From 6cdbcca741df41126d3850b3f76a34c826bfc0e3 Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 22:08:13 +0800 Subject: [PATCH] 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