From f85efec23c8cf852af8c57f87b2c0db53d79603e Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 11 May 2022 17:36:29 -0400 Subject: [PATCH 1/2] rename hidden-dpis to hidden-apis-stub --- .idea/compiler.xml | 2 ++ .idea/gradle.xml | 3 +-- app/build.gradle | 2 +- libs/{hidden-apis => hidden-apis-stub}/.gitignore | 0 libs/{hidden-apis => hidden-apis-stub}/build.gradle | 0 .../src/main/AndroidManifest.xml | 0 .../java/android/service/euicc/DownloadSubscriptionResult.java | 0 .../src/main/java/android/service/euicc/EuiccProfileInfo.java | 0 .../src/main/java/android/service/euicc/EuiccService.java | 0 .../euicc/GetDefaultDownloadableSubscriptionListResult.java | 0 .../euicc/GetDownloadableSubscriptionMetadataResult.java | 0 .../android/service/euicc/GetEuiccProfileInfoListResult.java | 0 .../src/main/java/android/telephony/UiccAccessRule.java | 0 settings.gradle | 2 +- 14 files changed, 5 insertions(+), 4 deletions(-) rename libs/{hidden-apis => hidden-apis-stub}/.gitignore (100%) rename libs/{hidden-apis => hidden-apis-stub}/build.gradle (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/AndroidManifest.xml (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/DownloadSubscriptionResult.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/EuiccProfileInfo.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/EuiccService.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/GetDefaultDownloadableSubscriptionListResult.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/GetDownloadableSubscriptionMetadataResult.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/service/euicc/GetEuiccProfileInfoListResult.java (100%) rename libs/{hidden-apis => hidden-apis-stub}/src/main/java/android/telephony/UiccAccessRule.java (100%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 59d8ad0..e87380b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -4,6 +4,8 @@ + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index d051337..d06202a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,11 +13,10 @@ - diff --git a/app/build.gradle b/app/build.gradle index bf861c2..3476b70 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,7 +36,7 @@ android { } dependencies { - compileOnly project(":libs:hidden-apis") + compileOnly project(':libs:hidden-apis-stub') implementation project(":libs:lpad-sm-dp-plus-connector") implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.1' diff --git a/libs/hidden-apis/.gitignore b/libs/hidden-apis-stub/.gitignore similarity index 100% rename from libs/hidden-apis/.gitignore rename to libs/hidden-apis-stub/.gitignore diff --git a/libs/hidden-apis/build.gradle b/libs/hidden-apis-stub/build.gradle similarity index 100% rename from libs/hidden-apis/build.gradle rename to libs/hidden-apis-stub/build.gradle diff --git a/libs/hidden-apis/src/main/AndroidManifest.xml b/libs/hidden-apis-stub/src/main/AndroidManifest.xml similarity index 100% rename from libs/hidden-apis/src/main/AndroidManifest.xml rename to libs/hidden-apis-stub/src/main/AndroidManifest.xml diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/DownloadSubscriptionResult.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/DownloadSubscriptionResult.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/DownloadSubscriptionResult.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/DownloadSubscriptionResult.java diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/EuiccProfileInfo.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/EuiccProfileInfo.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/EuiccProfileInfo.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/EuiccProfileInfo.java diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/EuiccService.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/EuiccService.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/EuiccService.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/EuiccService.java diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/GetDefaultDownloadableSubscriptionListResult.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/GetDefaultDownloadableSubscriptionListResult.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/GetDefaultDownloadableSubscriptionListResult.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/GetDefaultDownloadableSubscriptionListResult.java diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/GetDownloadableSubscriptionMetadataResult.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/GetDownloadableSubscriptionMetadataResult.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/GetDownloadableSubscriptionMetadataResult.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/GetDownloadableSubscriptionMetadataResult.java diff --git a/libs/hidden-apis/src/main/java/android/service/euicc/GetEuiccProfileInfoListResult.java b/libs/hidden-apis-stub/src/main/java/android/service/euicc/GetEuiccProfileInfoListResult.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/service/euicc/GetEuiccProfileInfoListResult.java rename to libs/hidden-apis-stub/src/main/java/android/service/euicc/GetEuiccProfileInfoListResult.java diff --git a/libs/hidden-apis/src/main/java/android/telephony/UiccAccessRule.java b/libs/hidden-apis-stub/src/main/java/android/telephony/UiccAccessRule.java similarity index 100% rename from libs/hidden-apis/src/main/java/android/telephony/UiccAccessRule.java rename to libs/hidden-apis-stub/src/main/java/android/telephony/UiccAccessRule.java diff --git a/settings.gradle b/settings.gradle index ce3d71f..661e47c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,4 +14,4 @@ dependencyResolutionManagement { } rootProject.name = "OpenEUICC" include ':app', ':libs:lpad-sm-dp-plus-connector' -include ':libs:hidden-apis' +include ':libs:hidden-apis-stub' From 125ebde95417341a7232769c9d20de0d485e05b3 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Wed, 11 May 2022 17:51:04 -0400 Subject: [PATCH 2/2] 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