Merge "[Settings] Unable to display disabled SIM"

This commit is contained in:
Bonian Chen
2019-12-18 10:41:23 +00:00
committed by Android (Google) Code Review
2 changed files with 165 additions and 12 deletions

View File

@@ -22,10 +22,12 @@ 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;
import android.content.Context; import android.content.Context;
import android.os.ParcelUuid;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.telephony.UiccSlotInfo; import android.telephony.UiccSlotInfo;
import android.text.TextUtils;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
@@ -67,6 +69,12 @@ public class SubscriptionUtil {
slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT; slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT;
} }
/**
* Get all of the subscriptions which is available to display to the user.
*
* @param context {@code Context}
* @return list of {@code SubscriptionInfo}
*/
public static List<SubscriptionInfo> getAvailableSubscriptions(Context context) { public static List<SubscriptionInfo> getAvailableSubscriptions(Context context) {
if (sAvailableResultsForTesting != null) { if (sAvailableResultsForTesting != null) {
return sAvailableResultsForTesting; return sAvailableResultsForTesting;
@@ -74,12 +82,12 @@ public class SubscriptionUtil {
final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class); final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class);
final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class); final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class);
List<SubscriptionInfo> subscriptions = final List<SubscriptionInfo> subscriptions =
new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList())); new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList()));
// Look for inactive but present physical SIMs that are missing from the selectable list. // Look for inactive but present physical SIMs that are missing from the selectable list.
final List<UiccSlotInfo> missing = new ArrayList<>(); final List<UiccSlotInfo> missing = new ArrayList<>();
UiccSlotInfo[] slotsInfo = telMgr.getUiccSlotsInfo(); final UiccSlotInfo[] slotsInfo = telMgr.getUiccSlotsInfo();
for (int i = 0; slotsInfo != null && i < slotsInfo.length; i++) { for (int i = 0; slotsInfo != null && i < slotsInfo.length; i++) {
final UiccSlotInfo slotInfo = slotsInfo[i]; final UiccSlotInfo slotInfo = slotsInfo[i];
if (isInactiveInsertedPSim(slotInfo)) { if (isInactiveInsertedPSim(slotInfo)) {
@@ -93,20 +101,164 @@ public class SubscriptionUtil {
} }
} }
} }
if (!missing.isEmpty()) { if (missing.isEmpty()) {
for (SubscriptionInfo info : subMgr.getAllSubscriptionInfoList()) { return subscriptions;
for (UiccSlotInfo slotInfo : missing) { }
if (info.getSimSlotIndex() == slotInfo.getLogicalSlotIdx() && for (SubscriptionInfo info : subMgr.getAllSubscriptionInfoList()) {
info.getCardString().equals(slotInfo.getCardId())) { for (UiccSlotInfo slotInfo : missing) {
subscriptions.add(info); if (info.getSimSlotIndex() == slotInfo.getLogicalSlotIdx()
break; && info.getCardString().equals(slotInfo.getCardId())) {
} subscriptions.add(info);
break;
} }
} }
} }
return subscriptions; return subscriptions;
} }
/**
* Get subscription which is available to be displayed to the user
* per subscription id.
*
* @param context {@code Context}
* @param subscriptionManager The ProxySubscriptionManager for accessing subcription
* information
* @param subId The id of subscription to be retrieved
* @return {@code SubscriptionInfo} based on the given subscription id. Null of subscription
* is invalid or not allowed to be displayed to the user.
*/
public static SubscriptionInfo getAvailableSubscription(Context context,
ProxySubscriptionManager subscriptionManager, int subId) {
final SubscriptionInfo subInfo = subscriptionManager.getAccessibleSubscriptionInfo(subId);
if (subInfo == null) {
return null;
}
final ParcelUuid groupUuid = subInfo.getGroupUuid();
if (groupUuid != null) {
if (isPrimarySubscriptionWithinSameUuid(getUiccSlotsInfo(context), groupUuid,
subscriptionManager.getAccessibleSubscriptionsInfo(), subId)) {
return subInfo;
}
return null;
}
if (subInfo.isEmbedded()) {
return subInfo;
}
// Look for physical SIM which presented in slots no mater active or not.
final UiccSlotInfo[] slotsInfo = getUiccSlotsInfo(context);
if (slotsInfo == null) {
return null;
}
for (UiccSlotInfo slotInfo : slotsInfo) {
if ((!slotInfo.getIsEuicc())
&& (slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT)
&& (slotInfo.getLogicalSlotIdx() == subInfo.getSimSlotIndex())
&& TextUtils.equals(slotInfo.getCardId(), subInfo.getCardString())) {
return subInfo;
}
}
return null;
}
private static UiccSlotInfo [] getUiccSlotsInfo(Context context) {
final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class);
return telMgr.getUiccSlotsInfo();
}
private static boolean isPrimarySubscriptionWithinSameUuid(UiccSlotInfo[] slotsInfo,
ParcelUuid groupUuid, List<SubscriptionInfo> subscriptions, int subId) {
// only interested in subscriptions with this group UUID
final ArrayList<SubscriptionInfo> physicalSubInfoList =
new ArrayList<SubscriptionInfo>();
final ArrayList<SubscriptionInfo> nonOpportunisticSubInfoList =
new ArrayList<SubscriptionInfo>();
final ArrayList<SubscriptionInfo> activeSlotSubInfoList =
new ArrayList<SubscriptionInfo>();
final ArrayList<SubscriptionInfo> inactiveSlotSubInfoList =
new ArrayList<SubscriptionInfo>();
for (SubscriptionInfo subInfo : subscriptions) {
if (groupUuid.equals(subInfo.getGroupUuid())) {
if (!subInfo.isEmbedded()) {
physicalSubInfoList.add(subInfo);
} else {
if (!subInfo.isOpportunistic()) {
nonOpportunisticSubInfoList.add(subInfo);
}
if (subInfo.getSimSlotIndex()
!= SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
activeSlotSubInfoList.add(subInfo);
} else {
inactiveSlotSubInfoList.add(subInfo);
}
}
}
}
// find any physical SIM which is currently inserted within logical slot
// and which is our target subscription
if ((slotsInfo != null) && (physicalSubInfoList.size() > 0)) {
final SubscriptionInfo subInfo = searchForSubscriptionId(physicalSubInfoList, subId);
if (subInfo == null) {
return false;
}
// verify if subscription is inserted within slot
for (UiccSlotInfo slotInfo : slotsInfo) {
if ((slotInfo != null) && (!slotInfo.getIsEuicc())
&& (slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT)
&& (slotInfo.getLogicalSlotIdx() == subInfo.getSimSlotIndex())
&& TextUtils.equals(slotInfo.getCardId(), subInfo.getCardString())) {
return true;
}
}
return false;
}
// When all of the eSIM profiles are opprtunistic and no physical SIM,
// first opportunistic subscriptions with same group UUID can be primary.
if (nonOpportunisticSubInfoList.size() <= 0) {
if (physicalSubInfoList.size() > 0) {
return false;
}
if (activeSlotSubInfoList.size() > 0) {
return (activeSlotSubInfoList.get(0).getSubscriptionId() == subId);
}
return (inactiveSlotSubInfoList.get(0).getSubscriptionId() == subId);
}
// Allow non-opportunistic + active eSIM subscription as primary
int numberOfActiveNonOpportunisticSubs = 0;
boolean isTargetNonOpportunistic = false;
for (SubscriptionInfo subInfo : nonOpportunisticSubInfoList) {
final boolean isTargetSubInfo = (subInfo.getSubscriptionId() == subId);
if (subInfo.getSimSlotIndex() != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
if (isTargetSubInfo) {
return true;
}
numberOfActiveNonOpportunisticSubs++;
} else {
isTargetNonOpportunistic |= isTargetSubInfo;
}
}
if (numberOfActiveNonOpportunisticSubs > 0) {
return false;
}
return isTargetNonOpportunistic;
}
private static SubscriptionInfo searchForSubscriptionId(List<SubscriptionInfo> subInfoList,
int subscriptionId) {
for (SubscriptionInfo subInfo : subInfoList) {
if (subInfo.getSubscriptionId() == subscriptionId) {
return subInfo;
}
}
return null;
}
public static String getDisplayName(SubscriptionInfo info) { public static String getDisplayName(SubscriptionInfo info) {
final CharSequence name = info.getDisplayName(); final CharSequence name = info.getDisplayName();
if (name != null) { if (name != null) {

View File

@@ -35,6 +35,7 @@ import com.android.internal.util.CollectionUtils;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.SettingsBaseActivity; import com.android.settings.core.SettingsBaseActivity;
import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.network.ProxySubscriptionManager;
import com.android.settings.network.SubscriptionUtil;
import java.util.List; import java.util.List;
@@ -161,8 +162,8 @@ public class MobileNetworkActivity extends SettingsBaseActivity
@VisibleForTesting @VisibleForTesting
SubscriptionInfo getSubscription() { SubscriptionInfo getSubscription() {
if (mCurSubscriptionId != SUB_ID_NULL) { if (mCurSubscriptionId != SUB_ID_NULL) {
final SubscriptionInfo subInfo = final SubscriptionInfo subInfo = SubscriptionUtil.getAvailableSubscription(
mProxySubscriptionMgr.getActiveSubscriptionInfo(mCurSubscriptionId); this, mProxySubscriptionMgr, mCurSubscriptionId);
if (subInfo != null) { if (subInfo != null) {
return subInfo; return subInfo;
} }