Loading src/java/com/android/internal/telephony/satellite/DatagramController.java +43 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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. Loading @@ -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); } Loading Loading @@ -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) { Loading src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +13 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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. Loading src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +45 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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. Loading Loading @@ -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. */ Loading src/java/com/android/internal/telephony/satellite/SatelliteController.java +1 −0 Original line number Diff line number Diff line Loading @@ -457,6 +457,7 @@ public class SatelliteController extends Handler { checkAndEnableBluetoothWifiState(); } mIsDemoModeEnabled = argument.enableDemoMode; mDatagramController.setDemoMode(mIsDemoModeEnabled); updateSatelliteEnabledState( argument.enableSatellite, "EVENT_SET_SATELLITE_ENABLED_DONE"); } Loading tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java +97 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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, Loading @@ -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()); Loading @@ -95,6 +103,7 @@ public class DatagramDispatcherTest extends TelephonyTest { logd(TAG + " tearDown"); mDatagramDispatcherUT.destroy(); mDatagramDispatcherUT = null; mTestDemoModeDatagramDispatcher = null; mResultListener = null; mDatagram = null; mInOrder = null; Loading Loading @@ -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
src/java/com/android/internal/telephony/satellite/DatagramController.java +43 −1 Original line number Diff line number Diff line Loading @@ -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; /** Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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. Loading @@ -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); } Loading Loading @@ -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) { Loading
src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +13 −1 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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; Loading Loading @@ -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. Loading
src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +45 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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; Loading Loading @@ -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, Loading Loading @@ -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, Loading Loading @@ -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. Loading Loading @@ -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. */ Loading
src/java/com/android/internal/telephony/satellite/SatelliteController.java +1 −0 Original line number Diff line number Diff line Loading @@ -457,6 +457,7 @@ public class SatelliteController extends Handler { checkAndEnableBluetoothWifiState(); } mIsDemoModeEnabled = argument.enableDemoMode; mDatagramController.setDemoMode(mIsDemoModeEnabled); updateSatelliteEnabledState( argument.enableSatellite, "EVENT_SET_SATELLITE_ENABLED_DONE"); } Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java +97 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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, Loading @@ -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()); Loading @@ -95,6 +103,7 @@ public class DatagramDispatcherTest extends TelephonyTest { logd(TAG + " tearDown"); mDatagramDispatcherUT.destroy(); mDatagramDispatcherUT = null; mTestDemoModeDatagramDispatcher = null; mResultListener = null; mDatagram = null; mInOrder = null; Loading Loading @@ -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); } } }