feat: open stk from menu #57
6 changed files with 99 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,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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
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