Loading src/java/com/android/internal/telephony/satellite/DatagramController.java +15 −3 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ public class DatagramController { private long mDatagramWaitTimeForConnectedState; private long mModemImageSwitchingDuration; private boolean mWaitForDeviceAlignmentInDemoDatagram; private long mDatagramWaitTimeForConnectedStateForLastMessage; @GuardedBy("mLock") @SatelliteManager.SatelliteModemState private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN; Loading Loading @@ -161,6 +162,8 @@ public class DatagramController { mModemImageSwitchingDuration = getSatelliteModemImageSwitchingDurationMillis(); mWaitForDeviceAlignmentInDemoDatagram = getWaitForDeviceAlignmentInDemoDatagramFromResources(); mDatagramWaitTimeForConnectedStateForLastMessage = getDatagramWaitForConnectedStateForLastMessageTimeoutMillis(); mDemoModeDatagramList = new ArrayList<>(); } Loading Loading @@ -447,13 +450,17 @@ public class DatagramController { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public long getDatagramWaitTimeForConnectedState() { public long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) { synchronized (mLock) { long timeout = isLastSosMessage ? mDatagramWaitTimeForConnectedStateForLastMessage : mDatagramWaitTimeForConnectedState; logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState); if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) { return (mDatagramWaitTimeForConnectedState + mModemImageSwitchingDuration); return (timeout + mModemImageSwitchingDuration); } return mDatagramWaitTimeForConnectedState; return timeout; } } Loading Loading @@ -553,6 +560,11 @@ public class DatagramController { R.integer.config_satellite_modem_image_switching_duration_millis); } private long getDatagramWaitForConnectedStateForLastMessageTimeoutMillis() { return mContext.getResources().getInteger( R.integer.config_datagram_wait_for_connected_state_for_last_message_timeout_millis); } /** * This API can be used by only CTS to override the cached value for the device overlay config * value : config_send_satellite_datagram_to_modem_in_demo_mode, which determines whether Loading src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +16 −3 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ public class DatagramDispatcher extends Handler { mPendingNonEmergencyDatagramsMap = new LinkedHashMap<>(); private long mWaitTimeForDatagramSendingResponse; private long mWaitTimeForDatagramSendingForLastMessageResponse; @SatelliteManager.DatagramType private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; Loading Loading @@ -142,6 +143,8 @@ public class DatagramDispatcher extends Handler { mSendingDatagramInProgress = false; } mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingForLastMessageResponse = getWaitForDatagramSendingResponseForLastMessageTimeoutMillis(); } private static final class DatagramDispatcherHandlerRequest { Loading Loading @@ -680,7 +683,8 @@ public class DatagramDispatcher extends Handler { } sendMessageDelayed(obtainMessage( EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT, datagramArgs), mDatagramController.getDatagramWaitTimeForConnectedState()); mDatagramController.getDatagramWaitTimeForConnectedState( SatelliteServiceUtils.isLastSosMessage(datagramArgs.datagramType))); } private void stopDatagramWaitForConnectedStateTimer() { Loading Loading @@ -709,9 +713,13 @@ public class DatagramDispatcher extends Handler { logd("WaitForDatagramSendingResponseTimer was already started"); return; } long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType) ? mWaitTimeForDatagramSendingForLastMessageResponse : mWaitTimeForDatagramSendingResponse; logd("startWaitForDatagramSendingResponseTimer: datagramType=" + argument.datagramType + ", waitTime=" + waitTime); sendMessageDelayed(obtainMessage( EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT, argument), mWaitTimeForDatagramSendingResponse); EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT, argument), waitTime); } private void stopWaitForDatagramSendingResponseTimer() { Loading Loading @@ -760,6 +768,11 @@ public class DatagramDispatcher extends Handler { R.integer.config_wait_for_datagram_sending_response_timeout_millis); } private long getWaitForDatagramSendingResponseForLastMessageTimeoutMillis() { return mContext.getResources().getInteger(R.integer .config_wait_for_datagram_sending_response_for_last_message_timeout_millis); } private boolean shouldProcessEventSendSatelliteDatagramDone( @NonNull SendSatelliteDatagramArgument argument) { synchronized (mLock) { Loading src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -818,7 +818,7 @@ public class DatagramReceiver extends Handler { } sendMessageDelayed(obtainMessage( EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT), mDatagramController.getDatagramWaitTimeForConnectedState()); mDatagramController.getDatagramWaitTimeForConnectedState(false)); } private void stopDatagramWaitForConnectedStateTimer() { Loading src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java +13 −1 Original line number Diff line number Diff line Loading @@ -347,7 +347,9 @@ public class SatelliteServiceUtils { } /** * * Check if the datagramType is the sos message (DATAGRAM_TYPE_SOS_MESSAGE, * DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP, * DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED) or not */ public static boolean isSosMessage(int datagramType) { return datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE Loading @@ -355,6 +357,16 @@ public class SatelliteServiceUtils { || datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED; } /** * Check if the datagramType is the last sos message * (DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP or * DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED) or not */ public static boolean isLastSosMessage(int datagramType) { return datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP || datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED; } /** * Return phone associated with phoneId 0. * Loading tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java +183 −146 Original line number Diff line number Diff line Loading @@ -98,6 +98,12 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 static final long TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(60); private static final int TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS = (int) TimeUnit.SECONDS.toMillis(60); private TestDatagramDispatcher mDatagramDispatcherUT; Loading Loading @@ -188,8 +194,11 @@ public class DatagramDispatcherTest extends TelephonyTest { clearInvocations(mMockSatelliteModemInterface); doReturn(true).when(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); when(mMockDatagramController.getDatagramWaitTimeForConnectedState()) when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(false))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(true))) .thenReturn( TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mResultListener.clear(); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, Loading @@ -201,7 +210,8 @@ public class DatagramDispatcherTest extends TelephonyTest { eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); verifyZeroInteractions(mMockSatelliteModemInterface); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); Loading Loading @@ -247,7 +257,8 @@ public class DatagramDispatcherTest extends TelephonyTest { verifyZeroInteractions(mMockSatelliteModemInterface); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); moveTimeForward(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); Loading Loading @@ -287,7 +298,8 @@ public class DatagramDispatcherTest extends TelephonyTest { verifyZeroInteractions(mMockSatelliteModemInterface); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); assertEquals(0, mResultListener.size()); Loading @@ -305,6 +317,19 @@ public class DatagramDispatcherTest extends TelephonyTest { @Test public void testSendSatelliteDatagram_timeout() throws Exception { when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(false))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(true))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_for_last_message_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mResultListener.clear(); int[] sosDatagramTypes = {DATAGRAM_TYPE1, DATAGRAM_TYPE4, DATAGRAM_TYPE5}; for (int datagramType : sosDatagramTypes) { doAnswer(invocation -> { Message message = (Message) invocation.getArguments()[3]; Loading @@ -318,33 +343,29 @@ public class DatagramDispatcherTest extends TelephonyTest { .sendToTarget(); return null; }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class), }).when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); doReturn(false).when(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); when(mMockDatagramController.getDatagramWaitTimeForConnectedState()) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMEOUT_MILLIS); mResultListener.clear(); .needsWaitingForSatelliteConnected(eq(datagramType)); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mResultListener::offer); processAllMessages(); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).isPollingInIdleState(); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0), eq(SATELLITE_RESULT_SUCCESS)); verifyNoMoreInteractions(mMockDatagramController); Loading @@ -361,22 +382,23 @@ public class DatagramDispatcherTest extends TelephonyTest { doNothing().when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mResultListener::offer); processAllMessages(); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).isPollingInIdleState(); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(1), eq(SATELLITE_RESULT_MODEM_TIMEOUT)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0), eq(SATELLITE_RESULT_SUCCESS)); verifyNoMoreInteractions(mMockDatagramController); Loading @@ -385,6 +407,12 @@ public class DatagramDispatcherTest extends TelephonyTest { verify(mMockSatelliteModemInterface).abortSendingSatelliteDatagrams(any(Message.class)); assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_MODEM_TIMEOUT); verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram(); clearInvocations(mMockSatelliteModemInterface); clearInvocations(mMockDatagramController); clearInvocations(mMockSessionMetricsStats); mResultListener.clear(); } } @Test Loading Loading @@ -629,33 +657,39 @@ public class DatagramDispatcherTest extends TelephonyTest { } @Test public void testSendSatelliteDatagramToModemInDemoMode() throws Exception { public void testSendSatelliteDatagramToModemInDemoMode() throws Exception { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true); mDatagramDispatcherUT.setDemoMode(true); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true); int[] sosDatagramTypes = {DATAGRAM_TYPE1, DATAGRAM_TYPE4, DATAGRAM_TYPE5}; for (int datagramType : sosDatagramTypes) { mIntegerConsumerSemaphore.drainPermits(); mIntegerConsumerResult.clear(); clearInvocations(mMockDatagramController); clearInvocations(mMockSatelliteModemInterface); clearInvocations(mMockSessionMetricsStats); doAnswer(invocation -> { Message message = (Message) invocation.getArguments()[3]; mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/, new AsyncResult(message.obj, null, null)) .sendToTarget(); return null; }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class), }).when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); mDatagramDispatcherUT.setDemoMode(true); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true); mIntegerConsumerSemaphore.drainPermits(); // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is true mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null); mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, true); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -667,19 +701,20 @@ public class DatagramDispatcherTest extends TelephonyTest { verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram(); // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is false // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is // false reset(mMockSatelliteModemInterface); mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null); mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, false); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, false); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -688,19 +723,19 @@ public class DatagramDispatcherTest extends TelephonyTest { processAllMessages(); verify(mMockDatagramController, times(2)).pushDemoModeDatagram( anyInt(), any(SatelliteDatagram.class)); verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any()); // Send datagram one more time reset(mMockSatelliteModemInterface); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -709,7 +744,9 @@ public class DatagramDispatcherTest extends TelephonyTest { processAllMessages(); verify(mMockDatagramController, times(3)).pushDemoModeDatagram( anyInt(), any(SatelliteDatagram.class)); verify(mMockDatagramController, times(3)).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockDatagramController, times(3)).pollPendingSatelliteDatagrams(anyInt(), any()); } mDatagramDispatcherUT.setDemoMode(false); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false); Loading Loading
src/java/com/android/internal/telephony/satellite/DatagramController.java +15 −3 Original line number Diff line number Diff line Loading @@ -105,6 +105,7 @@ public class DatagramController { private long mDatagramWaitTimeForConnectedState; private long mModemImageSwitchingDuration; private boolean mWaitForDeviceAlignmentInDemoDatagram; private long mDatagramWaitTimeForConnectedStateForLastMessage; @GuardedBy("mLock") @SatelliteManager.SatelliteModemState private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN; Loading Loading @@ -161,6 +162,8 @@ public class DatagramController { mModemImageSwitchingDuration = getSatelliteModemImageSwitchingDurationMillis(); mWaitForDeviceAlignmentInDemoDatagram = getWaitForDeviceAlignmentInDemoDatagramFromResources(); mDatagramWaitTimeForConnectedStateForLastMessage = getDatagramWaitForConnectedStateForLastMessageTimeoutMillis(); mDemoModeDatagramList = new ArrayList<>(); } Loading Loading @@ -447,13 +450,17 @@ public class DatagramController { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public long getDatagramWaitTimeForConnectedState() { public long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) { synchronized (mLock) { long timeout = isLastSosMessage ? mDatagramWaitTimeForConnectedStateForLastMessage : mDatagramWaitTimeForConnectedState; logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState); if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) { return (mDatagramWaitTimeForConnectedState + mModemImageSwitchingDuration); return (timeout + mModemImageSwitchingDuration); } return mDatagramWaitTimeForConnectedState; return timeout; } } Loading Loading @@ -553,6 +560,11 @@ public class DatagramController { R.integer.config_satellite_modem_image_switching_duration_millis); } private long getDatagramWaitForConnectedStateForLastMessageTimeoutMillis() { return mContext.getResources().getInteger( R.integer.config_datagram_wait_for_connected_state_for_last_message_timeout_millis); } /** * This API can be used by only CTS to override the cached value for the device overlay config * value : config_send_satellite_datagram_to_modem_in_demo_mode, which determines whether Loading
src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +16 −3 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ public class DatagramDispatcher extends Handler { mPendingNonEmergencyDatagramsMap = new LinkedHashMap<>(); private long mWaitTimeForDatagramSendingResponse; private long mWaitTimeForDatagramSendingForLastMessageResponse; @SatelliteManager.DatagramType private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; Loading Loading @@ -142,6 +143,8 @@ public class DatagramDispatcher extends Handler { mSendingDatagramInProgress = false; } mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingForLastMessageResponse = getWaitForDatagramSendingResponseForLastMessageTimeoutMillis(); } private static final class DatagramDispatcherHandlerRequest { Loading Loading @@ -680,7 +683,8 @@ public class DatagramDispatcher extends Handler { } sendMessageDelayed(obtainMessage( EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT, datagramArgs), mDatagramController.getDatagramWaitTimeForConnectedState()); mDatagramController.getDatagramWaitTimeForConnectedState( SatelliteServiceUtils.isLastSosMessage(datagramArgs.datagramType))); } private void stopDatagramWaitForConnectedStateTimer() { Loading Loading @@ -709,9 +713,13 @@ public class DatagramDispatcher extends Handler { logd("WaitForDatagramSendingResponseTimer was already started"); return; } long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType) ? mWaitTimeForDatagramSendingForLastMessageResponse : mWaitTimeForDatagramSendingResponse; logd("startWaitForDatagramSendingResponseTimer: datagramType=" + argument.datagramType + ", waitTime=" + waitTime); sendMessageDelayed(obtainMessage( EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT, argument), mWaitTimeForDatagramSendingResponse); EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT, argument), waitTime); } private void stopWaitForDatagramSendingResponseTimer() { Loading Loading @@ -760,6 +768,11 @@ public class DatagramDispatcher extends Handler { R.integer.config_wait_for_datagram_sending_response_timeout_millis); } private long getWaitForDatagramSendingResponseForLastMessageTimeoutMillis() { return mContext.getResources().getInteger(R.integer .config_wait_for_datagram_sending_response_for_last_message_timeout_millis); } private boolean shouldProcessEventSendSatelliteDatagramDone( @NonNull SendSatelliteDatagramArgument argument) { synchronized (mLock) { Loading
src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -818,7 +818,7 @@ public class DatagramReceiver extends Handler { } sendMessageDelayed(obtainMessage( EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT), mDatagramController.getDatagramWaitTimeForConnectedState()); mDatagramController.getDatagramWaitTimeForConnectedState(false)); } private void stopDatagramWaitForConnectedStateTimer() { Loading
src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java +13 −1 Original line number Diff line number Diff line Loading @@ -347,7 +347,9 @@ public class SatelliteServiceUtils { } /** * * Check if the datagramType is the sos message (DATAGRAM_TYPE_SOS_MESSAGE, * DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP, * DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED) or not */ public static boolean isSosMessage(int datagramType) { return datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE Loading @@ -355,6 +357,16 @@ public class SatelliteServiceUtils { || datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED; } /** * Check if the datagramType is the last sos message * (DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP or * DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED) or not */ public static boolean isLastSosMessage(int datagramType) { return datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP || datagramType == SatelliteManager.DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED; } /** * Return phone associated with phoneId 0. * Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java +183 −146 Original line number Diff line number Diff line Loading @@ -98,6 +98,12 @@ public class DatagramDispatcherTest extends TelephonyTest { 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 static final long TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(60); private static final int TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS = (int) TimeUnit.SECONDS.toMillis(60); private TestDatagramDispatcher mDatagramDispatcherUT; Loading Loading @@ -188,8 +194,11 @@ public class DatagramDispatcherTest extends TelephonyTest { clearInvocations(mMockSatelliteModemInterface); doReturn(true).when(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); when(mMockDatagramController.getDatagramWaitTimeForConnectedState()) when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(false))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(true))) .thenReturn( TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mResultListener.clear(); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, Loading @@ -201,7 +210,8 @@ public class DatagramDispatcherTest extends TelephonyTest { eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); verifyZeroInteractions(mMockSatelliteModemInterface); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); Loading Loading @@ -247,7 +257,8 @@ public class DatagramDispatcherTest extends TelephonyTest { verifyZeroInteractions(mMockSatelliteModemInterface); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); moveTimeForward(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); Loading Loading @@ -287,7 +298,8 @@ public class DatagramDispatcherTest extends TelephonyTest { verifyZeroInteractions(mMockSatelliteModemInterface); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState(); mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState( eq(SatelliteServiceUtils.isLastSosMessage(datagramType))); assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted()); assertEquals(0, mResultListener.size()); Loading @@ -305,6 +317,19 @@ public class DatagramDispatcherTest extends TelephonyTest { @Test public void testSendSatelliteDatagram_timeout() throws Exception { when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(false))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); when(mMockDatagramController.getDatagramWaitTimeForConnectedState(eq(true))) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_for_last_message_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS); mResultListener.clear(); int[] sosDatagramTypes = {DATAGRAM_TYPE1, DATAGRAM_TYPE4, DATAGRAM_TYPE5}; for (int datagramType : sosDatagramTypes) { doAnswer(invocation -> { Message message = (Message) invocation.getArguments()[3]; Loading @@ -318,33 +343,29 @@ public class DatagramDispatcherTest extends TelephonyTest { .sendToTarget(); return null; }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class), }).when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); doReturn(false).when(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); when(mMockDatagramController.getDatagramWaitTimeForConnectedState()) .thenReturn(TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS); mContextFixture.putIntResource( R.integer.config_wait_for_datagram_sending_response_timeout_millis, TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMEOUT_MILLIS); mResultListener.clear(); .needsWaitingForSatelliteConnected(eq(datagramType)); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mResultListener::offer); processAllMessages(); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).isPollingInIdleState(); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0), eq(SATELLITE_RESULT_SUCCESS)); verifyNoMoreInteractions(mMockDatagramController); Loading @@ -361,22 +382,23 @@ public class DatagramDispatcherTest extends TelephonyTest { doNothing().when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mResultListener::offer); processAllMessages(); mInOrder.verify(mMockDatagramController) .needsWaitingForSatelliteConnected(eq(DATAGRAM_TYPE1)); .needsWaitingForSatelliteConnected(eq(datagramType)); mInOrder.verify(mMockDatagramController).isPollingInIdleState(); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1), eq(SATELLITE_RESULT_SUCCESS)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(1), eq(SATELLITE_RESULT_MODEM_TIMEOUT)); mInOrder.verify(mMockDatagramController) .updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE1), .updateSendStatus(eq(SUB_ID), eq(datagramType), eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0), eq(SATELLITE_RESULT_SUCCESS)); verifyNoMoreInteractions(mMockDatagramController); Loading @@ -385,6 +407,12 @@ public class DatagramDispatcherTest extends TelephonyTest { verify(mMockSatelliteModemInterface).abortSendingSatelliteDatagrams(any(Message.class)); assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_MODEM_TIMEOUT); verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram(); clearInvocations(mMockSatelliteModemInterface); clearInvocations(mMockDatagramController); clearInvocations(mMockSessionMetricsStats); mResultListener.clear(); } } @Test Loading Loading @@ -629,33 +657,39 @@ public class DatagramDispatcherTest extends TelephonyTest { } @Test public void testSendSatelliteDatagramToModemInDemoMode() throws Exception { public void testSendSatelliteDatagramToModemInDemoMode() throws Exception { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true); mDatagramDispatcherUT.setDemoMode(true); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true); int[] sosDatagramTypes = {DATAGRAM_TYPE1, DATAGRAM_TYPE4, DATAGRAM_TYPE5}; for (int datagramType : sosDatagramTypes) { mIntegerConsumerSemaphore.drainPermits(); mIntegerConsumerResult.clear(); clearInvocations(mMockDatagramController); clearInvocations(mMockSatelliteModemInterface); clearInvocations(mMockSessionMetricsStats); doAnswer(invocation -> { Message message = (Message) invocation.getArguments()[3]; mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/, new AsyncResult(message.obj, null, null)) .sendToTarget(); return null; }).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class), }).when(mMockSatelliteModemInterface).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); mDatagramDispatcherUT.setDemoMode(true); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true); mIntegerConsumerSemaphore.drainPermits(); // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is true mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null); mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, true); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -667,19 +701,20 @@ public class DatagramDispatcherTest extends TelephonyTest { verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram(); // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is false // Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is // false reset(mMockSatelliteModemInterface); mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null); mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, false); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, false); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -688,19 +723,19 @@ public class DatagramDispatcherTest extends TelephonyTest { processAllMessages(); verify(mMockDatagramController, times(2)).pushDemoModeDatagram( anyInt(), any(SatelliteDatagram.class)); verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any()); // Send datagram one more time reset(mMockSatelliteModemInterface); mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram, mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, datagramType, mDatagram, true, mIntegerConsumer); processAllMessages(); moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE); processAllMessages(); waitForIntegerConsumerResult(1); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); assertEquals(SATELLITE_RESULT_SUCCESS, (int) mIntegerConsumerResult.get(0)); mIntegerConsumerResult.clear(); verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram( any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class)); Loading @@ -709,7 +744,9 @@ public class DatagramDispatcherTest extends TelephonyTest { processAllMessages(); verify(mMockDatagramController, times(3)).pushDemoModeDatagram( anyInt(), any(SatelliteDatagram.class)); verify(mMockDatagramController, times(3)).pollPendingSatelliteDatagrams(anyInt(), any()); verify(mMockDatagramController, times(3)).pollPendingSatelliteDatagrams(anyInt(), any()); } mDatagramDispatcherUT.setDemoMode(false); mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false); Loading