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

Commit fb9fa4b8 authored by Hyosun Kim's avatar Hyosun Kim
Browse files

Add triggering pollPendingSatelliteDatagrams after successfully sending a...

Add triggering pollPendingSatelliteDatagrams after successfully sending a callback back to sendSatelliteDatagram.

Bug: 329033411
Test: manual - test satellite demo mode on the device
Test: atest SatelliteManagerTestOnMockService
Test: atest DatagramDispatcherTest

Change-Id: Ia16b66ba811cd2d2f0c030ac8020475e2533c155
parent 3648a76f
Loading
Loading
Loading
Loading
+30 −9
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

@@ -59,6 +61,8 @@ public class DatagramController {
    public static final int TIMEOUT_TYPE_DATAGRAM_WAIT_FOR_CONNECTED_STATE = 2;
    /** This type is used by CTS to override the time to wait for response of the send request */
    public static final int TIMEOUT_TYPE_WAIT_FOR_DATAGRAM_SENDING_RESPONSE = 3;
    /** This type is used by CTS to override the time to datagram delay in demo mode */
    public static final int TIMEOUT_TYPE_DATAGRAM_DELAY_IN_DEMO_MODE = 4;
    private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem";
    private static final boolean DEBUG = !"user".equals(Build.TYPE);

@@ -83,8 +87,8 @@ public class DatagramController {
    private int mReceivePendingCount = 0;
    @GuardedBy("mLock")
    private int mReceiveErrorCode = SatelliteManager.SATELLITE_RESULT_SUCCESS;

    private SatelliteDatagram mDemoModeDatagram;
    @GuardedBy("mLock")
    private final List<SatelliteDatagram> mDemoModeDatagramList;
    private boolean mIsDemoMode = false;
    private long mAlignTimeoutDuration = SATELLITE_ALIGN_TIMEOUT;
    private long mDatagramWaitTimeForConnectedState;
@@ -143,6 +147,7 @@ public class DatagramController {

        mDatagramWaitTimeForConnectedState = getDatagramWaitForConnectedStateTimeoutMillis();
        mModemImageSwitchingDuration = getSatelliteModemImageSwitchingDurationMillis();
        mDemoModeDatagramList = new ArrayList<>();
    }

    /**
@@ -208,7 +213,7 @@ public class DatagramController {
    public void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType,
            @NonNull SatelliteDatagram datagram, boolean needFullScreenPointingUI,
            @NonNull Consumer<Integer> callback) {
        setDemoModeDatagram(datagramType, datagram);
        pushDemoModeDatagram(datagramType, datagram);
        mDatagramDispatcher.sendSatelliteDatagram(subId, datagramType, datagram,
                needFullScreenPointingUI, callback);
    }
@@ -349,14 +354,25 @@ public class DatagramController {
        mDatagramReceiver.setDemoMode(isDemoMode);

        if (!isDemoMode) {
            mDemoModeDatagram = null;
            synchronized (mLock) {
                mDemoModeDatagramList.clear();
            }
            setDeviceAlignedWithSatellite(false);
        }
        logd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
    }

    /** Get the last sent datagram for demo mode */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public SatelliteDatagram getDemoModeDatagram() {
        return mDemoModeDatagram;
    public SatelliteDatagram popDemoModeDatagram() {
        if (!mIsDemoMode) {
            return null;
        }

        synchronized (mLock) {
            logd("popDemoModeDatagram");
            return mDemoModeDatagramList.size() > 0 ? mDemoModeDatagramList.remove(0) : null;
        }
    }

    /**
@@ -365,10 +381,13 @@ public class DatagramController {
     * @param datagram datagram The last datagram saved when sendSatelliteDatagramForDemo is called
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected void setDemoModeDatagram(@SatelliteManager.DatagramType int datagramType,
    protected void pushDemoModeDatagram(@SatelliteManager.DatagramType int datagramType,
            SatelliteDatagram datagram) {
        if (mIsDemoMode && datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE) {
            mDemoModeDatagram = datagram;
            synchronized (mLock) {
                mDemoModeDatagramList.add(datagram);
                logd("pushDemoModeDatagram size=" + mDemoModeDatagramList.size());
            }
        }
    }

@@ -419,6 +438,8 @@ public class DatagramController {
            }
        } else if (timeoutType == TIMEOUT_TYPE_WAIT_FOR_DATAGRAM_SENDING_RESPONSE) {
            mDatagramDispatcher.setWaitTimeForDatagramSendingResponse(reset, timeoutMillis);
        } else if (timeoutType == TIMEOUT_TYPE_DATAGRAM_DELAY_IN_DEMO_MODE) {
            mDatagramDispatcher.setTimeoutDatagramDelayInDemoMode(reset, timeoutMillis);
        } else {
            loge("Invalid timeout type " + timeoutType);
            return false;
+61 −9
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.internal.telephony.satellite.metrics.ControllerMetricsStats;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
@@ -61,7 +62,8 @@ public class DatagramDispatcher extends Handler {
    private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4;
    private static final int EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT = 5;
    private static final int EVENT_ABORT_SENDING_SATELLITE_DATAGRAMS_DONE = 6;

    private static final int CMD_POLL_PENDING_SATELLITE_DATAGRAMS = 7;
    private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);
    @NonNull private static DatagramDispatcher sInstance;
    @NonNull private final Context mContext;
    @NonNull private final DatagramController mDatagramController;
@@ -76,6 +78,7 @@ public class DatagramDispatcher extends Handler {
    private AtomicBoolean mShouldSendDatagramToModemInDemoMode = null;

    private final Object mLock = new Object();
    private long mDemoTimeoutDuration = TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE;

    @GuardedBy("mLock")
    private boolean mSendingDatagramInProgress;
@@ -196,7 +199,9 @@ public class DatagramDispatcher extends Handler {

        switch(msg.what) {
            case CMD_SEND_SATELLITE_DATAGRAM: {
                logd("CMD_SEND_SATELLITE_DATAGRAM");
                logd("CMD_SEND_SATELLITE_DATAGRAM mIsDemoMode=" + mIsDemoMode
                        + ", shouldSendDatagramToModemInDemoMode="
                        + shouldSendDatagramToModemInDemoMode());
                request = (DatagramDispatcherHandlerRequest) msg.obj;
                SendSatelliteDatagramArgument argument =
                        (SendSatelliteDatagramArgument) request.argument;
@@ -205,7 +210,7 @@ public class DatagramDispatcher extends Handler {
                synchronized (mLock) {
                    if (mIsDemoMode && !shouldSendDatagramToModemInDemoMode()) {
                        AsyncResult.forMessage(onCompleted, SATELLITE_RESULT_SUCCESS, null);
                        onCompleted.sendToTarget();
                        sendMessageDelayed(onCompleted, getDemoTimeoutDuration());
                    } else {
                        SatelliteModemInterface.getInstance().sendSatelliteDatagram(
                                argument.datagram,
@@ -266,7 +271,11 @@ public class DatagramDispatcher extends Handler {
                                getPendingDatagramCount(), error);
                        mControllerMetricsStats.reportOutgoingDatagramSuccessCount(
                                argument.datagramType);

                        if (mIsDemoMode) {
                            sendMessageDelayed(
                                    obtainMessage(CMD_POLL_PENDING_SATELLITE_DATAGRAMS, request),
                                    getDemoTimeoutDuration());
                        }
                        if (getPendingDatagramCount() > 0) {
                            // Send response for current datagram
                            argument.callback.accept(error);
@@ -314,6 +323,15 @@ public class DatagramDispatcher extends Handler {
                handleEventDatagramWaitForConnectedStateTimedOut();
                break;

            case CMD_POLL_PENDING_SATELLITE_DATAGRAMS:
                if (mIsDemoMode) {
                    request = (DatagramDispatcherHandlerRequest) msg.obj;
                    SendSatelliteDatagramArgument argument =
                            (SendSatelliteDatagramArgument) request.argument;
                    pollPendingSatelliteDatagrams(argument.subId);
                }
                break;

            default:
                logw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                break;
@@ -392,15 +410,15 @@ public class DatagramDispatcher extends Handler {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void setDemoMode(boolean isDemoMode) {
        mIsDemoMode = isDemoMode;
        logd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void setDeviceAlignedWithSatellite(boolean isAligned) {
        if (mIsDemoMode) {
        synchronized (mLock) {
            mIsAligned = isAligned;
                if (isAligned) handleEventSatelliteAligned();
            }
            logd("setDeviceAlignedWithSatellite: " + mIsAligned);
            if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
        }
    }

@@ -435,12 +453,15 @@ public class DatagramDispatcher extends Handler {
                mSendSatelliteDatagramRequest = null;
                AsyncResult.forMessage(message, null, null);
                message.sendToTarget();
                logd("handleEventSatelliteAligned: EVENT_SEND_SATELLITE_DATAGRAM_DONE");
            }
        }
    }

    private void handleEventSatelliteAlignedTimeout(
            @NonNull DatagramDispatcherHandlerRequest request) {
        logd("handleEventSatelliteAlignedTimeout");
        mSendSatelliteDatagramRequest = null;
        SatelliteManager.SatelliteException exception =
                new SatelliteManager.SatelliteException(
                        SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
@@ -608,6 +629,7 @@ public class DatagramDispatcher extends Handler {

    @GuardedBy("mLock")
    private void cleanUpResources() {
        logd("cleanUpResources");
        mSendingDatagramInProgress = false;
        if (getPendingDatagramCount() > 0) {
            mDatagramController.updateSendStatus(
@@ -789,6 +811,36 @@ public class DatagramDispatcher extends Handler {
        }
    }

    private void pollPendingSatelliteDatagrams(int subId) {
        logd("pollPendingSatelliteDatagrams");
        Consumer<Integer> internalCallback = new Consumer<Integer>() {
            @Override
            public void accept(Integer result) {
                logd("pollPendingSatelliteDatagrams result: " + result);
            }
        };
        mDatagramController.pollPendingSatelliteDatagrams(subId, internalCallback);
    }

    long getDemoTimeoutDuration() {
        return mDemoTimeoutDuration;
    }

    /**
     * This API is used by CTS tests to override the mDemoTimeoutDuration.
     */
    void setTimeoutDatagramDelayInDemoMode(boolean reset, long timeoutMillis) {
        if (!mIsDemoMode) {
            return;
        }
        if (reset) {
            mDemoTimeoutDuration = TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE;
        } else {
            mDemoTimeoutDuration = timeoutMillis;
        }
        logd("setTimeoutDatagramDelayInDemoMode " + mDemoTimeoutDuration + " reset=" + reset);
    }

    private static void logd(@NonNull String log) {
        Rlog.d(TAG, log);
    }
+5 −6
Original line number Diff line number Diff line
@@ -439,7 +439,7 @@ public class DatagramReceiver extends Handler {
                        "pollPendingSatelliteDatagrams");

                if (mIsDemoMode && error == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
                    SatelliteDatagram datagram = mDatagramController.getDemoModeDatagram();
                    SatelliteDatagram datagram = mDatagramController.popDemoModeDatagram();
                    final int validSubId = SatelliteServiceUtils.getValidSatelliteSubId(
                            request.subId, mContext);
                    SatelliteDatagramListenerHandler listenerHandler =
@@ -744,11 +744,10 @@ public class DatagramReceiver extends Handler {

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void setDeviceAlignedWithSatellite(boolean isAligned) {
        if (mIsDemoMode) {
        synchronized (mLock) {
            mIsAligned = isAligned;
                if (isAligned) handleEventSatelliteAligned();
            }
            logd("setDeviceAlignedWithSatellite: " + mIsAligned);
            if (isAligned && mIsDemoMode) handleEventSatelliteAligned();
        }
    }

+1 −0
Original line number Diff line number Diff line
@@ -3219,6 +3219,7 @@ public class SatelliteController extends Handler {
    private void setDemoModeEnabled(boolean enabled) {
        mIsDemoModeEnabled = enabled;
        mDatagramController.setDemoMode(mIsDemoModeEnabled);
        logd("setDemoModeEnabled: mIsDemoModeEnabled=" + mIsDemoModeEnabled);
    }

    private boolean isMockModemAllowed() {
+15 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
            (int) TimeUnit.SECONDS.toMillis(180);
    private static final long TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS =
            TimeUnit.SECONDS.toMillis(60);
    private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);

    private DatagramDispatcher mDatagramDispatcherUT;
    private TestDatagramDispatcher mTestDemoModeDatagramDispatcher;
@@ -409,6 +410,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
                true, mResultListener::offer);

        processAllMessages();
        moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
        processAllMessages();

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
@@ -484,6 +487,8 @@ public class DatagramDispatcherTest extends TelephonyTest {
                true, mResultListener::offer);

        processAllMessages();
        moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
        processAllMessages();

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
@@ -597,6 +602,11 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mIntegerConsumer);
        processAllMessages();
        moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
        processAllMessages();

        verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());

        waitForIntegerConsumerResult(1);
        assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS,
                (int) mIntegerConsumerResult.get(0));
@@ -609,6 +619,11 @@ public class DatagramDispatcherTest extends TelephonyTest {
        mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mIntegerConsumer);
        processAllMessages();
        moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
        processAllMessages();

        verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any());

        waitForIntegerConsumerResult(1);
        assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS,
                (int) mIntegerConsumerResult.get(0));
Loading