From 6d43a9207cbfb1c03ccf304a2c3cd117c578df34 Mon Sep 17 00:00:00 2001 From: septs Date: Wed, 16 Jul 2025 14:24:05 +0200 Subject: [PATCH 1/2] chore: simplify pretty print json string (#201) https://developer.android.com/reference/org/json/JSONObject Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/201 Co-authored-by: septs Co-committed-by: septs --- .../DownloadWizardDiagnosticsFragment.kt | 4 +- .../im/angry/openeuicc/util/StringUtils.kt | 70 ------------------- 2 files changed, 3 insertions(+), 71 deletions(-) diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt index e282196..3841868 100644 --- a/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt +++ b/app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import android.widget.TextView import im.angry.openeuicc.common.R import im.angry.openeuicc.util.* +import org.json.JSONObject import java.util.Date class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardStepFragment() { @@ -86,9 +87,10 @@ class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardS ret.appendLine() val str = resp.data.decodeToString(throwOnInvalidSequence = false) + ret.appendLine( if (str.startsWith('{')) { - str.prettyPrintJson() + JSONObject(str).toString(2) } else { str } diff --git a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt index 079853e..57d150b 100644 --- a/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt +++ b/app-common/src/main/java/im/angry/openeuicc/util/StringUtils.kt @@ -41,73 +41,3 @@ fun parseIsdrAidList(s: String): List = .filter(String::isNotEmpty) .mapNotNull { runCatching(it::decodeHex).getOrNull() } .ifEmpty { listOf(EUICC_DEFAULT_ISDR_AID.decodeHex()) } - -fun String.prettyPrintJson(): String { - val ret = StringBuilder() - var inQuotes = false - var escaped = false - val indentSymbolStack = ArrayDeque() - - val addNewLine = { - ret.append('\n') - repeat(indentSymbolStack.size) { - ret.append('\t') - } - } - - var lastChar = ' ' - - for (c in this) { - when { - !inQuotes && (c == '{' || c == '[') -> { - ret.append(c) - indentSymbolStack.addLast(c) - addNewLine() - } - - !inQuotes && (c == '}' || c == ']') -> { - indentSymbolStack.removeLast() - if (lastChar != ',') { - addNewLine() - } - ret.append(c) - } - - !inQuotes && c == ',' -> { - ret.append(c) - addNewLine() - } - - !inQuotes && c == ':' -> { - ret.append(c) - ret.append(' ') - } - - inQuotes && c == '\\' -> { - ret.append(c) - escaped = true - continue - } - - !escaped && c == '"' -> { - ret.append(c) - inQuotes = !inQuotes - } - - !inQuotes && c == ' ' -> { - // Do nothing -- we ignore spaces outside of quotes by default - // This is to ensure predictable formatting - } - - else -> ret.append(c) - } - - if (escaped) { - escaped = false - } - - lastChar = c - } - - return ret.toString() -} \ No newline at end of file From 52fd037026fa793f706b65cb6a24c38419b5167b Mon Sep 17 00:00:00 2001 From: septs Date: Mon, 14 Jul 2025 12:37:46 +0800 Subject: [PATCH 2/2] 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