ソースを参照

Make the download fragment also recreatable

Peter Cai 3 年 前
コミット
ca637da5ee

+ 23 - 0
app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt

@@ -0,0 +1,23 @@
+package im.angry.openeuicc.ui
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import im.angry.openeuicc.OpenEUICCApplication
+import im.angry.openeuicc.core.EuiccChannel
+
+interface EuiccFragmentMarker
+
+fun <T> newInstanceEuicc(clazz: Class<T>, slotId: Int): T where T: Fragment, T: EuiccFragmentMarker {
+    val instance = clazz.newInstance()
+    instance.arguments = Bundle().apply {
+        putInt("slotId", slotId)
+    }
+    return instance
+}
+
+val <T> T.slotId: Int where T: Fragment, T: EuiccFragmentMarker
+    get() = requireArguments().getInt("slotId")
+
+val <T> T.channel: EuiccChannel where T: Fragment, T: EuiccFragmentMarker
+    get() =
+        (requireActivity().application as OpenEUICCApplication).euiccChannelRepo.availableChannels[slotId]

+ 5 - 15
app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt

@@ -10,28 +10,19 @@ import androidx.fragment.app.Fragment
 import androidx.lifecycle.lifecycleScope
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
-import im.angry.openeuicc.OpenEUICCApplication
 import im.angry.openeuicc.R
-import im.angry.openeuicc.core.EuiccChannel
 import im.angry.openeuicc.databinding.EuiccProfileBinding
 import im.angry.openeuicc.databinding.FragmentEuiccBinding
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 
-class EuiccManagementFragment : Fragment() {
+class EuiccManagementFragment : Fragment(), EuiccFragmentMarker {
     companion object {
-        fun newInstance(slotId: Int): EuiccManagementFragment {
-            val instance = EuiccManagementFragment()
-            instance.arguments = Bundle().apply {
-                putInt("slotId", slotId)
-            }
-            return instance
-        }
+        fun newInstance(slotId: Int): EuiccManagementFragment =
+            newInstanceEuicc(EuiccManagementFragment::class.java, slotId)
     }
 
-    private lateinit var channel: EuiccChannel
-
     private var _binding: FragmentEuiccBinding? = null
     private val binding get() = _binding!!
 
@@ -54,14 +45,13 @@ class EuiccManagementFragment : Fragment() {
             LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL, false)
 
         binding.fab.setOnClickListener {
-            ProfileDownloadFragment(channel).show(childFragmentManager, ProfileDownloadFragment.TAG)
+            ProfileDownloadFragment.newInstance(slotId)
+                .show(childFragmentManager, ProfileDownloadFragment.TAG)
         }
     }
 
     override fun onStart() {
         super.onStart()
-        val slotId = requireArguments().getInt("slotId")
-        channel = (requireActivity().application as OpenEUICCApplication).euiccChannelRepo.availableChannels[slotId]
         refresh()
     }
 

+ 4 - 2
app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt

@@ -8,13 +8,15 @@ import androidx.fragment.app.DialogFragment
 import com.journeyapps.barcodescanner.ScanContract
 import com.journeyapps.barcodescanner.ScanOptions
 import im.angry.openeuicc.R
-import im.angry.openeuicc.core.EuiccChannel
 import im.angry.openeuicc.databinding.FragmentProfileDownloadBinding
 import im.angry.openeuicc.util.setWidthPercent
 
-class ProfileDownloadFragment(val channel: EuiccChannel) : DialogFragment(), Toolbar.OnMenuItemClickListener {
+class ProfileDownloadFragment : DialogFragment(), EuiccFragmentMarker, Toolbar.OnMenuItemClickListener {
     companion object {
         const val TAG = "ProfileDownloadFragment"
+
+        fun newInstance(slotId: Int): ProfileDownloadFragment =
+            newInstanceEuicc(ProfileDownloadFragment::class.java, slotId)
     }
 
     private var _binding: FragmentProfileDownloadBinding? = null