Loading flags/network.aconfig +1 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ flag { } } # OWNER=yomna TARGET=25Q4 flag { name: "vendor_specific_cellular_identifier_disclosure_indications" is_exported: true Loading src/java/com/android/internal/telephony/data/DataNetwork.java +3 −2 Original line number Diff line number Diff line Loading @@ -2552,8 +2552,9 @@ public class DataNetwork extends StateMachine { // the MMS capability from this cellular network. This will allow IWLAN to be // brought up for MMS later. if (dataProfile != null && !dataProfile.getApn().equals(mDataProfile.getApn())) { log("Found a different apn name " + mDataProfile.getApn() + " that can serve MMS on IWLAN."); log("Found a different apn name " + dataProfile.getApn() + " that can serve MMS on IWLAN. Current data profile " + mDataProfile.getApn()); builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMS); } } Loading src/java/com/android/internal/telephony/satellite/DatagramController.java +22 −15 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class DatagramController { @NonNull private final PointingAppController mPointingAppController; @NonNull private final DatagramDispatcher mDatagramDispatcher; @NonNull private final DatagramReceiver mDatagramReceiver; @Nullable private PersistentLogger mPersistentLogger = null; public static final long MAX_DATAGRAM_ID = (long) Math.pow(2, 16); public static final int ROUNDING_UNIT = 10; Loading @@ -82,6 +83,7 @@ public class DatagramController { private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem"; private static final boolean DEBUG = !"user".equals(Build.TYPE); /** All the atomic variables are declared here. */ /** Variables used to update onSendDatagramStateChanged(). */ private AtomicInteger mSendSubId = new AtomicInteger(0); private @SatelliteManager.DatagramType AtomicInteger mDatagramType = Loading @@ -99,9 +101,6 @@ public class DatagramController { private AtomicInteger mReceivePendingCount = new AtomicInteger(0); private AtomicInteger mReceiveErrorCode = new AtomicInteger(SatelliteManager.SATELLITE_RESULT_SUCCESS); private final Object mLock = new Object(); @GuardedBy("mLock") private final List<SatelliteDatagram> mDemoModeDatagramList; private AtomicBoolean mIsDemoMode = new AtomicBoolean(false); private AtomicLong mAlignTimeoutDuration = new AtomicLong(SATELLITE_ALIGN_TIMEOUT); private AtomicLong mDatagramWaitTimeForConnectedState = new AtomicLong(0); Loading @@ -111,13 +110,16 @@ public class DatagramController { @SatelliteManager.SatelliteModemState private AtomicInteger mSatelltieModemState = new AtomicInteger(SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN); @Nullable private PersistentLogger mPersistentLogger = null; /** All the variables protected by lock are declared here. */ private final Object mLock = new Object(); @GuardedBy("mLock") private final List<SatelliteDatagram> mDemoModeDatagramList; /** * @return The singleton instance of DatagramController. */ public static DatagramController getInstance() { static DatagramController getInstance() { if (sInstance == null) { loge("DatagramController was not yet initialized."); } Loading @@ -133,7 +135,7 @@ public class DatagramController { * PointingApp about datagram transfer state changes. * @return The singleton instance of DatagramController. */ public static DatagramController make(@NonNull Context context, @NonNull Looper looper, static DatagramController make(@NonNull Context context, @NonNull Looper looper, @NonNull FeatureFlags featureFlags, @NonNull PointingAppController pointingAppController) { if (sInstance == null) { Loading Loading @@ -188,7 +190,8 @@ public class DatagramController { * * @return The {@link SatelliteManager.SatelliteResult} result of the operation. */ @SatelliteManager.SatelliteResult public int registerForSatelliteDatagram(int subId, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) @SatelliteManager.SatelliteResult protected int registerForSatelliteDatagram(int subId, @NonNull ISatelliteDatagramCallback callback) { return mDatagramReceiver.registerForSatelliteDatagram(subId, callback); } Loading @@ -201,7 +204,8 @@ public class DatagramController { * @param callback The callback that was passed to * {@link #registerForSatelliteDatagram(int, ISatelliteDatagramCallback)}. */ public void unregisterForSatelliteDatagram(int subId, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void unregisterForSatelliteDatagram(int subId, @NonNull ISatelliteDatagramCallback callback) { mDatagramReceiver.unregisterForSatelliteDatagram(subId, callback); } Loading @@ -217,7 +221,8 @@ public class DatagramController { * @param subId The subId of the subscription used for receiving datagrams. * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { plogd("pollPendingSatelliteDatagrams"); mDatagramReceiver.pollPendingSatelliteDatagrams(subId, callback); } Loading @@ -241,7 +246,8 @@ public class DatagramController { * full screen mode. * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType, @NonNull SatelliteDatagram datagram, boolean needFullScreenPointingUI, @NonNull Consumer<Integer> callback) { mDatagramDispatcher.sendSatelliteDatagram(subId, datagramType, datagram, Loading Loading @@ -343,7 +349,8 @@ public class DatagramController { /** @return {@code true} if already sent an emergency datagram during a session. */ public boolean isEmergencyCommunicationEstablished() { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected boolean isEmergencyCommunicationEstablished() { return mDatagramDispatcher.isEmergencyCommunicationEstablished(); } Loading @@ -365,7 +372,7 @@ public class DatagramController { * * @param subId The subId of the subscription used to receive SMS */ public void onSmsReceived(int subId) { void onSmsReceived(int subId) { // To keep exist notification flow, need to call with each state. updateReceiveStatus(subId, SatelliteManager.DATAGRAM_TYPE_SMS, SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING, Loading @@ -382,7 +389,7 @@ public class DatagramController { * Set whether the device is aligned with the satellite. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void setDeviceAlignedWithSatellite(boolean isAligned) { protected void setDeviceAlignedWithSatellite(boolean isAligned) { mDatagramDispatcher.setDeviceAlignedWithSatellite(isAligned); mDatagramReceiver.setDeviceAlignedWithSatellite(isAligned); if (isAligned) { Loading Loading @@ -654,7 +661,7 @@ public class DatagramController { * and it is required to wait for alignment else {@code false} */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean waitForAligningToSatellite(boolean isAligned) { protected boolean waitForAligningToSatellite(boolean isAligned) { if (isAligned) { return false; } Loading src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +33 −49 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ public class DatagramDispatcher extends Handler { private AtomicLong mWaitTimeForDatagramSendingForLastMessageResponse = new AtomicLong(0); @SatelliteManager.DatagramType private AtomicInteger mLastSendRequestDatagramType = new AtomicInteger(DATAGRAM_TYPE_UNKNOWN); private AtomicInteger mModemState = new AtomicInteger(SATELLITE_MODEM_STATE_UNKNOWN); private AtomicBoolean mHasEnteredConnectedState = new AtomicBoolean(false); private AtomicBoolean mShouldPollMtSms = new AtomicBoolean(false); private AtomicBoolean mIsMtSmsPollingThrottled = new AtomicBoolean(false); private AtomicInteger mConnectedStateCounter = new AtomicInteger(0); private AtomicLong mSmsTransmissionStartTime = new AtomicLong(0); private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null; private final Object mLock = new Object(); Loading @@ -131,18 +137,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, PendingRequest> mPendingSmsMap = new LinkedHashMap<>(); @GuardedBy("mLock") private int mModemState = SATELLITE_MODEM_STATE_UNKNOWN; @GuardedBy("mLock") private boolean mHasEnteredConnectedState = false; @GuardedBy("mLock") private boolean mShouldPollMtSms = false; @GuardedBy("mLock") private boolean mIsMtSmsPollingThrottled = false; @GuardedBy("mLock") private int mConnectedStateCounter = 0; private long mSmsTransmissionStartTime = 0; /** * Create the DatagramDispatcher singleton instance. * @param context The Context to use to create the DatagramDispatcher. Loading Loading @@ -395,7 +389,7 @@ public class DatagramDispatcher extends Handler { return; } mSmsTransmissionStartTime = System.currentTimeMillis(); mSmsTransmissionStartTime.set(System.currentTimeMillis()); smsDispatchersController.sendCarrierRoamingNbIotNtnText(pendingRequest); break; } Loading @@ -414,9 +408,7 @@ public class DatagramDispatcher extends Handler { } case EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT: { synchronized (mLock) { mIsMtSmsPollingThrottled = false; } mIsMtSmsPollingThrottled.set(false); if (allowMtSmsPolling()) { sendMessage(obtainMessage(CMD_SEND_MT_SMS_POLLING_MESSAGE)); } Loading Loading @@ -756,8 +748,8 @@ public class DatagramDispatcher extends Handler { int datagramType = pendingRequest.isMtSmsPolling ? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS; if (resultCode == SATELLITE_RESULT_SUCCESS) { long smsTransmissionTime = mSmsTransmissionStartTime > 0 ? (System.currentTimeMillis() - mSmsTransmissionStartTime) : 0; long smsTransmissionTime = mSmsTransmissionStartTime.get() > 0 ? (System.currentTimeMillis() - mSmsTransmissionStartTime.get()) : 0; mControllerMetricsStats.reportOutgoingDatagramSuccessCount(datagramType, false); mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram( datagramType, smsTransmissionTime); Loading Loading @@ -814,7 +806,7 @@ public class DatagramDispatcher extends Handler { */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { synchronized (mLock) { mModemState = state; mModemState.set(state); if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) { plogd("onSatelliteModemStateChanged: cleaning up resources"); Loading @@ -824,11 +816,11 @@ public class DatagramDispatcher extends Handler { } if (state == SATELLITE_MODEM_STATE_CONNECTED) { mHasEnteredConnectedState = true; mHasEnteredConnectedState.set(true); mConnectedStateCounter++; mConnectedStateCounter.incrementAndGet(); if (isFirstConnected()) { mShouldPollMtSms = shouldPollMtSms(); mShouldPollMtSms.set(shouldPollMtSms()); } if (isDatagramWaitForConnectedStateTimerStarted()) { Loading @@ -838,9 +830,9 @@ public class DatagramDispatcher extends Handler { } if (state == SATELLITE_MODEM_STATE_NOT_CONNECTED) { if (mHasEnteredConnectedState) { mHasEnteredConnectedState = false; mShouldPollMtSms = shouldPollMtSms(); if (mHasEnteredConnectedState.get()) { mHasEnteredConnectedState.set(false); mShouldPollMtSms.set(shouldPollMtSms()); } } } Loading @@ -851,7 +843,7 @@ public class DatagramDispatcher extends Handler { /** Returns true if this is the first time the satellite modem is connected. */ private boolean isFirstConnected() { return mConnectedStateCounter == 1; return mConnectedStateCounter.get() == 1; } @GuardedBy("mLock") Loading Loading @@ -882,10 +874,10 @@ public class DatagramDispatcher extends Handler { mSendSatelliteDatagramRequest = null; mIsAligned.set(false); mLastSendRequestDatagramType.set(DATAGRAM_TYPE_UNKNOWN); mModemState = SATELLITE_MODEM_STATE_UNKNOWN; mHasEnteredConnectedState = false; mShouldPollMtSms = false; mConnectedStateCounter = 0; mModemState.set(SATELLITE_MODEM_STATE_UNKNOWN); mHasEnteredConnectedState.set(false); mShouldPollMtSms.set(false); mConnectedStateCounter.set(0); stopMtSmsPollingThrottle(); } Loading Loading @@ -1287,7 +1279,7 @@ public class DatagramDispatcher extends Handler { reportSendSmsCompleted(pendingSms, SATELLITE_RESULT_SUCCESS); if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) { startMtSmsPollingThrottle(); mShouldPollMtSms = false; mShouldPollMtSms.set(false); } } else { // Update send status Loading Loading @@ -1325,14 +1317,14 @@ public class DatagramDispatcher extends Handler { private void handleCmdSendMtSmsPollingMessage() { synchronized (mLock) { if (!mShouldPollMtSms) { plogd("sendMtSmsPollingMessage: mShouldPollMtSms=" + mShouldPollMtSms); if (!mShouldPollMtSms.get()) { plogd("sendMtSmsPollingMessage: mShouldPollMtSms=" + mShouldPollMtSms.get()); return; } plogd("sendMtSmsPollingMessage"); if (!allowCheckMessageInNotConnected()) { mShouldPollMtSms = false; mShouldPollMtSms.set(false); } for (Entry<Long, PendingRequest> entry : mPendingSmsMap.entrySet()) { Loading Loading @@ -1361,17 +1353,15 @@ public class DatagramDispatcher extends Handler { smsDispatchersController.sendMtSmsPollingMessage(); } @GuardedBy("mLock") private void startMtSmsPollingThrottle() { plogd("startMtSmsPollingThrottle"); mIsMtSmsPollingThrottled = true; mIsMtSmsPollingThrottled.set(true); sendMessageDelayed(obtainMessage(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT), getMtSmsPollingThrottleMillis()); } @GuardedBy("mLock") private void stopMtSmsPollingThrottle() { mIsMtSmsPollingThrottled = false; mIsMtSmsPollingThrottled.set(false); removeMessages(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT); } Loading @@ -1385,22 +1375,16 @@ public class DatagramDispatcher extends Handler { return false; } boolean isModemStateConnectedOrTransferring; boolean isAligned = mIsAligned.get(); boolean isMtSmsPollingThrottled; synchronized (mLock) { isMtSmsPollingThrottled = mIsMtSmsPollingThrottled; isModemStateConnectedOrTransferring = mModemState == SATELLITE_MODEM_STATE_CONNECTED || mModemState == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING; } boolean isModemStateConnectedOrTransferring = mModemState.get() == SATELLITE_MODEM_STATE_CONNECTED || mModemState.get() == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING; if (isMtSmsPollingThrottled) { if (mIsMtSmsPollingThrottled.get()) { plogd("allowMtSmsPolling: polling is throttled"); return false; } if (!isAligned) { if (!mIsAligned.get()) { plogd("allowMtSmsPolling: not aligned"); return false; } Loading src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +73 −84 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import android.util.Log; import android.util.Pair; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; import com.android.internal.telephony.IIntegerConsumer; Loading Loading @@ -80,8 +79,8 @@ public class DatagramReceiver extends Handler { /** Key used to read/write satellite datagramId in shared preferences. */ private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key"; private static AtomicLong mNextDatagramId = new AtomicLong(0); /** All the variables initialized inside the constructor are declared here. */ @NonNull private static DatagramReceiver sInstance; @NonNull private final Context mContext; @NonNull private final ContentResolver mContentResolver; Loading @@ -91,17 +90,23 @@ public class DatagramReceiver extends Handler { @NonNull private final SessionMetricsStats mSessionMetricsStats; @NonNull private final Looper mLooper; @NonNull private final FeatureFlags mFeatureFlags; @Nullable private PersistentLogger mPersistentLogger = null; /** All the atomic variables are declared here. */ private static AtomicLong mNextDatagramId = new AtomicLong(0); private AtomicLong mDatagramTransferStartTime = new AtomicLong(0); private AtomicBoolean mIsDemoMode = new AtomicBoolean(false); private AtomicBoolean mIsAligned = new AtomicBoolean(false); /** * All the variables declared here should only be accessed by methods that run inside the * handler thread. */ @Nullable private DatagramReceiverHandlerRequest mDemoPollPendingSatelliteDatagramsRequest = null; @Nullable private DatagramReceiverHandlerRequest mPendingPollSatelliteDatagramsRequest = null; private final Object mLock = new Object(); @Nullable private PersistentLogger mPersistentLogger = null; /** * Map key: subId, value: SatelliteDatagramListenerHandler to notify registrants. Loading Loading @@ -636,7 +641,6 @@ public class DatagramReceiver extends Handler { } private void handleSatelliteConnectedEvent() { synchronized (mLock) { if (isDatagramWaitForConnectedStateTimerStarted()) { stopDatagramWaitForConnectedStateTimer(); if (mPendingPollSatelliteDatagramsRequest == null) { Loading @@ -652,7 +656,6 @@ public class DatagramReceiver extends Handler { mPendingPollSatelliteDatagramsRequest = null; } } } private void pollPendingSatelliteDatagramsInternal(int subId, @NonNull Consumer<Integer> callback) { Loading @@ -667,7 +670,6 @@ public class DatagramReceiver extends Handler { if (mDatagramController.needsWaitingForSatelliteConnected( SatelliteManager.DATAGRAM_TYPE_UNKNOWN)) { plogd("pollPendingSatelliteDatagramsInternal: wait for satellite connected"); synchronized (mLock) { mPendingPollSatelliteDatagramsRequest = new DatagramReceiverHandlerRequest( callback, SatelliteServiceUtils.getPhone(), subId); mDatagramController.updateReceiveStatus(subId, Loading @@ -676,7 +678,6 @@ public class DatagramReceiver extends Handler { mDatagramController.getReceivePendingCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS); startDatagramWaitForConnectedStateTimer(); } return; } Loading @@ -691,7 +692,6 @@ public class DatagramReceiver extends Handler { if (mIsDemoMode.get()) { DatagramReceiverHandlerRequest request = new DatagramReceiverHandlerRequest( callback, phone, subId); synchronized (mLock) { if (!mDatagramController.waitForAligningToSatellite(mIsAligned.get())) { Message msg = obtainMessage(EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE, request); Loading @@ -700,7 +700,6 @@ public class DatagramReceiver extends Handler { } else { startSatelliteAlignedTimer(request); } } } else { sendRequestAsync(CMD_POLL_PENDING_SATELLITE_DATAGRAMS, callback, phone, subId); } Loading @@ -726,7 +725,6 @@ public class DatagramReceiver extends Handler { private void handleEventSatelliteModemStateChanged( @SatelliteManager.SatelliteModemState int state) { plogd("handleEventSatelliteModemStateChanged: state = " + state); synchronized (mLock) { if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) { plogd("onSatelliteModemStateChanged: cleaning up resources"); Loading @@ -735,9 +733,7 @@ public class DatagramReceiver extends Handler { handleSatelliteConnectedEvent(); } } } @GuardedBy("mLock") private void cleanupDemoModeResources() { if (isSatelliteAlignedTimerStarted()) { stopSatelliteAlignedTimer(); Loading @@ -755,9 +751,7 @@ public class DatagramReceiver extends Handler { mIsAligned.set(false); } @GuardedBy("mLock") private void cleanUpResources() { synchronized (mLock) { if (mPendingPollSatelliteDatagramsRequest != null) { Consumer<Integer> callback = (Consumer<Integer>) mPendingPollSatelliteDatagramsRequest.argument; Loading @@ -765,7 +759,6 @@ public class DatagramReceiver extends Handler { mPendingPollSatelliteDatagramsRequest = null; } stopDatagramWaitForConnectedStateTimer(); } int subId = SatelliteController.getInstance().getSelectedSatelliteSubId(); if (mDatagramController.isReceivingDatagrams()) { Loading Loading @@ -855,12 +848,10 @@ public class DatagramReceiver extends Handler { } private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) { synchronized (mLock) { mIsAligned.set(isAligned); plogd("setDeviceAlignedWithSatellite: " + isAligned); if (isAligned && mIsDemoMode.get()) handleEventSatelliteAligned(); } } private void startSatelliteAlignedTimer(DatagramReceiverHandlerRequest request) { if (isSatelliteAlignedTimerStarted()) { Loading Loading @@ -933,7 +924,6 @@ public class DatagramReceiver extends Handler { } private void handleEventDatagramWaitForConnectedStateTimedOut() { synchronized (mLock) { if (mPendingPollSatelliteDatagramsRequest == null) { plogw("handleEventDatagramWaitForConnectedStateTimedOut: " + "mPendingPollSatelliteDatagramsRequest is null"); Loading @@ -960,7 +950,6 @@ public class DatagramReceiver extends Handler { callback.accept(SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE); mPendingPollSatelliteDatagramsRequest = null; } } /** * Destroys this DatagramDispatcher. Used for tearing down static resources during testing. Loading Loading
flags/network.aconfig +1 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ flag { } } # OWNER=yomna TARGET=25Q4 flag { name: "vendor_specific_cellular_identifier_disclosure_indications" is_exported: true Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +3 −2 Original line number Diff line number Diff line Loading @@ -2552,8 +2552,9 @@ public class DataNetwork extends StateMachine { // the MMS capability from this cellular network. This will allow IWLAN to be // brought up for MMS later. if (dataProfile != null && !dataProfile.getApn().equals(mDataProfile.getApn())) { log("Found a different apn name " + mDataProfile.getApn() + " that can serve MMS on IWLAN."); log("Found a different apn name " + dataProfile.getApn() + " that can serve MMS on IWLAN. Current data profile " + mDataProfile.getApn()); builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_MMS); } } Loading
src/java/com/android/internal/telephony/satellite/DatagramController.java +22 −15 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class DatagramController { @NonNull private final PointingAppController mPointingAppController; @NonNull private final DatagramDispatcher mDatagramDispatcher; @NonNull private final DatagramReceiver mDatagramReceiver; @Nullable private PersistentLogger mPersistentLogger = null; public static final long MAX_DATAGRAM_ID = (long) Math.pow(2, 16); public static final int ROUNDING_UNIT = 10; Loading @@ -82,6 +83,7 @@ public class DatagramController { private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem"; private static final boolean DEBUG = !"user".equals(Build.TYPE); /** All the atomic variables are declared here. */ /** Variables used to update onSendDatagramStateChanged(). */ private AtomicInteger mSendSubId = new AtomicInteger(0); private @SatelliteManager.DatagramType AtomicInteger mDatagramType = Loading @@ -99,9 +101,6 @@ public class DatagramController { private AtomicInteger mReceivePendingCount = new AtomicInteger(0); private AtomicInteger mReceiveErrorCode = new AtomicInteger(SatelliteManager.SATELLITE_RESULT_SUCCESS); private final Object mLock = new Object(); @GuardedBy("mLock") private final List<SatelliteDatagram> mDemoModeDatagramList; private AtomicBoolean mIsDemoMode = new AtomicBoolean(false); private AtomicLong mAlignTimeoutDuration = new AtomicLong(SATELLITE_ALIGN_TIMEOUT); private AtomicLong mDatagramWaitTimeForConnectedState = new AtomicLong(0); Loading @@ -111,13 +110,16 @@ public class DatagramController { @SatelliteManager.SatelliteModemState private AtomicInteger mSatelltieModemState = new AtomicInteger(SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN); @Nullable private PersistentLogger mPersistentLogger = null; /** All the variables protected by lock are declared here. */ private final Object mLock = new Object(); @GuardedBy("mLock") private final List<SatelliteDatagram> mDemoModeDatagramList; /** * @return The singleton instance of DatagramController. */ public static DatagramController getInstance() { static DatagramController getInstance() { if (sInstance == null) { loge("DatagramController was not yet initialized."); } Loading @@ -133,7 +135,7 @@ public class DatagramController { * PointingApp about datagram transfer state changes. * @return The singleton instance of DatagramController. */ public static DatagramController make(@NonNull Context context, @NonNull Looper looper, static DatagramController make(@NonNull Context context, @NonNull Looper looper, @NonNull FeatureFlags featureFlags, @NonNull PointingAppController pointingAppController) { if (sInstance == null) { Loading Loading @@ -188,7 +190,8 @@ public class DatagramController { * * @return The {@link SatelliteManager.SatelliteResult} result of the operation. */ @SatelliteManager.SatelliteResult public int registerForSatelliteDatagram(int subId, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) @SatelliteManager.SatelliteResult protected int registerForSatelliteDatagram(int subId, @NonNull ISatelliteDatagramCallback callback) { return mDatagramReceiver.registerForSatelliteDatagram(subId, callback); } Loading @@ -201,7 +204,8 @@ public class DatagramController { * @param callback The callback that was passed to * {@link #registerForSatelliteDatagram(int, ISatelliteDatagramCallback)}. */ public void unregisterForSatelliteDatagram(int subId, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void unregisterForSatelliteDatagram(int subId, @NonNull ISatelliteDatagramCallback callback) { mDatagramReceiver.unregisterForSatelliteDatagram(subId, callback); } Loading @@ -217,7 +221,8 @@ public class DatagramController { * @param subId The subId of the subscription used for receiving datagrams. * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { plogd("pollPendingSatelliteDatagrams"); mDatagramReceiver.pollPendingSatelliteDatagrams(subId, callback); } Loading @@ -241,7 +246,8 @@ public class DatagramController { * full screen mode. * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType, @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType, @NonNull SatelliteDatagram datagram, boolean needFullScreenPointingUI, @NonNull Consumer<Integer> callback) { mDatagramDispatcher.sendSatelliteDatagram(subId, datagramType, datagram, Loading Loading @@ -343,7 +349,8 @@ public class DatagramController { /** @return {@code true} if already sent an emergency datagram during a session. */ public boolean isEmergencyCommunicationEstablished() { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected boolean isEmergencyCommunicationEstablished() { return mDatagramDispatcher.isEmergencyCommunicationEstablished(); } Loading @@ -365,7 +372,7 @@ public class DatagramController { * * @param subId The subId of the subscription used to receive SMS */ public void onSmsReceived(int subId) { void onSmsReceived(int subId) { // To keep exist notification flow, need to call with each state. updateReceiveStatus(subId, SatelliteManager.DATAGRAM_TYPE_SMS, SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING, Loading @@ -382,7 +389,7 @@ public class DatagramController { * Set whether the device is aligned with the satellite. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void setDeviceAlignedWithSatellite(boolean isAligned) { protected void setDeviceAlignedWithSatellite(boolean isAligned) { mDatagramDispatcher.setDeviceAlignedWithSatellite(isAligned); mDatagramReceiver.setDeviceAlignedWithSatellite(isAligned); if (isAligned) { Loading Loading @@ -654,7 +661,7 @@ public class DatagramController { * and it is required to wait for alignment else {@code false} */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean waitForAligningToSatellite(boolean isAligned) { protected boolean waitForAligningToSatellite(boolean isAligned) { if (isAligned) { return false; } Loading
src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +33 −49 Original line number Diff line number Diff line Loading @@ -107,6 +107,12 @@ public class DatagramDispatcher extends Handler { private AtomicLong mWaitTimeForDatagramSendingForLastMessageResponse = new AtomicLong(0); @SatelliteManager.DatagramType private AtomicInteger mLastSendRequestDatagramType = new AtomicInteger(DATAGRAM_TYPE_UNKNOWN); private AtomicInteger mModemState = new AtomicInteger(SATELLITE_MODEM_STATE_UNKNOWN); private AtomicBoolean mHasEnteredConnectedState = new AtomicBoolean(false); private AtomicBoolean mShouldPollMtSms = new AtomicBoolean(false); private AtomicBoolean mIsMtSmsPollingThrottled = new AtomicBoolean(false); private AtomicInteger mConnectedStateCounter = new AtomicInteger(0); private AtomicLong mSmsTransmissionStartTime = new AtomicLong(0); private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null; private final Object mLock = new Object(); Loading @@ -131,18 +137,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, PendingRequest> mPendingSmsMap = new LinkedHashMap<>(); @GuardedBy("mLock") private int mModemState = SATELLITE_MODEM_STATE_UNKNOWN; @GuardedBy("mLock") private boolean mHasEnteredConnectedState = false; @GuardedBy("mLock") private boolean mShouldPollMtSms = false; @GuardedBy("mLock") private boolean mIsMtSmsPollingThrottled = false; @GuardedBy("mLock") private int mConnectedStateCounter = 0; private long mSmsTransmissionStartTime = 0; /** * Create the DatagramDispatcher singleton instance. * @param context The Context to use to create the DatagramDispatcher. Loading Loading @@ -395,7 +389,7 @@ public class DatagramDispatcher extends Handler { return; } mSmsTransmissionStartTime = System.currentTimeMillis(); mSmsTransmissionStartTime.set(System.currentTimeMillis()); smsDispatchersController.sendCarrierRoamingNbIotNtnText(pendingRequest); break; } Loading @@ -414,9 +408,7 @@ public class DatagramDispatcher extends Handler { } case EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT: { synchronized (mLock) { mIsMtSmsPollingThrottled = false; } mIsMtSmsPollingThrottled.set(false); if (allowMtSmsPolling()) { sendMessage(obtainMessage(CMD_SEND_MT_SMS_POLLING_MESSAGE)); } Loading Loading @@ -756,8 +748,8 @@ public class DatagramDispatcher extends Handler { int datagramType = pendingRequest.isMtSmsPolling ? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS; if (resultCode == SATELLITE_RESULT_SUCCESS) { long smsTransmissionTime = mSmsTransmissionStartTime > 0 ? (System.currentTimeMillis() - mSmsTransmissionStartTime) : 0; long smsTransmissionTime = mSmsTransmissionStartTime.get() > 0 ? (System.currentTimeMillis() - mSmsTransmissionStartTime.get()) : 0; mControllerMetricsStats.reportOutgoingDatagramSuccessCount(datagramType, false); mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram( datagramType, smsTransmissionTime); Loading Loading @@ -814,7 +806,7 @@ public class DatagramDispatcher extends Handler { */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { synchronized (mLock) { mModemState = state; mModemState.set(state); if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) { plogd("onSatelliteModemStateChanged: cleaning up resources"); Loading @@ -824,11 +816,11 @@ public class DatagramDispatcher extends Handler { } if (state == SATELLITE_MODEM_STATE_CONNECTED) { mHasEnteredConnectedState = true; mHasEnteredConnectedState.set(true); mConnectedStateCounter++; mConnectedStateCounter.incrementAndGet(); if (isFirstConnected()) { mShouldPollMtSms = shouldPollMtSms(); mShouldPollMtSms.set(shouldPollMtSms()); } if (isDatagramWaitForConnectedStateTimerStarted()) { Loading @@ -838,9 +830,9 @@ public class DatagramDispatcher extends Handler { } if (state == SATELLITE_MODEM_STATE_NOT_CONNECTED) { if (mHasEnteredConnectedState) { mHasEnteredConnectedState = false; mShouldPollMtSms = shouldPollMtSms(); if (mHasEnteredConnectedState.get()) { mHasEnteredConnectedState.set(false); mShouldPollMtSms.set(shouldPollMtSms()); } } } Loading @@ -851,7 +843,7 @@ public class DatagramDispatcher extends Handler { /** Returns true if this is the first time the satellite modem is connected. */ private boolean isFirstConnected() { return mConnectedStateCounter == 1; return mConnectedStateCounter.get() == 1; } @GuardedBy("mLock") Loading Loading @@ -882,10 +874,10 @@ public class DatagramDispatcher extends Handler { mSendSatelliteDatagramRequest = null; mIsAligned.set(false); mLastSendRequestDatagramType.set(DATAGRAM_TYPE_UNKNOWN); mModemState = SATELLITE_MODEM_STATE_UNKNOWN; mHasEnteredConnectedState = false; mShouldPollMtSms = false; mConnectedStateCounter = 0; mModemState.set(SATELLITE_MODEM_STATE_UNKNOWN); mHasEnteredConnectedState.set(false); mShouldPollMtSms.set(false); mConnectedStateCounter.set(0); stopMtSmsPollingThrottle(); } Loading Loading @@ -1287,7 +1279,7 @@ public class DatagramDispatcher extends Handler { reportSendSmsCompleted(pendingSms, SATELLITE_RESULT_SUCCESS); if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) { startMtSmsPollingThrottle(); mShouldPollMtSms = false; mShouldPollMtSms.set(false); } } else { // Update send status Loading Loading @@ -1325,14 +1317,14 @@ public class DatagramDispatcher extends Handler { private void handleCmdSendMtSmsPollingMessage() { synchronized (mLock) { if (!mShouldPollMtSms) { plogd("sendMtSmsPollingMessage: mShouldPollMtSms=" + mShouldPollMtSms); if (!mShouldPollMtSms.get()) { plogd("sendMtSmsPollingMessage: mShouldPollMtSms=" + mShouldPollMtSms.get()); return; } plogd("sendMtSmsPollingMessage"); if (!allowCheckMessageInNotConnected()) { mShouldPollMtSms = false; mShouldPollMtSms.set(false); } for (Entry<Long, PendingRequest> entry : mPendingSmsMap.entrySet()) { Loading Loading @@ -1361,17 +1353,15 @@ public class DatagramDispatcher extends Handler { smsDispatchersController.sendMtSmsPollingMessage(); } @GuardedBy("mLock") private void startMtSmsPollingThrottle() { plogd("startMtSmsPollingThrottle"); mIsMtSmsPollingThrottled = true; mIsMtSmsPollingThrottled.set(true); sendMessageDelayed(obtainMessage(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT), getMtSmsPollingThrottleMillis()); } @GuardedBy("mLock") private void stopMtSmsPollingThrottle() { mIsMtSmsPollingThrottled = false; mIsMtSmsPollingThrottled.set(false); removeMessages(EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT); } Loading @@ -1385,22 +1375,16 @@ public class DatagramDispatcher extends Handler { return false; } boolean isModemStateConnectedOrTransferring; boolean isAligned = mIsAligned.get(); boolean isMtSmsPollingThrottled; synchronized (mLock) { isMtSmsPollingThrottled = mIsMtSmsPollingThrottled; isModemStateConnectedOrTransferring = mModemState == SATELLITE_MODEM_STATE_CONNECTED || mModemState == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING; } boolean isModemStateConnectedOrTransferring = mModemState.get() == SATELLITE_MODEM_STATE_CONNECTED || mModemState.get() == SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING; if (isMtSmsPollingThrottled) { if (mIsMtSmsPollingThrottled.get()) { plogd("allowMtSmsPolling: polling is throttled"); return false; } if (!isAligned) { if (!mIsAligned.get()) { plogd("allowMtSmsPolling: not aligned"); return false; } Loading
src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +73 −84 Original line number Diff line number Diff line Loading @@ -46,7 +46,6 @@ import android.util.Log; import android.util.Pair; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; import com.android.internal.telephony.IIntegerConsumer; Loading Loading @@ -80,8 +79,8 @@ public class DatagramReceiver extends Handler { /** Key used to read/write satellite datagramId in shared preferences. */ private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key"; private static AtomicLong mNextDatagramId = new AtomicLong(0); /** All the variables initialized inside the constructor are declared here. */ @NonNull private static DatagramReceiver sInstance; @NonNull private final Context mContext; @NonNull private final ContentResolver mContentResolver; Loading @@ -91,17 +90,23 @@ public class DatagramReceiver extends Handler { @NonNull private final SessionMetricsStats mSessionMetricsStats; @NonNull private final Looper mLooper; @NonNull private final FeatureFlags mFeatureFlags; @Nullable private PersistentLogger mPersistentLogger = null; /** All the atomic variables are declared here. */ private static AtomicLong mNextDatagramId = new AtomicLong(0); private AtomicLong mDatagramTransferStartTime = new AtomicLong(0); private AtomicBoolean mIsDemoMode = new AtomicBoolean(false); private AtomicBoolean mIsAligned = new AtomicBoolean(false); /** * All the variables declared here should only be accessed by methods that run inside the * handler thread. */ @Nullable private DatagramReceiverHandlerRequest mDemoPollPendingSatelliteDatagramsRequest = null; @Nullable private DatagramReceiverHandlerRequest mPendingPollSatelliteDatagramsRequest = null; private final Object mLock = new Object(); @Nullable private PersistentLogger mPersistentLogger = null; /** * Map key: subId, value: SatelliteDatagramListenerHandler to notify registrants. Loading Loading @@ -636,7 +641,6 @@ public class DatagramReceiver extends Handler { } private void handleSatelliteConnectedEvent() { synchronized (mLock) { if (isDatagramWaitForConnectedStateTimerStarted()) { stopDatagramWaitForConnectedStateTimer(); if (mPendingPollSatelliteDatagramsRequest == null) { Loading @@ -652,7 +656,6 @@ public class DatagramReceiver extends Handler { mPendingPollSatelliteDatagramsRequest = null; } } } private void pollPendingSatelliteDatagramsInternal(int subId, @NonNull Consumer<Integer> callback) { Loading @@ -667,7 +670,6 @@ public class DatagramReceiver extends Handler { if (mDatagramController.needsWaitingForSatelliteConnected( SatelliteManager.DATAGRAM_TYPE_UNKNOWN)) { plogd("pollPendingSatelliteDatagramsInternal: wait for satellite connected"); synchronized (mLock) { mPendingPollSatelliteDatagramsRequest = new DatagramReceiverHandlerRequest( callback, SatelliteServiceUtils.getPhone(), subId); mDatagramController.updateReceiveStatus(subId, Loading @@ -676,7 +678,6 @@ public class DatagramReceiver extends Handler { mDatagramController.getReceivePendingCount(), SatelliteManager.SATELLITE_RESULT_SUCCESS); startDatagramWaitForConnectedStateTimer(); } return; } Loading @@ -691,7 +692,6 @@ public class DatagramReceiver extends Handler { if (mIsDemoMode.get()) { DatagramReceiverHandlerRequest request = new DatagramReceiverHandlerRequest( callback, phone, subId); synchronized (mLock) { if (!mDatagramController.waitForAligningToSatellite(mIsAligned.get())) { Message msg = obtainMessage(EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE, request); Loading @@ -700,7 +700,6 @@ public class DatagramReceiver extends Handler { } else { startSatelliteAlignedTimer(request); } } } else { sendRequestAsync(CMD_POLL_PENDING_SATELLITE_DATAGRAMS, callback, phone, subId); } Loading @@ -726,7 +725,6 @@ public class DatagramReceiver extends Handler { private void handleEventSatelliteModemStateChanged( @SatelliteManager.SatelliteModemState int state) { plogd("handleEventSatelliteModemStateChanged: state = " + state); synchronized (mLock) { if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) { plogd("onSatelliteModemStateChanged: cleaning up resources"); Loading @@ -735,9 +733,7 @@ public class DatagramReceiver extends Handler { handleSatelliteConnectedEvent(); } } } @GuardedBy("mLock") private void cleanupDemoModeResources() { if (isSatelliteAlignedTimerStarted()) { stopSatelliteAlignedTimer(); Loading @@ -755,9 +751,7 @@ public class DatagramReceiver extends Handler { mIsAligned.set(false); } @GuardedBy("mLock") private void cleanUpResources() { synchronized (mLock) { if (mPendingPollSatelliteDatagramsRequest != null) { Consumer<Integer> callback = (Consumer<Integer>) mPendingPollSatelliteDatagramsRequest.argument; Loading @@ -765,7 +759,6 @@ public class DatagramReceiver extends Handler { mPendingPollSatelliteDatagramsRequest = null; } stopDatagramWaitForConnectedStateTimer(); } int subId = SatelliteController.getInstance().getSelectedSatelliteSubId(); if (mDatagramController.isReceivingDatagrams()) { Loading Loading @@ -855,12 +848,10 @@ public class DatagramReceiver extends Handler { } private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) { synchronized (mLock) { mIsAligned.set(isAligned); plogd("setDeviceAlignedWithSatellite: " + isAligned); if (isAligned && mIsDemoMode.get()) handleEventSatelliteAligned(); } } private void startSatelliteAlignedTimer(DatagramReceiverHandlerRequest request) { if (isSatelliteAlignedTimerStarted()) { Loading Loading @@ -933,7 +924,6 @@ public class DatagramReceiver extends Handler { } private void handleEventDatagramWaitForConnectedStateTimedOut() { synchronized (mLock) { if (mPendingPollSatelliteDatagramsRequest == null) { plogw("handleEventDatagramWaitForConnectedStateTimedOut: " + "mPendingPollSatelliteDatagramsRequest is null"); Loading @@ -960,7 +950,6 @@ public class DatagramReceiver extends Handler { callback.accept(SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE); mPendingPollSatelliteDatagramsRequest = null; } } /** * Destroys this DatagramDispatcher. Used for tearing down static resources during testing. Loading