Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +14 −9 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import android.util.Pair; import android.util.SparseArray; import android.util.SparseBooleanArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.cdma.EriInfo; Loading Loading @@ -247,12 +248,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; Loading Loading @@ -865,6 +860,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); Loading Loading @@ -3158,7 +3163,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. Loading Loading @@ -3201,7 +3206,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() { Loading Loading @@ -5605,7 +5610,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); Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -284,6 +284,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); Loading Loading @@ -1943,6 +1947,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); Loading @@ -1960,10 +1966,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); Loading @@ -1979,7 +2004,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()); } Loading @@ -1988,6 +2013,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); Loading @@ -2003,7 +2030,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()); } Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +14 −9 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ import android.util.Pair; import android.util.SparseArray; import android.util.SparseBooleanArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.cdma.EriInfo; Loading Loading @@ -247,12 +248,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; Loading Loading @@ -865,6 +860,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); Loading Loading @@ -3158,7 +3163,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. Loading Loading @@ -3201,7 +3206,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() { Loading Loading @@ -5605,7 +5610,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); Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +29 −2 Original line number Diff line number Diff line Loading @@ -284,6 +284,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); Loading Loading @@ -1943,6 +1947,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); Loading @@ -1960,10 +1966,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); Loading @@ -1979,7 +2004,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()); } Loading @@ -1988,6 +2013,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); Loading @@ -2003,7 +2030,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()); } Loading