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

Commit 32b015b4 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add callback method to notify the emergency mode included in satellite...

Merge "Add callback method to notify the emergency mode included in satellite enable request is changed" into main
parents 00df2e8c 47129408
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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.
+6 −0
Original line number Diff line number Diff line
@@ -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;
                }
@@ -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);
+32 −0
Original line number Diff line number Diff line
@@ -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.
     *
@@ -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);
+12 −0
Original line number Diff line number Diff line
@@ -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(
@@ -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(
@@ -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);
@@ -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())
+89 −7
Original line number Diff line number Diff line
@@ -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;

/**
@@ -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);
@@ -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<>();

@@ -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;
                }
@@ -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();
        }
@@ -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);
    }