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
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..dceece2
--- /dev/null
+++ b/app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt
@@ -0,0 +1,39 @@
+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.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"
+
+ 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).isVisible =
+ slotId != -1 && !isUsb && SIMToolkit.isInstalled(requireContext())
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean =
+ when (item.itemId) {
+ R.id.open_sim_toolkit -> {
+ Log.d(TAG, "Opening SIM Toolkit for SlotId: $slotId")
+ startActivity(SIMToolkit.intent(requireContext(), slotId))
+ true
+ }
+
+ else -> super.onOptionsItemSelected(item)
+ }
+}
\ No newline at end of file
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..762fead
--- /dev/null
+++ b/app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt
@@ -0,0 +1,27 @@
+package im.angry.openeuicc.util
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.pm.PackageManager.NameNotFoundException
+
+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 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
+ }
+}
diff --git a/app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml b/app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml
new file mode 100644
index 0000000..610b3a1
--- /dev/null
+++ b/app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
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