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

Commit c0b62b61 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 10628727 from c0b85184 to udc-qpr1-release

Change-Id: Ied87d343dbcf6b969a0fafa8c63edcfc42da7345
parents 23446082 c0b85184
Loading
Loading
Loading
Loading
+23 −27
Original line number Diff line number Diff line
@@ -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 cellular data networks to be torn down.
     * The timer value to wait for all data networks to be torn down.
     */
    private static final long POWER_OFF_ALL_DATA_NETWORKS_DISCONNECTED_TIMEOUT =
            TimeUnit.SECONDS.toMillis(10);
@@ -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_CELLULAR_DATA_DISCONNECTED = 49;
    protected static final int EVENT_ALL_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;
@@ -611,11 +611,11 @@ public class ServiceStateTracker extends Handler {
    private int mLastKnownAreaCode = CellInfo.UNAVAILABLE;

    /**
     * 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.
     * 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.
     */
    private DataNetworkControllerCallback mAllCellularDataDisconnectedCallback;
    private DataNetworkControllerCallback mDataDisconnectedCallback;

    /**
     * AccessNetworksManagerCallback is used for preferred on the IWLAN when preferred transport
@@ -721,13 +721,12 @@ public class ServiceStateTracker extends Handler {
        registerForImsCapabilityChanged(mCSST,
                CarrierServiceStateTracker.CARRIER_EVENT_IMS_CAPABILITIES_CHANGED, null);

        mAllCellularDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) {
        mDataDisconnectedCallback = new DataNetworkControllerCallback(this::post) {
            @Override
            public void onAnyCellularDataNetworkExistingChanged(boolean anyCellularDataExisting) {
                log("onAnyCellularDataNetworkExistingChanged: anyCellularDataExisting="
                        + anyCellularDataExisting);
                if (!anyCellularDataExisting) {
                    sendEmptyMessage(EVENT_ALL_CELLULAR_DATA_DISCONNECTED);
            public void onAnyDataNetworkExistingChanged(boolean anyDataExisting) {
                log("onAnyDataNetworkExistingChanged: anyDataExisting=" + anyDataExisting);
                if (!anyDataExisting) {
                    sendEmptyMessage(EVENT_ALL_DATA_DISCONNECTED);
                }
            }
        };
@@ -1208,7 +1207,7 @@ public class ServiceStateTracker extends Handler {
            case EVENT_SET_RADIO_POWER_OFF:
                synchronized(this) {
                    mPendingRadioPowerOffAfterDataOff = false;
                    log("Wait for all cellular data networks torn down timed out. Power off now.");
                    log("Wait for all data networks torn down timed out. Power off now.");
                    hangupAndPowerOff();
                }
                break;
@@ -1476,18 +1475,18 @@ public class ServiceStateTracker extends Handler {
                }
                break;

            case EVENT_ALL_CELLULAR_DATA_DISCONNECTED:
                log("EVENT_ALL_CELLULAR_DATA_DISCONNECTED");
            case EVENT_ALL_DATA_DISCONNECTED:
                log("EVENT_ALL_DATA_DISCONNECTED");
                synchronized (this) {
                    if (!mPendingRadioPowerOffAfterDataOff) return;
                    boolean areAllDataDisconnectedOnAllPhones = true;
                    for (Phone phone : PhoneFactory.getPhones()) {
                        if (phone.getDataNetworkController().areAllCellularDataDisconnected()) {
                        if (phone.getDataNetworkController().areAllDataDisconnected()) {
                            phone.getDataNetworkController()
                                .unregisterDataNetworkControllerCallback(
                                        mAllCellularDataDisconnectedCallback);
                                        mDataDisconnectedCallback);
                        } else {
                            log("Still waiting for all cellular data disconnected on phone: "
                            log("Still waiting for all data disconnected on phone: "
                                    + phone.getSubId());
                            areAllDataDisconnectedOnAllPhones = false;
                        }
@@ -4978,17 +4977,17 @@ public class ServiceStateTracker extends Handler {
                }

                for (Phone phone : PhoneFactory.getPhones()) {
                    if (!phone.getDataNetworkController().areAllCellularDataDisconnected()) {
                    if (!phone.getDataNetworkController().areAllDataDisconnected()) {
                        log("powerOffRadioSafely: Data is active on phone " + phone.getSubId()
                                + ". Wait for all cellular data disconnect.");
                                + ". Wait for all data disconnect.");
                        mPendingRadioPowerOffAfterDataOff = true;
                        phone.getDataNetworkController().registerDataNetworkControllerCallback(
                                mAllCellularDataDisconnectedCallback);
                                mDataDisconnectedCallback);
                    }
                }

                // Tear down outside of the disconnected check to prevent race conditions.
                mPhone.getDataNetworkController().tearDownAllCellularDataNetworks(
                mPhone.getDataNetworkController().tearDownAllDataNetworks(
                        DataNetwork.TEAR_DOWN_REASON_AIRPLANE_MODE_ON);

                if (mPendingRadioPowerOffAfterDataOff) {
@@ -5046,11 +5045,8 @@ public class ServiceStateTracker extends Handler {
     */
    protected void hangupAndPowerOff() {
        if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) return;
        // 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) {
        // hang up all active voice calls
        if (!mPhone.isPhoneTypeGsm() || mPhone.isInCall()) {
            mPhone.mCT.mRingingCall.hangupIfAlive();
            mPhone.mCT.mBackgroundCall.hangupIfAlive();
            mPhone.mCT.mForegroundCall.hangupIfAlive();
+0 −8
Original line number Diff line number Diff line
@@ -812,12 +812,6 @@ 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.
         *
@@ -1453,8 +1447,6 @@ public class DataNetwork extends StateMachine {
            sendMessageDelayed(EVENT_STUCK_IN_TRANSIENT_STATE,
                    mDataConfigManager.getNetworkHandoverTimeoutMs());
            notifyPreciseDataConnectionState();
            mDataNetworkCallback.invokeFromExecutor(
                    () -> mDataNetworkCallback.onHandoverStarted(DataNetwork.this));
        }

        @Override
+78 −151

File changed.

Preview size limit exceeded, changes collapsed.

+4 −1
Original line number Diff line number Diff line
@@ -3859,10 +3859,13 @@ public class SubscriptionManagerService extends ISub.Stub {
                case TelephonyManager.SIM_STATE_PUK_REQUIRED:
                case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
                case TelephonyManager.SIM_STATE_PERM_DISABLED:
                case TelephonyManager.SIM_STATE_READY:
                case TelephonyManager.SIM_STATE_CARD_IO_ERROR:
                case TelephonyManager.SIM_STATE_LOADED:
                    updateSubscription(slotIndex);
                    break;
                case TelephonyManager.SIM_STATE_NOT_READY:
                case TelephonyManager.SIM_STATE_READY:
                    updateEmbeddedSubscriptions();
                    updateSubscription(slotIndex);
                    break;
                case TelephonyManager.SIM_STATE_CARD_RESTRICTED:
+9 −42
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ 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;
@@ -272,7 +271,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(mIwlanNetworkServiceStub).when(mIwlanNetworkServiceStub).asBinder();
        addNetworkService();

        doReturn(true).when(mDataNetworkController).areAllCellularDataDisconnected();
        doReturn(true).when(mDataNetworkController).areAllDataDisconnected();

        doReturn(new ServiceState()).when(mPhone).getServiceState();

@@ -431,8 +430,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).areAllCellularDataDisconnected();
        doReturn(false).when(dataNetworkController_phone2).areAllCellularDataDisconnected();
        doReturn(false).when(mDataNetworkController).areAllDataDisconnected();
        doReturn(false).when(dataNetworkController_phone2).areAllDataDisconnected();
        doReturn(1).when(mPhone).getSubId();
        doReturn(2).when(phone2).getSubId();

@@ -445,9 +444,9 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        sst.setRadioPower(false);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
        assertEquals(TelephonyManager.RADIO_POWER_ON, mSimulatedCommands.getRadioState());
        verify(mDataNetworkController).tearDownAllCellularDataNetworks(
        verify(mDataNetworkController).tearDownAllDataNetworks(
                eq(3 /* TEAR_DOWN_REASON_AIRPLANE_MODE_ON */));
        verify(dataNetworkController_phone2, never()).tearDownAllCellularDataNetworks(anyInt());
        verify(dataNetworkController_phone2, never()).tearDownAllDataNetworks(anyInt());
        ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback1 =
                ArgumentCaptor.forClass(DataNetworkController.DataNetworkControllerCallback.class);
        ArgumentCaptor<DataNetworkController.DataNetworkControllerCallback> callback2 =
@@ -458,16 +457,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).areAllCellularDataDisconnected();
        callback2.getValue().onAnyCellularDataNetworkExistingChanged(false);
        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).areAllCellularDataDisconnected();
        callback1.getValue().onAnyCellularDataNetworkExistingChanged(false);
        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());
@@ -586,38 +585,6 @@ 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