Skip to content

Commit d068261

Browse files
septsPeterCxy
authored andcommitted
improve stk menu handling (#162)
Reviewed-on: https://gitea.angry.im/PeterCxy/OpenEUICC/pulls/162 Co-authored-by: septs <github@septs.pw> Co-committed-by: septs <github@septs.pw>
1 parent 6a5d4b9 commit d068261

File tree

2 files changed

+39
-35
lines changed

2 files changed

+39
-35
lines changed

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

+19-12
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.pm.PackageManager
44
import android.provider.Settings
55
import android.view.Menu
66
import android.view.MenuInflater
7+
import android.view.MenuItem
78
import android.widget.Toast
89
import im.angry.easyeuicc.R
910
import im.angry.openeuicc.util.SIMToolkit
@@ -26,21 +27,27 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() {
2627
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
2728
super.onCreateOptionsMenu(menu, inflater)
2829
inflater.inflate(R.menu.fragment_sim_toolkit, menu)
30+
}
31+
32+
override fun onPrepareOptionsMenu(menu: Menu) {
33+
super.onPrepareOptionsMenu(menu)
2934
menu.findItem(R.id.open_sim_toolkit).apply {
30-
val slot = stk[slotId] ?: return@apply
31-
isVisible = slot.intent != null
32-
setOnMenuItemClickListener {
33-
val intent = slot.intent ?: return@setOnMenuItemClickListener false
34-
if (intent.action == Settings.ACTION_APPLICATION_DETAILS_SETTINGS) {
35-
val packageName = intent.data!!.schemeSpecificPart
36-
val label = requireContext().packageManager.getApplicationLabel(packageName)
37-
val message = requireContext().getString(R.string.toast_prompt_to_enable_sim_toolkit, label)
38-
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
39-
}
40-
startActivity(intent)
41-
true
35+
intent = stk[slotId]?.intent
36+
isVisible = intent != null
37+
}
38+
}
39+
40+
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
41+
R.id.open_sim_toolkit -> {
42+
SIMToolkit.getDisabledPackageName(item.intent)?.also { packageName ->
43+
val label = requireContext().packageManager.getApplicationLabel(packageName)
44+
val message = getString(R.string.toast_prompt_to_enable_sim_toolkit, label)
45+
Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show()
4246
}
47+
super.onOptionsItemSelected(item) // handling intent
4348
}
49+
50+
else -> super.onOptionsItemSelected(item)
4451
}
4552
}
4653

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

+20-23
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import android.content.pm.ActivityInfo
77
import android.content.pm.PackageManager
88
import android.net.Uri
99
import android.provider.Settings
10-
import android.widget.Toast
1110
import androidx.annotation.ArrayRes
1211
import im.angry.easyeuicc.R
1312
import im.angry.openeuicc.core.EuiccChannelManager
@@ -32,9 +31,10 @@ class SIMToolkit(private val context: Context) {
3231
data class Slot(private val packageManager: PackageManager, private val components: Set<ComponentName>) {
3332
private val packageNames: Iterable<String>
3433
get() = components.map(ComponentName::getPackageName).toSet()
34+
.filter(packageManager::isInstalledApp)
3535

3636
private val launchIntent: Intent?
37-
get() = packageNames.firstNotNullOfOrNull(packageManager::getLaunchIntent)
37+
get() = packageNames.firstNotNullOfOrNull(packageManager::getLaunchIntentForPackage)
3838

3939
private val activities: Iterable<ComponentName>
4040
get() = packageNames.flatMap(packageManager::getActivities)
@@ -50,23 +50,23 @@ class SIMToolkit(private val context: Context) {
5050
}
5151

5252
private fun getDisabledPackageIntent(): Intent? {
53-
val disabledPackageName = packageNames.find {
54-
try {
55-
isDisabledState(packageManager.getApplicationEnabledSetting(it))
56-
} catch (_: IllegalArgumentException) {
57-
false
58-
}
59-
}
60-
if (disabledPackageName == null) return null
61-
return Intent(
62-
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
63-
Uri.fromParts("package", disabledPackageName, null)
64-
)
53+
val disabledPackageName = packageNames
54+
.find { isDisabledState(packageManager.getApplicationEnabledSetting(it)) }
55+
?: return null
56+
val uri = Uri.fromParts("package", disabledPackageName, null)
57+
return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, uri)
6558
}
6659

6760
val intent: Intent?
6861
get() = getActivityIntent() ?: getDisabledPackageIntent()
6962
}
63+
64+
companion object {
65+
fun getDisabledPackageName(intent: Intent?): String? {
66+
if (intent?.action != Settings.ACTION_APPLICATION_DETAILS_SETTINGS) return null
67+
return intent.data?.schemeSpecificPart
68+
}
69+
}
7070
}
7171

7272
private fun isDisabledState(state: Int) = when (state) {
@@ -75,15 +75,12 @@ private fun isDisabledState(state: Int) = when (state) {
7575
else -> false
7676
}
7777

78-
private fun PackageManager.getLaunchIntent(packageName: String) = try {
79-
getLaunchIntentForPackage(packageName)
78+
private fun PackageManager.isInstalledApp(packageName: String) = try {
79+
getPackageInfo(packageName, 0)
80+
true
8081
} catch (_: PackageManager.NameNotFoundException) {
81-
null
82+
false
8283
}
8384

84-
private fun PackageManager.getActivities(packageName: String) = try {
85-
getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
86-
.activities?.toList() ?: emptyList()
87-
} catch (_: PackageManager.NameNotFoundException) {
88-
emptyList()
89-
}
85+
private fun PackageManager.getActivities(packageName: String) =
86+
getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).activities?.toList() ?: emptyList()

0 commit comments

Comments
 (0)