From 125ebde95417341a7232769c9d20de0d485e05b3 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 11 May 2022 17:51:04 -0400 Subject: [PATCH] Separate TelephonyManager hidden API reflections to a standalone file This file can then simply be excluded when (potentially) building against AOSP. --- .../util/TelephonyManagerHiddenApi.kt | 53 +++++++++++++++++++ .../im/angry/openeuicc/util/TelephonyUtils.kt | 47 ---------------- 2 files changed, 53 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/im/angry/openeuicc/util/TelephonyManagerHiddenApi.kt diff --git a/app/src/main/java/im/angry/openeuicc/util/TelephonyManagerHiddenApi.kt b/app/src/main/java/im/angry/openeuicc/util/TelephonyManagerHiddenApi.kt new file mode 100644 index 0000000..1bc0121 --- /dev/null +++ b/app/src/main/java/im/angry/openeuicc/util/TelephonyManagerHiddenApi.kt @@ -0,0 +1,53 @@ +package im.angry.openeuicc.util + +import android.telephony.IccOpenLogicalChannelResponse +import android.telephony.SubscriptionManager +import android.telephony.TelephonyManager +import java.lang.reflect.Method + +// Hidden APIs via reflection to enable building without AOSP source tree +// When building against AOSP, this file can be simply excluded to resolve +// calls to AOSP hidden APIs +private val iccOpenLogicalChannelBySlot: Method by lazy { + TelephonyManager::class.java.getMethod( + "iccOpenLogicalChannelBySlot", + Int::class.java, String::class.java, Int::class.java + ) +} +private val iccCloseLogicalChannelBySlot: Method by lazy { + TelephonyManager::class.java.getMethod( + "iccCloseLogicalChannelBySlot", + Int::class.java, Int::class.java + ) +} +private val iccTransmitApduLogicalChannelBySlot: Method by lazy { + TelephonyManager::class.java.getMethod( + "iccTransmitApduLogicalChannelBySlot", + Int::class.java, Int::class.java, Int::class.java, Int::class.java, + Int::class.java, Int::class.java, Int::class.java, String::class.java + ) +} + +fun TelephonyManager.iccOpenLogicalChannelBySlot( + slotId: Int, appletId: String, p2: Int +): IccOpenLogicalChannelResponse = + iccOpenLogicalChannelBySlot.invoke(this, slotId, appletId, p2) as IccOpenLogicalChannelResponse + +fun TelephonyManager.iccCloseLogicalChannelBySlot(slotId: Int, channel: Int): Boolean = + iccCloseLogicalChannelBySlot.invoke(this, slotId, channel) as Boolean + +fun TelephonyManager.iccTransmitApduLogicalChannelBySlot( + slotId: Int, channel: Int, cla: Int, instruction: Int, + p1: Int, p2: Int, p3: Int, data: String? +): String? = + iccTransmitApduLogicalChannelBySlot.invoke( + this, slotId, channel, cla, instruction, p1, p2, p3, data + ) as String? + +private val requestEmbeddedSubscriptionInfoListRefresh: Method by lazy { + SubscriptionManager::class.java.getMethod("requestEmbeddedSubscriptionInfoListRefresh", Int::class.java) +} + +fun SubscriptionManager.requestEmbeddedSubscriptionInfoListRefresh(cardId: Int): Unit { + requestEmbeddedSubscriptionInfoListRefresh.invoke(this, cardId) +} \ No newline at end of file diff --git a/app/src/main/java/im/angry/openeuicc/util/TelephonyUtils.kt b/app/src/main/java/im/angry/openeuicc/util/TelephonyUtils.kt index 05c31e7..28b9623 100644 --- a/app/src/main/java/im/angry/openeuicc/util/TelephonyUtils.kt +++ b/app/src/main/java/im/angry/openeuicc/util/TelephonyUtils.kt @@ -1,10 +1,8 @@ package im.angry.openeuicc.util -import android.telephony.IccOpenLogicalChannelResponse import android.telephony.SubscriptionManager import android.telephony.TelephonyManager import java.lang.Exception -import java.lang.reflect.Method val TelephonyManager.supportsDSDS: Boolean get() = supportedModemCount == 2 @@ -23,49 +21,4 @@ fun SubscriptionManager.tryRefreshCachedEuiccInfo(cardId: Int) { // Ignore } } -} - -// Hidden APIs via reflection to enable building without AOSP source tree -private val iccOpenLogicalChannelBySlot: Method by lazy { - TelephonyManager::class.java.getMethod( - "iccOpenLogicalChannelBySlot", - Int::class.java, String::class.java, Int::class.java - ) -} -private val iccCloseLogicalChannelBySlot: Method by lazy { - TelephonyManager::class.java.getMethod( - "iccCloseLogicalChannelBySlot", - Int::class.java, Int::class.java - ) -} -private val iccTransmitApduLogicalChannelBySlot: Method by lazy { - TelephonyManager::class.java.getMethod( - "iccTransmitApduLogicalChannelBySlot", - Int::class.java, Int::class.java, Int::class.java, Int::class.java, - Int::class.java, Int::class.java, Int::class.java, String::class.java - ) -} - -fun TelephonyManager.iccOpenLogicalChannelBySlot( - slotId: Int, appletId: String, p2: Int -): IccOpenLogicalChannelResponse = - iccOpenLogicalChannelBySlot.invoke(this, slotId, appletId, p2) as IccOpenLogicalChannelResponse - -fun TelephonyManager.iccCloseLogicalChannelBySlot(slotId: Int, channel: Int): Boolean = - iccCloseLogicalChannelBySlot.invoke(this, slotId, channel) as Boolean - -fun TelephonyManager.iccTransmitApduLogicalChannelBySlot( - slotId: Int, channel: Int, cla: Int, instruction: Int, - p1: Int, p2: Int, p3: Int, data: String? -): String? = - iccTransmitApduLogicalChannelBySlot.invoke( - this, slotId, channel, cla, instruction, p1, p2, p3, data - ) as String? - -private val requestEmbeddedSubscriptionInfoListRefresh: Method by lazy { - SubscriptionManager::class.java.getMethod("requestEmbeddedSubscriptionInfoListRefresh", Int::class.java) -} - -fun SubscriptionManager.requestEmbeddedSubscriptionInfoListRefresh(cardId: Int): Unit { - requestEmbeddedSubscriptionInfoListRefresh.invoke(this, cardId) } \ No newline at end of file