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

Commit 5fbed8e6 authored by Thomas Nguyen's avatar Thomas Nguyen Committed by Automerger Merge Worker
Browse files

Push keepAlive datagram to modem in NOT_CONNECTED state am: 0519c4b3

parents fbb1eee1 0519c4b3
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -17,11 +17,13 @@
package com.android.internal.telephony.satellite;

import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE;
import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_UNKNOWN;
import static android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_IDLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;

@@ -241,6 +243,10 @@ public class DatagramController {
                    + " datagramType: " + datagramType
                    + " datagramTransferState: " + datagramTransferState
                    + " sendPendingCount: " + sendPendingCount + " errorCode: " + errorCode);
            if (shouldSuppressDatagramTransferStateUpdate(datagramType)) {
                logd("Ignore the request to update send status");
                return;
            }

            mSendSubId = subId;
            mDatagramType = datagramType;
@@ -254,6 +260,20 @@ public class DatagramController {
        }
    }

    private boolean shouldSuppressDatagramTransferStateUpdate(
            @SatelliteManager.DatagramType int datagramType) {
        synchronized (mLock) {
            if (!SatelliteController.getInstance().isSatelliteAttachRequired()) {
                return false;
            }
            if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE
                    && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
                return true;
            }
            return false;
        }
    }

    /**
     * Update receive status to {@link PointingAppController}.
     *
@@ -334,10 +354,17 @@ public class DatagramController {
     * before transferring datagrams via satellite.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public boolean needsWaitingForSatelliteConnected() {
    public boolean needsWaitingForSatelliteConnected(
            @SatelliteManager.DatagramType int datagramType) {
        synchronized (mLock) {
            if (SatelliteController.getInstance().isSatelliteAttachRequired()
                    && mSatelltieModemState != SATELLITE_MODEM_STATE_CONNECTED
            if (!SatelliteController.getInstance().isSatelliteAttachRequired()) {
                return false;
            }
            if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE
                    && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
                return false;
            }
            if (mSatelltieModemState != SATELLITE_MODEM_STATE_CONNECTED
                    && mSatelltieModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) {
                return true;
            }
+7 −2
Original line number Diff line number Diff line
@@ -379,7 +379,7 @@ public class DatagramDispatcher extends Handler {
                mPendingNonEmergencyDatagramsMap.put(datagramId, datagramArgs);
            }

            if (mDatagramController.needsWaitingForSatelliteConnected()) {
            if (mDatagramController.needsWaitingForSatelliteConnected(datagramType)) {
                logd("sendDatagram: wait for satellite connected");
                mDatagramController.updateSendStatus(subId, datagramType,
                        SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT,
@@ -513,9 +513,14 @@ public class DatagramDispatcher extends Handler {
        }

        if ((pendingDatagram != null) && pendingDatagram.iterator().hasNext()) {
            mSendingDatagramInProgress = true;
            SendSatelliteDatagramArgument datagramArg =
                    pendingDatagram.iterator().next().getValue();
            if (mDatagramController.needsWaitingForSatelliteConnected(datagramArg.datagramType)) {
                logd("sendPendingDatagrams: wait for satellite connected");
                return;
            }

            mSendingDatagramInProgress = true;
            // Sets the trigger time for getting pending datagrams
            datagramArg.setDatagramStartTime();
            mDatagramController.updateSendStatus(datagramArg.subId, datagramArg.datagramType,
+2 −1
Original line number Diff line number Diff line
@@ -594,7 +594,8 @@ public class DatagramReceiver extends Handler {
            return;
        }

        if (mDatagramController.needsWaitingForSatelliteConnected()) {
        if (mDatagramController.needsWaitingForSatelliteConnected(
                SatelliteManager.DATAGRAM_TYPE_UNKNOWN)) {
            logd("pollPendingSatelliteDatagramsInternal: wait for satellite connected");
            synchronized (mLock) {
                mPendingPollSatelliteDatagramsRequest = new DatagramReceiverHandlerRequest(
+57 −0
Original line number Diff line number Diff line
@@ -31,10 +31,14 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import android.os.Looper;
import android.telephony.satellite.SatelliteDatagram;
import android.telephony.satellite.SatelliteManager;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

@@ -60,6 +64,7 @@ public class DatagramControllerTest extends TelephonyTest {
    @Mock private DatagramDispatcher mMockDatagramDispatcher;
    @Mock private PointingAppController mMockPointingAppController;
    @Mock private SatelliteSessionController mMockSatelliteSessionController;
    @Mock private SatelliteController mMockSatelliteController;

    private static final int SUB_ID = 0;

@@ -73,9 +78,12 @@ public class DatagramControllerTest extends TelephonyTest {
                mMockDatagramDispatcher);
        replaceInstance(DatagramReceiver.class, "sInstance", null,
                mMockDatagramReceiver);
        replaceInstance(SatelliteController.class, "sInstance", null,
                mMockSatelliteController);
        replaceInstance(SatelliteSessionController.class, "sInstance", null,
                mMockSatelliteSessionController);
        when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
        when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(true);
        mDatagramControllerUT = new DatagramController(
                mContext, Looper.myLooper(), mMockPointingAppController);

@@ -116,6 +124,55 @@ public class DatagramControllerTest extends TelephonyTest {
        testSetDeviceAlignedWithSatellite(false);
    }

    @Test
    public void testSuppressSendStatusUpdate() throws Exception {
        // Move to NOT_CONNECTED state
        mDatagramControllerUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);

        clearInvocations(mMockSatelliteSessionController);
        clearInvocations(mMockPointingAppController);
        clearInvocations(mMockDatagramReceiver);

        int sendPendingCount = 1;
        int errorCode = SATELLITE_RESULT_SUCCESS;
        mDatagramControllerUT.updateSendStatus(SUB_ID, DATAGRAM_TYPE_KEEP_ALIVE,
                SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING, sendPendingCount, errorCode);
        verifyZeroInteractions(mMockSatelliteSessionController);
        verifyZeroInteractions(mMockPointingAppController);
        verifyZeroInteractions(mMockDatagramReceiver);
    }

    @Test
    public void testNeedsWaitingForSatelliteConnected() throws Exception {
        when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(false);
        assertFalse(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_KEEP_ALIVE));

        when(mMockSatelliteController.isSatelliteAttachRequired()).thenReturn(true);
        mDatagramControllerUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_NOT_CONNECTED);
        assertFalse(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_KEEP_ALIVE));
        assertTrue(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_SOS_MESSAGE));

        mDatagramControllerUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        assertFalse(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_SOS_MESSAGE));

        mDatagramControllerUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING);
        assertFalse(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_SOS_MESSAGE));

        mDatagramControllerUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_IDLE);
        assertTrue(mDatagramControllerUT
                .needsWaitingForSatelliteConnected(DATAGRAM_TYPE_SOS_MESSAGE));
    }

    private void testUpdateSendStatus(boolean isDemoMode, int datagramType, int sendState) {
        mDatagramControllerUT.setDemoMode(isDemoMode);
        clearAllInvocations();
+22 −9
Original line number Diff line number Diff line
@@ -176,7 +176,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
        }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
                anyBoolean(), anyBoolean(), any(Message.class));
        doReturn(true).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected();
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        when(mMockDatagramController.getDatagramWaitTimeForConnectedState())
                .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        mResultListener.clear();
@@ -184,7 +184,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mResultListener::offer);
        processAllMessages();
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController).updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1),
                eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT), eq(1),
                eq(SATELLITE_RESULT_SUCCESS));
@@ -192,11 +193,15 @@ public class DatagramDispatcherTest extends TelephonyTest {
        verifyZeroInteractions(mMockSatelliteModemInterface);
        assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());

        doReturn(false).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mDatagramDispatcherUT.onSatelliteModemStateChanged(
                SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        processAllMessages();

        mInOrder.verify(mMockDatagramController).isPollingInIdleState();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
@@ -224,11 +229,14 @@ public class DatagramDispatcherTest extends TelephonyTest {
        clearInvocations(mMockSatelliteModemInterface);
        clearInvocations(mMockDatagramController);
        mResultListener.clear();
        doReturn(true).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mResultListener::offer);
        processAllMessages();
        verifyZeroInteractions(mMockSatelliteModemInterface);
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState();
        assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());

@@ -265,7 +273,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
                true, mResultListener::offer);
        processAllMessages();
        verifyZeroInteractions(mMockSatelliteModemInterface);
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState();
        assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
        assertEquals(0, mResultListener.size());
@@ -299,7 +308,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
        }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
                anyBoolean(), anyBoolean(), any(Message.class));
        doReturn(false).when(mMockDatagramController)
                .needsWaitingForSatelliteConnected();
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        when(mMockDatagramController.getDatagramWaitTimeForConnectedState())
                .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS);
        mContextFixture.putIntResource(
@@ -310,7 +319,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mResultListener::offer);
        processAllMessages();
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController).isPollingInIdleState();
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1),
@@ -340,7 +350,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mResultListener::offer);
        processAllMessages();
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController).isPollingInIdleState();
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1),
@@ -381,7 +392,8 @@ public class DatagramDispatcherTest extends TelephonyTest {

        processAllMessages();

        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE2));
        mInOrder.verify(mMockDatagramController).isPollingInIdleState();
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE2),
@@ -534,7 +546,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
                true, mResultListener::offer);
        processAllMessages();
        // As modem is busy receiving datagrams, sending datagram did not proceed further.
        mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
        mInOrder.verify(mMockDatagramController)
                .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1));
        mInOrder.verify(mMockDatagramController, times(2)).isPollingInIdleState();
        verifyNoMoreInteractions(mMockDatagramController);
    }
Loading