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

Commit 83e9530e authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Support DISABLING_SATELLITE state in satellite state machine" into 24D1-dev am: 1cdb078c

parents 5b9d75de 1cdb078c
Loading
Loading
Loading
Loading
+58 −0
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ public class SatelliteSessionController extends StateMachine {
    @NonNull private final UnavailableState mUnavailableState = new UnavailableState();
    @NonNull private final PowerOffState mPowerOffState = new PowerOffState();
    @NonNull private final EnablingState mEnablingState = new EnablingState();
    @NonNull private final DisablingState mDisablingState = new DisablingState();
    @NonNull private final IdleState mIdleState = new IdleState();
    @NonNull private final TransferringState mTransferringState = new TransferringState();
    @NonNull private final ListeningState mListeningState = new ListeningState();
@@ -222,6 +223,7 @@ public class SatelliteSessionController extends StateMachine {
        addState(mUnavailableState);
        addState(mPowerOffState);
        addState(mEnablingState);
        addState(mDisablingState);
        addState(mIdleState);
        addState(mTransferringState);
        addState(mListeningState);
@@ -521,6 +523,41 @@ public class SatelliteSessionController extends StateMachine {
        }
    }

    private class DisablingState extends State {
        @Override
        public void enter() {
            if (DBG) logd("Entering DisablingState");

            mCurrentState = SatelliteManager.SATELLITE_MODEM_STATE_DISABLING_SATELLITE;
            notifyStateChangedEvent(SatelliteManager.SATELLITE_MODEM_STATE_DISABLING_SATELLITE);
        }

        @Override
        public void exit() {
            if (DBG) logd("Exiting DisablingState");
        }

        @Override
        public boolean processMessage(Message msg) {
            if (DBG) log("DisablingState: processing " + getWhatToString(msg.what));
            switch (msg.what) {
                case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
                    handleSatelliteEnabledStateChanged((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
        }

        private void handleSatelliteEnabledStateChanged(boolean on) {
            if (on) {
                logw("Unexpected power on event while disabling satellite");
            } else {
                transitionTo(mPowerOffState);
            }
        }
    }

    private class IdleState extends State {
        @Override
        public void enter() {
@@ -547,6 +584,9 @@ public class SatelliteSessionController extends StateMachine {
                    handleEventDisableCellularModemWhileSatelliteModeIsOnDone(
                            (AsyncResult) msg.obj);
                    break;
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
@@ -637,6 +677,9 @@ public class SatelliteSessionController extends StateMachine {
                case EVENT_SATELLITE_MODEM_STATE_CHANGED:
                    handleEventSatelliteModemStateChange(msg.arg1);
                    break;
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
@@ -704,6 +747,9 @@ public class SatelliteSessionController extends StateMachine {
                case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
                    handleSatelliteEnabledStateChanged(!(boolean) msg.obj, "ListeningState");
                    break;
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
@@ -763,6 +809,9 @@ public class SatelliteSessionController extends StateMachine {
                case EVENT_DATAGRAM_TRANSFER_STATE_CHANGED:
                    handleEventDatagramTransferStateChanged((DatagramTransferState) msg.obj);
                    break;
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
@@ -825,6 +874,9 @@ public class SatelliteSessionController extends StateMachine {
                case EVENT_DATAGRAM_TRANSFER_STATE_CHANGED:
                    handleEventDatagramTransferStateChanged((DatagramTransferState) msg.obj);
                    break;
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
@@ -1030,6 +1082,12 @@ public class SatelliteSessionController extends StateMachine {
        }
    }

    private void handleSatelliteEnablementStarted(boolean enabled) {
        if (!enabled) {
            transitionTo(mDisablingState);
        }
    }

    private boolean isMockModemAllowed() {
        return (DEBUG || SystemProperties.getBoolean(ALLOW_MOCK_MODEM_PROPERTY, false));
    }
+143 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
    private static final String STATE_UNAVAILABLE = "UnavailableState";
    private static final String STATE_POWER_OFF = "PowerOffState";
    private static final String STATE_ENABLING_SATELLITE = "EnablingState";
    private static final String STATE_DISABLING_SATELLITE = "DisablingState";
    private static final String STATE_IDLE = "IdleState";
    private static final String STATE_TRANSFERRING = "TransferringState";
    private static final String STATE_LISTENING = "ListeningState";
@@ -927,6 +928,62 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        powerOnSatelliteModem();
    }

    @Test
    public void testDisablingSatellite() {
        // Since satellite is supported, SatelliteSessionController should move to POWER_OFF state.
        assertNotNull(mTestSatelliteSessionController);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        // IDLE -> DISABLING
        moveToIdleState();
        moveSatelliteToDisablingState();

        // DISABLING -> POWER_OFF
        moveToPowerOffState();

        // TRANSFERRING -> DISABLING
        moveToIdleState();
        moveIdleToTransferringState();
        moveSatelliteToDisablingState();

        // DISABLING -> POWER_OFF
        moveToPowerOffState();

        // LISTENING -> DISABLING
        moveToIdleState();
        moveIdleToTransferringState();
        moveTransferringToListeningState();
        moveSatelliteToDisablingState();

        // DISABLING -> POWER_OFF
        moveToPowerOffState();
    }

    @Test
    public void testDisablingSatelliteForNblot() {
        when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(true);

        // Since satellite is supported, SatelliteSessionController should move to POWER_OFF state.
        assertNotNull(mTestSatelliteSessionController);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        setupDatagramTransferringState(false);

        // NOT_CONNECTED -> DISABLING
        moveToNotConnectedState();
        moveSatelliteToDisablingState();

        // DISABLING -> POWER_OFF
        moveToPowerOffState();

        // CONNECTED -> DISABLING
        moveToNotConnectedState();
        moveNotConnectedToConnectedState();
        moveSatelliteToDisablingState();

        // DISABLING -> POWER_OFF
        moveToPowerOffState();
    }

    private void setupDatagramTransferringState(boolean isTransferring) {
        when(mMockDatagramController.isSendingInIdleState()).thenReturn(isTransferring);
        when(mMockDatagramController.isPollingInIdleState()).thenReturn(isTransferring);
@@ -967,6 +1024,92 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        mTestSatelliteModemStateCallback.clearModemStates();
    }

    private void moveToPowerOffState() {
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(false);
        processAllMessages();

        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
    }

    private void moveToIdleState() {
        powerOnSatelliteModem();

        // SatelliteSessionController should move to IDLE state after the modem is powered on.
        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_IDLE);
        assertEquals(STATE_IDLE, mTestSatelliteSessionController.getCurrentStateName());
        assertFalse(mTestSatelliteSessionController.isSendingTriggeredDuringTransferringState());
    }

    private void moveIdleToTransferringState() {
        assertEquals(STATE_IDLE, mTestSatelliteSessionController.getCurrentStateName());
        // Start sending datagrams
        mTestSatelliteSessionController.onDatagramTransferStateChanged(
                SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING, SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
        processAllMessages();

        // SatelliteSessionController should move to TRANSFERRING state.
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING);
        assertEquals(STATE_TRANSFERRING, mTestSatelliteSessionController.getCurrentStateName());
        assertTrue(mTestSatelliteSessionController.isSendingTriggeredDuringTransferringState());
    }

    private void moveTransferringToListeningState() {
        assertEquals(STATE_TRANSFERRING, mTestSatelliteSessionController.getCurrentStateName());
        // Sending datagrams is successful and done.
        mTestSatelliteSessionController.onDatagramTransferStateChanged(
                SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
        processAllMessages();

        // SatelliteSessionController should move to LISTENING state.
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_LISTENING);
        assertEquals(STATE_LISTENING, mTestSatelliteSessionController.getCurrentStateName());
    }

    private void moveToNotConnectedState() {
        powerOnSatelliteModem();
        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
        assertEquals(STATE_NOT_CONNECTED, mTestSatelliteSessionController.getCurrentStateName());
        assertFalse(mTestSatelliteSessionController.isNbIotInactivityTimerStarted());
        verify(mMockDatagramController).onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
        clearInvocations(mMockDatagramController);
    }

    private void moveNotConnectedToConnectedState() {
        // Satellite modem is connected to a satellite network.
        mTestSatelliteSessionController.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        // SatelliteSessionController should move to CONNECTED state
        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        assertEquals(STATE_CONNECTED, mTestSatelliteSessionController.getCurrentStateName());
        verify(mMockDatagramController).onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        clearInvocations(mMockDatagramController);
    }

    private void moveSatelliteToDisablingState() {
        mTestSatelliteSessionController.onSatelliteEnablementStarted(false);
        processAllMessages();

        // SatelliteSessionController should move to DISABLING state
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_DISABLING_SATELLITE);
        assertEquals(
                STATE_DISABLING_SATELLITE, mTestSatelliteSessionController.getCurrentStateName());
    }

    private static class TestSatelliteModemInterface extends SatelliteModemInterface {
        private final AtomicInteger mListeningEnabledCount = new AtomicInteger(0);
        private final AtomicInteger mListeningDisabledCount = new AtomicInteger(0);