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

Commit 96f23a6d authored by Aishwarya Mallampati's avatar Aishwarya Mallampati
Browse files

Send request immediately to handler.

The following methods are updated in this cl:
- pollPendingSatelliteDatagrams
- onSatelliteModemStateChanged
- setDeviceAlignedWithSatellite

Bug: 409610450
Test: atest
Flag: com.android.internal.telephony.flags.satellite_improve_multi_thread_design
Change-Id: Id22c94857e2b7f3b7b20ea852d14df62239f5db5
parent b11284fc
Loading
Loading
Loading
Loading
+81 −2
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.util.Pair;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IVoidConsumer;
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_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 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. */
    private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key";
@@ -498,6 +502,43 @@ public class DatagramReceiver extends Handler {
                handleEventDatagramWaitForConnectedStateTimedOut();
                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:
                plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                break;
@@ -570,6 +611,20 @@ public class DatagramReceiver extends Handler {
     * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
     */
    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()) {
            // Poll request should be sent to satellite modem only when it is free.
            plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
@@ -658,6 +713,19 @@ public class DatagramReceiver extends Handler {
     * @param state Current satellite modem 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) {
            if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
                    || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
@@ -775,7 +843,18 @@ public class DatagramReceiver extends Handler {
    }

    @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) {
            mIsAligned.set(isAligned);
            plogd("setDeviceAlignedWithSatellite: " + isAligned);
@@ -849,7 +928,7 @@ public class DatagramReceiver extends Handler {
    }

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

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

    private TestDatagramController mDatagramControllerUT;

    @Mock private DatagramReceiver mMockDatagramReceiver;
    @Mock private DatagramReceiverTest.TestDatagramReceiver mMockDatagramReceiver;
    @Mock private DatagramDispatcher mMockDatagramDispatcher;
    @Mock private PointingAppController mMockPointingAppController;
    @Mock private SatelliteSessionController mMockSatelliteSessionController;
+18 −11
Original line number Diff line number Diff line
@@ -166,11 +166,13 @@ public class DatagramReceiverTest extends TelephonyTest {
    @Test
    public void testPollPendingSatelliteDatagrams_usingSatelliteModemInterface_success()
            throws Exception {
        TestDatagramReceiver testDatagramReceiver = new TestDatagramReceiver(mContext,
                Looper.myLooper(), mFeatureFlags, mMockDatagramController);
        doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
        doAnswer(invocation -> {
            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))
                    .sendToTarget();
            return null;
@@ -181,7 +183,7 @@ public class DatagramReceiverTest extends TelephonyTest {
                .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        mResultListener.clear();

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

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

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

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

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

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

    private static class TestDatagramReceiver extends DatagramReceiver {
    public static class TestDatagramReceiver extends DatagramReceiver {
        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 DatagramController datagramController) {
            super(context, looper, featureFlags, datagramController);
@@ -527,7 +529,7 @@ public class DatagramReceiverTest extends TelephonyTest {
        }

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

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

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

    private static class TestSatelliteDatagramCallback extends ISatelliteDatagramCallback.Stub {