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

Commit 6f362c52 authored by Brad Ebinger's avatar Brad Ebinger
Browse files

Configure the radio power off delay timer using a device config

In android S, we now delay the radio power off during APM and
power off for N seconds to allow for the IMS service to deregister.

This is not necessary for all devices, so instead of delaying
power off in these cases where it is not necessary, create a
device configuration that allows the devices to tune the radio power
off delay if it is required, or remove the delay entirely.

Bug: 195304068
Test: manual; atest FrameworksTelephonyTests:ServiceStateTrackerTest
Change-Id: Ia6b62c98f86444b1b598af04f21d0806b6426159
parent 07958168
Loading
Loading
Loading
Loading
+13 −9
Original line number Diff line number Diff line
@@ -249,12 +249,6 @@ public class ServiceStateTracker extends Handler {
    /** Signal strength poll rate. */
    private static final int POLL_PERIOD_MILLIS = 20 * 1000;

    /**
     * The time we wait for IMS to deregister before executing a pending radio power off request.
     */
    @VisibleForTesting
    public static final int DELAY_RADIO_OFF_FOR_IMS_DEREG_TIMEOUT = 3 * 1000;

    /** Waiting period before recheck gprs and voice registration. */
    public static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000;

@@ -863,6 +857,16 @@ public class ServiceStateTracker extends Handler {
        setPowerStateToDesired();
    }

    /**
     * @return the timeout value in milliseconds that the framework will delay a pending radio power
     * off command while waiting for an IMS deregistered indication.
     */
    @VisibleForTesting
    public int getRadioPowerOffDelayTimeoutForImsRegistration() {
        return mPhone.getContext().getResources().getInteger(
                R.integer.config_delay_for_ims_dereg_millis);
    }

    public void dispose() {
        mCi.unSetOnSignalStrengthUpdate(this);
        mUiccController.unregisterForIccChanged(this);
@@ -3188,7 +3192,7 @@ public class ServiceStateTracker extends Handler {
        } else if ((!mDesiredPowerState || mRadioDisabledByCarrier) && mCi.getRadioState()
                == TelephonyManager.RADIO_POWER_ON) {
            // If it's on and available and we want it off gracefully
            if (mImsRegistrationOnOff) {
            if (mImsRegistrationOnOff && getRadioPowerOffDelayTimeoutForImsRegistration() > 0) {
                if (DBG) log("setPowerStateToDesired: delaying power off until IMS dereg.");
                startDelayRadioOffWaitingForImsDeregTimeout();
                // Return early here as we do not want to hit the cancel timeout code below.
@@ -3231,7 +3235,7 @@ public class ServiceStateTracker extends Handler {
        }
        if (DBG) log("startDelayRadioOffWaitingForImsDeregTimeout: starting timer");
        sendEmptyMessageDelayed(EVENT_POWER_OFF_RADIO_IMS_DEREG_TIMEOUT,
                DELAY_RADIO_OFF_FOR_IMS_DEREG_TIMEOUT);
                getRadioPowerOffDelayTimeoutForImsRegistration());
    }

    protected void onUpdateIccAvailability() {
@@ -5643,7 +5647,7 @@ public class ServiceStateTracker extends Handler {
        pw.println(" mImsRegistered=" + mImsRegistered);
        pw.println(" mImsRegistrationOnOff=" + mImsRegistrationOnOff);
        pw.println(" pending radio off event="
                + hasMessages(DELAY_RADIO_OFF_FOR_IMS_DEREG_TIMEOUT));
                + hasMessages(EVENT_POWER_OFF_RADIO_IMS_DEREG_TIMEOUT));
        pw.println(" mRadioDisabledByCarrier" + mRadioDisabledByCarrier);
        pw.println(" mDeviceShuttingDown=" + mDeviceShuttingDown);
        pw.println(" mSpnUpdatePending=" + mSpnUpdatePending);
+29 −2
Original line number Diff line number Diff line
@@ -287,6 +287,10 @@ public class ServiceStateTrackerTest extends TelephonyTest {
                com.android.internal.R.array.wfcSpnFormats,
                WIFI_CALLING_FORMATTERS);

        // Start with power off delay disabled.
        mContextFixture.putIntResource(
                com.android.internal.R.integer.config_delay_for_ims_dereg_millis, 0);

        mBundle.putBoolean(
                CarrierConfigManager.KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL, true);
        mBundle.putInt(CarrierConfigManager.KEY_WFC_SPN_FORMAT_IDX_INT, 0);
@@ -1940,6 +1944,8 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    @SmallTest
    public void testImsRegisteredDelayShutDown() throws Exception {
        doReturn(true).when(mPhone).isPhoneTypeGsm();
        mContextFixture.putIntResource(
                com.android.internal.R.integer.config_delay_for_ims_dereg_millis, 1000 /*ms*/);
        sst.setImsRegistrationState(true);
        mSimulatedCommands.setRadioPowerFailResponse(false);
        sst.setRadioPower(true);
@@ -1957,10 +1963,29 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState());
    }

    @Test
    @SmallTest
    public void testImsRegisteredNoDelayShutDown() throws Exception {
        doReturn(true).when(mPhone).isPhoneTypeGsm();
        // The radio power off delay time is 0, so there should should be no delay.
        sst.setImsRegistrationState(true);
        mSimulatedCommands.setRadioPowerFailResponse(false);
        sst.setRadioPower(true);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());

        // Turn off the radio and ensure radio power is off
        assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState());
        sst.setRadioPower(false);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
        assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState());
    }

    @Test
    @SmallTest
    public void testImsRegisteredDelayShutDownTimeout() throws Exception {
        doReturn(true).when(mPhone).isPhoneTypeGsm();
        mContextFixture.putIntResource(
                com.android.internal.R.integer.config_delay_for_ims_dereg_millis, 1000 /*ms*/);
        sst.setImsRegistrationState(true);
        mSimulatedCommands.setRadioPowerFailResponse(false);
        sst.setRadioPower(true);
@@ -1976,7 +2001,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        // move to off.
        // Timeout for IMS reg + some extra time to remove race conditions
        waitForDelayedHandlerAction(mSSTTestHandler.getThreadHandler(),
                ServiceStateTracker.DELAY_RADIO_OFF_FOR_IMS_DEREG_TIMEOUT + 100, 1000);
                sst.getRadioPowerOffDelayTimeoutForImsRegistration() + 1000, 1000);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
        assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState());
    }
@@ -1985,6 +2010,8 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    @SmallTest
    public void testImsRegisteredAPMOnOffToggle() throws Exception {
        doReturn(true).when(mPhone).isPhoneTypeGsm();
        mContextFixture.putIntResource(
                com.android.internal.R.integer.config_delay_for_ims_dereg_millis, 1000 /*ms*/);
        sst.setImsRegistrationState(true);
        mSimulatedCommands.setRadioPowerFailResponse(false);
        sst.setRadioPower(true);
@@ -2000,7 +2027,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        // Ensure the timeout was cancelled and we still see radio power is on.
        // Timeout for IMS reg + some extra time to remove race conditions
        waitForDelayedHandlerAction(mSSTTestHandler.getThreadHandler(),
                ServiceStateTracker.DELAY_RADIO_OFF_FOR_IMS_DEREG_TIMEOUT + 100, 1000);
                sst.getRadioPowerOffDelayTimeoutForImsRegistration() + 1000, 1000);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
        assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState());
    }