diff --git a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
index d6ffa32..2d0b67d 100644
--- a/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/ui/EuiccManagementFragment.kt
@@ -29,7 +29,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
-import net.typeblog.lpac_jni.LocalProfileNotification
import java.lang.Exception
open class EuiccManagementFragment : Fragment(), EuiccFragmentMarker, EuiccProfilesChangedListener {
@@ -159,6 +158,14 @@ open class EuiccManagementFragment : Fragment(), EuiccFragmentMarker, EuiccProfi
preferenceRepository.notificationDisableFlow.first()
}
+ protected open fun populatePopupWithProfileActions(popup: PopupMenu, profile: LocalProfileInfo) {
+ popup.inflate(R.menu.profile_options)
+ if (profile.isEnabled) {
+ popup.menu.findItem(R.id.enable).isVisible = false
+ popup.menu.findItem(R.id.delete).isVisible = false
+ }
+ }
+
sealed class ViewHolder(root: View) : RecyclerView.ViewHolder(root) {
enum class Type(val value: Int) {
PROFILE(0),
@@ -208,7 +215,7 @@ open class EuiccManagementFragment : Fragment(), EuiccFragmentMarker, EuiccProfi
name.text = profile.displayName
state.setText(
- if (isEnabled()) {
+ if (profile.isEnabled) {
R.string.enabled
} else {
R.string.disabled
@@ -219,19 +226,10 @@ open class EuiccManagementFragment : Fragment(), EuiccFragmentMarker, EuiccProfi
iccid.transformationMethod = PasswordTransformationMethod.getInstance()
}
- private fun isEnabled(): Boolean =
- profile.state == LocalProfileInfo.State.Enabled
-
private fun showOptionsMenu() {
PopupMenu(root.context, profileMenu).apply {
setOnMenuItemClickListener(::onMenuItemClicked)
- inflate(R.menu.profile_options)
- if (isEnabled()) {
- menu.findItem(R.id.enable).isVisible = false
- menu.findItem(R.id.delete).isVisible = false
- } else {
- menu.findItem(R.id.disable).isVisible = false
- }
+ populatePopupWithProfileActions(this, profile)
show()
}
}
diff --git a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt
index e5a7d2e..6e6f162 100644
--- a/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt
+++ b/app-common/src/main/java/im/angry/openeuicc/util/Utils.kt
@@ -2,6 +2,7 @@ package im.angry.openeuicc.util
import android.content.Context
import android.content.pm.PackageManager
+import net.typeblog.lpac_jni.LocalProfileInfo
import java.lang.RuntimeException
val Context.selfAppVersion: String
@@ -11,4 +12,7 @@ val Context.selfAppVersion: String
pInfo.versionName
} catch (e: PackageManager.NameNotFoundException) {
throw RuntimeException(e)
- }
\ No newline at end of file
+ }
+
+val LocalProfileInfo.isEnabled: Boolean
+ get() = state == LocalProfileInfo.State.Enabled
\ No newline at end of file
diff --git a/app-common/src/main/res/menu/profile_options.xml b/app-common/src/main/res/menu/profile_options.xml
index 4c9bede..6add53d 100644
--- a/app-common/src/main/res/menu/profile_options.xml
+++ b/app-common/src/main/res/menu/profile_options.xml
@@ -6,6 +6,7 @@
-
euiccManager.findEuiccChannelByPortBlocking(mapping.physicalSlotIndex, mapping.portIndex)?.let { channel ->
- return@mapNotNull channel.lpa.disableActiveProfileWithUndo()
+ if (!channel.removable) {
+ return@mapNotNull channel.lpa.disableActiveProfileWithUndo()
+ } else {
+ // Do not do anything for external eUICCs -- we can't really trust them to work properly
+ // with no profile enabled.
+ return@mapNotNull null
+ }
}
}