浏览代码

feat: update TelephonyManager preference key and implement context marker interface (#167)

Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/167
Co-authored-by: septs <github@septs.pw>
Co-committed-by: septs <github@septs.pw>
septs 11 月之前
父节点
当前提交
88eb1ce0e2

+ 3 - 2
app/src/main/java/im/angry/openeuicc/core/PrivilegedEuiccChannelFactory.kt

@@ -8,7 +8,8 @@ import im.angry.openeuicc.util.*
 import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.first
 import java.lang.IllegalArgumentException
 import java.lang.IllegalArgumentException
 
 
-class PrivilegedEuiccChannelFactory(context: Context) : DefaultEuiccChannelFactory(context) {
+class PrivilegedEuiccChannelFactory(context: Context) : DefaultEuiccChannelFactory(context),
+    PrivilegedEuiccContextMarker {
     private val tm by lazy {
     private val tm by lazy {
         (context.applicationContext as OpenEuiccApplication).appContainer.telephonyManager
         (context.applicationContext as OpenEuiccApplication).appContainer.telephonyManager
     }
     }
@@ -22,7 +23,7 @@ class PrivilegedEuiccChannelFactory(context: Context) : DefaultEuiccChannelFacto
             super.tryOpenEuiccChannel(port)?.let { return it }
             super.tryOpenEuiccChannel(port)?.let { return it }
         }
         }
 
 
-        if (port.card.isEuicc || (context.preferenceRepository as PrivilegedPreferenceRepository).removableTelephonyManagerFlow.first()) {
+        if (port.card.isEuicc || preferenceRepository.removableTelephonyManagerFlow.first()) {
             Log.i(
             Log.i(
                 DefaultEuiccChannelManager.TAG,
                 DefaultEuiccChannelManager.TAG,
                 "Trying TelephonyManager for slot ${port.card.physicalSlotIndex} port ${port.portIndex}"
                 "Trying TelephonyManager for slot ${port.card.physicalSlotIndex} port ${port.portIndex}"

+ 3 - 3
app/src/main/java/im/angry/openeuicc/ui/PrivilegedSettingsFragment.kt

@@ -6,7 +6,7 @@ import androidx.preference.Preference
 import im.angry.openeuicc.R
 import im.angry.openeuicc.R
 import im.angry.openeuicc.util.*
 import im.angry.openeuicc.util.*
 
 
-class PrivilegedSettingsFragment : SettingsFragment() {
+class PrivilegedSettingsFragment : SettingsFragment(), PrivilegedEuiccContextMarker {
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
         super.onCreatePreferences(savedInstanceState, rootKey)
         super.onCreatePreferences(savedInstanceState, rootKey)
         addPreferencesFromResource(R.xml.pref_privileged_settings)
         addPreferencesFromResource(R.xml.pref_privileged_settings)
@@ -21,7 +21,7 @@ class PrivilegedSettingsFragment : SettingsFragment() {
         requirePreference<Preference>("pref_advanced_language").isVisible = false
         requirePreference<Preference>("pref_advanced_language").isVisible = false
 
 
         // Force use TelephonyManager API
         // Force use TelephonyManager API
-        requirePreference<CheckBoxPreference>("pref_developer_tmapi_removable")
-            .bindBooleanFlow((preferenceRepository as PrivilegedPreferenceRepository).removableTelephonyManagerFlow)
+        requirePreference<CheckBoxPreference>("pref_developer_removable_telephony_manager")
+            .bindBooleanFlow(preferenceRepository.removableTelephonyManagerFlow)
     }
     }
 }
 }

+ 13 - 0
app/src/main/java/im/angry/openeuicc/util/PrivilegedUtils.kt

@@ -5,10 +5,23 @@ import android.content.Context
 import android.content.Intent
 import android.content.Intent
 import android.content.ServiceConnection
 import android.content.ServiceConnection
 import android.os.IBinder
 import android.os.IBinder
+import androidx.fragment.app.Fragment
 import java.util.concurrent.Executors
 import java.util.concurrent.Executors
 import kotlin.coroutines.resume
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 import kotlin.coroutines.suspendCoroutine
 
 
+interface PrivilegedEuiccContextMarker {
+    val privilegedEuiccMarkerContext: Context
+        get() = when (this) {
+            is Context -> this
+            is Fragment -> requireContext()
+            else -> throw RuntimeException("PrivilegedEuiccContextMarker shall only be used on Fragments or UI types that derive from Context")
+        }
+
+    val preferenceRepository: PrivilegedPreferenceRepository
+        get() = privilegedEuiccMarkerContext.preferenceRepository as PrivilegedPreferenceRepository
+}
+
 suspend fun Context.bindServiceSuspended(intent: Intent, flags: Int): Pair<IBinder?, () -> Unit> =
 suspend fun Context.bindServiceSuspended(intent: Intent, flags: Int): Pair<IBinder?, () -> Unit> =
     suspendCoroutine { cont ->
     suspendCoroutine { cont ->
         var binder: IBinder?
         var binder: IBinder?

+ 1 - 1
app/src/main/res/xml/pref_privileged_settings.xml

@@ -5,7 +5,7 @@
         app:key="pref_developer_overlay">
         app:key="pref_developer_overlay">
         <CheckBoxPreference
         <CheckBoxPreference
             app:iconSpaceReserved="false"
             app:iconSpaceReserved="false"
-            app:key="pref_developer_tmapi_removable"
+            app:key="pref_developer_removable_telephony_manager"
             app:summary="@string/pref_developer_telephony_manager_removable_desc"
             app:summary="@string/pref_developer_telephony_manager_removable_desc"
             app:title="@string/pref_developer_telephony_manager_removable" />
             app:title="@string/pref_developer_telephony_manager_removable" />
     </PreferenceCategory>
     </PreferenceCategory>