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

Commit b3b549fc authored by Sarah Chin's avatar Sarah Chin
Browse files

Remove DisplayInfo logic from DcTracker

Remove hysteresis logic and sync meteredness with override network type
from DisplayInfoController

Test: atest NetworkTypeControllerTest, DcTrackerTest
Test: manual verify timer and meteredness works as expected
Bug: 154186364
Change-Id: Icd31e7b9c4e22bff50089d1af64ff7ed58f5111a
parent 870a1ae5
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
@@ -2005,15 +2005,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;
@@ -3235,11 +3226,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();

        boolean hasLocationChanged = (mCellIdentity == null ? mNewCellIdentity != null
                : !mCellIdentity.isSameCell(mNewCellIdentity));
@@ -3557,6 +3544,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();
            }
        }
    }
@@ -5133,32 +4977,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;
    }

@@ -5250,50 +5077,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(
@@ -5302,8 +5107,6 @@ public class DcTracker extends Handler {
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_WHEN_ROAMING_BOOL);
            }
        }

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