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

Commit b9c782f0 authored by Ling Ma's avatar Ling Ma
Browse files

Adjust NR timer on PCI change

B: 364799697
Flag: EXEMPT under new carrier config flag
Test: reporter verified, reviewed BR
Test: voice call + data browsing"

Change-Id: I2780c41b98c1dac6efbfb6c739d80c6272608fce
parent 887b822b
Loading
Loading
Loading
Loading
+20 −3
Original line number Diff line number Diff line
@@ -213,8 +213,8 @@ public class NetworkTypeController extends StateMachine {
    @NonNull private final Set<Integer> mAdditionalNrAdvancedBands = new HashSet<>();
    @NonNull private String mPrimaryTimerState;
    @NonNull private String mSecondaryTimerState;
    // TODO(b/316425811 remove the workaround)
    private int mNrAdvancedBandsSecondaryTimer;
    private int mNrAdvancedPciChangeSecondaryTimer;
    @NonNull private String mPreviousState;
    @LinkStatus private int mPhysicalLinkStatus;
    private boolean mIsPhysicalChannelConfig16Supported;
@@ -224,6 +224,7 @@ public class NetworkTypeController extends StateMachine {
    private boolean mEnableNrAdvancedWhileRoaming = true;
    private boolean mIsDeviceIdleMode = false;
    private boolean mPrimaryCellChangedWhileIdle = false;
    private boolean mPciChangedDuringPrimaryTimer = false;

    // Cached copies below to prevent race conditions
    @NonNull private ServiceState mServiceState;
@@ -485,6 +486,8 @@ public class NetworkTypeController extends StateMachine {
                CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL);
        mNrAdvancedBandsSecondaryTimer = config.getInt(
                CarrierConfigManager.KEY_NR_ADVANCED_BANDS_SECONDARY_TIMER_SECONDS_INT);
        mNrAdvancedPciChangeSecondaryTimer = config.getInt(
                CarrierConfigManager.KEY_NR_ADVANCED_PCI_CHANGE_SECONDARY_TIMER_SECONDS_INT);
        String nrIconConfiguration = config.getString(
                CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING);
        String overrideTimerRule = config.getString(
@@ -1427,6 +1430,7 @@ public class NetworkTypeController extends StateMachine {
        mLastAnchorNrCellId = anchorNrCellId;
        mPhysicalChannelConfigs = physicalChannelConfigs;
        mDoesPccListIndicateIdle = false;
        mPciChangedDuringPrimaryTimer = mIsPrimaryTimerActive;
        if (DBG) {
            log("Physical channel configs updated: anchorNrCell=" + mLastAnchorNrCellId
                    + ", nrBandwidths=" + mRatchetedNrBandwidths + ", nrBands=" +  mRatchetedNrBands
@@ -1484,6 +1488,7 @@ public class NetworkTypeController extends StateMachine {
    private void transitionWithSecondaryTimerTo(IState destState) {
        String currentName = getCurrentState().getName();
        OverrideTimerRule rule = mOverrideTimerRules.get(mPrimaryTimerState);
        int duration = -1;
        if (DBG) {
            log("Transition with secondary timer from " + currentName + " to "
                    + destState.getName());
@@ -1492,12 +1497,19 @@ public class NetworkTypeController extends StateMachine {
            log("Skip secondary timer from " + currentName + " to "
                    + destState.getName() + " due to in call");
        } else if (!mIsDeviceIdleMode && rule != null && rule.getSecondaryTimer(currentName) > 0) {
            int duration = rule.getSecondaryTimer(currentName);
            duration = rule.getSecondaryTimer(currentName);
            if (mLastShownNrDueToAdvancedBand && mNrAdvancedBandsSecondaryTimer > 0) {
                duration = mNrAdvancedBandsSecondaryTimer;
                if (DBG) log("timer adjusted by nr_advanced_bands_secondary_timer_seconds_int");
            }
            if (DBG) log(duration + "s secondary timer started for state: " + currentName);
        } else if (mNrAdvancedPciChangeSecondaryTimer > 0
                && mPciChangedDuringPrimaryTimer) {
            duration = mNrAdvancedPciChangeSecondaryTimer;
            if (DBG) log(duration + "s secondary timer started for PCI changed");
        }

        if (duration > 0) {
            mSecondaryTimerState = currentName;
            mPreviousState = currentName;
            mIsSecondaryTimerActive = true;
@@ -1505,7 +1517,9 @@ public class NetworkTypeController extends StateMachine {
            mSecondaryTimerExpireTimestamp = SystemClock.uptimeMillis() + durationMillis;
            sendMessageDelayed(EVENT_SECONDARY_TIMER_EXPIRED, destState, durationMillis);
        }

        mIsPrimaryTimerActive = false;
        mPciChangedDuringPrimaryTimer = false;
        transitionTo(getCurrentState());
    }

@@ -1555,6 +1569,7 @@ public class NetworkTypeController extends StateMachine {
            }
            removeMessages(EVENT_PRIMARY_TIMER_EXPIRED);
            mIsPrimaryTimerActive = false;
            mPciChangedDuringPrimaryTimer = false;
            mPrimaryTimerState = "";
            transitionToCurrentState();
            return;
@@ -1598,6 +1613,7 @@ public class NetworkTypeController extends StateMachine {
        removeMessages(EVENT_PRIMARY_TIMER_EXPIRED);
        removeMessages(EVENT_SECONDARY_TIMER_EXPIRED);
        mIsPrimaryTimerActive = false;
        mPciChangedDuringPrimaryTimer = false;
        mIsSecondaryTimerActive = false;
        mSecondaryTimerExpireTimestamp = 0;
        mPrimaryTimerState = "";
@@ -1821,10 +1837,11 @@ public class NetworkTypeController extends StateMachine {
        pw.flush();
        pw.increaseIndent();
        pw.println("mSubId=" + mPhone.getSubId());
        pw.println("mOverrideTimerRules=" + mOverrideTimerRules.toString());
        pw.println("mOverrideTimerRules=" + mOverrideTimerRules);
        pw.println("mLteEnhancedPattern=" + mLteEnhancedPattern);
        pw.println("mIsPhysicalChannelConfigOn=" + mIsPhysicalChannelConfigOn);
        pw.println("mIsPrimaryTimerActive=" + mIsPrimaryTimerActive);
        pw.println("mPciChangedDuringPrimaryTimer=" + mPciChangedDuringPrimaryTimer);
        pw.println("mIsSecondaryTimerActive=" + mIsSecondaryTimerActive);
        pw.println("mIsTimerResetEnabledForLegacyStateRrcIdle="
                + mIsTimerResetEnabledForLegacyStateRrcIdle);
+54 −0
Original line number Diff line number Diff line
@@ -1372,6 +1372,60 @@ public class NetworkTypeControllerTest extends TelephonyTest {
        assertFalse(mNetworkTypeController.areAnyTimersActive());
    }

    @Test
    public void testSecondaryPciTimerExpire() throws Exception {
        testTransitionToCurrentStateNrConnectedMmwave();
        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
                mNetworkTypeController.getOverrideNetworkType());

        mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
                "connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
        mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_PCI_CHANGE_SECONDARY_TIMER_SECONDS_INT,
                30);
        sendCarrierConfigChanged();

        // should trigger 10 second primary timer
        doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
        mNetworkTypeController.sendMessage(3 /* EVENT_SERVICE_STATE_CHANGED */);
        processAllMessages();

        assertEquals("legacy", getCurrentState().getName());
        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
                mNetworkTypeController.getOverrideNetworkType());
        assertTrue(mNetworkTypeController.areAnyTimersActive());

        // Before primary timer expires, PCI changed, indicating 5G UW might soon recover
        moveTimeForward(5 * 1000);
        mNetworkTypeController.sendMessage(11 /* EVENT_PHYSICAL_CHANNEL_CONFIGS_CHANGED */,
                new AsyncResult(null,
                        List.of(new PhysicalChannelConfig.Builder()
                                .setPhysicalCellId(2)
                                .setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
                                .setCellConnectionStatus(CellInfo.CONNECTION_PRIMARY_SERVING)
                        .build()),
                        null));
        processAllMessages();

        // primary timer expires
        moveTimeForward(5 * 1000);
        processAllMessages();

        // should trigger 30 second secondary timer
        assertEquals("legacy", getCurrentState().getName());
        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_ADVANCED,
                mNetworkTypeController.getOverrideNetworkType());
        assertTrue(mNetworkTypeController.areAnyTimersActive());

        // secondary timer expires
        moveTimeForward(30 * 1000);
        processAllMessages();

        assertEquals("legacy", getCurrentState().getName());
        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE,
                mNetworkTypeController.getOverrideNetworkType());
        assertFalse(mNetworkTypeController.areAnyTimersActive());
    }

    @Test
    public void testSecondaryTimerReset() throws Exception {
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();