From ede6d8a1f1d0c7d6e0d0e8a00f8a44e02d1d1711 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 12:37:46 +0800 Subject: [PATCH 1/3] feat: supports for google euicc partner customization --- app/src/main/AndroidManifest.xml | 5 ++ .../angry/openeuicc/ui/SlotMappingFragment.kt | 11 +++++ .../java/im/angry/openeuicc/util/Partner.kt | 46 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 app/src/main/java/im/angry/openeuicc/util/Partner.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cae19d3..1c7f9a6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -63,4 +63,9 @@ + + + + + diff --git a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt index e17f60e..89412ab 100644 --- a/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt +++ b/app/src/main/java/im/angry/openeuicc/ui/SlotMappingFragment.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.os.Bundle import android.telephony.TelephonyManager import android.telephony.UiccSlotMapping +import android.util.Log import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -45,6 +46,10 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), private lateinit var adapter: SlotMappingAdapter private lateinit var helpTextView: TextView + private val partner: Partner? by lazy { + Partner.getInstance(requireContext()) + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -67,6 +72,12 @@ class SlotMappingFragment: BaseMaterialDialogFragment(), toolbar.setOnMenuItemClickListener(this) } + override fun onStart() { + super.onStart() + val mappings = partner?.getString("sim_slot_mappings_json") + Log.e(TAG, "sim_slot_mappings_json = $mappings") + } + override fun onResume() { super.onResume() setWidthPercent(85) diff --git a/app/src/main/java/im/angry/openeuicc/util/Partner.kt b/app/src/main/java/im/angry/openeuicc/util/Partner.kt new file mode 100644 index 0000000..9ad8f21 --- /dev/null +++ b/app/src/main/java/im/angry/openeuicc/util/Partner.kt @@ -0,0 +1,46 @@ +package im.angry.openeuicc.util + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.res.Resources +import im.angry.openeuicc.BuildConfig + + +class Partner { + companion object { + private val intent = Intent("com.google.android.euicc.action.PARTNER_CUSTOMIZATION") + + fun getInstance(context: Context): Partner? { + var flags = if (BuildConfig.DEBUG) + PackageManager.MATCH_UNINSTALLED_PACKAGES else + PackageManager.MATCH_SYSTEM_ONLY + flags = flags or PackageManager.MATCH_DISABLED_COMPONENTS + val apps = context.packageManager + .queryBroadcastReceivers(intent, flags) + .mapNotNull { it.activityInfo?.applicationInfo } + for (app in apps) { + try { + val resources = context.packageManager.getResourcesForApplication(app) + return Partner(resources) + } catch (_: PackageManager.NameNotFoundException) { + continue + } + } + return null + } + } + + private val resources: Resources + + private constructor(resources: Resources) { + this.resources = resources + } + + private fun getIdentifier(name: String) = + resources.getIdentifier(name, null, null) + + fun getString(name: String) = getIdentifier(name).let(resources::getString) + + fun getBoolean(name: String) = getIdentifier(name).let(resources::getBoolean) +} \ No newline at end of file From bf0d22405eab6345032bd2df05300d6aa4fc8213 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 15:00:19 +0800 Subject: [PATCH 2/3] chore: add resonce ids cache --- app/src/main/java/im/angry/openeuicc/util/Partner.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/im/angry/openeuicc/util/Partner.kt b/app/src/main/java/im/angry/openeuicc/util/Partner.kt index 9ad8f21..dc60cda 100644 --- a/app/src/main/java/im/angry/openeuicc/util/Partner.kt +++ b/app/src/main/java/im/angry/openeuicc/util/Partner.kt @@ -32,13 +32,15 @@ class Partner { } private val resources: Resources + private val ids = mutableMapOf() private constructor(resources: Resources) { this.resources = resources } - private fun getIdentifier(name: String) = + private fun getIdentifier(name: String) = ids.getOrPut(name) { resources.getIdentifier(name, null, null) + } fun getString(name: String) = getIdentifier(name).let(resources::getString) From 6cdbcca741df41126d3850b3f76a34c826bfc0e3 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 22:08:13 +0800 Subject: [PATCH 3/3] refactor: improve partner customization --- .../java/im/angry/openeuicc/util/Partner.kt | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/im/angry/openeuicc/util/Partner.kt b/app/src/main/java/im/angry/openeuicc/util/Partner.kt index dc60cda..43ecc18 100644 --- a/app/src/main/java/im/angry/openeuicc/util/Partner.kt +++ b/app/src/main/java/im/angry/openeuicc/util/Partner.kt @@ -9,40 +9,43 @@ import im.angry.openeuicc.BuildConfig class Partner { companion object { - private val intent = Intent("com.google.android.euicc.action.PARTNER_CUSTOMIZATION") + private const val ACTION = "com.google.android.euicc.action.PARTNER_CUSTOMIZATION" - fun getInstance(context: Context): Partner? { - var flags = if (BuildConfig.DEBUG) - PackageManager.MATCH_UNINSTALLED_PACKAGES else - PackageManager.MATCH_SYSTEM_ONLY - flags = flags or PackageManager.MATCH_DISABLED_COMPONENTS - val apps = context.packageManager - .queryBroadcastReceivers(intent, flags) - .mapNotNull { it.activityInfo?.applicationInfo } - for (app in apps) { - try { - val resources = context.packageManager.getResourcesForApplication(app) - return Partner(resources) - } catch (_: PackageManager.NameNotFoundException) { - continue - } + private val instances = mutableMapOf() + + private val packageFlags: Int + get() { + val flags = if (BuildConfig.DEBUG) + PackageManager.MATCH_UNINSTALLED_PACKAGES else + PackageManager.MATCH_SYSTEM_ONLY + return flags or PackageManager.MATCH_DISABLED_COMPONENTS } - return null + + fun getInstance(context: Context, action: String = ACTION) = instances.getOrPut(action) { + context.packageManager + .queryBroadcastReceivers(Intent(action), packageFlags) + .mapNotNull { it.activityInfo?.applicationInfo } + .firstNotNullOfOrNull { + try { + context.packageManager.getResourcesForApplication(it) + } catch (_: PackageManager.NameNotFoundException) { + null + } + } + ?.let(::Partner) } } private val resources: Resources - private val ids = mutableMapOf() private constructor(resources: Resources) { this.resources = resources } - private fun getIdentifier(name: String) = ids.getOrPut(name) { - resources.getIdentifier(name, null, null) - } + private fun getIdentifier(name: String) = + resources.getIdentifier(name, null, null).takeIf { it != 0 } - fun getString(name: String) = getIdentifier(name).let(resources::getString) + fun getString(name: String) = getIdentifier(name)?.let(resources::getString) - fun getBoolean(name: String) = getIdentifier(name).let(resources::getBoolean) + fun getBoolean(name: String) = getIdentifier(name)?.let(resources::getBoolean) } \ No newline at end of file