When the transfer status is CONVERTED, the menu on the pSIM is greyed out.
UX update for converted pSIMs. Bug: 326896614 Test: manual test Change-Id: I68ca181ec16c839ed8dc5dba3f8dc75aba09ab5b
This commit is contained in:
@@ -13186,4 +13186,7 @@
|
|||||||
|
|
||||||
<!--Text for acquire msg on UDFPS devices -->
|
<!--Text for acquire msg on UDFPS devices -->
|
||||||
<string name="fingerprint_acquired_imager_dirty_udfps">Clean your screen near the sensor and try again</string>
|
<string name="fingerprint_acquired_imager_dirty_udfps">Clean your screen near the sensor and try again</string>
|
||||||
|
|
||||||
|
<!-- Provider Model: summary of converted in SIM category. [CHAR LIMIT=50] -->
|
||||||
|
<string name="sim_category_converted_sim">Converted to eSIM. Remove and discard.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
@@ -44,6 +44,7 @@ public class NetworkProviderSimListController extends BasePreferenceController i
|
|||||||
DefaultLifecycleObserver, MobileNetworkRepository.MobileNetworkCallback,
|
DefaultLifecycleObserver, MobileNetworkRepository.MobileNetworkCallback,
|
||||||
DefaultSubscriptionReceiver.DefaultSubscriptionListener {
|
DefaultSubscriptionReceiver.DefaultSubscriptionListener {
|
||||||
|
|
||||||
|
private static final String TAG = "NetworkProviderSimListController";
|
||||||
private final SubscriptionManager mSubscriptionManager;
|
private final SubscriptionManager mSubscriptionManager;
|
||||||
@Nullable
|
@Nullable
|
||||||
private PreferenceCategory mPreferenceCategory;
|
private PreferenceCategory mPreferenceCategory;
|
||||||
@@ -104,6 +105,10 @@ public class NetworkProviderSimListController extends BasePreferenceController i
|
|||||||
final Drawable drawable = mContext.getDrawable(
|
final Drawable drawable = mContext.getDrawable(
|
||||||
info.isEmbedded ? R.drawable.ic_sim_card_download : R.drawable.ic_sim_card);
|
info.isEmbedded ? R.drawable.ic_sim_card_download : R.drawable.ic_sim_card);
|
||||||
pref.setIcon(drawable);
|
pref.setIcon(drawable);
|
||||||
|
if (SubscriptionUtil.isConvertedPsimSubscription(mContext, subId)) {
|
||||||
|
// If the subscription has been converted, disable the profile menu.
|
||||||
|
pref.setEnabled(false);
|
||||||
|
} else {
|
||||||
pref.setOnPreferenceClickListener(clickedPref -> {
|
pref.setOnPreferenceClickListener(clickedPref -> {
|
||||||
if (!info.isEmbedded && !isActiveSubscriptionId
|
if (!info.isEmbedded && !isActiveSubscriptionId
|
||||||
&& !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
|
&& !SubscriptionUtil.showToggleForPhysicalSim(mSubscriptionManager)) {
|
||||||
@@ -114,6 +119,7 @@ public class NetworkProviderSimListController extends BasePreferenceController i
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
mPreferences.put(subId, pref);
|
mPreferences.put(subId, pref);
|
||||||
}
|
}
|
||||||
for (RestrictedPreference pref : existingPreferences.values()) {
|
for (RestrictedPreference pref : existingPreferences.values()) {
|
||||||
@@ -122,6 +128,10 @@ public class NetworkProviderSimListController extends BasePreferenceController i
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence getSummary(SubscriptionInfoEntity subInfo, CharSequence displayName) {
|
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) {
|
if (subInfo.isActiveSubscriptionId) {
|
||||||
CharSequence config = SubscriptionUtil.getDefaultSimConfig(mContext,
|
CharSequence config = SubscriptionUtil.getDefaultSimConfig(mContext,
|
||||||
subInfo.getSubId());
|
subInfo.getSubId());
|
||||||
|
@@ -18,6 +18,7 @@ package com.android.settings.network;
|
|||||||
|
|
||||||
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
|
import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
|
||||||
import static android.telephony.SubscriptionManager.PROFILE_CLASS_PROVISIONING;
|
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 android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT;
|
||||||
|
|
||||||
import static com.android.internal.util.CollectionUtils.emptyIfNull;
|
import static com.android.internal.util.CollectionUtils.emptyIfNull;
|
||||||
@@ -905,4 +906,27 @@ public class SubscriptionUtil {
|
|||||||
context.getSystemService(ConnectivityManager.class);
|
context.getSystemService(ConnectivityManager.class);
|
||||||
return connectivityManager.getNetworkCapabilities(connectivityManager.getActiveNetwork());
|
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<SubscriptionInfo> 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -34,6 +34,7 @@ import android.telephony.SubscriptionInfo;
|
|||||||
import android.telephony.SubscriptionManager;
|
import android.telephony.SubscriptionManager;
|
||||||
import android.telephony.euicc.EuiccManager;
|
import android.telephony.euicc.EuiccManager;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.lifecycle.LifecycleObserver;
|
import androidx.lifecycle.LifecycleObserver;
|
||||||
@@ -42,22 +43,20 @@ import androidx.lifecycle.OnLifecycleEvent;
|
|||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
|
|
||||||
|
import com.android.internal.telephony.flags.Flags;
|
||||||
import com.android.internal.telephony.util.TelephonyUtils;
|
import com.android.internal.telephony.util.TelephonyUtils;
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.network.MobileNetworkRepository;
|
import com.android.settings.network.MobileNetworkRepository;
|
||||||
import com.android.settings.network.SubscriptionUtil;
|
|
||||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||||
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
|
import com.android.settingslib.mobile.dataservice.SubscriptionInfoEntity;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceController implements
|
public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceController implements
|
||||||
LifecycleObserver, MobileNetworkRepository.MobileNetworkCallback {
|
LifecycleObserver, MobileNetworkRepository.MobileNetworkCallback {
|
||||||
|
private static final String TAG = "ConvertToEsimPreference";
|
||||||
private Preference mPreference;
|
private Preference mPreference;
|
||||||
private LifecycleOwner mLifecycleOwner;
|
private LifecycleOwner mLifecycleOwner;
|
||||||
private MobileNetworkRepository mMobileNetworkRepository;
|
private MobileNetworkRepository mMobileNetworkRepository;
|
||||||
@@ -113,14 +112,27 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo
|
|||||||
* To avoid showing users dialogs that can cause confusion,
|
* To avoid showing users dialogs that can cause confusion,
|
||||||
* add conditions to allow conversion in the absence of active eSIM.
|
* add conditions to allow conversion in the absence of active eSIM.
|
||||||
*/
|
*/
|
||||||
if (!mContext.getResources().getBoolean(R.bool.config_psim_conversion_menu_enabled)
|
if (!Flags.supportPsimToEsimConversion()) {
|
||||||
|| !isPsimConversionSupport(subId)) {
|
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;
|
return CONDITIONALLY_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
if (findConversionSupportComponent()) {
|
if (findConversionSupportComponent()) {
|
||||||
return mSubscriptionInfoEntity != null && mSubscriptionInfoEntity.isActiveSubscriptionId
|
return mSubscriptionInfoEntity != null && mSubscriptionInfoEntity.isActiveSubscriptionId
|
||||||
&& !mSubscriptionInfoEntity.isEmbedded && isActiveSubscription(subId)
|
&& !mSubscriptionInfoEntity.isEmbedded && isActiveSubscription(subId)
|
||||||
&& !hasActiveEsimProfiles()
|
|
||||||
? AVAILABLE
|
? AVAILABLE
|
||||||
: CONDITIONALLY_UNAVAILABLE;
|
: CONDITIONALLY_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
@@ -174,24 +186,6 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasActiveEsimProfiles() {
|
|
||||||
SubscriptionManager subscriptionManager = mContext.getSystemService(
|
|
||||||
SubscriptionManager.class);
|
|
||||||
List<SubscriptionInfo> 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() {
|
private boolean findConversionSupportComponent() {
|
||||||
Intent intent = new Intent(EuiccService.ACTION_CONVERT_TO_EMBEDDED_SUBSCRIPTION);
|
Intent intent = new Intent(EuiccService.ACTION_CONVERT_TO_EMBEDDED_SUBSCRIPTION);
|
||||||
PackageManager packageManager = mContext.getPackageManager();
|
PackageManager packageManager = mContext.getPackageManager();
|
||||||
@@ -242,16 +236,4 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo
|
|||||||
}
|
}
|
||||||
return true;
|
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,6 @@ import static android.telephony.TelephonyManager.EXTRA_SUBSCRIPTION_ID;
|
|||||||
import static android.telephony.data.ApnSetting.TYPE_MMS;
|
import static android.telephony.data.ApnSetting.TYPE_MMS;
|
||||||
|
|
||||||
import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
|
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.Notification;
|
||||||
import android.app.NotificationChannel;
|
import android.app.NotificationChannel;
|
||||||
|
Reference in New Issue
Block a user