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

Commit 3253385a authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Satellite demo mode : check message handling" into udc-dev am: a70f7264

parents 208065d4 a70f7264
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@ import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.SatelliteDatagram;
import android.telephony.satellite.SatelliteManager;

import com.android.internal.annotations.VisibleForTesting;

import java.util.function.Consumer;

/**
@@ -53,6 +55,8 @@ public class DatagramController {
            SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_UNKNOWN;
    private int mReceivePendingCount = 0;
    private int mReceiveErrorCode = SatelliteManager.SATELLITE_ERROR_NONE;
    private SatelliteDatagram mDemoModeDatagram;
    private boolean mIsDemoMode = false;

    /**
     * @return The singleton instance of DatagramController.
@@ -88,7 +92,8 @@ public class DatagramController {
     * @param pointingAppController PointingAppController is used to update PointingApp
     *                              about datagram transfer state changes.
     */
    private DatagramController(@NonNull Context context, @NonNull Looper  looper,
    @VisibleForTesting
    protected DatagramController(@NonNull Context context, @NonNull Looper  looper,
            @NonNull PointingAppController pointingAppController) {
        mContext = context;
        mPointingAppController = pointingAppController;
@@ -150,6 +155,9 @@ public class DatagramController {
     * input to this method. Datagram received here will be passed down to modem without any
     * encoding or encryption.
     *
     * When demo mode is on, save the sent datagram and this datagram will be used as a received
     * datagram.
     *
     * @param subId The subId of the subscription to send satellite datagrams for.
     * @param datagramType datagram type indicating whether the datagram is of type
     *                     SOS_SMS or LOCATION_SHARING.
@@ -162,6 +170,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);
        mDatagramDispatcher.sendSatelliteDatagram(subId, datagramType, datagram,
                needFullScreenPointingUI, callback);
    }
@@ -252,6 +261,39 @@ public class DatagramController {
                SatelliteManager.SATELLITE_ERROR_NONE);
    }

    /**
     * Set variables for {@link DatagramDispatcher} and {@link DatagramReceiver} to run demo mode
     * @param isDemoMode {@code true} means demo mode is on, {@code false} otherwise.
     */
    void setDemoMode(boolean isDemoMode) {
        mIsDemoMode = isDemoMode;
        mDatagramDispatcher.setDemoMode(isDemoMode);
        mDatagramReceiver.setDemoMode(isDemoMode);

        if (!isDemoMode) {
            mDemoModeDatagram = null;
        }
    }

    /** Get the last sent datagram for demo mode */
    @VisibleForTesting
    public SatelliteDatagram getDemoModeDatagram() {
        return mDemoModeDatagram;
    }

    /**
     * Set last sent datagram for demo mode
     * @param datagramType datagram type, only DATAGRAM_TYPE_SOS_MESSAGE will be saved
     * @param datagram datagram The last datagram saved when sendSatelliteDatagramForDemo is called
     */
    @VisibleForTesting
    protected void setDemoModeDatagram(@SatelliteManager.DatagramType int datagramType,
            SatelliteDatagram datagram) {
        if (mIsDemoMode &&  datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE) {
            mDemoModeDatagram = datagram;
        }
    }

    private void notifyDatagramTransferStateChangedToSessionController() {
        SatelliteSessionController sessionController = SatelliteSessionController.getInstance();
        if (sessionController == null) {
+13 −1
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ public class DatagramDispatcher extends Handler {
    @NonNull private final DatagramController mDatagramController;
    @NonNull private final ControllerMetricsStats mControllerMetricsStats;

    private boolean mIsDemoMode = false;

    private static AtomicLong mNextDatagramId = new AtomicLong(0);

    private final Object mLock = new Object();
@@ -101,7 +103,8 @@ public class DatagramDispatcher extends Handler {
     * @param looper The looper for the handler.
     * @param datagramController DatagramController which is used to update datagram transfer state.
     */
    private DatagramDispatcher(@NonNull Context context, @NonNull Looper looper,
    @VisibleForTesting
    protected DatagramDispatcher(@NonNull Context context, @NonNull Looper looper,
            @NonNull DatagramController datagramController) {
        super(looper);
        mContext = context;
@@ -337,6 +340,15 @@ public class DatagramDispatcher extends Handler {
        }
    }

    /** Set demo mode
     *
     * @param isDemoMode {@code true} means demo mode is on, {@code false} otherwise.
     */
    @VisibleForTesting
    protected void setDemoMode(boolean isDemoMode) {
        mIsDemoMode = isDemoMode;
    }

    /**
     * Send pending satellite datagrams. Emergency datagrams are given priority over
     * non-emergency datagrams.
+45 −8
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.database.SQLException;
import android.net.Uri;
import android.os.AsyncResult;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
@@ -74,9 +73,10 @@ public class DatagramReceiver extends Handler {
    @NonNull private SharedPreferences mSharedPreferences = null;
    @NonNull private final DatagramController mDatagramController;
    @NonNull private final ControllerMetricsStats mControllerMetricsStats;
    @NonNull private final Looper mLooper;

    private long mDatagramTransferStartTime = 0;
    @NonNull private final Looper mLooper;
    private boolean mIsDemoMode = false;

    /**
     * Map key: subId, value: SatelliteDatagramListenerHandler to notify registrants.
@@ -116,7 +116,8 @@ public class DatagramReceiver extends Handler {
     * @param looper The looper for the handler.
     * @param datagramController DatagramController which is used to update datagram transfer state.
     */
    private DatagramReceiver(@NonNull Context context, @NonNull Looper looper,
    @VisibleForTesting
    protected DatagramReceiver(@NonNull Context context, @NonNull Looper looper,
            @NonNull DatagramController datagramController) {
        super(looper);
        mContext = context;
@@ -328,7 +329,7 @@ public class DatagramReceiver extends Handler {
                    if (pendingCount == 0 && satelliteDatagram == null) {
                        sInstance.mDatagramController.updateReceiveStatus(mSubId,
                                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_NONE,
                                0, SatelliteManager.SATELLITE_ERROR_NONE);
                                pendingCount, SatelliteManager.SATELLITE_ERROR_NONE);
                    } else if (satelliteDatagram != null) {
                        sInstance.mDatagramController.updateReceiveStatus(mSubId,
                                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_SUCCESS,
@@ -453,8 +454,26 @@ public class DatagramReceiver extends Handler {
                request = (DatagramReceiverHandlerRequest) ar.userObj;
                int error = SatelliteServiceUtils.getSatelliteError(ar,
                        "pollPendingSatelliteDatagrams");
                logd("EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE error: " + error);

                if (mIsDemoMode && error == SatelliteManager.SATELLITE_ERROR_NONE) {
                    SatelliteDatagram datagram = mDatagramController.getDemoModeDatagram();
                    final int validSubId = SatelliteServiceUtils.getValidSatelliteSubId(
                            request.subId, mContext);
                    SatelliteDatagramListenerHandler listenerHandler =
                            mSatelliteDatagramListenerHandlers.get(validSubId);
                    if (listenerHandler != null) {
                        Pair<SatelliteDatagram, Integer> pair = new Pair<>(datagram, 0);
                        ar = new AsyncResult(null, pair, null);
                        Message message = listenerHandler.obtainMessage(
                                SatelliteDatagramListenerHandler.EVENT_SATELLITE_DATAGRAM_RECEIVED,
                                ar);
                        listenerHandler.sendMessage(message);
                    } else {
                        error = SatelliteManager.SATELLITE_INVALID_TELEPHONY_STATE;
                    }
                }

                logd("EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE error: " + error);
                if (error != SatelliteManager.SATELLITE_ERROR_NONE) {
                    mDatagramController.updateReceiveStatus(request.subId,
                            SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED,
@@ -561,8 +580,17 @@ public class DatagramReceiver extends Handler {

        mDatagramTransferStartTime = System.currentTimeMillis();
        Phone phone = SatelliteServiceUtils.getPhone();

        if (mIsDemoMode) {
            DatagramReceiverHandlerRequest request = new DatagramReceiverHandlerRequest(
                    callback, phone, subId);
            AsyncResult ar = new AsyncResult(request, SatelliteManager.SATELLITE_ERROR_NONE, null);
            Message msg = this.obtainMessage(EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE, ar);
            msg.sendToTarget();
        } else {
            sendRequestAsync(CMD_POLL_PENDING_SATELLITE_DATAGRAMS, callback, phone, subId);
        }
    }

    /**
     * Posts the specified command to be executed on the main thread and returns immediately.
@@ -605,6 +633,15 @@ public class DatagramReceiver extends Handler {
                        .build());
    }

    /** Set demo mode
     *
     * @param isDemoMode {@code true} means demo mode is on, {@code false} otherwise.
     */
    @VisibleForTesting
    protected void setDemoMode(boolean isDemoMode) {
        mIsDemoMode = isDemoMode;
    }

    /**
     * Destroys this DatagramDispatcher. Used for tearing down static resources during testing.
     */
+1 −0
Original line number Diff line number Diff line
@@ -457,6 +457,7 @@ public class SatelliteController extends Handler {
                        checkAndEnableBluetoothWifiState();
                    }
                    mIsDemoModeEnabled = argument.enableDemoMode;
                    mDatagramController.setDemoMode(mIsDemoModeEnabled);
                    updateSatelliteEnabledState(
                            argument.enableSatellite, "EVENT_SET_SATELLITE_ENABLED_DONE");
                }
+97 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verifyNoMoreInteractions;

import android.annotation.NonNull;
import android.content.Context;
import android.os.AsyncResult;
import android.os.Looper;
import android.os.Message;
@@ -59,8 +61,10 @@ public class DatagramDispatcherTest extends TelephonyTest {
    private static final String TEST_MESSAGE = "This is a test datagram message";

    private DatagramDispatcher mDatagramDispatcherUT;
    private TestDatagramDispatcher mTestDemoModeDatagramDispatcher;

    @Mock private DatagramController mMockDatagramController;
    @Mock private DatagramReceiver mMockDatagramReceiver;
    @Mock private SatelliteModemInterface mMockSatelliteModemInterface;
    @Mock private ControllerMetricsStats mMockControllerMetricsStats;

@@ -77,6 +81,8 @@ public class DatagramDispatcherTest extends TelephonyTest {

        replaceInstance(DatagramController.class, "sInstance", null,
                mMockDatagramController);
        replaceInstance(DatagramReceiver.class, "sInstance", null,
                mMockDatagramReceiver);
        replaceInstance(SatelliteModemInterface.class, "sInstance", null,
                mMockSatelliteModemInterface);
        replaceInstance(ControllerMetricsStats.class, "sInstance", null,
@@ -84,6 +90,8 @@ public class DatagramDispatcherTest extends TelephonyTest {

        mDatagramDispatcherUT = DatagramDispatcher.make(mContext, Looper.myLooper(),
                mMockDatagramController);
        mTestDemoModeDatagramDispatcher = new TestDatagramDispatcher(mContext, Looper.myLooper(),
                mMockDatagramController);

        mResultListener = new LinkedBlockingQueue<>(1);
        mDatagram = new SatelliteDatagram(TEST_MESSAGE.getBytes());
@@ -95,6 +103,7 @@ public class DatagramDispatcherTest extends TelephonyTest {
        logd(TAG + " tearDown");
        mDatagramDispatcherUT.destroy();
        mDatagramDispatcherUT = null;
        mTestDemoModeDatagramDispatcher = null;
        mResultListener = null;
        mDatagram = null;
        mInOrder = null;
@@ -274,4 +283,92 @@ public class DatagramDispatcherTest extends TelephonyTest {

        assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_SERVICE_ERROR);
    }

    @Test
    public void testSendSatelliteDatagram_DemoMode_data_type_sos_message() throws Exception {
        mTestDemoModeDatagramDispatcher.setDemoMode(true);
        doReturn(false).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
        replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone});
        doAnswer(invocation -> {
            Message message = (Message) invocation.getArguments()[0];

            mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
                            new AsyncResult(message.obj, null, null))
                    .sendToTarget();
            return null;
        }).when(mPhone).sendSatelliteDatagram(any(Message.class), any(SatelliteDatagram.class),
                anyBoolean());

        mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
                true, mResultListener::offer);

        processAllMessages();

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));
        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));
        assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_ERROR_NONE);
        mTestDemoModeDatagramDispatcher.setDemoMode(false);
    }

    @Test
    public void testSendSatelliteDatagram_DemoMode_data_type_location_sharing() throws Exception {
        mTestDemoModeDatagramDispatcher.setDemoMode(true);
        doReturn(false).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
        replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone});
        doAnswer(invocation -> {
            Message message = (Message) invocation.getArguments()[0];

            mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
                            new AsyncResult(message.obj, null, null))
                    .sendToTarget();
            return null;
        }).when(mPhone).sendSatelliteDatagram(any(Message.class), any(SatelliteDatagram.class),
                anyBoolean());

        mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE2, mDatagram,
                true, mResultListener::offer);

        processAllMessages();

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));

        assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_ERROR_NONE);

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));

        mInOrder.verify(mMockDatagramController)
                .updateSendStatus(eq(SUB_ID),
                        eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
                        eq(SatelliteManager.SATELLITE_ERROR_NONE));

        mTestDemoModeDatagramDispatcher.setDemoMode(false);
    }

    private static class TestDatagramDispatcher extends DatagramDispatcher {
        TestDatagramDispatcher(@NonNull Context context, @NonNull Looper looper,
                @NonNull DatagramController datagramController) {
            super(context, looper, datagramController);
        }

        @Override
        protected void setDemoMode(boolean isDemoMode) {
            super.setDemoMode(isDemoMode);
        }
    }
}
Loading