From 6baa26648f08fd7409fc1040ec7aafaf1260fb7e Mon Sep 17 00:00:00 2001 From: IllusionMan1212 Date: Sun, 17 May 2020 05:54:01 +0300 Subject: [PATCH] Add RecyclerView to display basic app list and parse PSVita data only for now --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 1 + .../com/illusionware/npsbrowser/AppData.kt | 5 ++ .../npsbrowser/activities/AppsListActivity.kt | 36 ++++++++++++ .../npsbrowser/activities/MainActivity.kt | 28 ++++++++- .../npsbrowser/adapters/AppAdapter.kt | 36 ++++++++++++ .../main/res/drawable/ic_games_black_24dp.xml | 5 ++ .../main/res/layout/activity_apps_list.xml | 11 ++++ app/src/main/res/layout/list_item.xml | 57 +++++++++++++++++++ 9 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/illusionware/npsbrowser/AppData.kt create mode 100644 app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt create mode 100644 app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt create mode 100644 app/src/main/res/drawable/ic_games_black_24dp.xml create mode 100644 app/src/main/res/layout/activity_apps_list.xml create mode 100644 app/src/main/res/layout/list_item.xml diff --git a/app/build.gradle b/app/build.gradle index d8dbe01..6b56ffa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -55,6 +55,7 @@ dependencies { implementation 'androidx.core:core-ktx:1.2.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'com.github.doyaaaaaken:kotlin-csv-jvm:0.7.3' + implementation "androidx.cardview:cardview:1.0.0" testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f0e2911..551dc3b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/AppData.kt b/app/src/main/java/com/illusionware/npsbrowser/AppData.kt new file mode 100644 index 0000000..97fd7fe --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/AppData.kt @@ -0,0 +1,5 @@ +package com.illusionware.npsbrowser + +data class AppData(val TitleID: String?, val Region: String?, val Title : String?, val link : String?, + val license : String?, val contentID : String?, val lastDateTime: String?, + val fileSize : Number?, val SHA256 : String?, val minFW : String?) \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt new file mode 100644 index 0000000..2e6b292 --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/activities/AppsListActivity.kt @@ -0,0 +1,36 @@ +package com.illusionware.npsbrowser.activities + +import android.content.Intent +import android.os.Bundle +import android.view.View +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.illusionware.npsbrowser.AppData +import com.illusionware.npsbrowser.RecyclerTouchListener +import com.illusionware.npsbrowser.adapters.AppAdapter +import com.illusionware.npsbrowser.databinding.ActivityAppsListBinding + +class AppsListActivity : AppCompatActivity() { + companion object { + lateinit var apps : ArrayList + } + private lateinit var recyclerView: RecyclerView + private lateinit var viewAdapter: RecyclerView.Adapter<*> + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val binding = ActivityAppsListBinding.inflate(layoutInflater); + setContentView(binding.root) + + viewAdapter = AppAdapter(apps) + + recyclerView = binding.appsRecycler + recyclerView.apply { + layoutManager = LinearLayoutManager(applicationContext) + adapter = viewAdapter + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt index f64cbc3..76f6e9e 100644 --- a/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt +++ b/app/src/main/java/com/illusionware/npsbrowser/activities/MainActivity.kt @@ -9,6 +9,7 @@ import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import com.github.doyaaaaaken.kotlincsv.dsl.csvReader +import com.illusionware.npsbrowser.AppData import com.illusionware.npsbrowser.databinding.ActivityMainBinding import java.io.InputStream @@ -42,7 +43,32 @@ class MainActivity : AppCompatActivity() { if (requestCode == 1 && resultCode == Activity.RESULT_OK) { resultData?.data?.also { uri -> val inputStream: InputStream? = contentResolver.openInputStream(uri) - val entries : List> = tsvReader.readAllWithHeader(inputStream!!) + val entries : List> = tsvReader.readAllWithHeader(inputStream!!) + val myIntent = Intent(this, AppsListActivity::class.java) + var apps = ArrayList(entries.size) + + entries.forEach { entry -> + if (entry["Name"].isNullOrEmpty()) { + return@forEach; + } + val id = entry["Title ID"] + val region = entry["Region"] + val name = entry["Name"] + val link = entry["PKG direct link"] + val license = entry["zRIF"] + val contentID = entry["Content ID"] + val lastDateTime = entry["Last Modification Date"] + val fileSize = entry["File Size"]?.toLongOrNull() + val sha256 = entry["SHA256"] + val minFW = entry["Required FW"] + var app = AppData(id, region, name, link ?: "MISSING", license ?: "MISSING", + contentID ?: "MISSING", lastDateTime ?: "MISSING", + fileSize ?: 0, sha256 ?: "MISSING", minFW ?: "MISSING") + apps.add(app) + } + apps.sortBy { it.Title } + AppsListActivity.apps = apps; + startActivity(myIntent) } } } diff --git a/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt b/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt new file mode 100644 index 0000000..f7b1e63 --- /dev/null +++ b/app/src/main/java/com/illusionware/npsbrowser/adapters/AppAdapter.kt @@ -0,0 +1,36 @@ +package com.illusionware.npsbrowser.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.illusionware.npsbrowser.AppData +import com.illusionware.npsbrowser.R + +class AppAdapter(private val appsList: ArrayList) : RecyclerView.Adapter() { + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var appTitle: TextView = view.findViewById(R.id.appItem) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.appTitle.text = appsList[position].Title + } + + override fun getItemCount(): Int { + return appsList.size + } + + fun updateData(apps: ArrayList) { + appsList.clear() + notifyDataSetChanged() + appsList.addAll(apps) + notifyDataSetChanged() + + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_games_black_24dp.xml b/app/src/main/res/drawable/ic_games_black_24dp.xml new file mode 100644 index 0000000..1ee1e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_games_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/activity_apps_list.xml b/app/src/main/res/layout/activity_apps_list.xml new file mode 100644 index 0000000..cae9d15 --- /dev/null +++ b/app/src/main/res/layout/activity_apps_list.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml new file mode 100644 index 0000000..75a250f --- /dev/null +++ b/app/src/main/res/layout/list_item.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file