瀏覽代碼

refactor: Condense dependency management to a rudimentary dependency injection subpackage

Peter Cai 1 年之前
父節點
當前提交
2d1c96023a

+ 6 - 21
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)
-    }
 }

+ 1 - 1
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<UiccCardInfoCompat>

+ 13 - 0
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
+}

+ 26 - 0
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)
+    }
+}

+ 1 - 1
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) {
                 ""
             }

+ 6 - 2
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

+ 5 - 4
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()
     }
 }

+ 1 - 1
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)
             }

+ 11 - 0
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)
+    }
+}

+ 1 - 1
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 {

+ 1 - 1
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

+ 6 - 10
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<UiccPortInfoCompat> by lazy {
-        tm.uiccCardsInfoCompat.flatMap { it.ports }
+        telephonyManager.uiccCardsInfoCompat.flatMap { it.ports }
     }
 
     private val portsDesc: List<String> 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)