feat: open stk from menu #56

Closed
septs wants to merge 6 commits from septs:stk into master
6 changed files with 87 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,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)
}
}

View file

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

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>