/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.network; import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX; import static android.telephony.UiccSlotInfo.CARD_STATE_INFO_PRESENT; import static com.android.internal.util.CollectionUtils.emptyIfNull; import android.content.Context; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.UiccSlotInfo; import androidx.annotation.VisibleForTesting; import java.util.ArrayList; import java.util.List; public class SubscriptionUtil { private static final String TAG = "SubscriptionUtil"; private static List sAvailableResultsForTesting; private static List sActiveResultsForTesting; @VisibleForTesting public static void setAvailableSubscriptionsForTesting(List results) { sAvailableResultsForTesting = results; } @VisibleForTesting public static void setActiveSubscriptionsForTesting(List results) { sActiveResultsForTesting = results; } public static List getActiveSubscriptions(SubscriptionManager manager) { if (sActiveResultsForTesting != null) { return sActiveResultsForTesting; } final List subscriptions = manager.getActiveSubscriptionInfoList(true); if (subscriptions == null) { return new ArrayList<>(); } return subscriptions; } @VisibleForTesting static boolean isInactiveInsertedPSim(UiccSlotInfo slotInfo) { if (slotInfo == null) { return false; } return !slotInfo.getIsEuicc() && !slotInfo.getIsActive() && slotInfo.getCardStateInfo() == CARD_STATE_INFO_PRESENT; } public static List getAvailableSubscriptions(Context context) { if (sAvailableResultsForTesting != null) { return sAvailableResultsForTesting; } final SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class); final TelephonyManager telMgr = context.getSystemService(TelephonyManager.class); List subscriptions = new ArrayList<>(emptyIfNull(subMgr.getSelectableSubscriptionInfoList())); // Look for inactive but present physical SIMs that are missing from the selectable list. final List missing = new ArrayList<>(); UiccSlotInfo[] slotsInfo = telMgr.getUiccSlotsInfo(); for (int i = 0; slotsInfo != null && i < slotsInfo.length; i++) { final UiccSlotInfo slotInfo = slotsInfo[i]; if (isInactiveInsertedPSim(slotInfo)) { final int index = slotInfo.getLogicalSlotIdx(); final String cardId = slotInfo.getCardId(); final boolean found = subscriptions.stream().anyMatch(info -> index == info.getSimSlotIndex() && cardId.equals(info.getCardString())); if (!found) { missing.add(slotInfo); } } } if (!missing.isEmpty()) { for (SubscriptionInfo info : subMgr.getAllSubscriptionInfoList()) { for (UiccSlotInfo slotInfo : missing) { if (info.getSimSlotIndex() == slotInfo.getLogicalSlotIdx() && info.getCardString().equals(slotInfo.getCardId())) { subscriptions.add(info); break; } } } } return subscriptions; } public static String getDisplayName(SubscriptionInfo info) { final CharSequence name = info.getDisplayName(); if (name != null) { return name.toString(); } return ""; } /** * Whether Settings should show a "Use SIM" toggle in pSIM detailed page. */ public static boolean showToggleForPhysicalSim(SubscriptionManager subMgr) { return subMgr.canDisablePhysicalSubscription(); } /** * Get phoneId or logical slot index for a subId if active, or INVALID_PHONE_INDEX if inactive. */ public static int getPhoneId(Context context, int subId) { SubscriptionManager subManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); if (subManager == null) { return INVALID_SIM_SLOT_INDEX; } SubscriptionInfo info = subManager.getActiveSubscriptionInfo(subId); if (info == null) { return INVALID_SIM_SLOT_INDEX; } return info.getSimSlotIndex(); } }