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

Commit e630f96e authored by Aishwarya Mallampati's avatar Aishwarya Mallampati Committed by Android (Google) Code Review
Browse files

Merge "Send request immediately to handler." into main

parents 40a412ff 96f23a6d
Loading
Loading
Loading
Loading
+81 −2
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ import android.util.Pair;
import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.Phone;
@@ -73,6 +74,9 @@ public class DatagramReceiver extends Handler {
    private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 2;
    private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 2;
    private static final int EVENT_WAIT_FOR_DEVICE_ALIGNMENT_IN_DEMO_MODE_TIMED_OUT = 3;
    private static final int EVENT_WAIT_FOR_DEVICE_ALIGNMENT_IN_DEMO_MODE_TIMED_OUT = 3;
    private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4;
    private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4;
    private static final int REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS = 5;
    private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 6;
    private static final int REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE = 7;


    /** Key used to read/write satellite datagramId in shared preferences. */
    /** Key used to read/write satellite datagramId in shared preferences. */
    private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key";
    private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key";
@@ -498,6 +502,43 @@ public class DatagramReceiver extends Handler {
                handleEventDatagramWaitForConnectedStateTimedOut();
                handleEventDatagramWaitForConnectedStateTimedOut();
                break;
                break;


            case REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS: {
                plogd("REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS");
                SomeArgs args = (SomeArgs) msg.obj;
                int subId = (int) args.arg1;
                Consumer<Integer> callback = (Consumer<Integer>) args.arg2;
                try {
                    handleRequestPollPendingSatelliteDatagrams(subId, callback);
                } finally {
                    args.recycle();
                }
                break;
            }

            case EVENT_SATELLITE_MODEM_STATE_CHANGED: {
                plogd("EVENT_SATELLITE_MODEM_STATE_CHANGED");
                SomeArgs args = (SomeArgs) msg.obj;
                int state = (int) args.arg1;
                try {
                    handleEventSatelliteModemStateChanged(state);
                } finally {
                    args.recycle();
                }
                break;
            }

            case REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE: {
                plogd("REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE");
                SomeArgs args = (SomeArgs) msg.obj;
                boolean isAligned = (boolean) args.arg1;
                try {
                    handleRequestSetDeviceAlignedWithSatellite(isAligned);
                } finally {
                    args.recycle();
                }
                break;
            }

            default:
            default:
                plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                break;
                break;
@@ -570,6 +611,20 @@ public class DatagramReceiver extends Handler {
     * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
     * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
     */
     */
    public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
    public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = subId;
            args.arg2 = callback;
            sendMessage(obtainMessage(REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS, args));
            return;
        }

        handleRequestPollPendingSatelliteDatagrams(subId, callback);
    }

    private void handleRequestPollPendingSatelliteDatagrams(int subId,
            @NonNull Consumer<Integer> callback) {
        plogd("handleRequestPollPendingSatelliteDatagrams");
        if (!mDatagramController.isPollingInIdleState()) {
        if (!mDatagramController.isPollingInIdleState()) {
            // Poll request should be sent to satellite modem only when it is free.
            // Poll request should be sent to satellite modem only when it is free.
            plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
            plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
@@ -658,6 +713,19 @@ public class DatagramReceiver extends Handler {
     * @param state Current satellite modem state.
     * @param state Current satellite modem state.
     */
     */
    public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
    public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = state;
            sendMessage(obtainMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, args));
            return;
        }

        handleEventSatelliteModemStateChanged(state);
    }

    private void handleEventSatelliteModemStateChanged(
            @SatelliteManager.SatelliteModemState int state) {
        plogd("handleEventSatelliteModemStateChanged: state = " + state);
        synchronized (mLock) {
        synchronized (mLock) {
            if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
            if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
                    || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
                    || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
@@ -775,7 +843,18 @@ public class DatagramReceiver extends Handler {
    }
    }


    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public void setDeviceAlignedWithSatellite(boolean isAligned) {
    protected void setDeviceAlignedWithSatellite(boolean isAligned) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = isAligned;
            sendMessage(obtainMessage(REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE, args));
            return;
        }

        handleRequestSetDeviceAlignedWithSatellite(isAligned);
    }

    private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) {
        synchronized (mLock) {
        synchronized (mLock) {
            mIsAligned.set(isAligned);
            mIsAligned.set(isAligned);
            plogd("setDeviceAlignedWithSatellite: " + isAligned);
            plogd("setDeviceAlignedWithSatellite: " + isAligned);
@@ -849,7 +928,7 @@ public class DatagramReceiver extends Handler {
    }
    }


    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public boolean isDatagramWaitForConnectedStateTimerStarted() {
    protected boolean isDatagramWaitForConnectedStateTimerStarted() {
        return hasMessages(EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT);
        return hasMessages(EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT);
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -68,7 +68,7 @@ public class DatagramControllerTest extends TelephonyTest {


    private TestDatagramController mDatagramControllerUT;
    private TestDatagramController mDatagramControllerUT;


    @Mock private DatagramReceiver mMockDatagramReceiver;
    @Mock private DatagramReceiverTest.TestDatagramReceiver mMockDatagramReceiver;
    @Mock private DatagramDispatcher mMockDatagramDispatcher;
    @Mock private DatagramDispatcher mMockDatagramDispatcher;
    @Mock private PointingAppController mMockPointingAppController;
    @Mock private PointingAppController mMockPointingAppController;
    @Mock private SatelliteSessionController mMockSatelliteSessionController;
    @Mock private SatelliteSessionController mMockSatelliteSessionController;
+18 −11
Original line number Original line Diff line number Diff line
@@ -166,11 +166,13 @@ public class DatagramReceiverTest extends TelephonyTest {
    @Test
    @Test
    public void testPollPendingSatelliteDatagrams_usingSatelliteModemInterface_success()
    public void testPollPendingSatelliteDatagrams_usingSatelliteModemInterface_success()
            throws Exception {
            throws Exception {
        TestDatagramReceiver testDatagramReceiver = new TestDatagramReceiver(mContext,
                Looper.myLooper(), mFeatureFlags, mMockDatagramController);
        doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
        doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
        doAnswer(invocation -> {
        doAnswer(invocation -> {
            Message message = (Message) invocation.getArguments()[0];
            Message message = (Message) invocation.getArguments()[0];


            mDatagramReceiverUT.obtainMessage(2 /*EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE*/,
            testDatagramReceiver.obtainMessage(2 /*EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE*/,
                            new AsyncResult(message.obj, null, null))
                            new AsyncResult(message.obj, null, null))
                    .sendToTarget();
                    .sendToTarget();
            return null;
            return null;
@@ -181,7 +183,7 @@ public class DatagramReceiverTest extends TelephonyTest {
                .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
                .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        mResultListener.clear();
        mResultListener.clear();


        mDatagramReceiverUT.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
        testDatagramReceiver.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
        processAllMessages();
        processAllMessages();
        mInOrder.verify(mMockDatagramController)
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
@@ -191,11 +193,11 @@ public class DatagramReceiverTest extends TelephonyTest {
                eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
                eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(eq(false));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(eq(false));
        verifyNoMoreInteractions(mMockSatelliteModemInterface);
        verifyNoMoreInteractions(mMockSatelliteModemInterface);
        assertTrue(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
        assertTrue(testDatagramReceiver.isDatagramWaitForConnectedStateTimerStarted());


        doReturn(false).when(mMockDatagramController)
        doReturn(false).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
        mDatagramReceiverUT.onSatelliteModemStateChanged(
        testDatagramReceiver.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();
        processAllMessages();


@@ -208,20 +210,20 @@ public class DatagramReceiverTest extends TelephonyTest {
                .pollPendingSatelliteDatagrams(any(Message.class));
                .pollPendingSatelliteDatagrams(any(Message.class));
        assertEquals(1, mResultListener.size());
        assertEquals(1, mResultListener.size());
        assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
        assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
        assertFalse(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
        assertFalse(testDatagramReceiver.isDatagramWaitForConnectedStateTimerStarted());


        clearInvocations(mMockSatelliteModemInterface);
        clearInvocations(mMockSatelliteModemInterface);
        clearInvocations(mMockSessionMetricsStats);
        clearInvocations(mMockSessionMetricsStats);
        mResultListener.clear();
        mResultListener.clear();
        doReturn(true).when(mMockDatagramController)
        doReturn(true).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
        mDatagramReceiverUT.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
        testDatagramReceiver.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
        processAllMessages();
        processAllMessages();
        mInOrder.verify(mMockDatagramController)
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
                .needsWaitingForSatelliteConnected(eq(SatelliteManager.DATAGRAM_TYPE_UNKNOWN));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(eq(false));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(eq(false));
        verifyNoMoreInteractions(mMockSatelliteModemInterface);
        verifyNoMoreInteractions(mMockSatelliteModemInterface);
        assertTrue(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
        assertTrue(testDatagramReceiver.isDatagramWaitForConnectedStateTimerStarted());


        moveTimeForward(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        moveTimeForward(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        processAllMessages();
        processAllMessages();
@@ -238,7 +240,7 @@ public class DatagramReceiverTest extends TelephonyTest {
        assertThat(mResultListener.peek()).isEqualTo(
        assertThat(mResultListener.peek()).isEqualTo(
                SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
                SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
        verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram();
        verify(mMockSessionMetricsStats, times(1)).addCountOfFailedIncomingDatagram();
        assertFalse(mDatagramReceiverUT.isDatagramWaitForConnectedStateTimerStarted());
        assertFalse(testDatagramReceiver.isDatagramWaitForConnectedStateTimerStarted());


        mResultListener.clear();
        mResultListener.clear();
        mDatagramReceiverUT.onSatelliteModemStateChanged(
        mDatagramReceiverUT.onSatelliteModemStateChanged(
@@ -512,10 +514,10 @@ public class DatagramReceiverTest extends TelephonyTest {
                .isEqualTo(SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED);
                .isEqualTo(SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED);
    }
    }


    private static class TestDatagramReceiver extends DatagramReceiver {
    public static class TestDatagramReceiver extends DatagramReceiver {
        private long mLong =  SATELLITE_ALIGN_TIMEOUT;
        private long mLong =  SATELLITE_ALIGN_TIMEOUT;


        TestDatagramReceiver(@NonNull Context context, @NonNull Looper looper,
        public TestDatagramReceiver(@NonNull Context context, @NonNull Looper looper,
                @NonNull FeatureFlags featureFlags,
                @NonNull FeatureFlags featureFlags,
                @NonNull DatagramController datagramController) {
                @NonNull DatagramController datagramController) {
            super(context, looper, featureFlags, datagramController);
            super(context, looper, featureFlags, datagramController);
@@ -527,7 +529,7 @@ public class DatagramReceiverTest extends TelephonyTest {
        }
        }


        @Override
        @Override
        public void setDeviceAlignedWithSatellite(boolean isAligned) {
        protected void setDeviceAlignedWithSatellite(boolean isAligned) {
            super.setDeviceAlignedWithSatellite(isAligned);
            super.setDeviceAlignedWithSatellite(isAligned);
        }
        }


@@ -539,6 +541,11 @@ public class DatagramReceiverTest extends TelephonyTest {
        public void setDuration(long duration) {
        public void setDuration(long duration) {
            mLong = duration;
            mLong = duration;
        }
        }

        @Override
        protected boolean isDatagramWaitForConnectedStateTimerStarted() {
            return super.isDatagramWaitForConnectedStateTimerStarted();
        }
    }
    }


    private static class TestSatelliteDatagramCallback extends ISatelliteDatagramCallback.Stub {
    private static class TestSatelliteDatagramCallback extends ISatelliteDatagramCallback.Stub {