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

Commit 8ed00d8b authored by Thomas Nguyen's avatar Thomas Nguyen
Browse files

Support ENABLING_SATELLITE state in satellite state machine

Bug: 330585109
Test: SatelliteManagerTestOnMockService SatelliteSessionControllerTest SatelliteControllerTest
Manual test with demo and real mode

Change-Id: I688ac95edcfaa4b8e8060641b017f23efc392171
parent 8bb97fd1
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -1006,6 +1006,7 @@ public class SatelliteController extends Handler {
                                    SATELLITE_RESULT_SUCCESS);
                        }
                    }
                    notifyEnablementFailedToSatelliteSessionController();
                    resetSatelliteEnabledRequest();

                    // If Satellite enable/disable request returned Error, no need to wait for radio
@@ -3128,6 +3129,12 @@ public class SatelliteController extends Handler {
    private void handleSatelliteEnabled(SatelliteControllerHandlerRequest request) {
        RequestSatelliteEnabledArgument argument =
                (RequestSatelliteEnabledArgument) request.argument;
        if (mSatelliteSessionController != null) {
            mSatelliteSessionController.onSatelliteEnablementStarted(argument.enableSatellite);
        } else {
            loge("handleSatelliteEnabled: mSatelliteSessionController is not initialized yet");
        }

        if (!argument.enableSatellite && mSatelliteModemInterface.isSatelliteServiceSupported()) {
            synchronized (mIsSatelliteEnabledLock) {
                mWaitingForDisableSatelliteModemResponse = true;
@@ -3144,7 +3151,6 @@ public class SatelliteController extends Handler {
            mSessionStartTimeStamp = System.currentTimeMillis();
        }
        mSessionProcessingTimeStamp = System.currentTimeMillis();

    }

    private void handleRequestSatelliteAttachRestrictionForCarrierCmd(
@@ -4294,6 +4300,7 @@ public class SatelliteController extends Handler {
                    }
                    sendRequestAsync(CMD_SET_SATELLITE_ENABLED, request, null);
                }
                notifyEnablementFailedToSatelliteSessionController();
                mControllerMetricsStats.reportServiceEnablementFailCount();
                mSessionMetricsStats.setInitializationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
                        .setSatelliteTechnology(getSupportedNtnRadioTechnology())
@@ -4523,6 +4530,15 @@ public class SatelliteController extends Handler {
                - mSessionMetricsStats.getSessionTerminationProcessingTimeMillis()) / 1000);
    }

    private void notifyEnablementFailedToSatelliteSessionController() {
        if (mSatelliteSessionController != null) {
            mSatelliteSessionController.onSatelliteEnablementFailed();
        } else {
            loge("notifyEnablementFailedToSatelliteSessionController: mSatelliteSessionController"
                    + " is not initialized yet");
        }
    }

    private static void logd(@NonNull String log) {
        Rlog.d(TAG, log);
    }
+71 −2
Original line number Diff line number Diff line
@@ -101,6 +101,8 @@ public class SatelliteSessionController extends StateMachine {
    private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 4;
    private static final int EVENT_DISABLE_CELLULAR_MODEM_WHILE_SATELLITE_MODE_IS_ON_DONE = 5;
    protected static final int EVENT_NB_IOT_INACTIVITY_TIMER_TIMED_OUT = 6;
    private static final int EVENT_SATELLITE_ENABLEMENT_STARTED = 7;
    private static final int EVENT_SATELLITE_ENABLEMENT_FAILED = 8;

    private static final long REBIND_INITIAL_DELAY = 2 * 1000; // 2 seconds
    private static final long REBIND_MAXIMUM_DELAY = 64 * 1000; // 1 minute
@@ -120,6 +122,7 @@ public class SatelliteSessionController extends StateMachine {
    @NonNull private final SatelliteModemInterface mSatelliteModemInterface;
    @NonNull private final UnavailableState mUnavailableState = new UnavailableState();
    @NonNull private final PowerOffState mPowerOffState = new PowerOffState();
    @NonNull private final EnablingState mEnablingState = new EnablingState();
    @NonNull private final IdleState mIdleState = new IdleState();
    @NonNull private final TransferringState mTransferringState = new TransferringState();
    @NonNull private final ListeningState mListeningState = new ListeningState();
@@ -218,9 +221,10 @@ public class SatelliteSessionController extends StateMachine {

        addState(mUnavailableState);
        addState(mPowerOffState);
        addState(mEnablingState);
        addState(mIdleState);
        addState(mTransferringState);
        addState(mListeningState, mTransferringState);
        addState(mListeningState);
        addState(mNotConnectedState);
        addState(mConnectedState);
        setInitialState(isSatelliteSupported);
@@ -256,6 +260,26 @@ public class SatelliteSessionController extends StateMachine {
        sendMessage(EVENT_SATELLITE_ENABLED_STATE_CHANGED, enabled);
    }

    /**
     * {@link SatelliteController} uses this function to notify {@link SatelliteSessionController}
     * that the satellite enablement has just started.
     *
     * @param enabled {@code true} means being enabled and {@code false} means being disabled.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public void onSatelliteEnablementStarted(boolean enabled) {
        sendMessage(EVENT_SATELLITE_ENABLEMENT_STARTED, enabled);
    }

    /**
     * {@link SatelliteController} uses this function to notify {@link SatelliteSessionController}
     * that the satellite enablement has just failed.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public void onSatelliteEnablementFailed() {
        sendMessage(EVENT_SATELLITE_ENABLEMENT_FAILED);
    }

    /**
     * {@link SatelliteController} uses this function to notify {@link SatelliteSessionController}
     * that the satellite modem state has changed.
@@ -427,10 +451,48 @@ public class SatelliteSessionController extends StateMachine {
        @Override
        public boolean processMessage(Message msg) {
            if (DBG) log("PowerOffState: processing " + getWhatToString(msg.what));
            switch (msg.what) {
                case EVENT_SATELLITE_ENABLEMENT_STARTED:
                    handleSatelliteEnablementStarted((boolean) msg.obj);
                    break;
            }
            // Ignore all unexpected events.
            return HANDLED;
        }

        private void handleSatelliteEnablementStarted(boolean enabled) {
            if (enabled) {
                transitionTo(mEnablingState);
            } else {
                logw("Unexpected satellite disablement started in PowerOff state");
            }
        }
    }

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

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

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

        @Override
        public boolean processMessage(Message msg) {
            if (DBG) log("EnablingState: processing " + getWhatToString(msg.what));
            switch (msg.what) {
                case EVENT_SATELLITE_ENABLED_STATE_CHANGED:
                    handleSatelliteEnabledStateChanged((boolean) msg.obj);
                    break;
                case EVENT_SATELLITE_ENABLEMENT_FAILED:
                    transitionTo(mPowerOffState);
                    break;
                case EVENT_SATELLITE_MODEM_STATE_CHANGED:
                    deferMessage(msg);
                    break;
@@ -448,12 +510,13 @@ public class SatelliteSessionController extends StateMachine {
                }
            } else {
                /*
                 * During the state transition from POWER_OFF to NOT_CONNECTED, modem might be
                 * During the state transition from ENABLING to NOT_CONNECTED, modem might be
                 * reset. In such cases, we need to remove all deferred
                 * EVENT_SATELLITE_MODEM_STATE_CHANGED events so that they will not mess up our
                 * state machine later.
                 */
                removeDeferredMessages(EVENT_SATELLITE_MODEM_STATE_CHANGED);
                transitionTo(mPowerOffState);
            }
        }
    }
@@ -808,6 +871,12 @@ public class SatelliteSessionController extends StateMachine {
            case EVENT_NB_IOT_INACTIVITY_TIMER_TIMED_OUT:
                whatString = "EVENT_NB_IOT_INACTIVITY_TIMER_TIMED_OUT";
                break;
            case EVENT_SATELLITE_ENABLEMENT_STARTED:
                whatString = "EVENT_SATELLITE_ENABLEMENT_STARTED";
                break;
            case EVENT_SATELLITE_ENABLEMENT_FAILED:
                whatString = "EVENT_SATELLITE_ENABLEMENT_FAILED";
                break;
            default:
                whatString = "UNKNOWN EVENT " + what;
        }
+96 −29
Original line number Diff line number Diff line
@@ -71,6 +71,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_IDLE = "IdleState";
    private static final String STATE_TRANSFERRING = "TransferringState";
    private static final String STATE_LISTENING = "ListeningState";
@@ -173,9 +174,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        assertNotNull(mTestSatelliteSessionController);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to IDLE state after the modem is powered on.
        assertSuccessfulModemStateChangedCallback(
@@ -193,9 +192,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        assertFalse(mTestSatelliteSessionController.isSendingTriggeredDuringTransferringState());

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to IDLE state after radio is turned on.
        assertSuccessfulModemStateChangedCallback(
@@ -416,9 +413,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        setupDatagramTransferringState(false);

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
@@ -450,9 +445,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        clearInvocations(mMockDatagramController);

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after radio is turned on.
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
@@ -681,9 +674,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        clearInvocations(mMockDatagramController);

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
@@ -738,9 +729,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
@@ -766,9 +755,7 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
@@ -816,6 +803,8 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        moveSatelliteToEnablingState();

        mTestSatelliteSessionController.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
        mTestSatelliteSessionController.onSatelliteModemStateChanged(
@@ -826,11 +815,12 @@ public class SatelliteSessionControllerTest extends TelephonyTest {

        // The modem state changed events should be deferred
        assertModemStateChangedCallbackNotCalled(mTestSatelliteModemStateCallback);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        assertEquals(
                STATE_ENABLING_SATELLITE, mTestSatelliteSessionController.getCurrentStateName());
        assertTrue(mTestSatelliteSessionController.isEventDeferred(
                4 /* EVENT_SATELLITE_MODEM_STATE_CHANGED */));

        // Power on the modem.
        // Modem is powered on
        mTestSatelliteModemStateCallback.clearModemStates();
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
@@ -856,6 +846,8 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        moveSatelliteToEnablingState();

        mTestSatelliteModemStateCallback.clearSemaphorePermits();
        mTestSatelliteSessionController.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
@@ -867,7 +859,8 @@ public class SatelliteSessionControllerTest extends TelephonyTest {

        // The modem state changed events should be deferred
        assertModemStateChangedCallbackNotCalled(mTestSatelliteModemStateCallback);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        assertEquals(
                STATE_ENABLING_SATELLITE, mTestSatelliteSessionController.getCurrentStateName());
        assertTrue(mTestSatelliteSessionController.isEventDeferred(
                4 /* EVENT_SATELLITE_MODEM_STATE_CHANGED */));

@@ -875,15 +868,13 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        mTestSatelliteModemStateCallback.clearSemaphorePermits();
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(false);
        processAllMessages();
        assertModemStateChangedCallbackNotCalled(mTestSatelliteModemStateCallback);
        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        assertFalse(mTestSatelliteSessionController.isEventDeferred(
                4 /* EVENT_SATELLITE_MODEM_STATE_CHANGED */));

        // Power on the modem.
        mTestSatelliteModemStateCallback.clearModemStates();
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
        powerOnSatelliteModem();

        // SatelliteSessionController should move to NOT_CONNECTED state after the satellite modem
        // is powered on.
@@ -895,11 +886,87 @@ public class SatelliteSessionControllerTest extends TelephonyTest {
        assertEquals(STATE_NOT_CONNECTED, mTestSatelliteSessionController.getCurrentStateName());
    }

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

        // Power off satellite
        mTestSatelliteSessionController.onSatelliteEnablementStarted(false);
        processAllMessages();

        // Satellite should stay at POWER_OFF state
        assertModemStateChangedCallbackNotCalled(mTestSatelliteModemStateCallback);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        moveSatelliteToEnablingState();

        // Satellite enablement has failed
        mTestSatelliteSessionController.onSatelliteEnablementFailed();
        processAllMessages();

        // Satellite should move back to POWER_OFF state
        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        moveSatelliteToEnablingState();

        // Modem reset
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(false);
        processAllMessages();

        // Satellite should move back to POWER_OFF state
        assertSuccessfulModemStateChangedCallback(
                mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF);
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        powerOnSatelliteModem();
    }

    private void setupDatagramTransferringState(boolean isTransferring) {
        when(mMockDatagramController.isSendingInIdleState()).thenReturn(isTransferring);
        when(mMockDatagramController.isPollingInIdleState()).thenReturn(isTransferring);
    }

    private void powerOnSatelliteModem() {
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnablementStarted(true);
        processAllMessages();

        // SatelliteSessionController should move to ENABLING state
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_ENABLING_SATELLITE);
        assertEquals(
                STATE_ENABLING_SATELLITE, mTestSatelliteSessionController.getCurrentStateName());

        // Satellite is powered on
        mTestSatelliteModemStateCallback.clearModemStates();
        mTestSatelliteSessionController.onSatelliteEnabledStateChanged(true);
        processAllMessages();
    }

    private void moveSatelliteToEnablingState() {
        assertEquals(STATE_POWER_OFF, mTestSatelliteSessionController.getCurrentStateName());
        mTestSatelliteModemStateCallback.clearModemStates();

        // Power on the modem.
        mTestSatelliteSessionController.onSatelliteEnablementStarted(true);
        processAllMessages();

        // SatelliteSessionController should move to ENABLING state
        assertSuccessfulModemStateChangedCallback(mTestSatelliteModemStateCallback,
                SatelliteManager.SATELLITE_MODEM_STATE_ENABLING_SATELLITE);
        assertEquals(
                STATE_ENABLING_SATELLITE, mTestSatelliteSessionController.getCurrentStateName());
        mTestSatelliteModemStateCallback.clearModemStates();
    }

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