feat: open stk from menu #57

Merged
PeterCxy merged 2 commits from septs/OpenEUICC:stk into master 2024-11-02 19:29:41 +01:00
6 changed files with 99 additions and 2 deletions

View file

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

View file

@ -1,9 +1,15 @@
package im.angry.openeuicc.di package im.angry.openeuicc.di
import androidx.fragment.app.Fragment 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 import im.angry.openeuicc.ui.UnprivilegedNoEuiccPlaceholderFragment
class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() { class UnprivilegedUiComponentFactory : DefaultUiComponentFactory() {
override fun createEuiccManagementFragment(channel: EuiccChannel): EuiccManagementFragment =
UnprivilegedEuiccManagementFragment.newInstance(channel.slotId, channel.portId)
override fun createNoEuiccPlaceholderFragment(): Fragment = override fun createNoEuiccPlaceholderFragment(): Fragment =
UnprivilegedNoEuiccPlaceholderFragment() UnprivilegedNoEuiccPlaceholderFragment()
} }

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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>

View file

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