EuiccManagementFragment: prevent crashes on configuration change

This is... not supposed to happen. We made too many assumptions about
the Fragment lifecycle.
This commit is contained in:
Peter Cai 2024-09-28 16:15:17 -04:00
parent b94eedac0a
commit 324dcdc563
3 changed files with 11 additions and 0 deletions

View file

@ -9,14 +9,17 @@ import android.os.IBinder
import androidx.appcompat.app.AppCompatActivity
import im.angry.openeuicc.core.EuiccChannelManager
import im.angry.openeuicc.service.EuiccChannelManagerService
import kotlinx.coroutines.CompletableDeferred
abstract class BaseEuiccAccessActivity : AppCompatActivity() {
val euiccChannelManagerLoaded = CompletableDeferred<Unit>()
lateinit var euiccChannelManager: EuiccChannelManager
private val euiccChannelManagerServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
euiccChannelManager =
(service!! as EuiccChannelManagerService.LocalBinder).service.euiccChannelManager
euiccChannelManagerLoaded.complete(Unit)
onInit()
}

View file

@ -108,7 +108,10 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
ProfileDownloadFragment.newInstance(slotId, portId)
.show(childFragmentManager, ProfileDownloadFragment.TAG)
}
}
override fun onStart() {
super.onStart()
refresh()
}
@ -151,6 +154,8 @@ open class EuiccManagementFragment : Fragment(), EuiccProfilesChangedListener,
swipeRefresh.isRefreshing = true
lifecycleScope.launch {
ensureEuiccChannelManager()
if (!this@EuiccManagementFragment::disableSafeguardFlow.isInitialized) {
disableSafeguardFlow =
preferenceRepository.disableSafeguardFlow.stateIn(lifecycleScope)

View file

@ -39,6 +39,9 @@ val <T> T.channel: EuiccChannel where T: Fragment, T: EuiccChannelFragmentMarker
get() =
euiccChannelManager.findEuiccChannelByPortBlocking(slotId, portId)!!
suspend fun <T> T.ensureEuiccChannelManager() where T: Fragment, T: EuiccChannelFragmentMarker =
(requireActivity() as BaseEuiccAccessActivity).euiccChannelManagerLoaded.await()
interface EuiccProfilesChangedListener {
fun onEuiccProfilesChanged()
}