Browse Source

ui: Save selected slot as state in DownloadWizardActivity

Peter Cai 1 year ago
parent
commit
c4b513fc0a

+ 4 - 1
app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt

@@ -109,7 +109,10 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
         fab.setOnClickListener {
             lifecycleScope.launch {
                 if (preferenceRepository.experimentalDownloadWizardFlow.first()) {
-                    startActivity(Intent(requireContext(), DownloadWizardActivity::class.java))
+                    Intent(requireContext(), DownloadWizardActivity::class.java).apply {
+                        putExtra("selectedLogicalSlot", logicalSlotId)
+                        startActivity(this)
+                    }
                 } else {
                     ProfileDownloadFragment.newInstance(slotId, portId)
                         .show(childFragmentManager, ProfileDownloadFragment.TAG)

+ 15 - 2
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardActivity.kt

@@ -15,6 +15,12 @@ import im.angry.openeuicc.ui.BaseEuiccAccessActivity
 import im.angry.openeuicc.util.*
 
 class DownloadWizardActivity: BaseEuiccAccessActivity() {
+    data class DownloadWizardState(
+        var selectedLogicalSlot: Int
+    )
+
+    private lateinit var state: DownloadWizardState
+
     private lateinit var progressBar: ProgressBar
     private lateinit var nextButton: Button
     private lateinit var prevButton: Button
@@ -31,6 +37,10 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
             }
         })
 
+        state = DownloadWizardState(
+            intent.getIntExtra("selectedLogicalSlot", 0)
+        )
+
         progressBar = requireViewById(R.id.progress)
         nextButton = requireViewById(R.id.download_wizard_next)
         prevButton = requireViewById(R.id.download_wizard_back)
@@ -89,10 +99,13 @@ class DownloadWizardActivity: BaseEuiccAccessActivity() {
     }
 
     abstract class DownloadWizardStepFragment : Fragment(), OpenEuiccContextMarker {
+        protected val state: DownloadWizardState
+            get() = (requireActivity() as DownloadWizardActivity).state
+
         abstract val hasNext: Boolean
         abstract val hasPrev: Boolean
-        abstract fun createNextFragment(): DownloadWizardStepFragment
-        abstract fun createPrevFragment(): DownloadWizardStepFragment
+        abstract fun createNextFragment(): DownloadWizardStepFragment?
+        abstract fun createPrevFragment(): DownloadWizardStepFragment?
 
         protected fun hideProgressBar() {
             (requireActivity() as DownloadWizardActivity).progressBar.visibility = View.GONE

+ 22 - 10
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardSlotSelectFragment.kt

@@ -34,17 +34,15 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt
     private val adapter = SlotInfoAdapter()
 
     override val hasNext: Boolean
-        get() = loaded
+        get() = loaded && adapter.slots.isNotEmpty()
     override val hasPrev: Boolean
-        get() = false
+        get() = true
 
-    override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment {
+    override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment? {
         TODO("Not yet implemented")
     }
 
-    override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment {
-        TODO("Not yet implemented")
-    }
+    override fun createPrevFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
 
     override fun onCreateView(
         inflater: LayoutInflater,
@@ -84,13 +82,25 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt
             }
         }.toList()
         adapter.slots = slots
+
+        // Ensure we always have a selected slot by default
+        val selectedIdx = slots.indexOfFirst { it.logicalSlotId == state.selectedLogicalSlot }
+        adapter.currentSelectedIdx = if (selectedIdx > 0) {
+            selectedIdx
+        } else {
+            if (slots.isNotEmpty()) {
+                state.selectedLogicalSlot = slots[0].logicalSlotId
+            }
+            0
+        }
+
         adapter.notifyDataSetChanged()
         hideProgressBar()
         loaded = true
         refreshButtons()
     }
 
-    private class SlotItemHolder(val adapter: SlotInfoAdapter, val root: View) : ViewHolder(root) {
+    private inner class SlotItemHolder(val root: View) : ViewHolder(root) {
         private val title = root.requireViewById<TextView>(R.id.slot_item_title)
         private val type = root.requireViewById<TextView>(R.id.slot_item_type)
         private val eID = root.requireViewById<TextView>(R.id.slot_item_eid)
@@ -112,6 +122,8 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt
             adapter.currentSelectedIdx = curIdx
             adapter.notifyItemChanged(lastIdx)
             adapter.notifyItemChanged(curIdx)
+            // Selected index isn't logical slot ID directly, needs a conversion
+            state.selectedLogicalSlot = adapter.slots[adapter.currentSelectedIdx].logicalSlotId
         }
 
         fun bind(item: SlotInfo, idx: Int) {
@@ -135,13 +147,13 @@ class DownloadWizardSlotSelectFragment : DownloadWizardActivity.DownloadWizardSt
         }
     }
 
-    private class SlotInfoAdapter : RecyclerView.Adapter<SlotItemHolder>() {
+    private inner class SlotInfoAdapter : RecyclerView.Adapter<SlotItemHolder>() {
         var slots: List<SlotInfo> = listOf()
-        var currentSelectedIdx = 0
+        var currentSelectedIdx = -1
 
         override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SlotItemHolder {
             val root = LayoutInflater.from(parent.context).inflate(R.layout.download_slot_item, parent, false)
-            return SlotItemHolder(this, root)
+            return SlotItemHolder(root)
         }
 
         override fun getItemCount(): Int = slots.size