Loading src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java +58 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -222,6 +223,7 @@ public class SatelliteSessionController extends StateMachine { addState(mUnavailableState); addState(mPowerOffState); addState(mEnablingState); addState(mDisablingState); addState(mIdleState); addState(mTransferringState); addState(mListeningState); Loading Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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)); } Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java +143 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading
src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java +58 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -222,6 +223,7 @@ public class SatelliteSessionController extends StateMachine { addState(mUnavailableState); addState(mPowerOffState); addState(mEnablingState); addState(mDisablingState); addState(mIdleState); addState(mTransferringState); addState(mListeningState); Loading Loading @@ -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() { Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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)); } Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java +143 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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); Loading Loading @@ -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); Loading