Loading src/java/com/android/internal/telephony/ServiceStateTracker.java +5 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback; import com.android.internal.telephony.data.DataNetwork; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.domainselection.DomainSelectionResolver; import com.android.internal.telephony.emergency.EmergencyStateTracker; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.metrics.RadioPowerStateStats; Loading Loading @@ -4969,6 +4971,9 @@ public class ServiceStateTracker extends Handler { public void powerOffRadioSafely() { synchronized (this) { SatelliteController.getInstance().onCellularRadioPowerOffRequested(); if (DomainSelectionResolver.getInstance().isDomainSelectionSupported()) { EmergencyStateTracker.getInstance().onCellularRadioPowerOffRequested(); } if (!mPendingRadioPowerOffAfterDataOff) { // hang up all active voice calls first if (mPhone.isPhoneTypeGsm() && mPhone.isInCall()) { Loading src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java +12 −0 Original line number Diff line number Diff line Loading @@ -892,6 +892,18 @@ public class EmergencyStateTracker { } } /** * Handles the radio power off request. */ public void onCellularRadioPowerOffRequested() { synchronized (mLock) { if (isInEcm()) { exitEmergencyCallbackMode(null); } exitEmergencyModeIfDelayed(); } } private static boolean isVoWiFi(int properties) { return (properties & android.telecom.Connection.PROPERTY_WIFI) > 0 || (properties & android.telecom.Connection.PROPERTY_CROSS_SIM) > 0; Loading tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java +0 −6 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.testing.TestableLooper; import androidx.test.filters.FlakyTest; import com.android.internal.telephony.PhoneInternalInterface.DialArgs; import com.android.internal.telephony.domainselection.DomainSelectionResolver; import org.junit.After; import org.junit.Assert; Loading @@ -67,16 +66,12 @@ public class GsmCdmaCallTrackerTest extends TelephonyTest { // Mocked classes private GsmCdmaConnection mConnection; private Handler mHandler; private DomainSelectionResolver mDomainSelectionResolver; @Before public void setUp() throws Exception { super.setUp(getClass().getSimpleName()); mConnection = mock(GsmCdmaConnection.class); mHandler = mock(Handler.class); mDomainSelectionResolver = mock(DomainSelectionResolver.class); doReturn(false).when(mDomainSelectionResolver).isDomainSelectionSupported(); DomainSelectionResolver.setDomainSelectionResolver(mDomainSelectionResolver); mSimulatedCommands.setRadioPower(true, null); mPhone.mCi = this.mSimulatedCommands; Loading @@ -91,7 +86,6 @@ public class GsmCdmaCallTrackerTest extends TelephonyTest { @After public void tearDown() throws Exception { mCTUT = null; DomainSelectionResolver.setDomainSelectionResolver(null); super.tearDown(); } Loading tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +0 −5 Original line number Diff line number Diff line Loading @@ -132,7 +132,6 @@ public class GsmCdmaPhoneTest extends TelephonyTest { private UiccSlot mUiccSlot; private CommandsInterface mMockCi; private AdnRecordCache adnRecordCache; private DomainSelectionResolver mDomainSelectionResolver; //mPhoneUnderTest private GsmCdmaPhone mPhoneUT; Loading Loading @@ -173,13 +172,10 @@ public class GsmCdmaPhoneTest extends TelephonyTest { mUiccPort = Mockito.mock(UiccPort.class); mMockCi = Mockito.mock(CommandsInterface.class); adnRecordCache = Mockito.mock(AdnRecordCache.class); mDomainSelectionResolver = Mockito.mock(DomainSelectionResolver.class); mFeatureFlags = Mockito.mock(FeatureFlags.class); doReturn(false).when(mSST).isDeviceShuttingDown(); doReturn(true).when(mImsManager).isVolteEnabledByPlatform(); doReturn(false).when(mDomainSelectionResolver).isDomainSelectionSupported(); DomainSelectionResolver.setDomainSelectionResolver(mDomainSelectionResolver); mPhoneUT = new GsmCdmaPhone(mContext, mSimulatedCommands, mNotifier, true, 0, PhoneConstants.PHONE_TYPE_GSM, mTelephonyComponentFactory, (c, p) -> mImsManager, Loading @@ -198,7 +194,6 @@ public class GsmCdmaPhoneTest extends TelephonyTest { public void tearDown() throws Exception { mPhoneUT.removeCallbacksAndMessages(null); mPhoneUT = null; DomainSelectionResolver.setDomainSelectionResolver(null); try { DeviceConfig.setProperties(mPreTestProperties); } catch (DeviceConfig.BadConfigException e) { Loading tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +65 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ import com.android.internal.R; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.DataNetworkController; import com.android.internal.telephony.emergency.EmergencyStateTracker; import com.android.internal.telephony.metrics.ServiceStateStats; import com.android.internal.telephony.satellite.SatelliteController; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; Loading Loading @@ -145,6 +146,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { private ServiceStateTrackerTestHandler mSSTTestHandler; private PersistableBundle mBundle; private SatelliteController mSatelliteController; private EmergencyStateTracker mEmergencyStateTracker; private static final int EVENT_REGISTERED_TO_NETWORK = 1; private static final int EVENT_SUBSCRIPTION_INFO_READY = 2; Loading Loading @@ -390,6 +392,9 @@ public class ServiceStateTrackerTest extends TelephonyTest { sendCarrierConfigUpdate(PHONE_ID); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); mEmergencyStateTracker = Mockito.mock(EmergencyStateTracker.class); replaceInstance(EmergencyStateTracker.class, "INSTANCE", null, mEmergencyStateTracker); logd("ServiceStateTrackerTest -Setup!"); } Loading Loading @@ -480,6 +485,66 @@ public class ServiceStateTrackerTest extends TelephonyTest { waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); verify(mEmergencyStateTracker, never()).onCellularRadioPowerOffRequested(); } @Test public void testSetRadioPowerExitEmergencyMode() throws Exception { doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported(); // Set up DSDS environment GsmCdmaPhone phone2 = Mockito.mock(GsmCdmaPhone.class); DataNetworkController dataNetworkController_phone2 = Mockito.mock(DataNetworkController.class); mPhones = new Phone[] {mPhone, phone2}; 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(1).when(mPhone).getSubId(); doReturn(2).when(phone2).getSubId(); // Start with radio on sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); // Turn on APM sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); // Verify checking emergency mode verify(mEmergencyStateTracker).onCellularRadioPowerOffRequested(); // Verify that both subs are waiting for all data disconnected verify(mDataNetworkController).tearDownAllDataNetworks( eq(3 /* TEAR_DOWN_REASON_AIRPLANE_MODE_ON */)); verify(dataNetworkController_phone2, never()).tearDownAllDataNetworks(anyInt()); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback1 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback2 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); verify(mDataNetworkController, times(1)).registerDataNetworkControllerCallback( callback1.capture()); verify(dataNetworkController_phone2, times(1)).registerDataNetworkControllerCallback( 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); 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); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); } @Test Loading Loading
src/java/com/android/internal/telephony/ServiceStateTracker.java +5 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,8 @@ import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.AccessNetworksManager.AccessNetworksManagerCallback; import com.android.internal.telephony.data.DataNetwork; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.domainselection.DomainSelectionResolver; import com.android.internal.telephony.emergency.EmergencyStateTracker; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.metrics.RadioPowerStateStats; Loading Loading @@ -4969,6 +4971,9 @@ public class ServiceStateTracker extends Handler { public void powerOffRadioSafely() { synchronized (this) { SatelliteController.getInstance().onCellularRadioPowerOffRequested(); if (DomainSelectionResolver.getInstance().isDomainSelectionSupported()) { EmergencyStateTracker.getInstance().onCellularRadioPowerOffRequested(); } if (!mPendingRadioPowerOffAfterDataOff) { // hang up all active voice calls first if (mPhone.isPhoneTypeGsm() && mPhone.isInCall()) { Loading
src/java/com/android/internal/telephony/emergency/EmergencyStateTracker.java +12 −0 Original line number Diff line number Diff line Loading @@ -892,6 +892,18 @@ public class EmergencyStateTracker { } } /** * Handles the radio power off request. */ public void onCellularRadioPowerOffRequested() { synchronized (mLock) { if (isInEcm()) { exitEmergencyCallbackMode(null); } exitEmergencyModeIfDelayed(); } } private static boolean isVoWiFi(int properties) { return (properties & android.telecom.Connection.PROPERTY_WIFI) > 0 || (properties & android.telecom.Connection.PROPERTY_CROSS_SIM) > 0; Loading
tests/telephonytests/src/com/android/internal/telephony/GsmCdmaCallTrackerTest.java +0 −6 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.testing.TestableLooper; import androidx.test.filters.FlakyTest; import com.android.internal.telephony.PhoneInternalInterface.DialArgs; import com.android.internal.telephony.domainselection.DomainSelectionResolver; import org.junit.After; import org.junit.Assert; Loading @@ -67,16 +66,12 @@ public class GsmCdmaCallTrackerTest extends TelephonyTest { // Mocked classes private GsmCdmaConnection mConnection; private Handler mHandler; private DomainSelectionResolver mDomainSelectionResolver; @Before public void setUp() throws Exception { super.setUp(getClass().getSimpleName()); mConnection = mock(GsmCdmaConnection.class); mHandler = mock(Handler.class); mDomainSelectionResolver = mock(DomainSelectionResolver.class); doReturn(false).when(mDomainSelectionResolver).isDomainSelectionSupported(); DomainSelectionResolver.setDomainSelectionResolver(mDomainSelectionResolver); mSimulatedCommands.setRadioPower(true, null); mPhone.mCi = this.mSimulatedCommands; Loading @@ -91,7 +86,6 @@ public class GsmCdmaCallTrackerTest extends TelephonyTest { @After public void tearDown() throws Exception { mCTUT = null; DomainSelectionResolver.setDomainSelectionResolver(null); super.tearDown(); } Loading
tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +0 −5 Original line number Diff line number Diff line Loading @@ -132,7 +132,6 @@ public class GsmCdmaPhoneTest extends TelephonyTest { private UiccSlot mUiccSlot; private CommandsInterface mMockCi; private AdnRecordCache adnRecordCache; private DomainSelectionResolver mDomainSelectionResolver; //mPhoneUnderTest private GsmCdmaPhone mPhoneUT; Loading Loading @@ -173,13 +172,10 @@ public class GsmCdmaPhoneTest extends TelephonyTest { mUiccPort = Mockito.mock(UiccPort.class); mMockCi = Mockito.mock(CommandsInterface.class); adnRecordCache = Mockito.mock(AdnRecordCache.class); mDomainSelectionResolver = Mockito.mock(DomainSelectionResolver.class); mFeatureFlags = Mockito.mock(FeatureFlags.class); doReturn(false).when(mSST).isDeviceShuttingDown(); doReturn(true).when(mImsManager).isVolteEnabledByPlatform(); doReturn(false).when(mDomainSelectionResolver).isDomainSelectionSupported(); DomainSelectionResolver.setDomainSelectionResolver(mDomainSelectionResolver); mPhoneUT = new GsmCdmaPhone(mContext, mSimulatedCommands, mNotifier, true, 0, PhoneConstants.PHONE_TYPE_GSM, mTelephonyComponentFactory, (c, p) -> mImsManager, Loading @@ -198,7 +194,6 @@ public class GsmCdmaPhoneTest extends TelephonyTest { public void tearDown() throws Exception { mPhoneUT.removeCallbacksAndMessages(null); mPhoneUT = null; DomainSelectionResolver.setDomainSelectionResolver(null); try { DeviceConfig.setProperties(mPreTestProperties); } catch (DeviceConfig.BadConfigException e) { Loading
tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +65 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,7 @@ import com.android.internal.R; import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager; import com.android.internal.telephony.data.AccessNetworksManager; import com.android.internal.telephony.data.DataNetworkController; import com.android.internal.telephony.emergency.EmergencyStateTracker; import com.android.internal.telephony.metrics.ServiceStateStats; import com.android.internal.telephony.satellite.SatelliteController; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; Loading Loading @@ -145,6 +146,7 @@ public class ServiceStateTrackerTest extends TelephonyTest { private ServiceStateTrackerTestHandler mSSTTestHandler; private PersistableBundle mBundle; private SatelliteController mSatelliteController; private EmergencyStateTracker mEmergencyStateTracker; private static final int EVENT_REGISTERED_TO_NETWORK = 1; private static final int EVENT_SUBSCRIPTION_INFO_READY = 2; Loading Loading @@ -390,6 +392,9 @@ public class ServiceStateTrackerTest extends TelephonyTest { sendCarrierConfigUpdate(PHONE_ID); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); mEmergencyStateTracker = Mockito.mock(EmergencyStateTracker.class); replaceInstance(EmergencyStateTracker.class, "INSTANCE", null, mEmergencyStateTracker); logd("ServiceStateTrackerTest -Setup!"); } Loading Loading @@ -480,6 +485,66 @@ public class ServiceStateTrackerTest extends TelephonyTest { waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); verify(mEmergencyStateTracker, never()).onCellularRadioPowerOffRequested(); } @Test public void testSetRadioPowerExitEmergencyMode() throws Exception { doReturn(true).when(mDomainSelectionResolver).isDomainSelectionSupported(); // Set up DSDS environment GsmCdmaPhone phone2 = Mockito.mock(GsmCdmaPhone.class); DataNetworkController dataNetworkController_phone2 = Mockito.mock(DataNetworkController.class); mPhones = new Phone[] {mPhone, phone2}; 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(1).when(mPhone).getSubId(); doReturn(2).when(phone2).getSubId(); // Start with radio on sst.setRadioPower(true); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); // Turn on APM sst.setRadioPower(false); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState()); // Verify checking emergency mode verify(mEmergencyStateTracker).onCellularRadioPowerOffRequested(); // Verify that both subs are waiting for all data disconnected verify(mDataNetworkController).tearDownAllDataNetworks( eq(3 /* TEAR_DOWN_REASON_AIRPLANE_MODE_ON */)); verify(dataNetworkController_phone2, never()).tearDownAllDataNetworks(anyInt()); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback1 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback2 = ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class); verify(mDataNetworkController, times(1)).registerDataNetworkControllerCallback( callback1.capture()); verify(dataNetworkController_phone2, times(1)).registerDataNetworkControllerCallback( 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); 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); waitForLastHandlerAction(mSSTTestHandler.getThreadHandler()); verify(mDataNetworkController, times(1)).unregisterDataNetworkControllerCallback(any()); assertEquals(TelephonyManager.RADIO_POWER_OFF, mSimulatedCommands.getRadioState()); } @Test Loading