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

Commit b0e5784d authored by Hunsuk Choi's avatar Hunsuk Choi Committed by Android (Google) Code Review
Browse files

Merge "Exit emergency callback mode before turning off radio power" into main

parents ebe1720d 3afe29e4
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