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

Commit 98dea6c7 authored by Sooraj Sasindran's avatar Sooraj Sasindran Committed by Android (Google) Code Review
Browse files

Merge "Add triggering pollPendingSatelliteDatagrams after successfully sending...

Merge "Add triggering pollPendingSatelliteDatagrams after successfully sending a callback back to sendSatelliteDatagram." into 24D1-dev
parents 4752d6c6 c0b685dc
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
@@ -3213,6 +3213,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