diff --git a/res/values/strings.xml b/res/values/strings.xml index daccf46e22b..4d0b92dda95 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -13186,4 +13186,7 @@ Clean your screen near the sensor and try again + + + Converted to eSIM. Remove and discard. diff --git a/src/com/android/settings/network/NetworkProviderSimListController.java b/src/com/android/settings/network/NetworkProviderSimListController.java index 02b19802df2..46a66a6cba4 100644 --- a/src/com/android/settings/network/NetworkProviderSimListController.java +++ b/src/com/android/settings/network/NetworkProviderSimListController.java @@ -44,6 +44,7 @@ public class NetworkProviderSimListController extends BasePreferenceController i DefaultLifecycleObserver, MobileNetworkRepository.MobileNetworkCallback, DefaultSubscriptionReceiver.DefaultSubscriptionListener { + private static final String TAG = "NetworkProviderSimListController"; private final SubscriptionManager mSubscriptionManager; @Nullable private PreferenceCategory mPreferenceCategory; @@ -104,16 +105,21 @@ public class NetworkProviderSimListController extends BasePreferenceController i final Drawable drawable = mContext.getDrawable( info.isEmbedded ? R.drawable.ic_sim_card_download : R.drawable.ic_sim_card); pref.setIcon(drawable); - pref.setOnPreferenceClickListener(clickedPref -> { - if (!info.isEmbedded && !isActiveSubscriptionId - && !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) { - SubscriptionUtil.startToggleSubscriptionDialogActivity(mContext, subId, - true); - } else { - MobileNetworkUtils.launchMobileNetworkSettings(mContext, info); - } - return true; - }); + if (SubscriptionUtil.isConvertedPsimSubscription(mContext, subId)) { + // If the subscription has been converted, disable the profile menu. + pref.setEnabled(false); + } else { + pref.setOnPreferenceClickListener(clickedPref -> { + if (!info.isEmbedded && !isActiveSubscriptionId + && !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) { + SubscriptionUtil.startToggleSubscriptionDialogActivity(mContext, subId, + true); + } else { + MobileNetworkUtils.launchMobileNetworkSettings(mContext, info); + } + return true; + }); + } mPreferences.put(subId, pref); } for (RestrictedPreference pref : existingPreferences.values()) { @@ -122,6 +128,10 @@ public class NetworkProviderSimListController extends BasePreferenceController i } public CharSequence getSummary(SubscriptionInfoEntity subInfo, CharSequence displayName) { + if (!subInfo.isEmbedded + && SubscriptionUtil.isConvertedPsimSubscription(mContext, subInfo.getSubId())) { + return mContext.getString(R.string.sim_category_converted_sim); + } if (subInfo.isActiveSubscriptionId) { CharSequence config = SubscriptionUtil.getDefaultSimConfig(mContext, subInfo.getSubId()); diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index 56381e263b3..1ab3ed56e6b 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -18,6 +18,7 @@ package com.android.settings.network; import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX; import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING; +import static android.telephony.SubscriptionManager.TRANSFER_STATUS_CONVERTED; import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT; import static com.android.internal.util.CollectionUtils.emptyIfNull; @@ -905,4 +906,27 @@ public class SubscriptionUtil { context.getSystemService(ConnectivityManager.class); return connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork()); } + + /** + * Checks if the subscription with the given subId is converted pSIM. + * + * @param context {@code Context} + * @param subId The subscription ID. + */ + static boolean isConvertedPsimSubscription(@NonNull Context context, int subId) { + SubscriptionManager subscriptionManager = context.getSystemService( + SubscriptionManager.class); + List allSubInofs = subscriptionManager.getAllSubscriptionInfoList(); + for (SubscriptionInfo subInfo : allSubInofs) { + if (subInfo != null) { + if (com.android.internal.telephony.flags.Flags.supportPsimToEsimConversion() + && subInfo.getSubscriptionId() == subId + && !subInfo.isEmbedded() + && subInfo.getTransferStatus() == TRANSFER_STATUS_CONVERTED) { + return true; + } + } + } + return false; + } } diff --git a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java index 08e993b6cde..cf1350c8cb9 100644 --- a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java +++ b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java @@ -34,6 +34,7 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.euicc.EuiccManager; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; @@ -42,22 +43,20 @@ import androidx.lifecycle.OnLifecycleEvent; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.TelephonyUtils; -import com.android.settings.R; import com.android.settings.network.MobileNetworkRepository; -import com.android.settings.network.SubscriptionUtil; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceController implements LifecycleObserver, MobileNetworkRepository.MobileNetworkCallback { - + private static final String TAG = "ConvertToEsimPreference"; private Preference mPreference; private LifecycleOwner mLifecycleOwner; private MobileNetworkRepository mMobileNetworkRepository; @@ -113,14 +112,27 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo * To avoid showing users dialogs that can cause confusion, * add conditions to allow conversion in the absence of active eSIM. */ - if (!mContext.getResources().getBoolean(R.bool.config_psim_conversion_menu_enabled) - || !isPsimConversionSupport(subId)) { + if (!Flags.supportPsimToEsimConversion()) { + Log.d(TAG, "supportPsimToEsimConversion flag is not enabled"); + return CONDITIONALLY_UNAVAILABLE; + } + + SubscriptionManager subscriptionManager = mContext.getSystemService( + SubscriptionManager.class); + SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfo(subId); + if (subInfo == null) { + return CONDITIONALLY_UNAVAILABLE; + } + EuiccManager euiccManager = (EuiccManager) + mContext.getSystemService(Context.EUICC_SERVICE); + if (!euiccManager.isPsimConversionSupported(subInfo.getCarrierId())) { + Log.i(TAG, "subId is not matched with pSIM conversion" + + " supported carriers:" + subInfo.getCarrierId()); return CONDITIONALLY_UNAVAILABLE; } if (findConversionSupportComponent()) { return mSubscriptionInfoEntity != null && mSubscriptionInfoEntity.isActiveSubscriptionId && !mSubscriptionInfoEntity.isEmbedded && isActiveSubscription(subId) - && !hasActiveEsimProfiles() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @@ -174,24 +186,6 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo return true; } - private boolean hasActiveEsimProfiles() { - SubscriptionManager subscriptionManager = mContext.getSystemService( - SubscriptionManager.class); - List subscriptionInfoList = - SubscriptionUtil.getActiveSubscriptions(subscriptionManager); - if (subscriptionInfoList == null || subscriptionInfoList.isEmpty()) { - return false; - } - int activatedEsimCount = (int) subscriptionInfoList - .stream() - .filter(SubscriptionInfo::isEmbedded) - .count(); - if (activatedEsimCount > 0) { - return true; - } - return false; - } - private boolean findConversionSupportComponent() { Intent intent = new Intent(EuiccService.ACTION_CONVERT_TO_EMBEDDED_SUBSCRIPTION); PackageManager packageManager = mContext.getPackageManager(); @@ -242,16 +236,4 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo } return true; } - - private boolean isPsimConversionSupport(int subId) { - SubscriptionManager subscriptionManager = mContext.getSystemService( - SubscriptionManager.class); - SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfo(subId); - if (subInfo == null) { - return false; - } - final int[] supportedCarriers = mContext.getResources().getIntArray( - R.array.config_psim_conversion_menu_enabled_carrier); - return Arrays.stream(supportedCarriers).anyMatch(id -> id == subInfo.getCarrierId()); - } } diff --git a/src/com/android/settings/sim/SimSelectNotification.java b/src/com/android/settings/sim/SimSelectNotification.java index 9b235cea931..2a05105ff37 100644 --- a/src/com/android/settings/sim/SimSelectNotification.java +++ b/src/com/android/settings/sim/SimSelectNotification.java @@ -33,7 +33,6 @@ import static android.telephony.TelephonyManager.EXTRA_SUBSCRIPTION_ID; import static android.telephony.data.ApnSetting.TYPE_MMS; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; -import static com.android.settings.sim.SimDialogActivity.PICK_DISMISS; import android.app.Notification; import android.app.NotificationChannel;