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 + } } }