diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml
index 7279997da00..d5ddb0154c3 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -191,4 +191,7 @@
Maximum capacity
%1$d mAh (%2$d%%)
@string/battery_cycle_count_not_available
+
+
+ eSIM settings
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 756d5213ff0..12ef1268358 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -156,6 +156,8 @@ public final class Utils extends com.android.settingslib.Utils {
public static final String PHONE_PACKAGE_NAME = "com.android.phone";
+ public static final String ESIM_SETTINGS_PACKAGE_NAME = "org.lineageos.settings.esimswitcher";
+
public static final String OS_PKG = "os";
/**
diff --git a/src/com/android/settings/spa/network/SimsSection.kt b/src/com/android/settings/spa/network/SimsSection.kt
index d98129f6ab2..c3bbb24bd40 100644
--- a/src/com/android/settings/spa/network/SimsSection.kt
+++ b/src/com/android/settings/spa/network/SimsSection.kt
@@ -23,6 +23,7 @@ import android.telephony.SubscriptionInfo
import android.telephony.euicc.EuiccManager
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Add
+import androidx.compose.material.icons.outlined.SettingsApplications
import androidx.compose.material.icons.outlined.SimCard
import androidx.compose.material.icons.outlined.SimCardDownload
import androidx.compose.runtime.Composable
@@ -62,6 +63,7 @@ fun SimsSection(subscriptionInfoList: List) {
SimPreference(subInfo)
}
+ EsimSettings()
AddSim()
}
}
@@ -156,6 +158,46 @@ fun getAddSimIntent() = Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTI
putExtra(EuiccManager.EXTRA_FORCE_PROVISION, true)
}
+@Composable
+private fun EsimSettings() {
+ val context = LocalContext.current
+
+ val hasEsimSettingsPackage = remember {
+ try {
+ context.packageManager.getPackageInfo(Utils.ESIM_SETTINGS_PACKAGE_NAME, 0)
+ true
+ } catch (_: Exception) {
+ false
+ }
+ }
+
+ val res = context.resources
+ val euiccSlotsArrayId = remember {
+ res.getIdentifier("non_removable_euicc_slots", "array", "android")
+ }
+ val hasNonRemovableEuicc = remember {
+ euiccSlotsArrayId > 0 && (res.getIntArray(euiccSlotsArrayId)?.isNotEmpty() == true)
+ }
+
+ if (hasEsimSettingsPackage && hasNonRemovableEuicc) {
+ RestrictedPreference(
+ model =
+ object : PreferenceModel {
+ override val title = stringResource(id = R.string.esim_settings_title)
+ override val icon = @Composable { SettingsIcon(Icons.Outlined.SettingsApplications) }
+ override val onClick = { startEsimSettingsFlow(context) }
+ },
+ restrictions = Restrictions(keys = listOf(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)),
+ )
+ }
+}
+
+fun startEsimSettingsFlow(context: Context) = context.startActivity(getEsimSettingsIntent())
+
+fun getEsimSettingsIntent() = Intent("org.lineageos.settings.device.ESIM_SETTINGS").apply {
+ setPackage(Utils.ESIM_SETTINGS_PACKAGE_NAME)
+}
+
fun startSatelliteWarningDialogFlow(context: Context) = context.startActivity(getSatelliteWarningDialogIntent(context))
fun getSatelliteWarningDialogIntent(context: Context) = Intent(context,