From 52fd037026fa793f706b65cb6a24c38419b5167b Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 12:37:46 +0800 Subject: [PATCH 01/19] 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 | 51 +++++++++++++++++++ 3 files changed, 67 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..43ecc18 --- /dev/null +++ b/app/src/main/java/im/angry/openeuicc/util/Partner.kt @@ -0,0 +1,51 @@ +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 const val ACTION = "com.google.android.euicc.action.PARTNER_CUSTOMIZATION" + + 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 + } + + 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 constructor(resources: Resources) { + this.resources = resources + } + + private fun getIdentifier(name: String) = + resources.getIdentifier(name, null, null).takeIf { it != 0 } + + 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 677b69cedfcae37557ca5626bb1741987ffb0a10 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 20 Jul 2025 10:29:27 -0400 Subject: [PATCH 02/19] feat: quick compatibility check Co-authored-by: septs --- app-unpriv/src/main/AndroidManifest.xml | 5 + .../openeuicc/di/UnprivilegedAppContainer.kt | 5 + .../di/UnprivilegedUiComponentFactory.kt | 7 +- .../ui/QuickCompatibilityActivity.kt | 25 ++++ .../ui/QuickCompatibilityFragment.kt | 140 ++++++++++++++++++ .../openeuicc/ui/UnprivilegedMainActivity.kt | 13 +- .../openeuicc/util/CompatibilityCheck.kt | 6 +- .../util/UnprivilegedPreferenceRepository.kt | 14 ++ .../angry/openeuicc/util/UnprivilegedUtils.kt | 6 + .../layout/activity_quick_compatibility.xml | 16 ++ .../layout/fragment_quick_compatibility.xml | 53 +++++++ app-unpriv/src/main/res/values/strings.xml | 10 ++ 12 files changed, 294 insertions(+), 6 deletions(-) create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/ui/QuickCompatibilityActivity.kt create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/ui/QuickCompatibilityFragment.kt create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/util/UnprivilegedPreferenceRepository.kt create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/util/UnprivilegedUtils.kt create mode 100644 app-unpriv/src/main/res/layout/activity_quick_compatibility.xml create mode 100644 app-unpriv/src/main/res/layout/fragment_quick_compatibility.xml diff --git a/app-unpriv/src/main/AndroidManifest.xml b/app-unpriv/src/main/AndroidManifest.xml index ce985cd..ba37079 100644 --- a/app-unpriv/src/main/AndroidManifest.xml +++ b/app-unpriv/src/main/AndroidManifest.xml @@ -23,6 +23,11 @@ + + = emptyList() + ) + } + + private val conclusion: TextView by lazy { + requireView().requireViewById(R.id.quick_availability_conclusion) + } + + private val resultSlots: TextView by lazy { + requireView().requireViewById(R.id.quick_availability_result_slots) + } + + private val resultNotes: TextView by lazy { + requireView().requireViewById(R.id.quick_availability_result_notes) + } + + private val hidden: CheckBox by lazy { + requireView().requireViewById(R.id.quick_availability_hidden) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View = inflater.inflate(R.layout.fragment_quick_compatibility, container, false).apply { + requireViewById(R.id.quick_availability_device_information) + .text = formatDeviceInformation() + requireViewById