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

Commit 9be41ed3 authored by Sarah Chin's avatar Sarah Chin Committed by Automerger Merge Worker
Browse files

Merge changes from topics "displayinfocontroller", "remove_displayinfo" into...

Merge changes from topics "displayinfocontroller", "remove_displayinfo" into rvc-dev am: a53c2a00 am: 099783b9 am: bd3a9c34

Change-Id: I26b2377f60f36b7f66372b14949f6db156f50233
parents a847f612 bd3a9c34
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -264,8 +264,16 @@ public class GsmCdmaPhone extends Phone {
                this, this.mCi);
        mDataEnabledSettings = mTelephonyComponentFactory
                .inject(DataEnabledSettings.class.getName()).makeDataEnabledSettings(this);
        mDeviceStateMonitor = mTelephonyComponentFactory.inject(DeviceStateMonitor.class.getName())
                .makeDeviceStateMonitor(this);

        // DisplayInfoController creates an OverrideNetworkTypeController, which uses
        // DeviceStateMonitor so needs to be crated after it is instantiated.
        mDisplayInfoController = mTelephonyComponentFactory.inject(
                DisplayInfoController.class.getName()).makeDisplayInfoController(this);

        // DcTracker uses SST so needs to be created after it is instantiated
        // DcTracker uses ServiceStateTracker and DisplayInfoController so needs to be created
        // after they are instantiated
        for (int transport : mTransportManager.getAvailableTransports()) {
            mDcTrackers.put(transport, mTelephonyComponentFactory.inject(DcTracker.class.getName())
                    .makeDcTracker(this, transport));
@@ -279,14 +287,6 @@ public class GsmCdmaPhone extends Phone {
                EVENT_SET_CARRIER_DATA_ENABLED, null, false);

        mSST.registerForNetworkAttached(this, EVENT_REGISTERED_TO_NETWORK, null);
        mDeviceStateMonitor = mTelephonyComponentFactory.inject(DeviceStateMonitor.class.getName())
                .makeDeviceStateMonitor(this);

        // DisplayInfoController creates an OverrideNetworkTypeController, which uses
        // DeviceStateMonitor so needs to be crated after it is instantiated.
        mDisplayInfoController = mTelephonyComponentFactory.inject(
                DisplayInfoController.class.getName()).makeDisplayInfoController(this);

        mSST.registerForVoiceRegStateOrRatChanged(this, EVENT_VRS_OR_RAT_CHANGED, null);

        mSettingsObserver = new SettingsObserver(context, this);
+9 −14
Original line number Diff line number Diff line
@@ -2006,15 +2006,6 @@ public class ServiceStateTracker extends Handler {
        return cdmaRoaming && !isSameOperatorNameFromSimAndSS(s);
    }

    private boolean isNrStateChanged(
            NetworkRegistrationInfo oldRegState, NetworkRegistrationInfo newRegState) {
        if (oldRegState == null || newRegState == null) {
            return oldRegState != newRegState;
        }

        return oldRegState.getNrState() != newRegState.getNrState();
    }

    private boolean updateNrFrequencyRangeFromPhysicalChannelConfigs(
            List<PhysicalChannelConfig> physicalChannelConfigs, ServiceState ss) {
        int newFrequencyRange = ServiceState.FREQUENCY_RANGE_UNKNOWN;
@@ -3261,11 +3252,7 @@ public class ServiceStateTracker extends Handler {
        boolean hasNrFrequencyRangeChanged =
                mSS.getNrFrequencyRange() != mNewSS.getNrFrequencyRange();

        boolean hasNrStateChanged = isNrStateChanged(
                mSS.getNetworkRegistrationInfo(
                        NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkType.EUTRAN),
                mNewSS.getNetworkRegistrationInfo(
                        NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkType.EUTRAN));
        boolean hasNrStateChanged = mSS.getNrState() != mNewSS.getNrState();

        final List<CellIdentity> prioritizedCids = getPrioritizedCellIdentities(mNewSS);

@@ -3582,6 +3569,14 @@ public class ServiceStateTracker extends Handler {
            mPhone.notifyLocationChanged(getCellIdentity());
        }

        if (hasNrStateChanged) {
            mNrStateChangedRegistrants.notifyRegistrants();
        }

        if (hasNrFrequencyRangeChanged) {
            mNrFrequencyChangedRegistrants.notifyRegistrants();
        }

        if (mPhone.isPhoneTypeGsm()) {
            if (!isGprsConsistent(mSS.getDataRegistrationState(), mSS.getState())) {
                if (!mStartedGprsRegCheck && !mReportedGprsNoReg) {
+41 −238
Original line number Diff line number Diff line
@@ -132,8 +132,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.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
@@ -315,9 +313,9 @@ public class DcTracker extends Handler {
    private final LocalLog mDataRoamingLeakageLog = new LocalLog(50);
    private final LocalLog mApnSettingsInitializationLog = new LocalLog(50);

    /* Default for 5G connection reevaluation alarm durations */
    private int mHysteresisTimeSec = 0;
    /* 5G connection reevaluation watchdog alarm constants */
    private long mWatchdogTimeMs = 1000 * 60 * 60;
    private boolean mWatchdog = false;

    /* Default for whether 5G frequencies are considered unmetered */
    private boolean mNrNsaAllUnmetered = false;
@@ -328,21 +326,9 @@ public class DcTracker extends Handler {
    private boolean mNrSaSub6Unmetered = false;
    private boolean mRoamingUnmetered = false;

    /* Used to check whether 5G timers are currently active and waiting to go off */
    private boolean mHysteresis = false;
    private boolean mWatchdog = false;

    /* List of SubscriptionPlans, updated on SubscriptionManager.setSubscriptionPlans */
    private List<SubscriptionPlan> mSubscriptionPlans = null;

    /* Used to check whether phone was recently connected to 5G. */
    private boolean m5GWasConnected = false;

    /* Used to determine TelephonyDisplayInfo to send to SysUI. */
    private TelephonyDisplayInfo mTelephonyDisplayInfo = null;
    private final Map<String, Integer> m5GIconMapping = new HashMap<>();
    private String mDataIconPattern = "";

    @SimState
    private int mSimState = TelephonyManager.SIM_STATE_UNKNOWN;

@@ -358,16 +344,12 @@ public class DcTracker extends Handler {
                stopNetStatPoll();
                startNetStatPoll();
                restartDataStallAlarm();
                reevaluateUnmeteredConnections();
            } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                if (DBG) log("screen off");
                mIsScreenOn = false;
                stopNetStatPoll();
                startNetStatPoll();
                restartDataStallAlarm();
                stopHysteresisAlarm();
                stopWatchdogAlarm();
                setDataConnectionUnmetered(false);
            } else if (action.equals(INTENT_DATA_STALL_ALARM)) {
                onActionIntentDataStallAlarm(intent);
            } else if (action.equals(INTENT_PROVISIONING_APN_ALARM)) {
@@ -781,8 +763,6 @@ public class DcTracker extends Handler {
                DctConstants.EVENT_PS_RESTRICT_DISABLED, null);
        mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(mTransportType, this,
                DctConstants.EVENT_DATA_RAT_CHANGED, null);
        // listens for PhysicalChannelConfig changes
        mPhone.registerForServiceStateChanged(this, DctConstants.EVENT_SERVICE_STATE_CHANGED, null);
    }

    public void unregisterServiceStateTrackerEvents() {
@@ -792,9 +772,7 @@ public class DcTracker extends Handler {
        mPhone.getServiceStateTracker().unregisterForDataRoamingOff(this);
        mPhone.getServiceStateTracker().unregisterForPsRestrictedEnabled(this);
        mPhone.getServiceStateTracker().unregisterForPsRestrictedDisabled(this);
        mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(mTransportType,
                this);
        mPhone.unregisterForServiceStateChanged(this);
        mPhone.getServiceStateTracker().unregisterForDataRegStateOrRatChanged(mTransportType, this);
    }

    private void registerForAllEvents() {
@@ -814,6 +792,8 @@ public class DcTracker extends Handler {
                DctConstants.EVENT_VOICE_CALL_ENDED, null);
        mPhone.getCallTracker().registerForVoiceCallStarted(this,
                DctConstants.EVENT_VOICE_CALL_STARTED, null);
        mPhone.getDisplayInfoController().registerForTelephonyDisplayInfoChanged(this,
                DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED, null);
        registerServiceStateTrackerEvents();
        mDataServiceManager.registerForServiceBindingChanged(this,
                DctConstants.EVENT_DATA_SERVICE_BINDING_CHANGED, null);
@@ -860,9 +840,9 @@ public class DcTracker extends Handler {

        mPhone.getCallTracker().unregisterForVoiceCallEnded(this);
        mPhone.getCallTracker().unregisterForVoiceCallStarted(this);
        mPhone.getDisplayInfoController().unregisterForTelephonyDisplayInfoChanged(this);
        unregisterServiceStateTrackerEvents();
        mDataServiceManager.unregisterForServiceBindingChanged(this);

        mDataEnabledSettings.unregisterForDataEnabledChanged(this);
        mDataEnabledSettings.unregisterForDataEnabledOverrideChanged(this);
    }
@@ -897,7 +877,6 @@ public class DcTracker extends Handler {
        log("setActivity = " + activity);
        mActivity = activity;
        mPhone.notifyDataActivity();
        updateDisplayInfo();
    }

    public void requestNetwork(NetworkRequest networkRequest, @RequestNetworkType int type,
@@ -3880,19 +3859,11 @@ public class DcTracker extends Handler {
            case DctConstants.EVENT_DATA_ENABLED_OVERRIDE_RULES_CHANGED:
                onDataEnabledOverrideRulesChanged();
                break;
            case DctConstants.EVENT_SERVICE_STATE_CHANGED:
                if (!reevaluateUnmeteredConnections()) {
                    // always update on ServiceState changed so MobileSignalController gets
                    // accurate display info
                    mPhone.notifyDisplayInfoChanged(mTelephonyDisplayInfo);
                }
                break;
            case DctConstants.EVENT_5G_TIMER_HYSTERESIS:
            case DctConstants.EVENT_NR_TIMER_WATCHDOG:
                mWatchdog = false;
                reevaluateUnmeteredConnections();
                mHysteresis = false;
                break;
            case DctConstants.EVENT_5G_TIMER_WATCHDOG:
                mWatchdog = false;
            case DctConstants.EVENT_TELEPHONY_DISPLAY_INFO_CHANGED:
                reevaluateUnmeteredConnections();
                break;
            case DctConstants.EVENT_CARRIER_CONFIG_CHANGED:
@@ -3990,26 +3961,6 @@ public class DcTracker extends Handler {
        return mBandwidths.get(ratName);
    }

    private void update5GIconMapping(String config) {
        synchronized (m5GIconMapping) {
            m5GIconMapping.clear();
            for (String pair : config.trim().split(",")) {
                String[] kv = (pair.trim().toLowerCase()).split(":");
                if (kv.length != 2) {
                    if (DBG) log("Invalid 5G icon configuration, config = " + pair);
                    continue;
                }
                int value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
                if (kv[1].equals("5g")) {
                    value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA;
                } else if (kv[1].equals("5g_plus")) {
                    value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE;
                }
                m5GIconMapping.put(kv[0], value);
            }
        }
    }

    @VisibleForTesting
    public boolean shouldAutoAttach() {
        if (mAutoAttachEnabled.get()) return true;
@@ -4084,49 +4035,25 @@ public class DcTracker extends Handler {
        }
    }

    private boolean reevaluateUnmeteredConnections() {
    private void reevaluateUnmeteredConnections() {
        log("reevaluateUnmeteredConnections");
        int networkType = ServiceState.rilRadioTechnologyToNetworkType(getDataRat());
        boolean nrUnmetered = isNetworkTypeUnmetered(NETWORK_TYPE_NR);
        boolean nrNsaUnmetered = isNrNsaFrequencyRangeUnmetered();
        boolean nrSaUnmetered = isNrSaFrequencyRangeUnmetered();
        if ((nrUnmetered || nrNsaUnmetered || nrSaUnmetered)
        int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType();
        int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo()
                .getOverrideNetworkType();
        boolean nrPlanUnmetered = isNetworkTypeUnmetered(NETWORK_TYPE_NR) && (rat == NETWORK_TYPE_NR
                || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA
                || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE);
        if ((nrPlanUnmetered || isNrNsaFrequencyRangeUnmetered() || isNrSaFrequencyRangeUnmetered())
                && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) {
            if (DBG) log("NR is unmetered");
            if ((nrUnmetered || nrNsaUnmetered) && mPhone.getServiceState().getNrState()
                    == NetworkRegistrationInfo.NR_STATE_CONNECTED
                    || (nrUnmetered || nrSaUnmetered) && networkType == NETWORK_TYPE_NR) {
                if (!m5GWasConnected) { // 4G -> 5G
                    stopHysteresisAlarm();
            setDataConnectionUnmetered(true);
                }
            if (!mWatchdog) {
                startWatchdogAlarm();
            }
                m5GWasConnected = true;
        } else {
                if (m5GWasConnected) { // 5G -> 4G
                    if (!mHysteresis && !startHysteresisAlarm()) {
                        // hysteresis is not active but carrier does not support hysteresis
                        stopWatchdogAlarm();
                        setDataConnectionUnmetered(isNetworkTypeUnmetered(networkType));
                    }
                    m5GWasConnected = false;
                } else { // 4G -> 4G
                    if (!hasMessages(DctConstants.EVENT_5G_TIMER_HYSTERESIS)) {
            stopWatchdogAlarm();
                        setDataConnectionUnmetered(isNetworkTypeUnmetered(networkType));
            setDataConnectionUnmetered(isNetworkTypeUnmetered(rat));
        }
                    // do nothing if waiting for hysteresis alarm to go off
                }
            }
        } else {
            stopWatchdogAlarm();
            stopHysteresisAlarm();
            setDataConnectionUnmetered(isNetworkTypeUnmetered(networkType));
            m5GWasConnected = false;
        }
        return updateDisplayInfo();
    }

    private void setDataConnectionUnmetered(boolean isUnmetered) {
@@ -4173,18 +4100,24 @@ public class DcTracker extends Handler {
    }

    private boolean isNrNsaFrequencyRangeUnmetered() {
        int override = mPhone.getDisplayInfoController().getTelephonyDisplayInfo()
                .getOverrideNetworkType();
        if (mNrNsaMmwaveUnmetered || mNrNsaSub6Unmetered) {
            int frequencyRange = mPhone.getServiceState().getNrFrequencyRange();
            boolean mmwave = frequencyRange == ServiceState.FREQUENCY_RANGE_MMWAVE;
            // frequency range LOW, MID, or HIGH
            boolean sub6 = frequencyRange != ServiceState.FREQUENCY_RANGE_UNKNOWN && !mmwave;
            return mNrNsaMmwaveUnmetered && mmwave || mNrNsaSub6Unmetered && sub6;
            return (mNrNsaMmwaveUnmetered
                    && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE)
                    || (mNrNsaSub6Unmetered
                    && override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA);
        } else {
            return mNrNsaAllUnmetered;
            return mNrNsaAllUnmetered
                    && (override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE
                    || override == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA);
        }
    }

    private boolean isNrSaFrequencyRangeUnmetered() {
        if (ServiceState.rilRadioTechnologyToNetworkType(getDataRat()) != NETWORK_TYPE_NR) {
            return false;
        }
        if (mNrSaMmwaveUnmetered || mNrSaSub6Unmetered) {
            int frequencyRange = mPhone.getServiceState().getNrFrequencyRange();
            boolean mmwave = frequencyRange == ServiceState.FREQUENCY_RANGE_MMWAVE;
@@ -4196,94 +4129,6 @@ public class DcTracker extends Handler {
        }
    }

    private boolean updateDisplayInfo() {
        int displayNetworkType = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
        int dataNetworkType = mPhone.getServiceState().getDataNetworkType();
        if (mPhone.getServiceState().getNrState() != NetworkRegistrationInfo.NR_STATE_NONE
                || dataNetworkType == TelephonyManager.NETWORK_TYPE_NR || mHysteresis) {
            // process NR display network type
            displayNetworkType = getNrDisplayType();
            if (displayNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) {
                // use LTE values if 5G values aren't defined
                displayNetworkType = getLteDisplayType();
            }
        } else if (dataNetworkType == TelephonyManager.NETWORK_TYPE_LTE
                || dataNetworkType == TelephonyManager.NETWORK_TYPE_LTE_CA) {
            // process LTE display network type
            displayNetworkType = getLteDisplayType();
        }
        TelephonyDisplayInfo telephonyDisplayInfo =
                new TelephonyDisplayInfo(dataNetworkType, displayNetworkType);
        if (!telephonyDisplayInfo.equals(mTelephonyDisplayInfo)) {
            log("Display info changed: " + telephonyDisplayInfo);
            mTelephonyDisplayInfo = telephonyDisplayInfo;
            mPhone.notifyDisplayInfoChanged(telephonyDisplayInfo);
            return true;
        }
        return false;
    }

    private int getNrDisplayType() {
        // icon display keys in order of priority
        List<String> keys = new ArrayList<>();
        switch (mPhone.getServiceState().getNrState()) {
            case NetworkRegistrationInfo.NR_STATE_CONNECTED:
                if (mPhone.getServiceState().getNrFrequencyRange()
                        == ServiceState.FREQUENCY_RANGE_MMWAVE) {
                    keys.add("connected_mmwave");
                }
                keys.add("connected");
                break;
            case NetworkRegistrationInfo.NR_STATE_NOT_RESTRICTED:
                if (mActivity == DctConstants.Activity.DORMANT) {
                    keys.add("not_restricted_rrc_idle");
                } else {
                    keys.add("not_restricted_rrc_con");
                }
                break;
            case NetworkRegistrationInfo.NR_STATE_RESTRICTED:
                keys.add("restricted");
                break;
        }

        for (String key : keys) {
            if (m5GIconMapping.containsKey(key)
                    && m5GIconMapping.get(key) != TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) {
                return m5GIconMapping.get(key);
            }
        }
        return TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
    }

    private int getLteDisplayType() {
        int value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
        if (mPhone.getServiceState().getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA
                || mPhone.getServiceState().isUsingCarrierAggregation()) {
            value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_CA;
        }
        if (isLteEnhancedAvailable()) {
            value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_LTE_ADVANCED_PRO;
        }
        return value;
    }

    private boolean isLteEnhancedAvailable() {
        if (TextUtils.isEmpty(mDataIconPattern)) {
            return false;
        }
        Pattern stringPattern = Pattern.compile(mDataIconPattern);
        for (String opName : new String[] {mPhone.getServiceState().getOperatorAlphaLongRaw(),
                mPhone.getServiceState().getOperatorAlphaShortRaw()}) {
            if (!TextUtils.isEmpty(opName)) {
                Matcher matcher = stringPattern.matcher(opName);
                if (matcher.find()) {
                    return true;
                }
            }
        }
        return false;
    }

    protected void log(String s) {
        Rlog.d(mLogTag, s);
    }
@@ -4696,7 +4541,6 @@ public class DcTracker extends Handler {
                    log("updateDataActivity: newActivity=" + newActivity);
                mActivity = newActivity;
                mPhone.notifyDataActivity();
                updateDisplayInfo();
            }
        }
    }
@@ -5141,32 +4985,15 @@ public class DcTracker extends Handler {
    }

    /**
     * 5G connection reevaluation alarms
     * 5G connection reevaluation alarm
     */
    private boolean startHysteresisAlarm() {
        if (mHysteresisTimeSec > 0) {
            // only create hysteresis alarm if CarrierConfig allows it
            sendMessageDelayed(obtainMessage(DctConstants.EVENT_5G_TIMER_HYSTERESIS),
                    mHysteresisTimeSec * 1000);
            mHysteresis = true;
            return true;
        } else {
            return false;
        }
    }

    private void stopHysteresisAlarm() {
        removeMessages(DctConstants.EVENT_5G_TIMER_HYSTERESIS);
        mHysteresis = false;
    }

    private void startWatchdogAlarm() {
        sendMessageDelayed(obtainMessage(DctConstants.EVENT_5G_TIMER_WATCHDOG), mWatchdogTimeMs);
        sendMessageDelayed(obtainMessage(DctConstants.EVENT_NR_TIMER_WATCHDOG), mWatchdogTimeMs);
        mWatchdog = true;
    }

    private void stopWatchdogAlarm() {
        removeMessages(DctConstants.EVENT_5G_TIMER_WATCHDOG);
        removeMessages(DctConstants.EVENT_NR_TIMER_WATCHDOG);
        mWatchdog = false;
    }

@@ -5258,50 +5085,28 @@ 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);
                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);
                mNrNsaAllUnmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL);
                mWatchdogTimeMs = b.getLong(CarrierConfigManager.KEY_5G_WATCHDOG_TIME_MS_LONG);
                mNrNsaAllUnmetered = b.getBoolean(CarrierConfigManager.KEY_UNMETERED_NR_NSA_BOOL);
                mNrNsaMmwaveUnmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_MMWAVE_BOOL);
                mNrNsaSub6Unmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL);
                mNrSaAllUnmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_SA_BOOL);
                mNrSaAllUnmetered = b.getBoolean(CarrierConfigManager.KEY_UNMETERED_NR_SA_BOOL);
                mNrSaMmwaveUnmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_SA_MMWAVE_BOOL);
                mNrSaSub6Unmetered = b.getBoolean(
@@ -5310,8 +5115,6 @@ public class DcTracker extends Handler {
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_WHEN_ROAMING_BOOL);
            }
        }

        updateLinkBandwidths(bandwidths, useLte);
        update5GIconMapping(nr5GIconConfiguration);
    }
}