Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +6 −7 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,7 @@ import com.android.internal.telephony.dataconnection.TransportManager; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.gsm.GsmMmiCode; import com.android.internal.telephony.gsm.GsmMmiCode; import com.android.internal.telephony.gsm.SuppServiceNotification; import com.android.internal.telephony.gsm.SuppServiceNotification; import com.android.internal.telephony.imsphone.ImsPhoneMmiCode; import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardStatus; import com.android.internal.telephony.uicc.IccCardStatus; Loading @@ -109,7 +110,6 @@ import com.android.internal.telephony.uicc.UiccProfile; import com.android.internal.telephony.uicc.UiccSlot; import com.android.internal.telephony.uicc.UiccSlot; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.telephony.Rlog; import com.android.telephony.Rlog; import com.android.internal.telephony.imsphone.ImsPhoneMmiCode; import java.io.FileDescriptor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.PrintWriter; Loading Loading @@ -3159,7 +3159,7 @@ public class GsmCdmaPhone extends Phone { simOperatorNumeric); simOperatorNumeric); } } } } updateDataConnectionTracker(); updateCurrentCarrierInProvider(); } } } } Loading Loading @@ -4029,10 +4029,9 @@ public class GsmCdmaPhone extends Phone { return dialString; return dialString; } } /** @Override * @return operator numeric. @NonNull */ public String getOperatorNumeric() { private String getOperatorNumeric() { String operatorNumeric = null; String operatorNumeric = null; if (isPhoneTypeGsm()) { if (isPhoneTypeGsm()) { IccRecords r = mIccRecords.get(); IccRecords r = mIccRecords.get(); Loading Loading @@ -4074,7 +4073,7 @@ public class GsmCdmaPhone extends Phone { + " operatorNumeric = " + operatorNumeric); + " operatorNumeric = " + operatorNumeric); } } return operatorNumeric; return TextUtils.emptyIfNull(operatorNumeric); } } /** /** Loading src/java/com/android/internal/telephony/Phone.java +10 −10 Original line number Original line Diff line number Diff line Loading @@ -4044,16 +4044,6 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return getLocaleFromCarrierProperties(); return getLocaleFromCarrierProperties(); } } public void updateDataConnectionTracker() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).update(); } } } } public boolean updateCurrentCarrierInProvider() { public boolean updateCurrentCarrierInProvider() { return false; return false; } } Loading Loading @@ -4257,6 +4247,16 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return false; return false; } } /** * Get the SIM's MCC/MNC * * @return MCC/MNC in string format, empty string if not available. */ @NonNull public String getOperatorNumeric() { return ""; } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Phone: subId=" + getSubId()); pw.println("Phone: subId=" + getSubId()); pw.println(" mPhoneId=" + mPhoneId); pw.println(" mPhoneId=" + mPhoneId); Loading src/java/com/android/internal/telephony/SubscriptionController.java +0 −17 Original line number Original line Diff line number Diff line Loading @@ -1247,9 +1247,6 @@ public class SubscriptionController extends ISub.Stub { if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); } } // Once the records are loaded, notify DcTracker PhoneFactory.getPhone(slotIndex).updateDataConnectionTracker(); if (DBG) logdl("[addSubInfoRecord]- info size=" + sSlotIndexToSubIds.size()); if (DBG) logdl("[addSubInfoRecord]- info size=" + sSlotIndexToSubIds.size()); } } Loading Loading @@ -2361,9 +2358,6 @@ public class SubscriptionController extends ISub.Stub { } } } } // FIXME is this still needed? updateAllDataConnectionTrackers(); int previousDefaultSub = getDefaultSubId(); int previousDefaultSub = getDefaultSubId(); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId); Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId); Loading @@ -2377,17 +2371,6 @@ public class SubscriptionController extends ISub.Stub { } } } } @UnsupportedAppUsage private void updateAllDataConnectionTrackers() { // Tell Phone Proxies to update data connection tracker int len = TelephonyManager.from(mContext).getActiveModemCount(); if (DBG) logd("[updateAllDataConnectionTrackers] activeModemCount=" + len); for (int phoneId = 0; phoneId < len; phoneId++) { if (DBG) logd("[updateAllDataConnectionTrackers] phoneId=" + phoneId); PhoneFactory.getPhone(phoneId).updateDataConnectionTracker(); } } @UnsupportedAppUsage @UnsupportedAppUsage private void broadcastDefaultDataSubIdChanged(int subId) { private void broadcastDefaultDataSubIdChanged(int subId) { // Broadcast an Intent for default data sub change // Broadcast an Intent for default data sub change Loading src/java/com/android/internal/telephony/dataconnection/DataConnectionReasons.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,7 @@ public class DataConnectionReasons { // Belows are all hard failure reasons. // Belows are all hard failure reasons. NOT_ATTACHED(true), NOT_ATTACHED(true), RECORD_NOT_LOADED(true), SIM_NOT_READY(true), INVALID_PHONE_STATE(true), INVALID_PHONE_STATE(true), CONCURRENT_VOICE_DATA_NOT_ALLOWED(true), CONCURRENT_VOICE_DATA_NOT_ALLOWED(true), PS_RESTRICTED(true), PS_RESTRICTED(true), Loading src/java/com/android/internal/telephony/dataconnection/DcTracker.java +89 −178 Original line number Original line Diff line number Diff line Loading @@ -80,7 +80,6 @@ import android.telephony.PreciseDataConnectionState; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.ServiceState.RilRadioTechnology; import android.telephony.ServiceState.RilRadioTechnology; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionPlan; import android.telephony.SubscriptionPlan; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.cdma.CdmaCellLocation; Loading Loading @@ -109,8 +108,6 @@ import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataA import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataDisallowedReasonType; import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataDisallowedReasonType; import com.android.internal.telephony.dataconnection.DataEnabledSettings.DataEnabledChangedReason; import com.android.internal.telephony.dataconnection.DataEnabledSettings.DataEnabledChangedReason; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.uicc.IccRecords; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; Loading @@ -132,7 +129,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Collectors; Loading Loading @@ -340,6 +336,8 @@ public class DcTracker extends Handler { private final Map<String, Integer> m5GIconMapping = new HashMap<>(); private final Map<String, Integer> m5GIconMapping = new HashMap<>(); private String mDataIconPattern = ""; private String mDataIconPattern = ""; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { @Override @Override public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { Loading Loading @@ -368,54 +366,9 @@ public class DcTracker extends Handler { if (DBG) log("Provisioning apn alarm"); if (DBG) log("Provisioning apn alarm"); onActionIntentProvisioningApnAlarm(intent); onActionIntentProvisioningApnAlarm(intent); } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (DBG) log("received carrier config change"); sendMessage(obtainMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED, if (mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded()) { intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, setDefaultDataRoamingEnabled(); SubscriptionManager.INVALID_SUBSCRIPTION_ID), 0)); } String nr5GIconConfiguration = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); String[] bandwidths = CarrierConfigManager.getDefaultConfig().getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); boolean useLte = false; mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext() .getSystemService(Context.CARRIER_CONFIG_SERVICE); if (configManager != null) { PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); if (b != null) { if (b.getString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING) != null) { nr5GIconConfiguration = b.getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); } if (b.getString(CarrierConfigManager .KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING) != null) { mDataIconPattern = b.getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); } if (b.getStringArray(CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY) != null) { bandwidths = b.getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); } useLte = b.getBoolean(CarrierConfigManager .KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL); mHysteresisTimeSec = b.getInt( CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT); mWatchdogTimeMs = b.getLong( CarrierConfigManager.KEY_5G_WATCHDOG_TIME_MS_LONG); mAllUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL); mMmwaveUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL); mSub6Unmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL); } } sendMessage(obtainMessage(DctConstants.EVENT_UPDATE_CARRIER_CONFIGS, useLte ? 1 : 0, 0 /* unused */, new Pair<>(bandwidths, nr5GIconConfiguration))); } else { } else { if (DBG) log("onReceive: Unknown action=" + action); if (DBG) log("onReceive: Unknown action=" + action); } } Loading @@ -442,33 +395,6 @@ public class DcTracker extends Handler { } } }; }; private SubscriptionManager mSubscriptionManager; private final DctOnSubscriptionsChangedListener mOnSubscriptionsChangedListener = new DctOnSubscriptionsChangedListener(); private class DctOnSubscriptionsChangedListener extends OnSubscriptionsChangedListener { public final AtomicInteger mPreviousSubId = new AtomicInteger(SubscriptionManager.INVALID_SUBSCRIPTION_ID); /** * Callback invoked when there is any change to any SubscriptionInfo. Typically * this method invokes {@link SubscriptionManager#getActiveSubscriptionInfoList} */ @Override public void onSubscriptionsChanged() { if (DBG) log("SubscriptionListener.onSubscriptionInfoChanged"); // Set the network type, in case the radio does not restore it. int subId = mPhone.getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { registerSettingsObserver(); } if (SubscriptionManager.isValidSubscriptionId(subId) && mPreviousSubId.getAndSet(subId) != subId) { onRecordsLoadedOrSubIdChanged(); } } }; private NetworkPolicyManager mNetworkPolicyManager; private NetworkPolicyManager mNetworkPolicyManager; private final NetworkPolicyManager.SubscriptionCallback mSubscriptionCallback = private final NetworkPolicyManager.SubscriptionCallback mSubscriptionCallback = new NetworkPolicyManager.SubscriptionCallback() { new NetworkPolicyManager.SubscriptionCallback() { Loading Loading @@ -611,8 +537,6 @@ public class DcTracker extends Handler { // member variables // member variables protected final Phone mPhone; protected final Phone mPhone; private final UiccController mUiccController; protected final AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>(); private DctConstants.Activity mActivity = DctConstants.Activity.NONE; private DctConstants.Activity mActivity = DctConstants.Activity.NONE; private DctConstants.State mState = DctConstants.State.IDLE; private DctConstants.State mState = DctConstants.State.IDLE; private final Handler mDataConnectionTracker; private final Handler mDataConnectionTracker; Loading Loading @@ -746,8 +670,6 @@ public class DcTracker extends Handler { mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix); mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix); mResolver = mPhone.getContext().getContentResolver(); mResolver = mPhone.getContext().getContentResolver(); mUiccController = UiccController.getInstance(); mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null); mAlarmManager = mAlarmManager = (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); Loading @@ -772,9 +694,6 @@ public class DcTracker extends Handler { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); mAutoAttachEnabled.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false)); mAutoAttachEnabled.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false)); mSubscriptionManager = SubscriptionManager.from(mPhone.getContext()); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); mNetworkPolicyManager = (NetworkPolicyManager) mPhone.getContext() mNetworkPolicyManager = (NetworkPolicyManager) mPhone.getContext() .getSystemService(Context.NETWORK_POLICY_SERVICE); .getSystemService(Context.NETWORK_POLICY_SERVICE); mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback); mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback); Loading @@ -787,7 +706,6 @@ public class DcTracker extends Handler { mDataConnectionTracker = this; mDataConnectionTracker = this; registerForAllEvents(); registerForAllEvents(); update(); mApnObserver = new ApnChangeObserver(); mApnObserver = new ApnChangeObserver(); phone.getContext().getContentResolver().registerContentObserver( phone.getContext().getContentResolver().registerContentObserver( Telephony.Carriers.CONTENT_URI, true, mApnObserver); Telephony.Carriers.CONTENT_URI, true, mApnObserver); Loading @@ -809,7 +727,6 @@ public class DcTracker extends Handler { mTelephonyManager = null; mTelephonyManager = null; mAlarmManager = null; mAlarmManager = null; mPhone = null; mPhone = null; mUiccController = null; mDataConnectionTracker = null; mDataConnectionTracker = null; mProvisionActionName = null; mProvisionActionName = null; mSettingsObserver = new SettingsObserver(null, this); mSettingsObserver = new SettingsObserver(null, this); Loading Loading @@ -887,11 +804,8 @@ public class DcTracker extends Handler { mIsDisposed = true; mIsDisposed = true; mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.getContext().unregisterReceiver(mIntentReceiver); mUiccController.unregisterForIccChanged(this); mSettingsObserver.unobserve(); mSettingsObserver.unobserve(); mSubscriptionManager .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); mNetworkPolicyManager.unregisterSubscriptionCallback(mSubscriptionCallback); mNetworkPolicyManager.unregisterSubscriptionCallback(mSubscriptionCallback); mDcc.dispose(); mDcc.dispose(); mDcTesterFailBringUpAll.dispose(); mDcTesterFailBringUpAll.dispose(); Loading @@ -913,11 +827,6 @@ public class DcTracker extends Handler { mPhone.mCi.unregisterForPcoData(this); mPhone.mCi.unregisterForPcoData(this); } } IccRecords r = mIccRecords.get(); if (r != null) { r.unregisterForRecordsLoaded(this); mIccRecords.set(null); } mPhone.getCallTracker().unregisterForVoiceCallEnded(this); mPhone.getCallTracker().unregisterForVoiceCallEnded(this); mPhone.getCallTracker().unregisterForVoiceCallStarted(this); mPhone.getCallTracker().unregisterForVoiceCallStarted(this); unregisterServiceStateTrackerEvents(); unregisterServiceStateTrackerEvents(); Loading Loading @@ -1349,8 +1258,6 @@ public class DcTracker extends Handler { radioStateFromCarrier = true; radioStateFromCarrier = true; } } boolean recordsLoaded = mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded(); boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId( boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId( SubscriptionManager.getDefaultDataSubscriptionId()); SubscriptionManager.getDefaultDataSubscriptionId()); Loading Loading @@ -1404,8 +1311,8 @@ public class DcTracker extends Handler { if (!attachedState && !shouldAutoAttach() && requestType != REQUEST_TYPE_HANDOVER) { if (!attachedState && !shouldAutoAttach() && requestType != REQUEST_TYPE_HANDOVER) { reasons.add(DataDisallowedReasonType.NOT_ATTACHED); reasons.add(DataDisallowedReasonType.NOT_ATTACHED); } } if (!recordsLoaded) { if (mPhone.getSubId() == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { reasons.add(DataDisallowedReasonType.RECORD_NOT_LOADED); reasons.add(DataDisallowedReasonType.SIM_NOT_READY); } } if (phoneState != PhoneConstants.State.IDLE if (phoneState != PhoneConstants.State.IDLE && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { Loading Loading @@ -2289,17 +2196,24 @@ public class DcTracker extends Handler { removeMessages(DctConstants.EVENT_DATA_RECONNECT, apnContext); removeMessages(DctConstants.EVENT_DATA_RECONNECT, apnContext); } } protected void onRecordsLoadedOrSubIdChanged() { private void onSubscriptionChanged() { if (DBG) log("onRecordsLoadedOrSubIdChanged: createAllApnList"); if (DBG) log("onSubscriptionChanged"); if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { // Auto attach is for cellular only. // Auto attach is for cellular only. mAutoAttachOnCreationConfig = mPhone.getContext().getResources() mAutoAttachOnCreationConfig = mPhone.getContext().getResources() .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation); .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation); } } mAutoAttachEnabled.set(false); setDefaultDataRoamingEnabled(); read5GConfiguration(); registerSettingsObserver(); createAllApnList(); createAllApnList(); setDataProfilesAsNeeded(); setDataProfilesAsNeeded(); if (mPhone.getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { setInitialAttachApn(); setInitialAttachApn(); } mPhone.notifyAllActiveDataConnections(); mPhone.notifyAllActiveDataConnections(); setupDataOnAllConnectableApns(Phone.REASON_SIM_LOADED, RetryFailures.ALWAYS); setupDataOnAllConnectableApns(Phone.REASON_SIM_LOADED, RetryFailures.ALWAYS); } } Loading @@ -2312,8 +2226,6 @@ public class DcTracker extends Handler { mAutoAttachOnCreationConfig = false; mAutoAttachOnCreationConfig = false; // Clear auto attach as modem is expected to do a new attach once SIM is ready // Clear auto attach as modem is expected to do a new attach once SIM is ready mAutoAttachEnabled.set(false); mAutoAttachEnabled.set(false); mOnSubscriptionsChangedListener.mPreviousSubId.set( SubscriptionManager.INVALID_SUBSCRIPTION_ID); // In no-sim case, we should still send the emergency APN to the modem, if there is any. // In no-sim case, we should still send the emergency APN to the modem, if there is any. createAllApnList(); createAllApnList(); setDataProfilesAsNeeded(); setDataProfilesAsNeeded(); Loading Loading @@ -3152,8 +3064,7 @@ public class DcTracker extends Handler { */ */ protected void createAllApnList() { protected void createAllApnList() { mAllApnSettings.clear(); mAllApnSettings.clear(); IccRecords r = mIccRecords.get(); String operator = mPhone.getOperatorNumeric(); String operator = (r != null) ? r.getOperatorNumeric() : ""; // ORDER BY Telephony.Carriers._ID ("_id") // ORDER BY Telephony.Carriers._ID ("_id") Cursor cursor = mPhone.getContext().getContentResolver().query( Cursor cursor = mPhone.getContext().getContentResolver().query( Loading Loading @@ -3296,8 +3207,7 @@ public class DcTracker extends Handler { } } } } IccRecords r = mIccRecords.get(); String operator = mPhone.getOperatorNumeric(); String operator = (r != null) ? r.getOperatorNumeric() : ""; // This is a workaround for a bug (7305641) where we don't failover to other // This is a workaround for a bug (7305641) where we don't failover to other // suitable APNs if our preferred APN fails. On prepaid ATT sims we need to // suitable APNs if our preferred APN fails. On prepaid ATT sims we need to Loading @@ -3319,8 +3229,7 @@ public class DcTracker extends Handler { log("buildWaitingApns: usePreferred=" + usePreferred log("buildWaitingApns: usePreferred=" + usePreferred + " canSetPreferApn=" + mCanSetPreferApn + " canSetPreferApn=" + mCanSetPreferApn + " mPreferredApn=" + mPreferredApn + " mPreferredApn=" + mPreferredApn + " operator=" + operator + " radioTech=" + radioTech + " operator=" + operator + " radioTech=" + radioTech); + " IccRecords r=" + r); } } if (usePreferred && mCanSetPreferApn && mPreferredApn != null && if (usePreferred && mCanSetPreferApn && mPreferredApn != null && Loading Loading @@ -3490,17 +3399,6 @@ public class DcTracker extends Handler { int generation; int generation; int requestType; int requestType; switch (msg.what) { switch (msg.what) { case DctConstants.EVENT_RECORDS_LOADED: // If onRecordsLoadedOrSubIdChanged() is not called here, it should be called on // onSubscriptionsChanged() when a valid subId is available. int subId = mPhone.getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { onRecordsLoadedOrSubIdChanged(); } else { log("Ignoring EVENT_RECORDS_LOADED as subId is not valid: " + subId); } break; case DctConstants.EVENT_DATA_CONNECTION_DETACHED: case DctConstants.EVENT_DATA_CONNECTION_DETACHED: onDataConnectionDetached(); onDataConnectionDetached(); break; break; Loading Loading @@ -3802,10 +3700,6 @@ public class DcTracker extends Handler { isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED); isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED); break; break; } } case DctConstants.EVENT_ICC_CHANGED: { onUpdateIcc(); break; } case DctConstants.EVENT_RESTART_RADIO: { case DctConstants.EVENT_RESTART_RADIO: { restartRadio(); restartRadio(); break; break; Loading Loading @@ -3856,10 +3750,8 @@ public class DcTracker extends Handler { mWatchdog = false; mWatchdog = false; reevaluateUnmeteredConnections(); reevaluateUnmeteredConnections(); break; break; case DctConstants.EVENT_UPDATE_CARRIER_CONFIGS: case DctConstants.EVENT_CARRIER_CONFIG_CHANGED: Pair<String[], String> configPair = (Pair<String[], String>) msg.obj; onCarrierConfigChanged(msg.arg1); updateLinkBandwidths(configPair.first, msg.arg1 == 1); update5GIconMapping(configPair.second); break; break; default: default: Rlog.e("DcTracker", "Unhandled event=" + msg); Rlog.e("DcTracker", "Unhandled event=" + msg); Loading Loading @@ -3898,38 +3790,6 @@ public class DcTracker extends Handler { return cid; return cid; } } private IccRecords getUiccRecords(int appFamily) { return mUiccController.getIccRecords(mPhone.getPhoneId(), appFamily); } private void onUpdateIcc() { if (mUiccController == null ) { return; } IccRecords newIccRecords = getUiccRecords(UiccController.APP_FAM_3GPP); IccRecords r = mIccRecords.get(); if (r != newIccRecords) { if (r != null) { log("Removing stale icc objects."); r.unregisterForRecordsLoaded(this); mIccRecords.set(null); } if (newIccRecords != null) { if (SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { log("New records found."); mIccRecords.set(newIccRecords); newIccRecords.registerForRecordsLoaded( this, DctConstants.EVENT_RECORDS_LOADED, null); } } else { onSimNotReady(); } } } /** /** * Update link bandwidth estimate default values from carrier config. * Update link bandwidth estimate default values from carrier config. * @param bandwidths String array of "RAT:upstream,downstream" for each RAT * @param bandwidths String array of "RAT:upstream,downstream" for each RAT Loading Loading @@ -4001,21 +3861,6 @@ public class DcTracker extends Handler { } } } } /** * Update DcTracker. * * TODO: This should be cleaned up. DcTracker should listen to those events. */ public void update() { log("update sub = " + mPhone.getSubId()); log("update(): Active DDS, register for all events now!"); onUpdateIcc(); mAutoAttachEnabled.set(false); mPhone.updateCurrentCarrierInProvider(); } @VisibleForTesting @VisibleForTesting public boolean shouldAutoAttach() { public boolean shouldAutoAttach() { if (mAutoAttachEnabled.get()) return true; if (mAutoAttachEnabled.get()) return true; Loading Loading @@ -4091,6 +3936,7 @@ public class DcTracker extends Handler { } } private boolean reevaluateUnmeteredConnections() { private boolean reevaluateUnmeteredConnections() { log("reevaluateUnmeteredConnections"); if (isNetworkTypeUnmetered(NETWORK_TYPE_NR) || isFrequencyRangeUnmetered()) { if (isNetworkTypeUnmetered(NETWORK_TYPE_NR) || isFrequencyRangeUnmetered()) { if (DBG) log("NR NSA is unmetered"); if (DBG) log("NR NSA is unmetered"); if (mPhone.getServiceState().getNrState() if (mPhone.getServiceState().getNrState() Loading Loading @@ -4427,7 +4273,7 @@ public class DcTracker extends Handler { * PLMN name,APN name are not mandatory parameters * PLMN name,APN name are not mandatory parameters */ */ private void initEmergencyApnSetting() { private void initEmergencyApnSetting() { // Operator Numeric is not available when sim records are not loaded. // Operator Numeric is not available when SIM is not ready. // Query Telephony.db with APN type as EPDN request does not // Query Telephony.db with APN type as EPDN request does not // require APN name, plmn and all operators support same APN config. // require APN name, plmn and all operators support same APN config. // DB will contain only one entry for Emergency APN // DB will contain only one entry for Emergency APN Loading Loading @@ -5228,4 +5074,69 @@ public class DcTracker extends Handler { } } return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; } } // TODO: Move icon related to display info controller. private void read5GConfiguration() { if (DBG) log("read5GConfiguration"); String nr5GIconConfiguration = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); String[] bandwidths = CarrierConfigManager.getDefaultConfig().getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); boolean useLte = false; mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext() .getSystemService(Context.CARRIER_CONFIG_SERVICE); if (configManager != null) { PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); if (b != null) { if (b.getString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING) != null) { nr5GIconConfiguration = b.getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); } if (b.getString(CarrierConfigManager .KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING) != null) { mDataIconPattern = b.getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); } if (b.getStringArray(CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY) != null) { bandwidths = b.getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); } useLte = b.getBoolean(CarrierConfigManager .KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL); mHysteresisTimeSec = b.getInt( CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT); mWatchdogTimeMs = b.getLong( CarrierConfigManager.KEY_5G_WATCHDOG_TIME_MS_LONG); mAllUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL); mMmwaveUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL); mSub6Unmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL); } } updateLinkBandwidths(bandwidths, useLte); update5GIconMapping(nr5GIconConfiguration); } // This handles carrier config changed event. We intentionally to use this for SIM loaded/absent // event. There are several data setup related configuration stored in carrier config. We have // to wait carrier config ready before we can setup a data. private void onCarrierConfigChanged(int subId) { // TODO: Remove this check after b/152149072 is fixed because carrier config might // actually change without sub id change. if (mSubId == subId) return; mSubId = subId; if (DBG) log("onCarrierConfigChanged subId=" + subId); if (SubscriptionManager.isValidSubscriptionId(subId)) { onSubscriptionChanged(); } else { onSimNotReady(); } } } } Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +6 −7 Original line number Original line Diff line number Diff line Loading @@ -91,6 +91,7 @@ import com.android.internal.telephony.dataconnection.TransportManager; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import com.android.internal.telephony.gsm.GsmMmiCode; import com.android.internal.telephony.gsm.GsmMmiCode; import com.android.internal.telephony.gsm.SuppServiceNotification; import com.android.internal.telephony.gsm.SuppServiceNotification; import com.android.internal.telephony.imsphone.ImsPhoneMmiCode; import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.test.SimulatedRadioControl; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardApplicationStatus.AppType; import com.android.internal.telephony.uicc.IccCardStatus; import com.android.internal.telephony.uicc.IccCardStatus; Loading @@ -109,7 +110,6 @@ import com.android.internal.telephony.uicc.UiccProfile; import com.android.internal.telephony.uicc.UiccSlot; import com.android.internal.telephony.uicc.UiccSlot; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.telephony.Rlog; import com.android.telephony.Rlog; import com.android.internal.telephony.imsphone.ImsPhoneMmiCode; import java.io.FileDescriptor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.PrintWriter; Loading Loading @@ -3159,7 +3159,7 @@ public class GsmCdmaPhone extends Phone { simOperatorNumeric); simOperatorNumeric); } } } } updateDataConnectionTracker(); updateCurrentCarrierInProvider(); } } } } Loading Loading @@ -4029,10 +4029,9 @@ public class GsmCdmaPhone extends Phone { return dialString; return dialString; } } /** @Override * @return operator numeric. @NonNull */ public String getOperatorNumeric() { private String getOperatorNumeric() { String operatorNumeric = null; String operatorNumeric = null; if (isPhoneTypeGsm()) { if (isPhoneTypeGsm()) { IccRecords r = mIccRecords.get(); IccRecords r = mIccRecords.get(); Loading Loading @@ -4074,7 +4073,7 @@ public class GsmCdmaPhone extends Phone { + " operatorNumeric = " + operatorNumeric); + " operatorNumeric = " + operatorNumeric); } } return operatorNumeric; return TextUtils.emptyIfNull(operatorNumeric); } } /** /** Loading
src/java/com/android/internal/telephony/Phone.java +10 −10 Original line number Original line Diff line number Diff line Loading @@ -4044,16 +4044,6 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return getLocaleFromCarrierProperties(); return getLocaleFromCarrierProperties(); } } public void updateDataConnectionTracker() { if (mTransportManager != null) { for (int transport : mTransportManager.getAvailableTransports()) { if (getDcTracker(transport) != null) { getDcTracker(transport).update(); } } } } public boolean updateCurrentCarrierInProvider() { public boolean updateCurrentCarrierInProvider() { return false; return false; } } Loading Loading @@ -4257,6 +4247,16 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return false; return false; } } /** * Get the SIM's MCC/MNC * * @return MCC/MNC in string format, empty string if not available. */ @NonNull public String getOperatorNumeric() { return ""; } public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("Phone: subId=" + getSubId()); pw.println("Phone: subId=" + getSubId()); pw.println(" mPhoneId=" + mPhoneId); pw.println(" mPhoneId=" + mPhoneId); Loading
src/java/com/android/internal/telephony/SubscriptionController.java +0 −17 Original line number Original line Diff line number Diff line Loading @@ -1247,9 +1247,6 @@ public class SubscriptionController extends ISub.Stub { if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); if (DBG) logdl("[addSubInfoRecord] sim name = " + nameToSet); } } // Once the records are loaded, notify DcTracker PhoneFactory.getPhone(slotIndex).updateDataConnectionTracker(); if (DBG) logdl("[addSubInfoRecord]- info size=" + sSlotIndexToSubIds.size()); if (DBG) logdl("[addSubInfoRecord]- info size=" + sSlotIndexToSubIds.size()); } } Loading Loading @@ -2361,9 +2358,6 @@ public class SubscriptionController extends ISub.Stub { } } } } // FIXME is this still needed? updateAllDataConnectionTrackers(); int previousDefaultSub = getDefaultSubId(); int previousDefaultSub = getDefaultSubId(); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId); Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId); Loading @@ -2377,17 +2371,6 @@ public class SubscriptionController extends ISub.Stub { } } } } @UnsupportedAppUsage private void updateAllDataConnectionTrackers() { // Tell Phone Proxies to update data connection tracker int len = TelephonyManager.from(mContext).getActiveModemCount(); if (DBG) logd("[updateAllDataConnectionTrackers] activeModemCount=" + len); for (int phoneId = 0; phoneId < len; phoneId++) { if (DBG) logd("[updateAllDataConnectionTrackers] phoneId=" + phoneId); PhoneFactory.getPhone(phoneId).updateDataConnectionTracker(); } } @UnsupportedAppUsage @UnsupportedAppUsage private void broadcastDefaultDataSubIdChanged(int subId) { private void broadcastDefaultDataSubIdChanged(int subId) { // Broadcast an Intent for default data sub change // Broadcast an Intent for default data sub change Loading
src/java/com/android/internal/telephony/dataconnection/DataConnectionReasons.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -106,7 +106,7 @@ public class DataConnectionReasons { // Belows are all hard failure reasons. // Belows are all hard failure reasons. NOT_ATTACHED(true), NOT_ATTACHED(true), RECORD_NOT_LOADED(true), SIM_NOT_READY(true), INVALID_PHONE_STATE(true), INVALID_PHONE_STATE(true), CONCURRENT_VOICE_DATA_NOT_ALLOWED(true), CONCURRENT_VOICE_DATA_NOT_ALLOWED(true), PS_RESTRICTED(true), PS_RESTRICTED(true), Loading
src/java/com/android/internal/telephony/dataconnection/DcTracker.java +89 −178 Original line number Original line Diff line number Diff line Loading @@ -80,7 +80,6 @@ import android.telephony.PreciseDataConnectionState; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.ServiceState.RilRadioTechnology; import android.telephony.ServiceState.RilRadioTechnology; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionPlan; import android.telephony.SubscriptionPlan; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.cdma.CdmaCellLocation; Loading Loading @@ -109,8 +108,6 @@ import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataA import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataDisallowedReasonType; import com.android.internal.telephony.dataconnection.DataConnectionReasons.DataDisallowedReasonType; import com.android.internal.telephony.dataconnection.DataEnabledSettings.DataEnabledChangedReason; import com.android.internal.telephony.dataconnection.DataEnabledSettings.DataEnabledChangedReason; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.metrics.TelephonyMetrics; import com.android.internal.telephony.uicc.IccRecords; import com.android.internal.telephony.uicc.UiccController; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.ArrayUtils; import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.telephony.util.TelephonyUtils; import com.android.internal.util.AsyncChannel; import com.android.internal.util.AsyncChannel; Loading @@ -132,7 +129,6 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.regex.Matcher; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Collectors; Loading Loading @@ -340,6 +336,8 @@ public class DcTracker extends Handler { private final Map<String, Integer> m5GIconMapping = new HashMap<>(); private final Map<String, Integer> m5GIconMapping = new HashMap<>(); private String mDataIconPattern = ""; private String mDataIconPattern = ""; private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () { @Override @Override public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) { Loading Loading @@ -368,54 +366,9 @@ public class DcTracker extends Handler { if (DBG) log("Provisioning apn alarm"); if (DBG) log("Provisioning apn alarm"); onActionIntentProvisioningApnAlarm(intent); onActionIntentProvisioningApnAlarm(intent); } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { if (DBG) log("received carrier config change"); sendMessage(obtainMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED, if (mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded()) { intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX, setDefaultDataRoamingEnabled(); SubscriptionManager.INVALID_SUBSCRIPTION_ID), 0)); } String nr5GIconConfiguration = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); String[] bandwidths = CarrierConfigManager.getDefaultConfig().getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); boolean useLte = false; mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext() .getSystemService(Context.CARRIER_CONFIG_SERVICE); if (configManager != null) { PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); if (b != null) { if (b.getString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING) != null) { nr5GIconConfiguration = b.getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); } if (b.getString(CarrierConfigManager .KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING) != null) { mDataIconPattern = b.getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); } if (b.getStringArray(CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY) != null) { bandwidths = b.getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); } useLte = b.getBoolean(CarrierConfigManager .KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL); mHysteresisTimeSec = b.getInt( CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT); mWatchdogTimeMs = b.getLong( CarrierConfigManager.KEY_5G_WATCHDOG_TIME_MS_LONG); mAllUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL); mMmwaveUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL); mSub6Unmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL); } } sendMessage(obtainMessage(DctConstants.EVENT_UPDATE_CARRIER_CONFIGS, useLte ? 1 : 0, 0 /* unused */, new Pair<>(bandwidths, nr5GIconConfiguration))); } else { } else { if (DBG) log("onReceive: Unknown action=" + action); if (DBG) log("onReceive: Unknown action=" + action); } } Loading @@ -442,33 +395,6 @@ public class DcTracker extends Handler { } } }; }; private SubscriptionManager mSubscriptionManager; private final DctOnSubscriptionsChangedListener mOnSubscriptionsChangedListener = new DctOnSubscriptionsChangedListener(); private class DctOnSubscriptionsChangedListener extends OnSubscriptionsChangedListener { public final AtomicInteger mPreviousSubId = new AtomicInteger(SubscriptionManager.INVALID_SUBSCRIPTION_ID); /** * Callback invoked when there is any change to any SubscriptionInfo. Typically * this method invokes {@link SubscriptionManager#getActiveSubscriptionInfoList} */ @Override public void onSubscriptionsChanged() { if (DBG) log("SubscriptionListener.onSubscriptionInfoChanged"); // Set the network type, in case the radio does not restore it. int subId = mPhone.getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { registerSettingsObserver(); } if (SubscriptionManager.isValidSubscriptionId(subId) && mPreviousSubId.getAndSet(subId) != subId) { onRecordsLoadedOrSubIdChanged(); } } }; private NetworkPolicyManager mNetworkPolicyManager; private NetworkPolicyManager mNetworkPolicyManager; private final NetworkPolicyManager.SubscriptionCallback mSubscriptionCallback = private final NetworkPolicyManager.SubscriptionCallback mSubscriptionCallback = new NetworkPolicyManager.SubscriptionCallback() { new NetworkPolicyManager.SubscriptionCallback() { Loading Loading @@ -611,8 +537,6 @@ public class DcTracker extends Handler { // member variables // member variables protected final Phone mPhone; protected final Phone mPhone; private final UiccController mUiccController; protected final AtomicReference<IccRecords> mIccRecords = new AtomicReference<IccRecords>(); private DctConstants.Activity mActivity = DctConstants.Activity.NONE; private DctConstants.Activity mActivity = DctConstants.Activity.NONE; private DctConstants.State mState = DctConstants.State.IDLE; private DctConstants.State mState = DctConstants.State.IDLE; private final Handler mDataConnectionTracker; private final Handler mDataConnectionTracker; Loading Loading @@ -746,8 +670,6 @@ public class DcTracker extends Handler { mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix); mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix); mResolver = mPhone.getContext().getContentResolver(); mResolver = mPhone.getContext().getContentResolver(); mUiccController = UiccController.getInstance(); mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null); mAlarmManager = mAlarmManager = (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE); Loading @@ -772,9 +694,6 @@ public class DcTracker extends Handler { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext()); mAutoAttachEnabled.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false)); mAutoAttachEnabled.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false)); mSubscriptionManager = SubscriptionManager.from(mPhone.getContext()); mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); mNetworkPolicyManager = (NetworkPolicyManager) mPhone.getContext() mNetworkPolicyManager = (NetworkPolicyManager) mPhone.getContext() .getSystemService(Context.NETWORK_POLICY_SERVICE); .getSystemService(Context.NETWORK_POLICY_SERVICE); mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback); mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback); Loading @@ -787,7 +706,6 @@ public class DcTracker extends Handler { mDataConnectionTracker = this; mDataConnectionTracker = this; registerForAllEvents(); registerForAllEvents(); update(); mApnObserver = new ApnChangeObserver(); mApnObserver = new ApnChangeObserver(); phone.getContext().getContentResolver().registerContentObserver( phone.getContext().getContentResolver().registerContentObserver( Telephony.Carriers.CONTENT_URI, true, mApnObserver); Telephony.Carriers.CONTENT_URI, true, mApnObserver); Loading @@ -809,7 +727,6 @@ public class DcTracker extends Handler { mTelephonyManager = null; mTelephonyManager = null; mAlarmManager = null; mAlarmManager = null; mPhone = null; mPhone = null; mUiccController = null; mDataConnectionTracker = null; mDataConnectionTracker = null; mProvisionActionName = null; mProvisionActionName = null; mSettingsObserver = new SettingsObserver(null, this); mSettingsObserver = new SettingsObserver(null, this); Loading Loading @@ -887,11 +804,8 @@ public class DcTracker extends Handler { mIsDisposed = true; mIsDisposed = true; mPhone.getContext().unregisterReceiver(mIntentReceiver); mPhone.getContext().unregisterReceiver(mIntentReceiver); mUiccController.unregisterForIccChanged(this); mSettingsObserver.unobserve(); mSettingsObserver.unobserve(); mSubscriptionManager .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); mNetworkPolicyManager.unregisterSubscriptionCallback(mSubscriptionCallback); mNetworkPolicyManager.unregisterSubscriptionCallback(mSubscriptionCallback); mDcc.dispose(); mDcc.dispose(); mDcTesterFailBringUpAll.dispose(); mDcTesterFailBringUpAll.dispose(); Loading @@ -913,11 +827,6 @@ public class DcTracker extends Handler { mPhone.mCi.unregisterForPcoData(this); mPhone.mCi.unregisterForPcoData(this); } } IccRecords r = mIccRecords.get(); if (r != null) { r.unregisterForRecordsLoaded(this); mIccRecords.set(null); } mPhone.getCallTracker().unregisterForVoiceCallEnded(this); mPhone.getCallTracker().unregisterForVoiceCallEnded(this); mPhone.getCallTracker().unregisterForVoiceCallStarted(this); mPhone.getCallTracker().unregisterForVoiceCallStarted(this); unregisterServiceStateTrackerEvents(); unregisterServiceStateTrackerEvents(); Loading Loading @@ -1349,8 +1258,6 @@ public class DcTracker extends Handler { radioStateFromCarrier = true; radioStateFromCarrier = true; } } boolean recordsLoaded = mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded(); boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId( boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId( SubscriptionManager.getDefaultDataSubscriptionId()); SubscriptionManager.getDefaultDataSubscriptionId()); Loading Loading @@ -1404,8 +1311,8 @@ public class DcTracker extends Handler { if (!attachedState && !shouldAutoAttach() && requestType != REQUEST_TYPE_HANDOVER) { if (!attachedState && !shouldAutoAttach() && requestType != REQUEST_TYPE_HANDOVER) { reasons.add(DataDisallowedReasonType.NOT_ATTACHED); reasons.add(DataDisallowedReasonType.NOT_ATTACHED); } } if (!recordsLoaded) { if (mPhone.getSubId() == SubscriptionManager.INVALID_SUBSCRIPTION_ID) { reasons.add(DataDisallowedReasonType.RECORD_NOT_LOADED); reasons.add(DataDisallowedReasonType.SIM_NOT_READY); } } if (phoneState != PhoneConstants.State.IDLE if (phoneState != PhoneConstants.State.IDLE && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) { Loading Loading @@ -2289,17 +2196,24 @@ public class DcTracker extends Handler { removeMessages(DctConstants.EVENT_DATA_RECONNECT, apnContext); removeMessages(DctConstants.EVENT_DATA_RECONNECT, apnContext); } } protected void onRecordsLoadedOrSubIdChanged() { private void onSubscriptionChanged() { if (DBG) log("onRecordsLoadedOrSubIdChanged: createAllApnList"); if (DBG) log("onSubscriptionChanged"); if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { // Auto attach is for cellular only. // Auto attach is for cellular only. mAutoAttachOnCreationConfig = mPhone.getContext().getResources() mAutoAttachOnCreationConfig = mPhone.getContext().getResources() .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation); .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation); } } mAutoAttachEnabled.set(false); setDefaultDataRoamingEnabled(); read5GConfiguration(); registerSettingsObserver(); createAllApnList(); createAllApnList(); setDataProfilesAsNeeded(); setDataProfilesAsNeeded(); if (mPhone.getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { setInitialAttachApn(); setInitialAttachApn(); } mPhone.notifyAllActiveDataConnections(); mPhone.notifyAllActiveDataConnections(); setupDataOnAllConnectableApns(Phone.REASON_SIM_LOADED, RetryFailures.ALWAYS); setupDataOnAllConnectableApns(Phone.REASON_SIM_LOADED, RetryFailures.ALWAYS); } } Loading @@ -2312,8 +2226,6 @@ public class DcTracker extends Handler { mAutoAttachOnCreationConfig = false; mAutoAttachOnCreationConfig = false; // Clear auto attach as modem is expected to do a new attach once SIM is ready // Clear auto attach as modem is expected to do a new attach once SIM is ready mAutoAttachEnabled.set(false); mAutoAttachEnabled.set(false); mOnSubscriptionsChangedListener.mPreviousSubId.set( SubscriptionManager.INVALID_SUBSCRIPTION_ID); // In no-sim case, we should still send the emergency APN to the modem, if there is any. // In no-sim case, we should still send the emergency APN to the modem, if there is any. createAllApnList(); createAllApnList(); setDataProfilesAsNeeded(); setDataProfilesAsNeeded(); Loading Loading @@ -3152,8 +3064,7 @@ public class DcTracker extends Handler { */ */ protected void createAllApnList() { protected void createAllApnList() { mAllApnSettings.clear(); mAllApnSettings.clear(); IccRecords r = mIccRecords.get(); String operator = mPhone.getOperatorNumeric(); String operator = (r != null) ? r.getOperatorNumeric() : ""; // ORDER BY Telephony.Carriers._ID ("_id") // ORDER BY Telephony.Carriers._ID ("_id") Cursor cursor = mPhone.getContext().getContentResolver().query( Cursor cursor = mPhone.getContext().getContentResolver().query( Loading Loading @@ -3296,8 +3207,7 @@ public class DcTracker extends Handler { } } } } IccRecords r = mIccRecords.get(); String operator = mPhone.getOperatorNumeric(); String operator = (r != null) ? r.getOperatorNumeric() : ""; // This is a workaround for a bug (7305641) where we don't failover to other // This is a workaround for a bug (7305641) where we don't failover to other // suitable APNs if our preferred APN fails. On prepaid ATT sims we need to // suitable APNs if our preferred APN fails. On prepaid ATT sims we need to Loading @@ -3319,8 +3229,7 @@ public class DcTracker extends Handler { log("buildWaitingApns: usePreferred=" + usePreferred log("buildWaitingApns: usePreferred=" + usePreferred + " canSetPreferApn=" + mCanSetPreferApn + " canSetPreferApn=" + mCanSetPreferApn + " mPreferredApn=" + mPreferredApn + " mPreferredApn=" + mPreferredApn + " operator=" + operator + " radioTech=" + radioTech + " operator=" + operator + " radioTech=" + radioTech); + " IccRecords r=" + r); } } if (usePreferred && mCanSetPreferApn && mPreferredApn != null && if (usePreferred && mCanSetPreferApn && mPreferredApn != null && Loading Loading @@ -3490,17 +3399,6 @@ public class DcTracker extends Handler { int generation; int generation; int requestType; int requestType; switch (msg.what) { switch (msg.what) { case DctConstants.EVENT_RECORDS_LOADED: // If onRecordsLoadedOrSubIdChanged() is not called here, it should be called on // onSubscriptionsChanged() when a valid subId is available. int subId = mPhone.getSubId(); if (SubscriptionManager.isValidSubscriptionId(subId)) { onRecordsLoadedOrSubIdChanged(); } else { log("Ignoring EVENT_RECORDS_LOADED as subId is not valid: " + subId); } break; case DctConstants.EVENT_DATA_CONNECTION_DETACHED: case DctConstants.EVENT_DATA_CONNECTION_DETACHED: onDataConnectionDetached(); onDataConnectionDetached(); break; break; Loading Loading @@ -3802,10 +3700,6 @@ public class DcTracker extends Handler { isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED); isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED); break; break; } } case DctConstants.EVENT_ICC_CHANGED: { onUpdateIcc(); break; } case DctConstants.EVENT_RESTART_RADIO: { case DctConstants.EVENT_RESTART_RADIO: { restartRadio(); restartRadio(); break; break; Loading Loading @@ -3856,10 +3750,8 @@ public class DcTracker extends Handler { mWatchdog = false; mWatchdog = false; reevaluateUnmeteredConnections(); reevaluateUnmeteredConnections(); break; break; case DctConstants.EVENT_UPDATE_CARRIER_CONFIGS: case DctConstants.EVENT_CARRIER_CONFIG_CHANGED: Pair<String[], String> configPair = (Pair<String[], String>) msg.obj; onCarrierConfigChanged(msg.arg1); updateLinkBandwidths(configPair.first, msg.arg1 == 1); update5GIconMapping(configPair.second); break; break; default: default: Rlog.e("DcTracker", "Unhandled event=" + msg); Rlog.e("DcTracker", "Unhandled event=" + msg); Loading Loading @@ -3898,38 +3790,6 @@ public class DcTracker extends Handler { return cid; return cid; } } private IccRecords getUiccRecords(int appFamily) { return mUiccController.getIccRecords(mPhone.getPhoneId(), appFamily); } private void onUpdateIcc() { if (mUiccController == null ) { return; } IccRecords newIccRecords = getUiccRecords(UiccController.APP_FAM_3GPP); IccRecords r = mIccRecords.get(); if (r != newIccRecords) { if (r != null) { log("Removing stale icc objects."); r.unregisterForRecordsLoaded(this); mIccRecords.set(null); } if (newIccRecords != null) { if (SubscriptionManager.isValidSubscriptionId(mPhone.getSubId())) { log("New records found."); mIccRecords.set(newIccRecords); newIccRecords.registerForRecordsLoaded( this, DctConstants.EVENT_RECORDS_LOADED, null); } } else { onSimNotReady(); } } } /** /** * Update link bandwidth estimate default values from carrier config. * Update link bandwidth estimate default values from carrier config. * @param bandwidths String array of "RAT:upstream,downstream" for each RAT * @param bandwidths String array of "RAT:upstream,downstream" for each RAT Loading Loading @@ -4001,21 +3861,6 @@ public class DcTracker extends Handler { } } } } /** * Update DcTracker. * * TODO: This should be cleaned up. DcTracker should listen to those events. */ public void update() { log("update sub = " + mPhone.getSubId()); log("update(): Active DDS, register for all events now!"); onUpdateIcc(); mAutoAttachEnabled.set(false); mPhone.updateCurrentCarrierInProvider(); } @VisibleForTesting @VisibleForTesting public boolean shouldAutoAttach() { public boolean shouldAutoAttach() { if (mAutoAttachEnabled.get()) return true; if (mAutoAttachEnabled.get()) return true; Loading Loading @@ -4091,6 +3936,7 @@ public class DcTracker extends Handler { } } private boolean reevaluateUnmeteredConnections() { private boolean reevaluateUnmeteredConnections() { log("reevaluateUnmeteredConnections"); if (isNetworkTypeUnmetered(NETWORK_TYPE_NR) || isFrequencyRangeUnmetered()) { if (isNetworkTypeUnmetered(NETWORK_TYPE_NR) || isFrequencyRangeUnmetered()) { if (DBG) log("NR NSA is unmetered"); if (DBG) log("NR NSA is unmetered"); if (mPhone.getServiceState().getNrState() if (mPhone.getServiceState().getNrState() Loading Loading @@ -4427,7 +4273,7 @@ public class DcTracker extends Handler { * PLMN name,APN name are not mandatory parameters * PLMN name,APN name are not mandatory parameters */ */ private void initEmergencyApnSetting() { private void initEmergencyApnSetting() { // Operator Numeric is not available when sim records are not loaded. // Operator Numeric is not available when SIM is not ready. // Query Telephony.db with APN type as EPDN request does not // Query Telephony.db with APN type as EPDN request does not // require APN name, plmn and all operators support same APN config. // require APN name, plmn and all operators support same APN config. // DB will contain only one entry for Emergency APN // DB will contain only one entry for Emergency APN Loading Loading @@ -5228,4 +5074,69 @@ public class DcTracker extends Handler { } } return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; } } // TODO: Move icon related to display info controller. private void read5GConfiguration() { if (DBG) log("read5GConfiguration"); String nr5GIconConfiguration = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); String[] bandwidths = CarrierConfigManager.getDefaultConfig().getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); boolean useLte = false; mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext() .getSystemService(Context.CARRIER_CONFIG_SERVICE); if (configManager != null) { PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId()); if (b != null) { if (b.getString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING) != null) { nr5GIconConfiguration = b.getString( CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING); } if (b.getString(CarrierConfigManager .KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING) != null) { mDataIconPattern = b.getString( CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING); } if (b.getStringArray(CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY) != null) { bandwidths = b.getStringArray( CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY); } useLte = b.getBoolean(CarrierConfigManager .KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL); mHysteresisTimeSec = b.getInt( CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT); mWatchdogTimeMs = b.getLong( CarrierConfigManager.KEY_5G_WATCHDOG_TIME_MS_LONG); mAllUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL); mMmwaveUnmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL); mSub6Unmetered = b.getBoolean( CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL); } } updateLinkBandwidths(bandwidths, useLte); update5GIconMapping(nr5GIconConfiguration); } // This handles carrier config changed event. We intentionally to use this for SIM loaded/absent // event. There are several data setup related configuration stored in carrier config. We have // to wait carrier config ready before we can setup a data. private void onCarrierConfigChanged(int subId) { // TODO: Remove this check after b/152149072 is fixed because carrier config might // actually change without sub id change. if (mSubId == subId) return; mSubId = subId; if (DBG) log("onCarrierConfigChanged subId=" + subId); if (SubscriptionManager.isValidSubscriptionId(subId)) { onSubscriptionChanged(); } else { onSimNotReady(); } } } }