浏览代码

feat: open stk from menu (#57)

Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/57
Co-authored-by: septs <github@septs.pw>
Co-committed-by: septs <github@septs.pw>
septs 1 年之前
父节点
当前提交
87eb497f40

+ 5 - 2
app-unpriv/src/main/AndroidManifest.xml

@@ -22,9 +22,12 @@
 
         <activity
             android:name="im.angry.openeuicc.ui.CompatibilityCheckActivity"
-            android:label="@string/compatibility_check"
-            android:exported="false" />
+            android:exported="false"
+            android:label="@string/compatibility_check" />
 
     </application>
 
+    <queries>
+        <package android:name="com.android.stk" />
+    </queries>
 </manifest>

+ 6 - 0
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()
 }

+ 40 - 0
app-unpriv/src/main/java/im/angry/openeuicc/ui/UnprivilegedEuiccManagementFragment.kt

@@ -0,0 +1,40 @@
+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 =
+            SIMToolkit.getComponentName(requireContext(), slotId) != null
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean =
+        when (item.itemId) {
+            R.id.open_sim_toolkit -> {
+                val intent = SIMToolkit.intent(requireContext(), slotId)
+                Log.d(TAG, "Opening SIM Toolkit for $slotId slot, intent: $intent")
+                startActivity(intent)
+                true
+            }
+
+            else -> super.onOptionsItemSelected(item)
+        }
+}

+ 38 - 0
app-unpriv/src/main/java/im/angry/openeuicc/util/SIMToolkit.kt

@@ -0,0 +1,38 @@
+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 val slot1activities = arrayOf(
+        ComponentName("com.android.stk", "com.android.stk.StkMain1"),
+    )
+
+    private val slot2activities = arrayOf(
+        ComponentName("com.android.stk", "com.android.stk.StkMain2"),
+    )
+
+    fun getComponentName(context: Context, slotId: Int): ComponentName? {
+        val components = when (slotId) {
+            0 -> slot1activities
+            1 -> slot2activities
+            else -> return null
+        }
+        return components.find {
+            try {
+                context.packageManager.getActivityIcon(it)
+                true
+            } catch (_: NameNotFoundException) {
+                false
+            }
+        }
+    }
+
+    fun intent(context: Context, slotId: Int) = Intent(Intent.ACTION_MAIN, null).apply {
+        flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        component = getComponentName(context, slotId)
+        addCategory(Intent.CATEGORY_LAUNCHER)
+    }
+}

+ 9 - 0
app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/open_sim_toolkit"
+        android:title="@string/open_sim_toolkit"
+        android:visible="false"
+        app:showAsAction="never" />
+</menu>

+ 1 - 0
app-unpriv/src/main/res/values/strings.xml

@@ -2,6 +2,7 @@
     <string name="app_name" translatable="false">EasyEUICC</string>
     <string name="channel_name_format">SIM %d</string>
     <string name="compatibility_check">Compatibility Check</string>
+    <string name="open_sim_toolkit">Open SIM Toolkit</string>
 
     <!-- Compatibility Check Descriptions -->
     <string name="compatibility_check_system_features">System Features</string>