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

Commit 3afe29e4 authored by Hunsuk Choi's avatar Hunsuk Choi
Browse files

Exit emergency callback mode before turning off radio power

Synchronize the order of EXIT_EMERGENCY_MODE and RADIO_POWER.

Bug: 310569968
Test: atest FrameworksTelephonyTests
Change-Id: I359660ec33c7524d4968af2b8b82a728a0b72a3c
parent 6cee7724
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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()) {
+12 −0
Original line number Diff line number Diff line
@@ -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;
+0 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -91,7 +86,6 @@ public class GsmCdmaCallTrackerTest extends TelephonyTest {
    @After
    public void tearDown() throws Exception {
        mCTUT = null;
        DomainSelectionResolver.setDomainSelectionResolver(null);
        super.tearDown();
    }

+0 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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) {
+65 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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!");
    }

@@ -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