Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bc7d7cd3 authored by Jack Yu's avatar Jack Yu Committed by Automerger Merge Worker
Browse files

Merge "Get rid of SIM record access in DcTracker" into rvc-dev am: 7ab40202

Change-Id: I3082e304a3b541c2b95a85f5de24ef3aeb7b64f2
parents e3d5a7c1 7ab40202
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ import com.android.internal.telephony.dataconnection.TransportManager;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.gsm.GsmMmiCode;
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.uicc.IccCardApplicationStatus.AppType;
import com.android.internal.telephony.uicc.IccCardStatus;
@@ -108,7 +109,6 @@ import com.android.internal.telephony.uicc.UiccProfile;
import com.android.internal.telephony.uicc.UiccSlot;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.telephony.Rlog;
import com.android.internal.telephony.imsphone.ImsPhoneMmiCode;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -3172,7 +3172,7 @@ public class GsmCdmaPhone extends Phone {
                                simOperatorNumeric);
                    }
                }
                updateDataConnectionTracker();
                updateCurrentCarrierInProvider();
            }
        }

@@ -4043,10 +4043,9 @@ public class GsmCdmaPhone extends Phone {
        return dialString;
    }

    /**
     * @return operator numeric.
     */
    private String getOperatorNumeric() {
    @Override
    @NonNull
    public String getOperatorNumeric() {
        String operatorNumeric = null;
        if (isPhoneTypeGsm()) {
            IccRecords r = mIccRecords.get();
@@ -4088,7 +4087,7 @@ public class GsmCdmaPhone extends Phone {
                    + " operatorNumeric = " + operatorNumeric);

        }
        return operatorNumeric;
        return TextUtils.emptyIfNull(operatorNumeric);
    }

    /**
+10 −10
Original line number Diff line number Diff line
@@ -4039,16 +4039,6 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        return getLocaleFromCarrierProperties();
    }

    public void updateDataConnectionTracker() {
        if (mTransportManager != null) {
            for (int transport : mTransportManager.getAvailableTransports()) {
                if (getDcTracker(transport) != null) {
                    getDcTracker(transport).update();
                }
            }
        }
    }

    public boolean updateCurrentCarrierInProvider() {
        return false;
    }
@@ -4243,6 +4233,16 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
        return RIL.RADIO_HAL_VERSION_UNKNOWN;
    }

    /**
     * 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) {
        pw.println("Phone: subId=" + getSubId());
        pw.println(" mPhoneId=" + mPhoneId);
+0 −17
Original line number Diff line number Diff line
@@ -1309,9 +1309,6 @@ public class SubscriptionController extends ISub.Stub {
                    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());
            }

@@ -2423,9 +2420,6 @@ public class SubscriptionController extends ISub.Stub {
                }
            }

            // FIXME is this still needed?
            updateAllDataConnectionTrackers();

            int previousDefaultSub = getDefaultSubId();
            Settings.Global.putInt(mContext.getContentResolver(),
                    Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION, subId);
@@ -2439,17 +2433,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
    private void broadcastDefaultDataSubIdChanged(int subId) {
        // Broadcast an Intent for default data sub change
+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ public class DataConnectionReasons {

        // Belows are all hard failure reasons.
        NOT_ATTACHED(true),
        RECORD_NOT_LOADED(true),
        SIM_NOT_READY(true),
        INVALID_PHONE_STATE(true),
        CONCURRENT_VOICE_DATA_NOT_ALLOWED(true),
        PS_RESTRICTED(true),
+89 −178
Original line number Diff line number Diff line
@@ -78,7 +78,6 @@ import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
import android.telephony.ServiceState.RilRadioTechnology;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.SubscriptionPlan;
import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyFrameworkInitializer;
@@ -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.DataEnabledSettings.DataEnabledChangedReason;
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.TelephonyUtils;
import com.android.internal.util.AsyncChannel;
@@ -132,7 +129,6 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -340,6 +336,8 @@ public class DcTracker extends Handler {
    private final Map<String, Integer> m5GIconMapping = new HashMap<>();
    private String mDataIconPattern = "";

    private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;

    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver () {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -368,54 +366,9 @@ public class DcTracker extends Handler {
                if (DBG) log("Provisioning apn alarm");
                onActionIntentProvisioningApnAlarm(intent);
            } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
                if (DBG) log("received carrier config change");
                if (mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded()) {
                    setDefaultDataRoamingEnabled();
                }
                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)));
                sendMessage(obtainMessage(DctConstants.EVENT_CARRIER_CONFIG_CHANGED,
                        intent.getIntExtra(SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX,
                                SubscriptionManager.INVALID_SUBSCRIPTION_ID), 0));
            } else {
                if (DBG) log("onReceive: Unknown action=" + action);
            }
@@ -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 final NetworkPolicyManager.SubscriptionCallback mSubscriptionCallback =
            new NetworkPolicyManager.SubscriptionCallback() {
@@ -611,8 +537,6 @@ public class DcTracker extends Handler {

    // member variables
    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.State mState = DctConstants.State.IDLE;
    private final Handler mDataConnectionTracker;
@@ -746,8 +670,6 @@ public class DcTracker extends Handler {
        mDataServiceManager = new DataServiceManager(phone, transportType, tagSuffix);

        mResolver = mPhone.getContext().getContentResolver();
        mUiccController = UiccController.getInstance();
        mUiccController.registerForIccChanged(this, DctConstants.EVENT_ICC_CHANGED, null);
        mAlarmManager =
                (AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);

@@ -772,9 +694,6 @@ public class DcTracker extends Handler {
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mPhone.getContext());
        mAutoAttachEnabled.set(sp.getBoolean(Phone.DATA_DISABLED_ON_BOOT_KEY, false));

        mSubscriptionManager = SubscriptionManager.from(mPhone.getContext());
        mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);

        mNetworkPolicyManager = (NetworkPolicyManager) mPhone.getContext()
                .getSystemService(Context.NETWORK_POLICY_SERVICE);
        mNetworkPolicyManager.registerSubscriptionCallback(mSubscriptionCallback);
@@ -787,7 +706,6 @@ public class DcTracker extends Handler {

        mDataConnectionTracker = this;
        registerForAllEvents();
        update();
        mApnObserver = new ApnChangeObserver();
        phone.getContext().getContentResolver().registerContentObserver(
                Telephony.Carriers.CONTENT_URI, true, mApnObserver);
@@ -809,7 +727,6 @@ public class DcTracker extends Handler {
        mTelephonyManager = null;
        mAlarmManager = null;
        mPhone = null;
        mUiccController = null;
        mDataConnectionTracker = null;
        mProvisionActionName = null;
        mSettingsObserver = new SettingsObserver(null, this);
@@ -887,11 +804,8 @@ public class DcTracker extends Handler {

        mIsDisposed = true;
        mPhone.getContext().unregisterReceiver(mIntentReceiver);
        mUiccController.unregisterForIccChanged(this);
        mSettingsObserver.unobserve();

        mSubscriptionManager
                .removeOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener);
        mNetworkPolicyManager.unregisterSubscriptionCallback(mSubscriptionCallback);
        mDcc.dispose();
        mDcTesterFailBringUpAll.dispose();
@@ -913,11 +827,6 @@ public class DcTracker extends Handler {
            mPhone.mCi.unregisterForPcoData(this);
        }

        IccRecords r = mIccRecords.get();
        if (r != null) {
            r.unregisterForRecordsLoaded(this);
            mIccRecords.set(null);
        }
        mPhone.getCallTracker().unregisterForVoiceCallEnded(this);
        mPhone.getCallTracker().unregisterForVoiceCallStarted(this);
        unregisterServiceStateTrackerEvents();
@@ -1353,8 +1262,6 @@ public class DcTracker extends Handler {
            radioStateFromCarrier = true;
        }

        boolean recordsLoaded = mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded();

        boolean defaultDataSelected = SubscriptionManager.isValidSubscriptionId(
                SubscriptionManager.getDefaultDataSubscriptionId());

@@ -1408,8 +1315,8 @@ public class DcTracker extends Handler {
        if (!attachedState && !shouldAutoAttach() && requestType != REQUEST_TYPE_HANDOVER) {
            reasons.add(DataDisallowedReasonType.NOT_ATTACHED);
        }
        if (!recordsLoaded) {
            reasons.add(DataDisallowedReasonType.RECORD_NOT_LOADED);
        if (mPhone.getSubId() == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            reasons.add(DataDisallowedReasonType.SIM_NOT_READY);
        }
        if (phoneState != PhoneConstants.State.IDLE
                && !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
@@ -2293,17 +2200,24 @@ public class DcTracker extends Handler {
        removeMessages(DctConstants.EVENT_DATA_RECONNECT, apnContext);
    }

    protected void onRecordsLoadedOrSubIdChanged() {
        if (DBG) log("onRecordsLoadedOrSubIdChanged: createAllApnList");
    private void onSubscriptionChanged() {
        if (DBG) log("onSubscriptionChanged");
        if (mTransportType == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) {
            // Auto attach is for cellular only.
            mAutoAttachOnCreationConfig = mPhone.getContext().getResources()
                    .getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation);
        }

        mAutoAttachEnabled.set(false);
        setDefaultDataRoamingEnabled();
        read5GConfiguration();
        registerSettingsObserver();

        createAllApnList();
        setDataProfilesAsNeeded();
        if (mPhone.getSubId() != SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            setInitialAttachApn();
        }
        mPhone.notifyAllActiveDataConnections();
        setupDataOnAllConnectableApns(Phone.REASON_SIM_LOADED, RetryFailures.ALWAYS);
    }
@@ -2316,8 +2230,6 @@ public class DcTracker extends Handler {
        mAutoAttachOnCreationConfig = false;
        // Clear auto attach as modem is expected to do a new attach once SIM is ready
        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.
        createAllApnList();
        setDataProfilesAsNeeded();
@@ -3157,8 +3069,7 @@ public class DcTracker extends Handler {
     */
    protected void createAllApnList() {
        mAllApnSettings.clear();
        IccRecords r = mIccRecords.get();
        String operator = (r != null) ? r.getOperatorNumeric() : "";
        String operator = mPhone.getOperatorNumeric();

        // ORDER BY Telephony.Carriers._ID ("_id")
        Cursor cursor = mPhone.getContext().getContentResolver().query(
@@ -3301,8 +3212,7 @@ public class DcTracker extends Handler {
            }
        }

        IccRecords r = mIccRecords.get();
        String operator = (r != null) ? r.getOperatorNumeric() : "";
        String operator = mPhone.getOperatorNumeric();

        // 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
@@ -3324,8 +3234,7 @@ public class DcTracker extends Handler {
            log("buildWaitingApns: usePreferred=" + usePreferred
                    + " canSetPreferApn=" + mCanSetPreferApn
                    + " mPreferredApn=" + mPreferredApn
                    + " operator=" + operator + " radioTech=" + radioTech
                    + " IccRecords r=" + r);
                    + " operator=" + operator + " radioTech=" + radioTech);
        }

        if (usePreferred && mCanSetPreferApn && mPreferredApn != null &&
@@ -3495,17 +3404,6 @@ public class DcTracker extends Handler {
        int generation;
        int requestType;
        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:
                onDataConnectionDetached();
                break;
@@ -3807,10 +3705,6 @@ public class DcTracker extends Handler {
                        isProvApn ? DctConstants.ENABLED : DctConstants.DISABLED);
                break;
            }
            case DctConstants.EVENT_ICC_CHANGED: {
                onUpdateIcc();
                break;
            }
            case DctConstants.EVENT_RESTART_RADIO: {
                restartRadio();
                break;
@@ -3861,10 +3755,8 @@ public class DcTracker extends Handler {
                mWatchdog = false;
                reevaluateUnmeteredConnections();
                break;
            case DctConstants.EVENT_UPDATE_CARRIER_CONFIGS:
                Pair<String[], String> configPair = (Pair<String[], String>) msg.obj;
                updateLinkBandwidths(configPair.first, msg.arg1 == 1);
                update5GIconMapping(configPair.second);
            case DctConstants.EVENT_CARRIER_CONFIG_CHANGED:
                onCarrierConfigChanged(msg.arg1);
                break;
            default:
                Rlog.e("DcTracker", "Unhandled event=" + msg);
@@ -3903,38 +3795,6 @@ public class DcTracker extends Handler {
        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.
     * @param bandwidths String array of "RAT:upstream,downstream" for each RAT
@@ -4009,21 +3869,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
    public boolean shouldAutoAttach() {
        if (mAutoAttachEnabled.get()) return true;
@@ -4099,6 +3944,7 @@ public class DcTracker extends Handler {
    }

    private boolean reevaluateUnmeteredConnections() {
        log("reevaluateUnmeteredConnections");
        if (isNetworkTypeUnmetered(NETWORK_TYPE_NR) || isFrequencyRangeUnmetered()) {
            if (DBG) log("NR NSA is unmetered");
            if (mPhone.getServiceState().getNrState()
@@ -4436,7 +4282,7 @@ public class DcTracker extends Handler {
     * PLMN name,APN name are not mandatory parameters
     */
    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
        // require APN name, plmn and all operators support same APN config.
        // DB will contain only one entry for Emergency APN
@@ -5237,4 +5083,69 @@ public class DcTracker extends Handler {
        }
        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