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

Commit e3404067 authored by Sarah Chin's avatar Sarah Chin Committed by Android (Google) Code Review
Browse files

Merge "NetworkTypeController listen for device idle state changed" into tm-dev

parents 6464b9ce ca0c0f69
Loading
Loading
Loading
Loading
+40 −12
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.IntentFilter;
import android.os.AsyncResult;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.Annotation;
import android.telephony.CarrierConfigManager;
@@ -101,8 +102,9 @@ public class NetworkTypeController extends StateMachine {
    private static final int EVENT_PCO_DATA_CHANGED = 14;
    private static final int EVENT_BANDWIDTH_CHANGED = 15;
    private static final int EVENT_UPDATE_NR_ADVANCED_STATE = 16;
    private static final int EVENT_DEVICE_IDLE_MODE_CHANGED = 17;

    private static final String[] sEvents = new String[EVENT_UPDATE_NR_ADVANCED_STATE + 1];
    private static final String[] sEvents = new String[EVENT_DEVICE_IDLE_MODE_CHANGED + 1];
    static {
        sEvents[EVENT_UPDATE] = "EVENT_UPDATE";
        sEvents[EVENT_QUIT] = "EVENT_QUIT";
@@ -122,6 +124,7 @@ public class NetworkTypeController extends StateMachine {
        sEvents[EVENT_PCO_DATA_CHANGED] = "EVENT_PCO_DATA_CHANGED";
        sEvents[EVENT_BANDWIDTH_CHANGED] = "EVENT_BANDWIDTH_CHANGED";
        sEvents[EVENT_UPDATE_NR_ADVANCED_STATE] = "EVENT_UPDATE_NR_ADVANCED_STATE";
        sEvents[EVENT_DEVICE_IDLE_MODE_CHANGED] = "EVENT_DEVICE_IDLE_MODE_CHANGED";
    }

    private final Phone mPhone;
@@ -129,13 +132,19 @@ public class NetworkTypeController extends StateMachine {
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)
                    && intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX,
            switch (intent.getAction()) {
                case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED:
                    if (intent.getIntExtra(SubscriptionManager.EXTRA_SLOT_INDEX,
                            SubscriptionManager.INVALID_PHONE_INDEX) == mPhone.getPhoneId()
                    && !intent.getBooleanExtra(CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK,
                    false)) {
                            && !intent.getBooleanExtra(
                                    CarrierConfigManager.EXTRA_REBROADCAST_ON_UNLOCK, false)) {
                        sendMessage(EVENT_CARRIER_CONFIG_CHANGED);
                    }
                    break;
                case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED:
                    sendMessage(EVENT_DEVICE_IDLE_MODE_CHANGED);
                    break;
            }
        }
    };

@@ -154,10 +163,11 @@ public class NetworkTypeController extends StateMachine {
    private String mPreviousState;
    private @LinkStatus int mPhysicalLinkStatus;
    private boolean mIsPhysicalChannelConfig16Supported;
    private Boolean mIsNrAdvancedAllowedByPco = false;
    private boolean mIsNrAdvancedAllowedByPco = false;
    private int mNrAdvancedCapablePcoId = 0;
    private boolean mIsUsingUserDataForRrcDetection = false;
    private boolean mEnableNrAdvancedWhileRoaming = true;
    private boolean mIsDeviceIdleMode = false;

    /**
     * NetworkTypeController constructor.
@@ -220,6 +230,7 @@ public class NetworkTypeController extends StateMachine {
                EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED, null);
        IntentFilter filter = new IntentFilter();
        filter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
        filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
        mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
        if (!mPhone.isUsingNewDataStack()) {
            mPhone.mCi.registerForPcoData(getHandler(), EVENT_PCO_DATA_CHANGED, null);
@@ -594,6 +605,17 @@ public class NetworkTypeController extends StateMachine {
                    resetAllTimers();
                    transitionTo(mLegacyState);
                    break;
                case EVENT_DEVICE_IDLE_MODE_CHANGED:
                    PowerManager pm = mPhone.getContext().getSystemService(PowerManager.class);
                    mIsDeviceIdleMode = pm.isDeviceIdleMode();
                    if (DBG) {
                        log("mIsDeviceIdleMode changed to: " + mIsDeviceIdleMode);
                    }
                    if (mIsDeviceIdleMode) {
                        resetAllTimers();
                    }
                    transitionToCurrentState();
                    break;
                default:
                    throw new RuntimeException("Received invalid event: " + msg.what);
            }
@@ -992,13 +1014,13 @@ public class NetworkTypeController extends StateMachine {
    private void transitionWithTimerTo(IState destState) {
        String destName = destState.getName();
        OverrideTimerRule rule = mOverrideTimerRules.get(mPreviousState);
        if (rule != null && rule.getTimer(destName) > 0) {
        if (!mIsDeviceIdleMode && rule != null && rule.getTimer(destName) > 0) {
            if (DBG) log("Primary timer started for state: " + mPreviousState);
            mPrimaryTimerState = mPreviousState;
            mPreviousState = getCurrentState().getName();
            mIsPrimaryTimerActive = true;
            sendMessageDelayed(EVENT_PRIMARY_TIMER_EXPIRED, destState,
                    rule.getTimer(destName) * 1000);
                    rule.getTimer(destName) * 1000L);
        }
        transitionTo(destState);
    }
@@ -1006,13 +1028,13 @@ public class NetworkTypeController extends StateMachine {
    private void transitionWithSecondaryTimerTo(IState destState) {
        String currentName = getCurrentState().getName();
        OverrideTimerRule rule = mOverrideTimerRules.get(mPrimaryTimerState);
        if (rule != null && rule.getSecondaryTimer(currentName) > 0) {
        if (!mIsDeviceIdleMode && rule != null && rule.getSecondaryTimer(currentName) > 0) {
            if (DBG) log("Secondary timer started for state: " + currentName);
            mSecondaryTimerState = currentName;
            mPreviousState = currentName;
            mIsSecondaryTimerActive = true;
            sendMessageDelayed(EVENT_SECONDARY_TIMER_EXPIRED, destState,
                    rule.getSecondaryTimer(currentName) * 1000);
                    rule.getSecondaryTimer(currentName) * 1000L);
        }
        mIsPrimaryTimerActive = false;
        transitionTo(getCurrentState());
@@ -1315,13 +1337,19 @@ public class NetworkTypeController extends StateMachine {
        pw.println("mIsTimerRestEnabledForLegacyStateRRCIdle="
                + mIsTimerResetEnabledForLegacyStateRRCIdle);
        pw.println("mLtePlusThresholdBandwidth=" + mLtePlusThresholdBandwidth);
        pw.println("mNrAdvancedThresholdBandwidth=" + mNrAdvancedThresholdBandwidth);
        pw.println("mPrimaryTimerState=" + mPrimaryTimerState);
        pw.println("mSecondaryTimerState=" + mSecondaryTimerState);
        pw.println("mPreviousState=" + mPreviousState);
        pw.println("mPhysicalLinkStatus=" + mPhysicalLinkStatus);
        pw.println("mAdditionalNrAdvancedBandsList="
                + Arrays.toString(mAdditionalNrAdvancedBandsList));
        pw.println("mIsPhysicalChannelConfig16Supported=" + mIsPhysicalChannelConfig16Supported);
        pw.println("mIsNrAdvancedAllowedByPco=" + mIsNrAdvancedAllowedByPco);
        pw.println("mNrAdvancedCapablePcoId=" + mNrAdvancedCapablePcoId);
        pw.println("mIsUsingUserDataForRrcDetection=" + mIsUsingUserDataForRrcDetection);
        pw.println("mEnableNrAdvancedWhileRoaming=" + mEnableNrAdvancedWhileRoaming);
        pw.println("mIsDeviceIdleMode=" + mIsDeviceIdleMode);
        pw.decreaseIndent();
        pw.flush();
    }
+3 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.IInterface;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.PowerWhitelistManager;
import android.os.SystemConfigManager;
import android.os.UserHandle;
@@ -346,6 +347,8 @@ public class ContextFixture implements TestFixture<Context> {
                return Context.TELEPHONY_REGISTRY_SERVICE;
            } else if (serviceClass == NetworkPolicyManager.class) {
                return Context.NETWORK_POLICY_SERVICE;
            } else if (serviceClass == PowerManager.class) {
                return Context.POWER_SERVICE;
            }
            return super.getSystemServiceName(serviceClass);
        }
+34 −0
Original line number Diff line number Diff line
@@ -23,11 +23,15 @@ import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;

import android.content.Context;
import android.content.Intent;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.IPowerManager;
import android.os.IThermalService;
import android.os.Looper;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.telephony.CarrierConfigManager;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.PcoData;
@@ -884,6 +888,36 @@ public class NetworkTypeControllerTest extends TelephonyTest {
        assertFalse(mNetworkTypeController.is5GHysteresisActive());
    }

    @Test
    public void testPrimaryTimerDeviceIdleMode() throws Exception {
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();
        doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
        mBundle.putString(CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_STRING,
                "connected_mmwave,any,10;connected,any,10;not_restricted_rrc_con,any,10");
        broadcastCarrierConfigs();

        IPowerManager powerManager = mock(IPowerManager.class);
        PowerManager pm = new PowerManager(mContext, powerManager, mock(IThermalService.class),
                new Handler(Looper.myLooper()));
        doReturn(pm).when(mContext).getSystemService(Context.POWER_SERVICE);
        doReturn(true).when(powerManager).isDeviceIdleMode();
        mNetworkTypeController.sendMessage(17 /*EVENT_DEVICE_IDLE_MODE_CHANGED*/);

        assertEquals("connected", getCurrentState().getName());
        assertEquals(TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA,
                mNetworkTypeController.getOverrideNetworkType());

        // should not trigger timer
        doReturn(NetworkRegistrationInfo.NR_STATE_NONE).when(mServiceState).getNrState();
        mNetworkTypeController.sendMessage(EVENT_NR_STATE_CHANGED);
        processAllMessages();

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

    @Test
    public void testPrimaryTimerReset() throws Exception {
        doReturn(TelephonyManager.NETWORK_TYPE_LTE).when(mServiceState).getDataNetworkType();