Compare commits

..

7 commits

Author SHA1 Message Date
40d97f0291
refactor: sim toolkit 2025-03-05 14:56:35 +08:00
d9cbef886e
fix: strings 2025-03-05 14:34:30 +08:00
cc5f798d3d
fix: strings 2025-03-05 14:32:23 +08:00
e24523f3e2
refactor: sim toolkit 2025-03-05 14:20:55 +08:00
e47eca289b
refactor: sim toolkit 2025-03-05 13:59:29 +08:00
698021c7f4
refactor: sim toolkit 2025-03-05 13:42:44 +08:00
9873634de7
chore: rename strings name 2025-03-05 13:20:19 +08:00
2 changed files with 51 additions and 48 deletions

View file

@ -24,10 +24,8 @@ class UnprivilegedEuiccManagementFragment : EuiccManagementFragment() {
super.onCreateOptionsMenu(menu, inflater) super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.fragment_sim_toolkit, menu) inflater.inflate(R.menu.fragment_sim_toolkit, menu)
menu.findItem(R.id.open_sim_toolkit).apply { menu.findItem(R.id.open_sim_toolkit).apply {
val slot = stk[slotId] isVisible = stk.isAvailable(slotId)
if (slot == null) return@apply setOnMenuItemClickListener { stk.launch(slotId) }
isVisible = true
setOnMenuItemClickListener { slot.launch() }
} }
} }
} }

View file

@ -3,6 +3,7 @@ package im.angry.openeuicc.util
import android.content.ComponentName import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.net.Uri import android.net.Uri
import android.provider.Settings import android.provider.Settings
@ -20,37 +21,36 @@ class SIMToolkit(private val context: Context) {
put(1, getComponentNames(R.array.sim_toolkit_slot_2)) put(1, getComponentNames(R.array.sim_toolkit_slot_2))
} }
operator fun get(slotId: Int): Slot? = when (slotId) { private val packageNames: Iterable<String>
-1, EuiccChannelManager.USB_CHANNEL_ID -> null get() = slots.values.flatten().map { it.packageName }.toSet()
else -> Slot(context, buildSet {
addAll(slots.getOrDefault(slotId, emptySet())) private val activities: Iterable<ComponentName>
addAll(slots.getOrDefault(-1, emptySet())) get() = packageNames.flatMap(context.packageManager::getActivities)
}) .filter { it.exported }
.map { ComponentName(it.packageName, it.name) }
private val launchIntent: Intent?
get() = packageNames.firstNotNullOfOrNull(context.packageManager::getLaunchIntent)
private fun getComponentsBySlotId(slotId: Int) = buildSet {
addAll(slots.getOrDefault(slotId, emptySet()))
addAll(slots.getOrDefault(-1, emptySet()))
} }
data class Slot(private val context: Context, private val components: Set<ComponentName>) { private fun intentActivity(slotId: Int): Intent? {
private val packageNames: Iterable<String> val component = getComponentsBySlotId(slotId).find(activities::contains)
get() = components.map { it.packageName }.toSet() ?: return launchIntent
val disabled = try {
private val launchIntent: Intent? isDisabledState(context.packageManager.getComponentEnabledSetting(component))
get() = packageNames.firstNotNullOfOrNull(context.packageManager::getLaunchIntent) } catch (e: IllegalArgumentException) {
true
private val activities: Iterable<ComponentName>
get() = packageNames.flatMap(context.packageManager::getActivities)
.filter { it.exported }.map { ComponentName(it.packageName, it.name) }
private fun getIntent(): Intent? {
try {
val component = components.find(activities::contains) ?: return launchIntent
if (isDisabledState(context.packageManager.getComponentEnabledSetting(component)))
return null
return Intent.makeMainActivity(component)
} catch (e: IllegalArgumentException) {
return null
}
} }
if (disabled) return null
return Intent.makeMainActivity(component)
}
private fun getDisabledPackageName() = packageNames.find { private fun getDisabledPackageName(slotId: Int) =
getComponentsBySlotId(slotId).map { it.packageName }.toSet().find {
try { try {
isDisabledState(context.packageManager.getApplicationEnabledSetting(it)) isDisabledState(context.packageManager.getApplicationEnabledSetting(it))
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
@ -58,23 +58,28 @@ class SIMToolkit(private val context: Context) {
} }
} }
fun launch(): Boolean { fun isAvailable(slotId: Int) = when (slotId) {
var intent = getIntent() -1 -> false
if (intent == null) { EuiccChannelManager.USB_CHANNEL_ID -> false
val pkgName = getDisabledPackageName() ?: return false else -> intentActivity(slotId) != null || getDisabledPackageName(slotId) != null
val message = context.getString( }
R.string.toast_prompt_to_enable_sim_toolkit,
context.packageManager.getApplicationLabel(pkgName) fun launch(slotId: Int): Boolean {
) var intent = intentActivity(slotId)
intent = Intent( if (intent == null) {
Settings.ACTION_APPLICATION_DETAILS_SETTINGS, val pkgName = getDisabledPackageName(slotId) ?: return false
Uri.fromParts("package", pkgName, null) val message = context.getString(
) R.string.toast_prompt_to_enable_sim_toolkit,
Toast.makeText(context, message, Toast.LENGTH_LONG).show() context.packageManager.getApplicationLabel(pkgName)
} )
context.startActivity(intent) intent = Intent(
return true Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", pkgName, null)
)
Toast.makeText(context, message, Toast.LENGTH_LONG).show()
} }
context.startActivity(intent)
return true
} }
} }
@ -97,5 +102,5 @@ private fun PackageManager.getActivities(packageName: String) = try {
getPackageInfo(packageName, PackageManager.GET_ACTIVITIES) getPackageInfo(packageName, PackageManager.GET_ACTIVITIES)
.activities?.toList() ?: emptyList() .activities?.toList() ?: emptyList()
} catch (_: PackageManager.NameNotFoundException) { } catch (_: PackageManager.NameNotFoundException) {
emptyList() emptyList<ActivityInfo>()
} }