refactor: Condense dependency management to a rudimentary dependency injection subpackage
All checks were successful
/ build-debug (push) Successful in 4m16s

This commit is contained in:
Peter Cai 2024-03-04 17:17:20 -05:00
parent 770083523d
commit 2d1c96023a
12 changed files with 78 additions and 42 deletions

View file

@ -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)
}
}

View file

@ -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>

View file

@ -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
}

View file

@ -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)
}
}

View file

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

View file

@ -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

View file

@ -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()
}
}

View file

@ -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)
}

View file

@ -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)
}
}

View file

@ -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 {

View file

@ -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

View file

@ -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)