Loading src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java +5 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,11 @@ public class RadioOnStateListener { public void onSatelliteModemStateChanged(int state) { mHandler.obtainMessage(MSG_SATELLITE_ENABLED_CHANGED).sendToTarget(); } @Override public void onEmergencyModeChanged(boolean isEmergency) { Rlog.d(TAG, "onEmergencyModeChanged: ignored " + isEmergency); } }; private Callback mCallback; // The callback to notify upon completion. Loading src/java/com/android/internal/telephony/satellite/SatelliteController.java +6 −0 Original line number Diff line number Diff line Loading @@ -3995,6 +3995,9 @@ public class SatelliteController extends Handler { && mWaitingForRadioDisabled) { plogd("Sending success to callback that sent enable satellite request"); mIsEmergency = mSatelliteEnabledRequest.isEmergency; if (mSatelliteSessionController != null) { mSatelliteSessionController.onEmergencyModeChanged(mIsEmergency); } synchronized (mIsSatelliteEnabledLock) { mIsSatelliteEnabled = mSatelliteEnabledRequest.enableSatellite; } Loading Loading @@ -4024,6 +4027,9 @@ public class SatelliteController extends Handler { setDemoModeEnabled(false); handlePersistentLoggingOnSessionEnd(mIsEmergency); mIsEmergency = false; if (mSatelliteSessionController != null) { mSatelliteSessionController.onEmergencyModeChanged(mIsEmergency); } mIsSatelliteEnabled = false; setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE); setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_FALSE); Loading src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java +32 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,35 @@ public class SatelliteSessionController extends StateMachine { sendMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, state); } /** * {@link SatelliteController} uses this function to notify {@link SatelliteSessionController} * that the satellite emergency mode has changed. * * @param isEmergencyMode The satellite emergency mode. */ public void onEmergencyModeChanged(boolean isEmergencyMode) { if (!mFeatureFlags.carrierRoamingNbIotNtn()) { plogd("onEmergencyModeChanged: carrierRoamingNbIotNtn is disabled"); return; } plogd("onEmergencyModeChanged " + isEmergencyMode); List<ISatelliteModemStateCallback> toBeRemoved = new ArrayList<>(); mListeners.values().forEach(listener -> { try { listener.onEmergencyModeChanged(isEmergencyMode); } catch (RemoteException e) { plogd("onEmergencyModeChanged RemoteException: " + e); toBeRemoved.add(listener); } }); toBeRemoved.forEach(listener -> { mListeners.remove(listener.asBinder()); }); } /** * Registers for modem state changed from satellite modem. * Loading @@ -341,6 +370,9 @@ public class SatelliteSessionController extends StateMachine { @NonNull ISatelliteModemStateCallback callback) { try { callback.onSatelliteModemStateChanged(mCurrentState); if (mFeatureFlags.carrierRoamingNbIotNtn()) { callback.onEmergencyModeChanged(mSatelliteController.getRequestIsEmergency()); } mListeners.put(callback.asBinder(), callback); } catch (RemoteException ex) { ploge("registerForSatelliteModemStateChanged: Got RemoteException ex=" + ex); Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -819,6 +819,7 @@ public class SatelliteControllerTest extends TelephonyTest { assertTrue(waitForIIntegerConsumerResult(1)); assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0)); verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS); verify(mMockSatelliteSessionController, times(2)).onEmergencyModeChanged(eq(false)); assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled); assertEquals( Loading @@ -839,6 +840,7 @@ public class SatelliteControllerTest extends TelephonyTest { sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null); processAllMessages(); verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS); verify(mMockSatelliteSessionController, times(3)).onEmergencyModeChanged(eq(false)); assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled); assertEquals( Loading Loading @@ -1369,6 +1371,11 @@ public class SatelliteControllerTest extends TelephonyTest { public void onSatelliteModemStateChanged(int state) { logd("onSatelliteModemStateChanged: state=" + state); } @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: emergency=" + isEmergency); } }; int errorCode = mSatelliteControllerUT.registerForSatelliteModemStateChanged( SUB_ID, callback); Loading @@ -1392,6 +1399,11 @@ public class SatelliteControllerTest extends TelephonyTest { public void onSatelliteModemStateChanged(int state) { logd("onSatelliteModemStateChanged: state=" + state); } @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: emergency=" + isEmergency); } }; mSatelliteControllerUT.unregisterForModemStateChanged(SUB_ID, callback); verify(mMockSatelliteSessionController, never()) Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java +89 −7 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; /** Loading Loading @@ -1100,6 +1101,41 @@ public class SatelliteSessionControllerTest extends TelephonyTest { moveToPowerOffState(); } @Test public void testEmergencyModeChanged() { when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true); when(mMockSatelliteController.getRequestIsEmergency()).thenReturn(false); // Unregister exist callback mTestSatelliteSessionController.unregisterForSatelliteModemStateChanged( mTestSatelliteModemStateCallback); // Register callback mTestSatelliteSessionController.registerForSatelliteModemStateChanged( mTestSatelliteModemStateCallback); // Verify initial notification assertSuccessfulModemStateChangedCallback( mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, false); mTestSatelliteSessionController.onEmergencyModeChanged(true); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, true); mTestSatelliteSessionController.onEmergencyModeChanged(false); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, false); when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(false); mTestSatelliteSessionController.onEmergencyModeChanged(false); assertEmergencyModeChangedCallbackNotCalled(mTestSatelliteModemStateCallback); } private void setupDatagramTransferringState(boolean isTransferring) { when(mMockDatagramController.isSendingInIdleState()).thenReturn(isTransferring); when(mMockDatagramController.isPollingInIdleState()).thenReturn(isTransferring); Loading Loading @@ -1321,7 +1357,9 @@ public class SatelliteSessionControllerTest extends TelephonyTest { private static class TestSatelliteModemStateCallback extends ISatelliteModemStateCallback.Stub { private final AtomicInteger mModemState = new AtomicInteger( SatelliteManager.SATELLITE_MODEM_STATE_OFF); private final Semaphore mSemaphore = new Semaphore(0); private final AtomicBoolean mIsEmergency = new AtomicBoolean(false); private final Semaphore mSemaphoreForModemStateChanged = new Semaphore(0); private final Semaphore mSemaphoreForEmergencyModeChanged = new Semaphore(0); private final Object mLock = new Object(); private final List<Integer> mModemStates = new ArrayList<>(); Loading @@ -1333,15 +1371,27 @@ public class SatelliteSessionControllerTest extends TelephonyTest { mModemStates.add(state); } try { mSemaphore.release(); mSemaphoreForModemStateChanged.release(); } catch (Exception ex) { logd("onSatelliteModemStateChanged: Got exception, ex=" + ex); } } public boolean waitUntilResult() { @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: state=" + isEmergency); mIsEmergency.set(isEmergency); try { mSemaphoreForEmergencyModeChanged.release(); } catch (Exception ex) { logd("onEmergencyModeChanged: Got exception, ex=" + ex); } } public boolean waitUntilResultForModemStateChanged() { try { if (!mSemaphore.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { if (!mSemaphoreForModemStateChanged.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { logd("Timeout to receive onSatelliteModemStateChanged"); return false; } Loading @@ -1352,6 +1402,20 @@ public class SatelliteSessionControllerTest extends TelephonyTest { } } public boolean waitUntilResultForEmergencyModeChanged() { try { if (!mSemaphoreForEmergencyModeChanged.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { logd("Timeout to receive onEmergencyModeChanged"); return false; } return true; } catch (Exception ex) { logd("onEmergencyModeChanged: Got exception=" + ex); return false; } } public int getModemState() { return mModemState.get(); } Loading @@ -1374,22 +1438,40 @@ public class SatelliteSessionControllerTest extends TelephonyTest { } } public boolean getEmergencyMode() { return mIsEmergency.get(); } public void clearSemaphorePermits() { mSemaphore.drainPermits(); mSemaphoreForModemStateChanged.drainPermits(); } } private static void assertSuccessfulModemStateChangedCallback( TestSatelliteModemStateCallback callback, @SatelliteManager.SatelliteModemState int expectedModemState) { boolean successful = callback.waitUntilResult(); boolean successful = callback.waitUntilResultForModemStateChanged(); assertTrue(successful); assertEquals(expectedModemState, callback.getModemState()); } private static void assertModemStateChangedCallbackNotCalled( TestSatelliteModemStateCallback callback) { boolean successful = callback.waitUntilResult(); boolean successful = callback.waitUntilResultForModemStateChanged(); assertFalse(successful); } private static void assertSuccessfulEmergencyModeChangedCallback( TestSatelliteModemStateCallback callback, boolean isEmergency) { boolean successful = callback.waitUntilResultForEmergencyModeChanged(); assertTrue(successful); assertEquals(isEmergency, callback.getEmergencyMode()); } private static void assertEmergencyModeChangedCallbackNotCalled( TestSatelliteModemStateCallback callback) { boolean successful = callback.waitUntilResultForEmergencyModeChanged(); assertFalse(successful); } Loading Loading
src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java +5 −0 Original line number Diff line number Diff line Loading @@ -148,6 +148,11 @@ public class RadioOnStateListener { public void onSatelliteModemStateChanged(int state) { mHandler.obtainMessage(MSG_SATELLITE_ENABLED_CHANGED).sendToTarget(); } @Override public void onEmergencyModeChanged(boolean isEmergency) { Rlog.d(TAG, "onEmergencyModeChanged: ignored " + isEmergency); } }; private Callback mCallback; // The callback to notify upon completion. Loading
src/java/com/android/internal/telephony/satellite/SatelliteController.java +6 −0 Original line number Diff line number Diff line Loading @@ -3995,6 +3995,9 @@ public class SatelliteController extends Handler { && mWaitingForRadioDisabled) { plogd("Sending success to callback that sent enable satellite request"); mIsEmergency = mSatelliteEnabledRequest.isEmergency; if (mSatelliteSessionController != null) { mSatelliteSessionController.onEmergencyModeChanged(mIsEmergency); } synchronized (mIsSatelliteEnabledLock) { mIsSatelliteEnabled = mSatelliteEnabledRequest.enableSatellite; } Loading Loading @@ -4024,6 +4027,9 @@ public class SatelliteController extends Handler { setDemoModeEnabled(false); handlePersistentLoggingOnSessionEnd(mIsEmergency); mIsEmergency = false; if (mSatelliteSessionController != null) { mSatelliteSessionController.onEmergencyModeChanged(mIsEmergency); } mIsSatelliteEnabled = false; setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE); setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_FALSE); Loading
src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java +32 −0 Original line number Diff line number Diff line Loading @@ -332,6 +332,35 @@ public class SatelliteSessionController extends StateMachine { sendMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, state); } /** * {@link SatelliteController} uses this function to notify {@link SatelliteSessionController} * that the satellite emergency mode has changed. * * @param isEmergencyMode The satellite emergency mode. */ public void onEmergencyModeChanged(boolean isEmergencyMode) { if (!mFeatureFlags.carrierRoamingNbIotNtn()) { plogd("onEmergencyModeChanged: carrierRoamingNbIotNtn is disabled"); return; } plogd("onEmergencyModeChanged " + isEmergencyMode); List<ISatelliteModemStateCallback> toBeRemoved = new ArrayList<>(); mListeners.values().forEach(listener -> { try { listener.onEmergencyModeChanged(isEmergencyMode); } catch (RemoteException e) { plogd("onEmergencyModeChanged RemoteException: " + e); toBeRemoved.add(listener); } }); toBeRemoved.forEach(listener -> { mListeners.remove(listener.asBinder()); }); } /** * Registers for modem state changed from satellite modem. * Loading @@ -341,6 +370,9 @@ public class SatelliteSessionController extends StateMachine { @NonNull ISatelliteModemStateCallback callback) { try { callback.onSatelliteModemStateChanged(mCurrentState); if (mFeatureFlags.carrierRoamingNbIotNtn()) { callback.onEmergencyModeChanged(mSatelliteController.getRequestIsEmergency()); } mListeners.put(callback.asBinder(), callback); } catch (RemoteException ex) { ploge("registerForSatelliteModemStateChanged: Got RemoteException ex=" + ex); Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +12 −0 Original line number Diff line number Diff line Loading @@ -819,6 +819,7 @@ public class SatelliteControllerTest extends TelephonyTest { assertTrue(waitForIIntegerConsumerResult(1)); assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0)); verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS); verify(mMockSatelliteSessionController, times(2)).onEmergencyModeChanged(eq(false)); assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled); assertEquals( Loading @@ -839,6 +840,7 @@ public class SatelliteControllerTest extends TelephonyTest { sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null); processAllMessages(); verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS); verify(mMockSatelliteSessionController, times(3)).onEmergencyModeChanged(eq(false)); assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled); assertTrue(mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled); assertEquals( Loading Loading @@ -1369,6 +1371,11 @@ public class SatelliteControllerTest extends TelephonyTest { public void onSatelliteModemStateChanged(int state) { logd("onSatelliteModemStateChanged: state=" + state); } @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: emergency=" + isEmergency); } }; int errorCode = mSatelliteControllerUT.registerForSatelliteModemStateChanged( SUB_ID, callback); Loading @@ -1392,6 +1399,11 @@ public class SatelliteControllerTest extends TelephonyTest { public void onSatelliteModemStateChanged(int state) { logd("onSatelliteModemStateChanged: state=" + state); } @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: emergency=" + isEmergency); } }; mSatelliteControllerUT.unregisterForModemStateChanged(SUB_ID, callback); verify(mMockSatelliteSessionController, never()) Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java +89 −7 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; /** Loading Loading @@ -1100,6 +1101,41 @@ public class SatelliteSessionControllerTest extends TelephonyTest { moveToPowerOffState(); } @Test public void testEmergencyModeChanged() { when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true); when(mMockSatelliteController.getRequestIsEmergency()).thenReturn(false); // Unregister exist callback mTestSatelliteSessionController.unregisterForSatelliteModemStateChanged( mTestSatelliteModemStateCallback); // Register callback mTestSatelliteSessionController.registerForSatelliteModemStateChanged( mTestSatelliteModemStateCallback); // Verify initial notification assertSuccessfulModemStateChangedCallback( mTestSatelliteModemStateCallback, SatelliteManager.SATELLITE_MODEM_STATE_OFF); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, false); mTestSatelliteSessionController.onEmergencyModeChanged(true); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, true); mTestSatelliteSessionController.onEmergencyModeChanged(false); assertSuccessfulEmergencyModeChangedCallback( mTestSatelliteModemStateCallback, false); when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(false); mTestSatelliteSessionController.onEmergencyModeChanged(false); assertEmergencyModeChangedCallbackNotCalled(mTestSatelliteModemStateCallback); } private void setupDatagramTransferringState(boolean isTransferring) { when(mMockDatagramController.isSendingInIdleState()).thenReturn(isTransferring); when(mMockDatagramController.isPollingInIdleState()).thenReturn(isTransferring); Loading Loading @@ -1321,7 +1357,9 @@ public class SatelliteSessionControllerTest extends TelephonyTest { private static class TestSatelliteModemStateCallback extends ISatelliteModemStateCallback.Stub { private final AtomicInteger mModemState = new AtomicInteger( SatelliteManager.SATELLITE_MODEM_STATE_OFF); private final Semaphore mSemaphore = new Semaphore(0); private final AtomicBoolean mIsEmergency = new AtomicBoolean(false); private final Semaphore mSemaphoreForModemStateChanged = new Semaphore(0); private final Semaphore mSemaphoreForEmergencyModeChanged = new Semaphore(0); private final Object mLock = new Object(); private final List<Integer> mModemStates = new ArrayList<>(); Loading @@ -1333,15 +1371,27 @@ public class SatelliteSessionControllerTest extends TelephonyTest { mModemStates.add(state); } try { mSemaphore.release(); mSemaphoreForModemStateChanged.release(); } catch (Exception ex) { logd("onSatelliteModemStateChanged: Got exception, ex=" + ex); } } public boolean waitUntilResult() { @Override public void onEmergencyModeChanged(boolean isEmergency) { logd("onEmergencyModeChanged: state=" + isEmergency); mIsEmergency.set(isEmergency); try { mSemaphoreForEmergencyModeChanged.release(); } catch (Exception ex) { logd("onEmergencyModeChanged: Got exception, ex=" + ex); } } public boolean waitUntilResultForModemStateChanged() { try { if (!mSemaphore.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { if (!mSemaphoreForModemStateChanged.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { logd("Timeout to receive onSatelliteModemStateChanged"); return false; } Loading @@ -1352,6 +1402,20 @@ public class SatelliteSessionControllerTest extends TelephonyTest { } } public boolean waitUntilResultForEmergencyModeChanged() { try { if (!mSemaphoreForEmergencyModeChanged.tryAcquire(EVENT_PROCESSING_TIME_MILLIS, TimeUnit.MILLISECONDS)) { logd("Timeout to receive onEmergencyModeChanged"); return false; } return true; } catch (Exception ex) { logd("onEmergencyModeChanged: Got exception=" + ex); return false; } } public int getModemState() { return mModemState.get(); } Loading @@ -1374,22 +1438,40 @@ public class SatelliteSessionControllerTest extends TelephonyTest { } } public boolean getEmergencyMode() { return mIsEmergency.get(); } public void clearSemaphorePermits() { mSemaphore.drainPermits(); mSemaphoreForModemStateChanged.drainPermits(); } } private static void assertSuccessfulModemStateChangedCallback( TestSatelliteModemStateCallback callback, @SatelliteManager.SatelliteModemState int expectedModemState) { boolean successful = callback.waitUntilResult(); boolean successful = callback.waitUntilResultForModemStateChanged(); assertTrue(successful); assertEquals(expectedModemState, callback.getModemState()); } private static void assertModemStateChangedCallbackNotCalled( TestSatelliteModemStateCallback callback) { boolean successful = callback.waitUntilResult(); boolean successful = callback.waitUntilResultForModemStateChanged(); assertFalse(successful); } private static void assertSuccessfulEmergencyModeChangedCallback( TestSatelliteModemStateCallback callback, boolean isEmergency) { boolean successful = callback.waitUntilResultForEmergencyModeChanged(); assertTrue(successful); assertEquals(isEmergency, callback.getEmergencyMode()); } private static void assertEmergencyModeChangedCallbackNotCalled( TestSatelliteModemStateCallback callback) { boolean successful = callback.waitUntilResultForEmergencyModeChanged(); assertFalse(successful); } Loading