From d5d7a3c54443ddf56e5e7fc7916d71eb22b4393a Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 1 Nov 2024 12:15:35 +0800 Subject: [PATCH 1/6] feat: open stk from menu --- .../main/res/menu/fragment_sim_toolkit.xml | 9 ++++ app-common/src/main/res/values/strings.xml | 2 + .../di/UnprivilegedUiComponentFactory.kt | 6 +++ .../ui/UnprivilegedEuiccManagementFragment.kt | 53 +++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 app-common/src/main/res/menu/fragment_sim_toolkit.xml create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt diff --git a/app-common/src/main/res/menu/fragment_sim_toolkit.xml b/app-common/src/main/res/menu/fragment_sim_toolkit.xml new file mode 100644 index 0000000..610b3a1 --- /dev/null +++ b/app-common/src/main/res/menu/fragment_sim_toolkit.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 0278ffa..5e4dcf0 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -94,4 +94,6 @@ App Version Source Code https://gitea.angry.im/PeterCxy/OpenEUICC + + Open SIM Toolkit \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt b/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt index f117038..2531676 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/di/UnprivilegedUiComponentFactory.kt @@ -1,9 +1,15 @@ package im.angry.openeuicc.di import androidx.fragment.app.Fragment +import im.angry.openeuicc.core.EuiccChannel +import im.angry.openeuicc.ui.EuiccManagementFragment +import im.angry.openeuicc.ui.UnprivilegedEuiccManagementFragment import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() { + override fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment = + UnprivilegedEuiccManagementFragment.newInstance(channel.slotId, channel.portId) + override fun createNoEuiccPlaceholderFragment(): Fragment = UnprivilegedNoEuiccPlaceholderFragment() } \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt new file mode 100644 index 0000000..f092a8b --- /dev/null +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt @@ -0,0 +1,53 @@ +package im.angry.openeuicc.ui + +import android.content.ComponentName +import android.content.Intent +import android.content.pm.PackageManager.NameNotFoundException +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import im.angry.openeuicc.common.R +import im.angry.openeuicc.util.channel +import im.angry.openeuicc.util.newInstanceEuicc +import im.angry.openeuicc.util.slotId + +class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { + companion object { + const val TAG = "UnprivilegedEuiccManagementFragment" + + fun newInstance(slotId: Int, portId: Int): EuiccManagementFragment = + newInstanceEuicc(UnprivilegedEuiccManagementFragment::class.java, slotId, portId) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + super.onCreateOptionsMenu(menu, inflater) + inflater.inflate(R.menu.fragment_sim_toolkit, menu) + + menu.findItem(R.id.open_sim_toolkit).let { + val supported = try { + requireContext().packageManager.getPackageInfo("com.android.stk", 0) + true + } catch (_: NameNotFoundException) { + false + } + it.isVisible = slotId != -1 && supported + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean = + when (item.itemId) { + R.id.open_sim_toolkit -> { + Intent(Intent.ACTION_MAIN, null).apply { + addCategory(Intent.CATEGORY_LAUNCHER) + component = ComponentName( + "com.android.stk", + "com.android.stk.StkMain${channel.slotId + 1}" + ) + startActivity(this) + } + true + } + + else -> super.onOptionsItemSelected(item) + } +} \ No newline at end of file -- 2.45.3 From 8f9cf9e8e8c0a31fa138f9a62452988aff1f097e Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 1 Nov 2024 16:35:01 +0800 Subject: [PATCH 2/6] chore: add package query --- app-unpriv/src/main/AndroidManifest.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app-unpriv/src/main/AndroidManifest.xml b/app-unpriv/src/main/AndroidManifest.xml index e72b112..cb1ef5f 100644 --- a/app-unpriv/src/main/AndroidManifest.xml +++ b/app-unpriv/src/main/AndroidManifest.xml @@ -22,9 +22,12 @@ + android:exported="false" + android:label="@string/compatibility_check" /> + + + \ No newline at end of file -- 2.45.3 From 8eef768a023ea002ea25f817788ffb3cbd09fd07 Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 1 Nov 2024 18:34:33 +0800 Subject: [PATCH 3/6] refactor --- app-common/src/main/res/values/strings.xml | 2 -- .../ui/UnprivilegedEuiccManagementFragment.kt | 31 ++++++------------- .../im/angry/openeuicc/util/SIMToolkit.kt | 21 +++++++++++++ .../main/res/menu/fragment_sim_toolkit.xml | 0 app-unpriv/src/main/res/values/strings.xml | 1 + 5 files changed, 31 insertions(+), 24 deletions(-) create mode 100644 app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt rename {app-common => app-unpriv}/src/main/res/menu/fragment_sim_toolkit.xml (100%) diff --git a/app-common/src/main/res/values/strings.xml b/app-common/src/main/res/values/strings.xml index 5e4dcf0..0278ffa 100644 --- a/app-common/src/main/res/values/strings.xml +++ b/app-common/src/main/res/values/strings.xml @@ -94,6 +94,4 @@ App Version Source Code https://gitea.angry.im/PeterCxy/OpenEUICC - - Open SIM Toolkit \ No newline at end of file diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt index f092a8b..7f5e93f 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt @@ -1,15 +1,14 @@ package im.angry.openeuicc.ui -import android.content.ComponentName -import android.content.Intent -import android.content.pm.PackageManager.NameNotFoundException import android.view.Menu import android.view.MenuInflater import android.view.MenuItem -import im.angry.openeuicc.common.R +import im.angry.easyeuicc.R +import im.angry.openeuicc.core.EuiccChannelManager import im.angry.openeuicc.util.channel +import im.angry.openeuicc.util.intentSTK +import im.angry.openeuicc.util.isInstalledSTK import im.angry.openeuicc.util.newInstanceEuicc -import im.angry.openeuicc.util.slotId class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { companion object { @@ -22,29 +21,17 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.fragment_sim_toolkit, menu) - - menu.findItem(R.id.open_sim_toolkit).let { - val supported = try { - requireContext().packageManager.getPackageInfo("com.android.stk", 0) - true - } catch (_: NameNotFoundException) { - false - } - it.isVisible = slotId != -1 && supported + menu.findItem(R.id.open_sim_toolkit).isVisible = when (channel.logicalSlotId) { + -1 -> false + EuiccChannelManager.USB_CHANNEL_ID -> false + else -> isInstalledSTK(requireContext()) } } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.open_sim_toolkit -> { - Intent(Intent.ACTION_MAIN, null).apply { - addCategory(Intent.CATEGORY_LAUNCHER) - component = ComponentName( - "com.android.stk", - "com.android.stk.StkMain${channel.slotId + 1}" - ) - startActivity(this) - } + startActivity(intentSTK(channel.logicalSlotId)) true } diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt new file mode 100644 index 0000000..b2ffffb --- /dev/null +++ b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt @@ -0,0 +1,21 @@ +package im.angry.openeuicc.util + +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager.NameNotFoundException + +fun isInstalledSTK(context: Context): Boolean = + try { + context.packageManager.getPackageInfo("com.android.stk", 0) + true + } catch (_: NameNotFoundException) { + false + } + +fun intentSTK(slotId: Int) = Intent().apply { + action = Intent.ACTION_MAIN + flags = Intent.FLAG_ACTIVITY_NEW_TASK + component = ComponentName("com.android.stk", "com.android.stk.StkMain${slotId + 1}") + addCategory(Intent.CATEGORY_LAUNCHER) +} \ No newline at end of file diff --git a/app-common/src/main/res/menu/fragment_sim_toolkit.xml b/app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml similarity index 100% rename from app-common/src/main/res/menu/fragment_sim_toolkit.xml rename to app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml diff --git a/app-unpriv/src/main/res/values/strings.xml b/app-unpriv/src/main/res/values/strings.xml index 124bedf..5abc4bf 100644 --- a/app-unpriv/src/main/res/values/strings.xml +++ b/app-unpriv/src/main/res/values/strings.xml @@ -2,6 +2,7 @@ EasyEUICC SIM %d Compatibility Check + Open SIM Toolkit System Features -- 2.45.3 From d61ea21774266043bd6fe8f7c43c658da007e6f6 Mon Sep 17 00:00:00 2001 From: septs Date: Fri, 1 Nov 2024 19:19:46 +0800 Subject: [PATCH 4/6] chore:simplify logic --- .../ui/UnprivilegedEuiccManagementFragment.kt | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt index 7f5e93f..d264ca8 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt @@ -4,11 +4,11 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import im.angry.easyeuicc.R -import im.angry.openeuicc.core.EuiccChannelManager -import im.angry.openeuicc.util.channel import im.angry.openeuicc.util.intentSTK import im.angry.openeuicc.util.isInstalledSTK +import im.angry.openeuicc.util.isUsb import im.angry.openeuicc.util.newInstanceEuicc +import im.angry.openeuicc.util.slotId class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { companion object { @@ -21,17 +21,14 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.fragment_sim_toolkit, menu) - menu.findItem(R.id.open_sim_toolkit).isVisible = when (channel.logicalSlotId) { - -1 -> false - EuiccChannelManager.USB_CHANNEL_ID -> false - else -> isInstalledSTK(requireContext()) - } + menu.findItem(R.id.open_sim_toolkit).isVisible = + slotId != -1 && !isUsb && isInstalledSTK(requireContext()) } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.open_sim_toolkit -> { - startActivity(intentSTK(channel.logicalSlotId)) + startActivity(intentSTK(slotId)) true } -- 2.45.3 From 6c47afafa9ff8784ba2360df2ddc0690f0be213d Mon Sep 17 00:00:00 2001 From: septs Date: Sat, 2 Nov 2024 08:32:02 +0800 Subject: [PATCH 5/6] fix: add stk fallback --- .../ui/UnprivilegedEuiccManagementFragment.kt | 6 +++++- .../main/java/im/angry/openeuicc/util/SIMToolkit.kt | 12 ++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt index d264ca8..0a93cee 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt @@ -28,7 +28,11 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.open_sim_toolkit -> { - startActivity(intentSTK(slotId)) + try { + startActivity(intentSTK(slotId)) + } catch (_: Exception) { + startActivity(intentSTK(null)) + } true } diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt index b2ffffb..2014d53 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt @@ -13,9 +13,17 @@ fun isInstalledSTK(context: Context): Boolean = false } -fun intentSTK(slotId: Int) = Intent().apply { +fun intentSTK(slotId: Int?) = Intent().apply { + val pkgName = "com.android.stk" action = Intent.ACTION_MAIN flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName("com.android.stk", "com.android.stk.StkMain${slotId + 1}") + component = ComponentName( + pkgName, + when (slotId) { + 0 -> "${pkgName}.StkMain1" + 1 -> "${pkgName}.StkMain2" + else -> "${pkgName}.StkMain" + }, + ) addCategory(Intent.CATEGORY_LAUNCHER) } \ No newline at end of file -- 2.45.3 From a1d6068b4a75ffa337486ecc4e42c0d1d63cb542 Mon Sep 17 00:00:00 2001 From: septs Date: Sat, 2 Nov 2024 11:01:52 +0800 Subject: [PATCH 6/6] chore: simplify logic --- .../ui/UnprivilegedEuiccManagementFragment.kt | 14 +++---- .../im/angry/openeuicc/util/SIMToolkit.kt | 38 +++++++++---------- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt index 0a93cee..dceece2 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt @@ -1,15 +1,16 @@ package im.angry.openeuicc.ui +import android.util.Log import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import im.angry.easyeuicc.R -import im.angry.openeuicc.util.intentSTK -import im.angry.openeuicc.util.isInstalledSTK +import im.angry.openeuicc.util.SIMToolkit import im.angry.openeuicc.util.isUsb import im.angry.openeuicc.util.newInstanceEuicc import im.angry.openeuicc.util.slotId + class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { companion object { const val TAG = "UnprivilegedEuiccManagementFragment" @@ -22,17 +23,14 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() { super.onCreateOptionsMenu(menu, inflater) inflater.inflate(R.menu.fragment_sim_toolkit, menu) menu.findItem(R.id.open_sim_toolkit).isVisible = - slotId != -1 && !isUsb && isInstalledSTK(requireContext()) + slotId != -1 && !isUsb && SIMToolkit.isInstalled(requireContext()) } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { R.id.open_sim_toolkit -> { - try { - startActivity(intentSTK(slotId)) - } catch (_: Exception) { - startActivity(intentSTK(null)) - } + Log.d(TAG, "Opening SIM Toolkit for SlotId: $slotId") + startActivity(SIMToolkit.intent(requireContext(), slotId)) true } diff --git a/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt index 2014d53..762fead 100644 --- a/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt +++ b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt @@ -5,25 +5,23 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager.NameNotFoundException -fun isInstalledSTK(context: Context): Boolean = - try { - context.packageManager.getPackageInfo("com.android.stk", 0) - true - } catch (_: NameNotFoundException) { - false +object SIMToolkit { + private const val PKG_NAME = "com.android.stk" + + fun isInstalled(context: Context): Boolean = context.let { + try { + it.packageManager.getPackageInfo(PKG_NAME, 0) + true + } catch (_: NameNotFoundException) { + false + } } -fun intentSTK(slotId: Int?) = Intent().apply { - val pkgName = "com.android.stk" - action = Intent.ACTION_MAIN - flags = Intent.FLAG_ACTIVITY_NEW_TASK - component = ComponentName( - pkgName, - when (slotId) { - 0 -> "${pkgName}.StkMain1" - 1 -> "${pkgName}.StkMain2" - else -> "${pkgName}.StkMain" - }, - ) - addCategory(Intent.CATEGORY_LAUNCHER) -} \ No newline at end of file + fun intent(context: Context, slotId: Int): Intent? { + val intent = context.packageManager.getLaunchIntentForPackage(PKG_NAME) ?: return null + if (intent.component?.shortClassName == ".StkMain1" && slotId == 1) { + intent.component = ComponentName(PKG_NAME, "$PKG_NAME.StkMain2") + } + return intent + } +} -- 2.45.3