feat: open stk from menu #56
6 changed files with 87 additions and 2 deletions
|
@ -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>
|
|
@ -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()
|
||||||
}
|
}
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
9
app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml
Normal file
9
app-unpriv/src/main/res/menu/fragment_sim_toolkit.xml
Normal 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>
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue