From ca637da5ee1476858469eb686d51fdaacbd2a3ec Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 30 Apr 2022 15:15:23 -0400 Subject: [PATCH] Make the download fragment also recreatable --- .../openeuicc/ui/EuiccChannelFragmentUtils.kt | 23 +++++++++++++++++++ .../openeuicc/ui/EuiccManagementFragment.kt | 20 ++++------------ .../openeuicc/ui/ProfileDownloadFragment.kt | 6 +++-- 3 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt diff --git a/app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt b/app/src/main/java/im/angry/openeuicc/ui/EuiccChannelFragmentUtils.kt new file mode 100644 index 0000000..4aaa49a --- /dev/null +++ b/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 newInstanceEuicc(clazz: Class, slotId: Int): T where T: Fragment, T: EuiccFragmentMarker { + val instance = clazz.newInstance() + instance.arguments = Bundle().apply { + putInt("slotId", slotId) + } + return instance +} + +val T.slotId: Int where T: Fragment, T: EuiccFragmentMarker + get() = requireArguments().getInt("slotId") + +val T.channel: EuiccChannel where T: Fragment, T: EuiccFragmentMarker + get() = + (requireActivity().application as OpenEUICCApplication).euiccChannelRepo.availableChannels[slotId] \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt index 3446ccf..7b0a6b9 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt +++ b/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() } diff --git a/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt index 5db931f..bdd5fd2 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt +++ b/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