From 2d1c96023a8669036dc2652e13414bcb4f05a893 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Mon, 4 Mar 2024 17:17:20 -0500 Subject: [PATCH] refactor: Condense dependency management to a rudimentary dependency injection subpackage --- .../angry/openeuicc/OpenEuiccApplication.kt | 27 +++++-------------- .../openeuicc/core/EuiccChannelManager.kt | 2 +- .../im/angry/openeuicc/di/AppContainer.kt | 13 +++++++++ .../angry/openeuicc/di/DefaultAppContainer.kt | 26 ++++++++++++++++++ .../openeuicc/ui/ProfileDownloadFragment.kt | 2 +- .../java/im/angry/openeuicc/util/Utils.kt | 8 ++++-- .../PrivilegedOpenEuiccApplication.kt | 9 ++++--- .../core/PrivilegedEuiccChannelManager.kt | 2 +- .../openeuicc/di/PrivilegedAppContainer.kt | 11 ++++++++ .../openeuicc/service/OpenEuiccService.kt | 2 +- .../openeuicc/ui/PrivilegedMainActivity.kt | 2 +- .../angry/openeuicc/ui/SlotMappingFragment.kt | 16 +++++------ 12 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 app-common/src/main/java/im/angry/openeuicc/di/AppContainer.kt create mode 100644 app-common/src/main/java/im/angry/openeuicc/di/DefaultAppContainer.kt create mode 100644 app/src/main/java/im/angry/openeuicc/di/PrivilegedAppContainer.kt diff --git a/app-common/src/main/java/im/angry/openeuicc/OpenEuiccApplication.kt b/app-common/src/main/java/im/angry/openeuicc/OpenEuiccApplication.kt index 0b2ccec..6cd22ce 100644 --- a/app-common/src/main/java/im/angry/openeuicc/OpenEuiccApplication.kt +++ b/app-common/src/main/java/im/angry/openeuicc/OpenEuiccApplication.kt @@ -1,34 +1,19 @@ package im.angry.openeuicc import android.app.Application -import android.telephony.SubscriptionManager -import android.telephony.TelephonyManager import com.google.android.material.color.DynamicColors -import im.angry.openeuicc.core.EuiccChannelManager -import im.angry.openeuicc.core.IEuiccChannelManager -import im.angry.openeuicc.util.PreferenceRepository +import im.angry.openeuicc.di.AppContainer +import im.angry.openeuicc.di.DefaultAppContainer open class OpenEuiccApplication : Application() { + open val appContainer: AppContainer by lazy { + DefaultAppContainer(this) + } + override fun onCreate() { super.onCreate() // Observe dynamic colors changes DynamicColors.applyToActivitiesIfAvailable(this) } - - val telephonyManager by lazy { - getSystemService(TelephonyManager::class.java)!! - } - - open val euiccChannelManager: IEuiccChannelManager by lazy { - EuiccChannelManager(this) - } - - val subscriptionManager by lazy { - getSystemService(SubscriptionManager::class.java)!! - } - - val preferenceRepository by lazy { - PreferenceRepository(this) - } } \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelManager.kt b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelManager.kt index e031794..9033d34 100644 --- a/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelManager.kt +++ b/app-common/src/main/java/im/angry/openeuicc/core/EuiccChannelManager.kt @@ -25,7 +25,7 @@ open class EuiccChannelManager(protected val context: Context) : IEuiccChannelMa private val lock = Mutex() protected val tm by lazy { - (context.applicationContext as OpenEuiccApplication).telephonyManager + (context.applicationContext as OpenEuiccApplication).appContainer.telephonyManager } protected open val uiccCards: Collection diff --git a/app-common/src/main/java/im/angry/openeuicc/di/AppContainer.kt b/app-common/src/main/java/im/angry/openeuicc/di/AppContainer.kt new file mode 100644 index 0000000..65c2aa9 --- /dev/null +++ b/app-common/src/main/java/im/angry/openeuicc/di/AppContainer.kt @@ -0,0 +1,13 @@ +package im.angry.openeuicc.di + +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager +import im.angry.openeuicc.core.IEuiccChannelManager +import im.angry.openeuicc.util.* + +interface AppContainer { + val telephonyManager: TelephonyManager + val euiccChannelManager: IEuiccChannelManager + val subscriptionManager: SubscriptionManager + val preferenceRepository: PreferenceRepository +} \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/di/DefaultAppContainer.kt b/app-common/src/main/java/im/angry/openeuicc/di/DefaultAppContainer.kt new file mode 100644 index 0000000..dd7826c --- /dev/null +++ b/app-common/src/main/java/im/angry/openeuicc/di/DefaultAppContainer.kt @@ -0,0 +1,26 @@ +package im.angry.openeuicc.di + +import android.content.Context +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager +import im.angry.openeuicc.core.EuiccChannelManager +import im.angry.openeuicc.core.IEuiccChannelManager +import im.angry.openeuicc.util.* + +open class DefaultAppContainer(context: Context) : AppContainer { + override val telephonyManager by lazy { + context.getSystemService(TelephonyManager::class.java)!! + } + + override val euiccChannelManager: IEuiccChannelManager by lazy { + EuiccChannelManager(context) + } + + override val subscriptionManager by lazy { + context.getSystemService(SubscriptionManager::class.java)!! + } + + override val preferenceRepository by lazy { + PreferenceRepository(context) + } +} \ No newline at end of file diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt index 360da4f..43fc1ee 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/ProfileDownloadFragment.kt @@ -121,7 +121,7 @@ class ProfileDownloadFragment : BaseMaterialDialogFragment(), super.onStart() profileDownloadIMEI.editText!!.text = Editable.Factory.getInstance().newEditable( try { - openEuiccApplication.telephonyManager.getImei(channel.logicalSlotId) + telephonyManager.getImei(channel.logicalSlotId) } catch (e: Exception) { "" } diff --git a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt index 3c21898..57626e2 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt @@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment import im.angry.openeuicc.OpenEuiccApplication import im.angry.openeuicc.core.EuiccChannel import im.angry.openeuicc.core.IEuiccChannelManager +import im.angry.openeuicc.di.AppContainer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex @@ -48,11 +49,14 @@ interface OpenEuiccContextMarker { val openEuiccApplication: OpenEuiccApplication get() = openEuiccMarkerContext.applicationContext as OpenEuiccApplication + val appContainer: AppContainer + get() = openEuiccApplication.appContainer + val euiccChannelManager: IEuiccChannelManager - get() = openEuiccApplication.euiccChannelManager + get() = appContainer.euiccChannelManager val telephonyManager: TelephonyManager - get() = openEuiccApplication.telephonyManager + get() = appContainer.telephonyManager } val LocalProfileInfo.isEnabled: Boolean diff --git a/app/src/main/java/im/angry/openeuicc/PrivilegedOpenEuiccApplication.kt b/app/src/main/java/im/angry/openeuicc/PrivilegedOpenEuiccApplication.kt index 28ea49d..2d8e5ee 100644 --- a/app/src/main/java/im/angry/openeuicc/PrivilegedOpenEuiccApplication.kt +++ b/app/src/main/java/im/angry/openeuicc/PrivilegedOpenEuiccApplication.kt @@ -1,16 +1,17 @@ package im.angry.openeuicc -import im.angry.openeuicc.core.IEuiccChannelManager import im.angry.openeuicc.core.PrivilegedEuiccChannelManager +import im.angry.openeuicc.di.AppContainer +import im.angry.openeuicc.di.PrivilegedAppContainer class PrivilegedOpenEuiccApplication: OpenEuiccApplication() { - override val euiccChannelManager: IEuiccChannelManager by lazy { - PrivilegedEuiccChannelManager(this) + override val appContainer: AppContainer by lazy { + PrivilegedAppContainer(this) } override fun onCreate() { super.onCreate() - (euiccChannelManager as PrivilegedEuiccChannelManager).closeAllStaleChannels() + (appContainer.euiccChannelManager as PrivilegedEuiccChannelManager).closeAllStaleChannels() } } \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelManager.kt b/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelManager.kt index 288cebd..75b2b22 100644 --- a/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelManager.kt +++ b/app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelManager.kt @@ -48,7 +48,7 @@ class PrivilegedEuiccChannelManager(context: Context): EuiccChannelManager(conte } override fun notifyEuiccProfilesChanged(logicalSlotId: Int) { - (context.applicationContext as OpenEuiccApplication).subscriptionManager.apply { + (context.applicationContext as OpenEuiccApplication).appContainer.subscriptionManager.apply { findEuiccChannelBySlotBlocking(logicalSlotId)?.let { tryRefreshCachedEuiccInfo(it.cardId) } diff --git a/app/src/main/java/im/angry/openeuicc/di/PrivilegedAppContainer.kt b/app/src/main/java/im/angry/openeuicc/di/PrivilegedAppContainer.kt new file mode 100644 index 0000000..a849a27 --- /dev/null +++ b/app/src/main/java/im/angry/openeuicc/di/PrivilegedAppContainer.kt @@ -0,0 +1,11 @@ +package im.angry.openeuicc.di + +import android.content.Context +import im.angry.openeuicc.core.IEuiccChannelManager +import im.angry.openeuicc.core.PrivilegedEuiccChannelManager + +class PrivilegedAppContainer(context: Context) : DefaultAppContainer(context) { + override val euiccChannelManager: IEuiccChannelManager by lazy { + PrivilegedEuiccChannelManager(context) + } +} \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt index 6a08da5..23f1444 100644 --- a/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt +++ b/app/src/main/java/im/angry/openeuicc/service/OpenEuiccService.kt @@ -238,7 +238,7 @@ class OpenEuiccService : EuiccService(), OpenEuiccContextMarker { } val success = channel.lpa .setNickname(iccid, nickname!!) - openEuiccApplication.subscriptionManager.tryRefreshCachedEuiccInfo(channel.cardId) + appContainer.subscriptionManager.tryRefreshCachedEuiccInfo(channel.cardId) return if (success) { RESULT_OK } else { diff --git a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt index 64e8ca9..1261932 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/PrivilegedMainActivity.kt @@ -26,7 +26,7 @@ class PrivilegedMainActivity : MainActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.dsds -> { - tm.setDsdsEnabled(openEuiccApplication.euiccChannelManager, !item.isChecked) + tm.setDsdsEnabled(euiccChannelManager, !item.isChecked) Toast.makeText(this, R.string.toast_dsds_switched, Toast.LENGTH_LONG).show() finish() true diff --git a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt index ba60fd7..4c77bac 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt @@ -32,12 +32,8 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), const val TAG = "SlotMappingFragment" } - private val tm: TelephonyManager by lazy { - (requireContext().applicationContext as OpenEuiccApplication).telephonyManager - } - private val ports: List by lazy { - tm.uiccCardsInfoCompat.flatMap { it.ports } + telephonyManager.uiccCardsInfoCompat.flatMap { it.ports } } private val portsDesc: List by lazy { @@ -81,7 +77,7 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), private fun init() { lifecycleScope.launch(Dispatchers.Main) { val mapping = withContext(Dispatchers.IO) { - tm.simSlotMapping + telephonyManager.simSlotMapping } adapter = SlotMappingAdapter(mapping.toMutableList().apply { @@ -100,14 +96,14 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), withContext(Dispatchers.IO) { // Use the utility method from PrivilegedTelephonyUtils to ensure // unmapped ports have all profiles disabled - tm.updateSimSlotMapping(openEuiccApplication.euiccChannelManager, adapter.mappings) + telephonyManager.updateSimSlotMapping(euiccChannelManager, adapter.mappings) } } catch (e: Exception) { Toast.makeText(requireContext(), R.string.slot_mapping_failure, Toast.LENGTH_LONG).show() return@launch } Toast.makeText(requireContext(), R.string.slot_mapping_completed, Toast.LENGTH_LONG).show() - openEuiccApplication.euiccChannelManager.invalidate() + euiccChannelManager.invalidate() requireActivity().finish() } } @@ -115,7 +111,7 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), private suspend fun buildHelpText() = withContext(Dispatchers.IO) { val nLogicalSlots = adapter.mappings.size - val cards = openEuiccApplication.telephonyManager.uiccCardsInfoCompat + val cards = telephonyManager.uiccCardsInfoCompat val nPhysicalSlots = cards.size var idxMepCard = -1 @@ -129,7 +125,7 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), } val mayEnableDSDS = - openEuiccApplication.telephonyManager.supportsDSDS && !openEuiccApplication.telephonyManager.dsdsEnabled + telephonyManager.supportsDSDS && !telephonyManager.dsdsEnabled val extraText = if (nLogicalSlots == 1 && mayEnableDSDS) { getString(R.string.slot_mapping_help_dsds)