Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +27 −23 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ public class ServiceStateTracker extends Handler { public static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000; /** * The timer value to wait for all data networks to be torn down. * The timer value to wait for all cellular data networks to be torn down. */ private static final long POWER_OFF_ALL_DATA_NETWORKS_DISCONNECTED_TIMEOUT = TimeUnit.SECONDS.toMillis(10); Loading Loading @@ -273,7 +273,7 @@ public class ServiceStateTracker extends Handler { protected static final int EVENT_IMS_STATE_CHANGED = 46; protected static final int EVENT_IMS_STATE_DONE = 47; protected static final int EVENT_IMS_CAPABILITY_CHANGED = 48; protected static final int EVENT_ALL_DATA_DISCONNECTED = 49; protected static final int EVENT_ALL_CELLULAR_DATA_DISCONNECTED = 49; protected static final int EVENT_PHONE_TYPE_SWITCHED = 50; protected static final int EVENT_RADIO_POWER_FROM_CARRIER = 51; protected static final int EVENT_IMS_SERVICE_STATE_CHANGED = 53; Loading Loading @@ -606,11 +606,11 @@ public class ServiceStateTracker extends Handler { private int mLastKnownAreaCode = CellInfo.UNAVAILABLE; /** * Data network controller callback for all data disconnected. This is used when turning on * airplane mode, where service state tracker should wait for all data disconnected on all * subscriptions before powering down the modem. * Data network controller callback for all cellular data disconnected. This is used when * turning on airplane mode, where service state tracker should wait for all cellular data * disconnected on all subscriptions before powering down the modem. */ private DataNetworkControllerCallback mDataDisconnectedCallback; private DataNetworkControllerCallback mAllCellularDataDisconnectedCallback; /** * AccessNetworksManagerCallback is used for preferred on the IWLAN when preferred transport Loading Loading @@ -716,12 +716,13 @@ public class ServiceStateTracker extends Handler { registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); mDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) { mAllCellularDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) { @Override public void onAnyDataNetworkExistingChanged(boolean anyDataExisting) { log("onAnyDataNetworkExistingChanged: anyDataExisting=" + anyDataExisting); if (!anyDataExisting) { sendEmptyMessage(EVENT_ALL_DATA_DISCONNECTED); public void onAnyCellularDataNetworkExistingChanged(boolean anyCellularDataExisting) { log("onAnyCellularDataNetworkExistingChanged: anyCellularDataExisting=" + anyCellularDataExisting); if (!anyCellularDataExisting) { sendEmptyMessage(EVENT_ALL_CELLULAR_DATA_DISCONNECTED); } } }; Loading Loading @@ -1202,7 +1203,7 @@ public class ServiceStateTracker extends Handler { case EVENT_SET_RADIO_POWER_OFF: synchronized(this) { mPendingRadioPowerOffAfterDataOff = false; log("Wait for all data networks torn down timed out. Power off now."); log("Wait for all cellular data networks torn down timed out. Power off now."); hangupAndPowerOff(); } break; Loading Loading @@ -1470,18 +1471,18 @@ public class ServiceStateTracker extends Handler { } break; case EVENT_ALL_DATA_DISCONNECTED: log("EVENT_ALL_DATA_DISCONNECTED"); case EVENT_ALL_CELLULAR_DATA_DISCONNECTED: log("EVENT_ALL_CELLULAR_DATA_DISCONNECTED"); synchronized (this) { if (!mPendingRadioPowerOffAfterDataOff) return; boolean areAllDataDisconnectedOnAllPhones = true; for (Phone phone : PhoneFactory.getPhones()) { if (phone.getDataNetworkController().areAllDataDisconnected()) { if (phone.getDataNetworkController().areAllCellularDataDisconnected()) { phone.getDataNetworkController() .unregisterDataNetworkControllerCallback( mDataDisconnectedCallback); mAllCellularDataDisconnectedCallback); } else { log("Still waiting for all data disconnected on phone: " log("Still waiting for all cellular data disconnected on phone: " + phone.getSubId()); areAllDataDisconnectedOnAllPhones = false; } Loading Loading @@ -5008,17 +5009,17 @@ public class ServiceStateTracker extends Handler { } for (Phone phone : PhoneFactory.getPhones()) { if (!phone.getDataNetworkController().areAllDataDisconnected()) { if (!phone.getDataNetworkController().areAllCellularDataDisconnected()) { log("powerOffRadioSafely: Data is active on phone " + phone.getSubId() + ". Wait for all data disconnect."); + ". Wait for all cellular data disconnect."); mPendingRadioPowerOffAfterDataOff = true; phone.getDataNetworkController().registerDataNetworkControllerCallback( mDataDisconnectedCallback); mAllCellularDataDisconnectedCallback); } } // Tear down outside of the disconnected check to prevent race conditions. mPhone.getDataNetworkController().tearDownAllDataNetworks( mPhone.getDataNetworkController().tearDownAllCellularDataNetworks( DataNetwork.TEAR_DOWN_REASON_AIRPLANE_MODE_ON); if (mPendingRadioPowerOffAfterDataOff) { Loading Loading @@ -5076,8 +5077,11 @@ public class ServiceStateTracker extends Handler { */ protected void hangupAndPowerOff() { if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) return; // hang up all active voice calls if (!mPhone.isPhoneTypeGsm() || mPhone.isInCall()) { // hang up all active non-WFC voice calls boolean isWfc = mPhone.getImsRegistrationTech() == ImsRegistrationImplBase .REGISTRATION_TECH_IWLAN; if (isWfc) log("hangupAndPowerOff: VoWifi registered."); if ((!mPhone.isPhoneTypeGsm() || mPhone.isInCall()) && !isWfc) { mPhone.mCT.mRingingCall.hangupIfAlive(); mPhone.mCT.mBackgroundCall.hangupIfAlive(); mPhone.mCT.mForegroundCall.hangupIfAlive(); Loading src/java/com/android/internal/telephony/data/DataNetwork.java +8 −0 Original line number Diff line number Diff line Loading @@ -807,6 +807,12 @@ public class DataNetwork extends StateMachine { public abstract void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause, @TearDownReason int tearDownReason); /** * Called when handover between IWLAN and cellular network started. * @param dataNetwork The data network. */ public abstract void onHandoverStarted(@NonNull DataNetwork dataNetwork); /** * Called when handover between IWLAN and cellular network succeeded. * Loading Loading @@ -1432,6 +1438,8 @@ public class DataNetwork extends StateMachine { sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE, mDataConfigManager.getNetworkHandoverTimeoutMs()); notifyPreciseDataConnectionState(); mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onHandoverStarted(DataNetwork.this)); } @Override Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +151 −78 File changed.Preview size limit exceeded, changes collapsed. Show changes tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +42 −9 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; Loading Loading @@ -260,7 +261,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(mIwlanNetworkServiceStub).when(mIwlanNetworkServiceStub).asBinder(); addNetworkService(); doReturn(true).when(mDataNetworkController).areAllDataDisconnected(); doReturn(true).when(mDataNetworkController).areAllCellularDataDisconnected(); doReturn(new ServiceState()).when(mPhone).getServiceState(); Loading Loading @@ -428,8 +429,8 @@ public class ServiceStateTrackerTest extends TelephonyTest { replaceInstance(PhoneFactory.class, "sPhones", null, mPhones); doReturn(dataNetworkController_phone2).when(phone2).getDataNetworkController(); doReturn(mSST).when(phone2).getServiceStateTracker(); doReturn(false).when(mDataNetworkController).areAllDataDisconnected(); doReturn(false).when(dataNetworkController_phone2).areAllDataDisconnected(); doReturn(false).when(mDataNetworkController).areAllCellularDataDisconnected(); doReturn(false).when(dataNetworkController_phone2).areAllCellularDataDisconnected(); doReturn(1).when(mPhone).getSubId(); doReturn(2).when(phone2).getSubId(); Loading @@ -442,9 +443,9 @@ public class ServiceStateTrackerTest extends TelephonyTest { sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); verify(mDataNetworkController).tearDownAllDataNetworks( verify(mDataNetworkController).tearDownAllCellularDataNetworks( eq(3 /* TEAR_DOWN_REASON_AIRPLANE_MODE_ON */)); verify(dataNetworkController_phone2, never()).tearDownAllDataNetworks(anyInt()); verify(dataNetworkController_phone2, never()).tearDownAllCellularDataNetworks(anyInt()); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback1 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback2 = Loading @@ -455,16 +456,16 @@ public class ServiceStateTrackerTest extends TelephonyTest { callback2.capture()); // Data disconnected on sub 2, still waiting for data disconnected on sub 1 doReturn(true).when(dataNetworkController_phone2).areAllDataDisconnected(); callback2.getValue().onAnyDataNetworkExistingChanged(false); doReturn(true).when(dataNetworkController_phone2).areAllCellularDataDisconnected(); callback2.getValue().onAnyCellularDataNetworkExistingChanged(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); verify(dataNetworkController_phone2, times(1)).unregisterDataNetworkControllerCallback( any()); // Data disconnected on sub 1, radio should power off now doReturn(true).when(mDataNetworkController).areAllDataDisconnected(); callback1.getValue().onAnyDataNetworkExistingChanged(false); doReturn(true).when(mDataNetworkController).areAllCellularDataDisconnected(); callback1.getValue().onAnyCellularDataNetworkExistingChanged(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); Loading Loading @@ -583,6 +584,38 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertTrue(mSimulatedCommands.getRadioState() == expectedRadioPowerState); } @Test public void testSetRadioPowerForReasonKeepsWfc() { mPhone.mCT = mCT; mCT.mRingingCall = mGsmCdmaCall; mCT.mBackgroundCall = mGsmCdmaCall; mCT.mForegroundCall = mGsmCdmaCall; doReturn(false).when(mPhone).isPhoneTypeGsm(); sst.updatePhoneType(); // Regular power off leads to call drop sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); clearInvocations(mGsmCdmaCall); sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mGsmCdmaCall, times(3)).hangupIfAlive(); // Any WFC should be kept sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); clearInvocations(mGsmCdmaCall); doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN).when(mPhone) .getImsRegistrationTech(); sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mGsmCdmaCall, never()).hangupIfAlive(); } @Test @MediumTest public void testSetRadioPowerForReasonCarrier() { Loading tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -534,6 +534,7 @@ public abstract class TelephonyTest { .queryLocalInterface(anyString()); mPhone.mCi = mSimulatedCommands; mPhone.mCT = mCT; mCT.mCi = mSimulatedCommands; doReturn(mUiccCard).when(mPhone).getUiccCard(); doReturn(mUiccCard).when(mUiccSlot).getUiccCard(); Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +27 −23 Original line number Diff line number Diff line Loading @@ -229,7 +229,7 @@ public class ServiceStateTracker extends Handler { public static final int DEFAULT_GPRS_CHECK_PERIOD_MILLIS = 60 * 1000; /** * The timer value to wait for all data networks to be torn down. * The timer value to wait for all cellular data networks to be torn down. */ private static final long POWER_OFF_ALL_DATA_NETWORKS_DISCONNECTED_TIMEOUT = TimeUnit.SECONDS.toMillis(10); Loading Loading @@ -273,7 +273,7 @@ public class ServiceStateTracker extends Handler { protected static final int EVENT_IMS_STATE_CHANGED = 46; protected static final int EVENT_IMS_STATE_DONE = 47; protected static final int EVENT_IMS_CAPABILITY_CHANGED = 48; protected static final int EVENT_ALL_DATA_DISCONNECTED = 49; protected static final int EVENT_ALL_CELLULAR_DATA_DISCONNECTED = 49; protected static final int EVENT_PHONE_TYPE_SWITCHED = 50; protected static final int EVENT_RADIO_POWER_FROM_CARRIER = 51; protected static final int EVENT_IMS_SERVICE_STATE_CHANGED = 53; Loading Loading @@ -606,11 +606,11 @@ public class ServiceStateTracker extends Handler { private int mLastKnownAreaCode = CellInfo.UNAVAILABLE; /** * Data network controller callback for all data disconnected. This is used when turning on * airplane mode, where service state tracker should wait for all data disconnected on all * subscriptions before powering down the modem. * Data network controller callback for all cellular data disconnected. This is used when * turning on airplane mode, where service state tracker should wait for all cellular data * disconnected on all subscriptions before powering down the modem. */ private DataNetworkControllerCallback mDataDisconnectedCallback; private DataNetworkControllerCallback mAllCellularDataDisconnectedCallback; /** * AccessNetworksManagerCallback is used for preferred on the IWLAN when preferred transport Loading Loading @@ -716,12 +716,13 @@ public class ServiceStateTracker extends Handler { registerForImsCapabilityChanged(mCSST, CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null); mDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) { mAllCellularDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) { @Override public void onAnyDataNetworkExistingChanged(boolean anyDataExisting) { log("onAnyDataNetworkExistingChanged: anyDataExisting=" + anyDataExisting); if (!anyDataExisting) { sendEmptyMessage(EVENT_ALL_DATA_DISCONNECTED); public void onAnyCellularDataNetworkExistingChanged(boolean anyCellularDataExisting) { log("onAnyCellularDataNetworkExistingChanged: anyCellularDataExisting=" + anyCellularDataExisting); if (!anyCellularDataExisting) { sendEmptyMessage(EVENT_ALL_CELLULAR_DATA_DISCONNECTED); } } }; Loading Loading @@ -1202,7 +1203,7 @@ public class ServiceStateTracker extends Handler { case EVENT_SET_RADIO_POWER_OFF: synchronized(this) { mPendingRadioPowerOffAfterDataOff = false; log("Wait for all data networks torn down timed out. Power off now."); log("Wait for all cellular data networks torn down timed out. Power off now."); hangupAndPowerOff(); } break; Loading Loading @@ -1470,18 +1471,18 @@ public class ServiceStateTracker extends Handler { } break; case EVENT_ALL_DATA_DISCONNECTED: log("EVENT_ALL_DATA_DISCONNECTED"); case EVENT_ALL_CELLULAR_DATA_DISCONNECTED: log("EVENT_ALL_CELLULAR_DATA_DISCONNECTED"); synchronized (this) { if (!mPendingRadioPowerOffAfterDataOff) return; boolean areAllDataDisconnectedOnAllPhones = true; for (Phone phone : PhoneFactory.getPhones()) { if (phone.getDataNetworkController().areAllDataDisconnected()) { if (phone.getDataNetworkController().areAllCellularDataDisconnected()) { phone.getDataNetworkController() .unregisterDataNetworkControllerCallback( mDataDisconnectedCallback); mAllCellularDataDisconnectedCallback); } else { log("Still waiting for all data disconnected on phone: " log("Still waiting for all cellular data disconnected on phone: " + phone.getSubId()); areAllDataDisconnectedOnAllPhones = false; } Loading Loading @@ -5008,17 +5009,17 @@ public class ServiceStateTracker extends Handler { } for (Phone phone : PhoneFactory.getPhones()) { if (!phone.getDataNetworkController().areAllDataDisconnected()) { if (!phone.getDataNetworkController().areAllCellularDataDisconnected()) { log("powerOffRadioSafely: Data is active on phone " + phone.getSubId() + ". Wait for all data disconnect."); + ". Wait for all cellular data disconnect."); mPendingRadioPowerOffAfterDataOff = true; phone.getDataNetworkController().registerDataNetworkControllerCallback( mDataDisconnectedCallback); mAllCellularDataDisconnectedCallback); } } // Tear down outside of the disconnected check to prevent race conditions. mPhone.getDataNetworkController().tearDownAllDataNetworks( mPhone.getDataNetworkController().tearDownAllCellularDataNetworks( DataNetwork.TEAR_DOWN_REASON_AIRPLANE_MODE_ON); if (mPendingRadioPowerOffAfterDataOff) { Loading Loading @@ -5076,8 +5077,11 @@ public class ServiceStateTracker extends Handler { */ protected void hangupAndPowerOff() { if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) return; // hang up all active voice calls if (!mPhone.isPhoneTypeGsm() || mPhone.isInCall()) { // hang up all active non-WFC voice calls boolean isWfc = mPhone.getImsRegistrationTech() == ImsRegistrationImplBase .REGISTRATION_TECH_IWLAN; if (isWfc) log("hangupAndPowerOff: VoWifi registered."); if ((!mPhone.isPhoneTypeGsm() || mPhone.isInCall()) && !isWfc) { mPhone.mCT.mRingingCall.hangupIfAlive(); mPhone.mCT.mBackgroundCall.hangupIfAlive(); mPhone.mCT.mForegroundCall.hangupIfAlive(); Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +8 −0 Original line number Diff line number Diff line Loading @@ -807,6 +807,12 @@ public class DataNetwork extends StateMachine { public abstract void onDisconnected(@NonNull DataNetwork dataNetwork, @DataFailureCause int cause, @TearDownReason int tearDownReason); /** * Called when handover between IWLAN and cellular network started. * @param dataNetwork The data network. */ public abstract void onHandoverStarted(@NonNull DataNetwork dataNetwork); /** * Called when handover between IWLAN and cellular network succeeded. * Loading Loading @@ -1432,6 +1438,8 @@ public class DataNetwork extends StateMachine { sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE, mDataConfigManager.getNetworkHandoverTimeoutMs()); notifyPreciseDataConnectionState(); mDataNetworkCallback.invokeFromExecutor( () -> mDataNetworkCallback.onHandoverStarted(DataNetwork.this)); } @Override Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +151 −78 File changed.Preview size limit exceeded, changes collapsed. Show changes
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +42 −9 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static org.mockito.Matchers.nullable; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; Loading Loading @@ -260,7 +261,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { doReturn(mIwlanNetworkServiceStub).when(mIwlanNetworkServiceStub).asBinder(); addNetworkService(); doReturn(true).when(mDataNetworkController).areAllDataDisconnected(); doReturn(true).when(mDataNetworkController).areAllCellularDataDisconnected(); doReturn(new ServiceState()).when(mPhone).getServiceState(); Loading Loading @@ -428,8 +429,8 @@ public class ServiceStateTrackerTest extends TelephonyTest { replaceInstance(PhoneFactory.class, "sPhones", null, mPhones); doReturn(dataNetworkController_phone2).when(phone2).getDataNetworkController(); doReturn(mSST).when(phone2).getServiceStateTracker(); doReturn(false).when(mDataNetworkController).areAllDataDisconnected(); doReturn(false).when(dataNetworkController_phone2).areAllDataDisconnected(); doReturn(false).when(mDataNetworkController).areAllCellularDataDisconnected(); doReturn(false).when(dataNetworkController_phone2).areAllCellularDataDisconnected(); doReturn(1).when(mPhone).getSubId(); doReturn(2).when(phone2).getSubId(); Loading @@ -442,9 +443,9 @@ public class ServiceStateTrackerTest extends TelephonyTest { sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); verify(mDataNetworkController).tearDownAllDataNetworks( verify(mDataNetworkController).tearDownAllCellularDataNetworks( eq(3 /* TEAR_DOWN_REASON_AIRPLANE_MODE_ON */)); verify(dataNetworkController_phone2, never()).tearDownAllDataNetworks(anyInt()); verify(dataNetworkController_phone2, never()).tearDownAllCellularDataNetworks(anyInt()); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback1 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback2 = Loading @@ -455,16 +456,16 @@ public class ServiceStateTrackerTest extends TelephonyTest { callback2.capture()); // Data disconnected on sub 2, still waiting for data disconnected on sub 1 doReturn(true).when(dataNetworkController_phone2).areAllDataDisconnected(); callback2.getValue().onAnyDataNetworkExistingChanged(false); doReturn(true).when(dataNetworkController_phone2).areAllCellularDataDisconnected(); callback2.getValue().onAnyCellularDataNetworkExistingChanged(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); verify(dataNetworkController_phone2, times(1)).unregisterDataNetworkControllerCallback( any()); // Data disconnected on sub 1, radio should power off now doReturn(true).when(mDataNetworkController).areAllDataDisconnected(); callback1.getValue().onAnyDataNetworkExistingChanged(false); doReturn(true).when(mDataNetworkController).areAllCellularDataDisconnected(); callback1.getValue().onAnyCellularDataNetworkExistingChanged(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); Loading Loading @@ -583,6 +584,38 @@ public class ServiceStateTrackerTest extends TelephonyTest { assertTrue(mSimulatedCommands.getRadioState() == expectedRadioPowerState); } @Test public void testSetRadioPowerForReasonKeepsWfc() { mPhone.mCT = mCT; mCT.mRingingCall = mGsmCdmaCall; mCT.mBackgroundCall = mGsmCdmaCall; mCT.mForegroundCall = mGsmCdmaCall; doReturn(false).when(mPhone).isPhoneTypeGsm(); sst.updatePhoneType(); // Regular power off leads to call drop sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); clearInvocations(mGsmCdmaCall); sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mGsmCdmaCall, times(3)).hangupIfAlive(); // Any WFC should be kept sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); clearInvocations(mGsmCdmaCall); doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN).when(mPhone) .getImsRegistrationTech(); sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mGsmCdmaCall, never()).hangupIfAlive(); } @Test @MediumTest public void testSetRadioPowerForReasonCarrier() { Loading
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −0 Original line number Diff line number Diff line Loading @@ -534,6 +534,7 @@ public abstract class TelephonyTest { .queryLocalInterface(anyString()); mPhone.mCi = mSimulatedCommands; mPhone.mCT = mCT; mCT.mCi = mSimulatedCommands; doReturn(mUiccCard).when(mPhone).getUiccCard(); doReturn(mUiccCard).when(mUiccSlot).getUiccCard(); Loading