Merge "[Settings] Replacing accessing of PhoneConstants$DataState"

This commit is contained in:
Bonian Chen
2020-01-15 14:56:36 +00:00
committed by Gerrit Code Review
2 changed files with 229 additions and 36 deletions

View File

@@ -38,6 +38,8 @@ import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.Telephony; import android.provider.Telephony;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.PreciseDataConnectionState;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -52,8 +54,6 @@ import android.widget.Toast;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.RestrictedSettingsFragment; import com.android.settings.RestrictedSettingsFragment;
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -107,6 +107,7 @@ public class ApnSettings extends RestrictedSettingsFragment
private static boolean mRestoreDefaultApnMode; private static boolean mRestoreDefaultApnMode;
private UserManager mUserManager; private UserManager mUserManager;
private TelephonyManager mTelephonyManager;
private RestoreApnUiHandler mRestoreApnUiHandler; private RestoreApnUiHandler mRestoreApnUiHandler;
private RestoreApnProcessHandler mRestoreApnProcessHandler; private RestoreApnProcessHandler mRestoreApnProcessHandler;
private HandlerThread mRestoreDefaultApnThread; private HandlerThread mRestoreDefaultApnThread;
@@ -130,32 +131,35 @@ public class ApnSettings extends RestrictedSettingsFragment
super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS); super(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS);
} }
private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
public void onPreciseDataConnectionStateChanged(
PreciseDataConnectionState dataConnectionState) {
if (dataConnectionState.getState() == TelephonyManager.DATA_CONNECTED) {
if (!mRestoreDefaultApnMode) {
fillList();
} else {
showDialog(DIALOG_RESTORE_DEFAULTAPN);
}
}
}
};
private final BroadcastReceiver mReceiver = new BroadcastReceiver() { private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals( if (intent.getAction().equals(
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
PhoneConstants.DataState state = getMobileDataState(intent);
switch (state) {
case CONNECTED:
if (!mRestoreDefaultApnMode) {
fillList();
} else {
showDialog(DIALOG_RESTORE_DEFAULTAPN);
}
break;
}
} else if(intent.getAction().equals(
TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED)) { TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED)) {
if (!mRestoreDefaultApnMode) { if (!mRestoreDefaultApnMode) {
int extraSubId = intent.getIntExtra(TelephonyManager.EXTRA_SUBSCRIPTION_ID, int extraSubId = intent.getIntExtra(TelephonyManager.EXTRA_SUBSCRIPTION_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID); SubscriptionManager.INVALID_SUBSCRIPTION_ID);
if (SubscriptionManager.isValidSubscriptionId(extraSubId) && if (SubscriptionManager.isValidSubscriptionId(extraSubId)
mPhoneId == SubscriptionManager.getPhoneId(extraSubId) && && mPhoneId == SubscriptionUtil.getPhoneId(context, extraSubId)
extraSubId != mSubId) { && extraSubId != mSubId) {
// subscription has changed // subscription has changed
mSubId = extraSubId; mSubId = extraSubId;
mSubscriptionInfo = getSubscriptionInfo(mSubId); mSubscriptionInfo = getSubscriptionInfo(mSubId);
restartPhoneStateListener(mSubId);
} }
fillList(); fillList();
} }
@@ -163,13 +167,22 @@ public class ApnSettings extends RestrictedSettingsFragment
} }
}; };
private static PhoneConstants.DataState getMobileDataState(Intent intent) { private void restartPhoneStateListener(int subId) {
String str = intent.getStringExtra(PhoneConstants.STATE_KEY); if (mRestoreDefaultApnMode) {
if (str != null) { return;
return Enum.valueOf(PhoneConstants.DataState.class, str);
} else {
return PhoneConstants.DataState.DISCONNECTED;
} }
final TelephonyManager updatedTelephonyManager =
mTelephonyManager.createForSubscriptionId(subId);
// restart monitoring when subscription has been changed
mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_NONE);
mTelephonyManager = updatedTelephonyManager;
mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE);
} }
@Override @Override
@@ -183,14 +196,14 @@ public class ApnSettings extends RestrictedSettingsFragment
final Activity activity = getActivity(); final Activity activity = getActivity();
mSubId = activity.getIntent().getIntExtra(SUB_ID, mSubId = activity.getIntent().getIntExtra(SUB_ID,
SubscriptionManager.INVALID_SUBSCRIPTION_ID); SubscriptionManager.INVALID_SUBSCRIPTION_ID);
mPhoneId = SubscriptionManager.getPhoneId(mSubId); mPhoneId = SubscriptionUtil.getPhoneId(activity, mSubId);
mIntentFilter = new IntentFilter( mIntentFilter = new IntentFilter(
TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
mIntentFilter.addAction(TelephonyManager.ACTION_SUBSCRIPTION_CARRIER_IDENTITY_CHANGED);
setIfOnlyAvailableForAdmins(true); setIfOnlyAvailableForAdmins(true);
mSubscriptionInfo = getSubscriptionInfo(mSubId); mSubscriptionInfo = getSubscriptionInfo(mSubId);
mTelephonyManager = activity.getSystemService(TelephonyManager.class);
CarrierConfigManager configManager = (CarrierConfigManager) CarrierConfigManager configManager = (CarrierConfigManager)
getSystemService(Context.CARRIER_CONFIG_SERVICE); getSystemService(Context.CARRIER_CONFIG_SERVICE);
@@ -235,6 +248,8 @@ public class ApnSettings extends RestrictedSettingsFragment
getActivity().registerReceiver(mReceiver, mIntentFilter); getActivity().registerReceiver(mReceiver, mIntentFilter);
restartPhoneStateListener(mSubId);
if (!mRestoreDefaultApnMode) { if (!mRestoreDefaultApnMode) {
fillList(); fillList();
} }
@@ -249,6 +264,9 @@ public class ApnSettings extends RestrictedSettingsFragment
} }
getActivity().unregisterReceiver(mReceiver); getActivity().unregisterReceiver(mReceiver);
mTelephonyManager.listen(mPhoneStateListener,
PhoneStateListener.LISTEN_NONE);
} }
@Override @Override

View File

@@ -16,15 +16,18 @@
package com.android.settings.network; 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 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;
@@ -66,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;
@@ -73,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)) {
@@ -92,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) {
@@ -113,4 +266,26 @@ public class SubscriptionUtil {
} }
return ""; 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) {
final SubscriptionManager subManager = context.getSystemService(SubscriptionManager.class);
if (subManager == null) {
return INVALID_SIM_SLOT_INDEX;
}
final SubscriptionInfo info = subManager.getActiveSubscriptionInfo(subId);
if (info == null) {
return INVALID_SIM_SLOT_INDEX;
}
return info.getSimSlotIndex();
}
} }