Skip to content

Commit 533b4cb

Browse files
authored
fix: support app start and value read until SDK 34 since SDK 28 despite no value update guarantee (#426)
1 parent ef6245f commit 533b4cb

1 file changed

Lines changed: 94 additions & 39 deletions

File tree

  • app/src/main/java/dev/bluehouse/enablevolte

app/src/main/java/dev/bluehouse/enablevolte/Moder.kt

Lines changed: 94 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import android.os.Build
99
import android.os.Build.VERSION_CODES
1010
import android.os.Bundle
1111
import android.os.IInterface
12+
import android.os.PersistableBundle
13+
import android.os.ServiceManager
1214
import android.telephony.CarrierConfigManager
1315
import android.telephony.SubscriptionInfo
1416
import android.telephony.TelephonyFrameworkInitializer
@@ -46,43 +48,59 @@ open class Moder {
4648
get() =
4749
ICarrierConfigLoader.Stub.asInterface(
4850
ShizukuBinderWrapper(
49-
TelephonyFrameworkInitializer
50-
.getTelephonyServiceManager()
51-
.carrierConfigServiceRegisterer
52-
.get()!!,
51+
try {
52+
TelephonyFrameworkInitializer
53+
.getTelephonyServiceManager()
54+
.carrierConfigServiceRegisterer
55+
.get()
56+
} catch (e: NoClassDefFoundError) {
57+
ServiceManager.getService(Context.CARRIER_CONFIG_SERVICE)
58+
}!!,
5359
),
5460
)
5561

5662
protected val telephony: ITelephony
5763
get() =
5864
ITelephony.Stub.asInterface(
5965
ShizukuBinderWrapper(
60-
TelephonyFrameworkInitializer
61-
.getTelephonyServiceManager()
62-
.telephonyServiceRegisterer
63-
.get()!!,
66+
try {
67+
TelephonyFrameworkInitializer
68+
.getTelephonyServiceManager()
69+
.telephonyServiceRegisterer
70+
.get()
71+
} catch (e: NoClassDefFoundError) {
72+
ServiceManager.getService(Context.TELEPHONY_SERVICE)
73+
}!!,
6474
),
6575
)
6676

6777
protected val phoneSubInfo: IPhoneSubInfo
6878
get() =
6979
IPhoneSubInfo.Stub.asInterface(
7080
ShizukuBinderWrapper(
71-
TelephonyFrameworkInitializer
72-
.getTelephonyServiceManager()
73-
.phoneSubServiceRegisterer
74-
.get()!!,
81+
try {
82+
TelephonyFrameworkInitializer
83+
.getTelephonyServiceManager()
84+
.phoneSubServiceRegisterer
85+
.get()
86+
} catch (e: NoClassDefFoundError) {
87+
ServiceManager.getService("iphonesubinfo")
88+
}!!,
7589
),
7690
)
7791

7892
protected val sub: ISub
7993
get() =
8094
ISub.Stub.asInterface(
8195
ShizukuBinderWrapper(
82-
TelephonyFrameworkInitializer
83-
.getTelephonyServiceManager()
84-
.subscriptionServiceRegisterer
85-
.get()!!,
96+
try {
97+
TelephonyFrameworkInitializer
98+
.getTelephonyServiceManager()
99+
.subscriptionServiceRegisterer
100+
.get()
101+
} catch (e: NoClassDefFoundError) {
102+
ServiceManager.getService("isub")
103+
}!!,
86104
),
87105
)
88106
}
@@ -92,24 +110,41 @@ class CarrierModer(
92110
) : Moder() {
93111
fun getActiveSubscriptionInfoForSimSlotIndex(index: Int): SubscriptionInfo? {
94112
val sub = this.loadCachedInterface { sub }
95-
return sub.getActiveSubscriptionInfoForSimSlotIndex(index, null, null)
113+
return try {
114+
sub.getActiveSubscriptionInfoForSimSlotIndex(index, null, null)
115+
} catch (e: NoSuchMethodError) {
116+
val getActiveSubscriptionInfoForSimSlotIndexMethod =
117+
sub.javaClass.getMethod(
118+
"getActiveSubscriptionInfoForSimSlotIndex",
119+
Int::class.javaPrimitiveType,
120+
String::class.java,
121+
)
122+
(getActiveSubscriptionInfoForSimSlotIndexMethod.invoke(sub, index, null) as? SubscriptionInfo)
123+
}
96124
}
97125

98126
val subscriptions: List<SubscriptionInfo>
99127
get() {
100128
val sub = this.loadCachedInterface { sub }
101-
return try {
102-
sub.getActiveSubscriptionInfoList(null, null, true)
129+
try {
130+
return sub.getActiveSubscriptionInfoList(null, null, true) ?: emptyList()
103131
} catch (e: NoSuchMethodError) {
104-
// FIXME: lift up reflect as soon as official source code releases
132+
}
133+
return try {
105134
val getActiveSubscriptionInfoListMethod =
106135
sub.javaClass.getMethod(
107136
"getActiveSubscriptionInfoList",
108137
String::class.java,
109138
String::class.java,
110-
Boolean::class.java,
111139
)
112-
(getActiveSubscriptionInfoListMethod.invoke(sub, null, null, false) as List<SubscriptionInfo>)
140+
(getActiveSubscriptionInfoListMethod.invoke(sub, null, null) as? List<SubscriptionInfo>) ?: emptyList()
141+
} catch (e: NoSuchMethodException) {
142+
val getActiveSubscriptionInfoListMethod =
143+
sub.javaClass.getMethod(
144+
"getActiveSubscriptionInfoList",
145+
String::class.java,
146+
)
147+
(getActiveSubscriptionInfoListMethod.invoke(sub, null) as? List<SubscriptionInfo>) ?: emptyList()
113148
}
114149
}
115150

@@ -276,8 +311,8 @@ class SubscriptionModer(
276311
}
277312
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
278313

279-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
280-
return config.getString(key)
314+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
315+
return config?.getString(key)
281316
}
282317

283318
fun getBooleanValue(key: String): Boolean {
@@ -288,8 +323,8 @@ class SubscriptionModer(
288323
}
289324
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
290325

291-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
292-
return config.getBoolean(key)
326+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
327+
return config?.getBoolean(key) ?: false
293328
}
294329

295330
fun getIntValue(key: String): Int {
@@ -300,8 +335,8 @@ class SubscriptionModer(
300335
}
301336
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
302337

303-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
304-
return config.getInt(key)
338+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
339+
return config?.getInt(key) ?: -1
305340
}
306341

307342
fun getLongValue(key: String): Long {
@@ -312,8 +347,8 @@ class SubscriptionModer(
312347
}
313348
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
314349

315-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
316-
return config.getLong(key)
350+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
351+
return config?.getLong(key) ?: -1L
317352
}
318353

319354
fun getBooleanArrayValue(key: String): BooleanArray {
@@ -324,8 +359,8 @@ class SubscriptionModer(
324359
}
325360
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
326361

327-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
328-
return config.getBooleanArray(key) ?: BooleanArray(0)
362+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
363+
return config?.getBooleanArray(key) ?: BooleanArray(0)
329364
}
330365

331366
fun getIntArrayValue(key: String): IntArray {
@@ -336,8 +371,8 @@ class SubscriptionModer(
336371
}
337372
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
338373

339-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
340-
return config.getIntArray(key) ?: IntArray(0)
374+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
375+
return config?.getIntArray(key) ?: IntArray(0)
341376
}
342377

343378
fun getStringArrayValue(key: String): Array<String> {
@@ -348,8 +383,8 @@ class SubscriptionModer(
348383
}
349384
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
350385

351-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
352-
return config.getStringArray(key) ?: emptyArray()
386+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
387+
return config?.getStringArray(key) ?: emptyArray()
353388
}
354389

355390
fun getValue(key: String): Any? {
@@ -360,8 +395,28 @@ class SubscriptionModer(
360395
}
361396
val iCclInstance = this.loadCachedInterface { carrierConfigLoader }
362397

363-
val config = iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
364-
return config.get(key)
398+
val config = this.getConfigForSubId(iCclInstance, subscriptionId)
399+
return config?.get(key)
400+
}
401+
402+
fun getConfigForSubId(
403+
iCclInstance: ICarrierConfigLoader,
404+
subscriptionId: Int,
405+
): PersistableBundle? {
406+
try {
407+
return iCclInstance.getConfigForSubIdWithFeature(subscriptionId, iCclInstance.defaultCarrierServicePackageName, "")
408+
} catch (e: NoSuchMethodError) {
409+
}
410+
return try {
411+
iCclInstance.getConfigForSubId(subscriptionId, iCclInstance.defaultCarrierServicePackageName)
412+
} catch (e: NoSuchMethodError) {
413+
val getConfigForSubIdMethod =
414+
iCclInstance.javaClass.getMethod(
415+
"getConfigForSubId",
416+
Int::class.javaPrimitiveType,
417+
)
418+
(getConfigForSubIdMethod.invoke(iCclInstance, subscriptionId) as? PersistableBundle)
419+
}
365420
}
366421

367422
val simSlotIndex: Int
@@ -410,7 +465,7 @@ class SubscriptionModer(
410465
val wfcSpnFormatIndex: Int
411466
get() = this.getIntValue(CarrierConfigManager.KEY_WFC_SPN_FORMAT_IDX_INT)
412467

413-
val carrierName: String
468+
val carrierName: String?
414469
get() = this.loadCachedInterface { telephony }.getSubscriptionCarrierName(this.subscriptionId)
415470

416471
val showVoWifiIcon: Boolean

0 commit comments

Comments
 (0)