@@ -9,6 +9,8 @@ import android.os.Build
99import android.os.Build.VERSION_CODES
1010import android.os.Bundle
1111import android.os.IInterface
12+ import android.os.PersistableBundle
13+ import android.os.ServiceManager
1214import android.telephony.CarrierConfigManager
1315import android.telephony.SubscriptionInfo
1416import 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