Loading flags/misc.aconfig +0 −10 Original line number Diff line number Diff line Loading @@ -202,13 +202,3 @@ flag { } } # OWNER=jackyu TARGET=25Q2 flag { name: "carrier_config_changed_callback_fix" namespace: "telephony" description: "Carrier config callback race condition fix" bug:"375526692" metadata { purpose: PURPOSE_BUGFIX } } src/java/com/android/internal/telephony/satellite/DatagramController.java +46 −47 Original line number Diff line number Diff line Loading @@ -108,9 +108,9 @@ public class DatagramController { private AtomicLong mModemImageSwitchingDuration = new AtomicLong(0); private AtomicBoolean mWaitForDeviceAlignmentInDemoDatagram = new AtomicBoolean(false); private AtomicLong mDatagramWaitTimeForConnectedStateForLastMessage = new AtomicLong(0); @GuardedBy("mLock") @SatelliteManager.SatelliteModemState private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN; private AtomicInteger mSatelltieModemState = new AtomicInteger(SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN); @Nullable private PersistentLogger mPersistentLogger = null; Loading Loading @@ -286,17 +286,15 @@ public class DatagramController { private boolean shouldSuppressDatagramTransferStateUpdate( @SatelliteManager.DatagramType int datagramType) { synchronized (mLock) { if (!SatelliteController.getInstance().isSatelliteAttachRequired()) { return false; } if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { && mSatelltieModemState.get() == SATELLITE_MODEM_STATE_NOT_CONNECTED) { return true; } return false; } } /** * Update receive status to {@link PointingAppController}. Loading Loading @@ -355,10 +353,9 @@ public class DatagramController { * * @param state Current satellite modem state. */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { synchronized (mLock) { mSatelltieModemState = state; } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { mSatelltieModemState.set(state); mDatagramDispatcher.onSatelliteModemStateChanged(state); mDatagramReceiver.onSatelliteModemStateChanged(state); } Loading Loading @@ -404,32 +401,35 @@ public class DatagramController { * before transferring datagrams via satellite. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean needsWaitingForSatelliteConnected( protected boolean needsWaitingForSatelliteConnected( @SatelliteManager.DatagramType int datagramType) { synchronized (mLock) { if (!SatelliteController.getInstance().isSatelliteAttachRequired()) { return false; } int satelliteModemState = mSatelltieModemState.get(); plogd("needsWaitingForSatelliteConnected: datagramType=" + datagramType + " satelliteModemState=" + satelliteModemState); if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { return false; } boolean allowCheckMessageInNotConnected = mContext.getResources().getBoolean( R.bool.config_satellite_allow_check_message_in_not_connected); if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED && allowCheckMessageInNotConnected && mFeatureFlags.carrierRoamingNbIotNtn()) { return false; } if (mSatelltieModemState != SATELLITE_MODEM_STATE_CONNECTED && mSatelltieModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) { if (satelliteModemState != SATELLITE_MODEM_STATE_CONNECTED && satelliteModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) { return true; } return false; } } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected boolean isSendingInIdleState() { Loading Loading @@ -497,19 +497,18 @@ public class DatagramController { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) { synchronized (mLock) { long timeout = isLastSosMessage ? mDatagramWaitTimeForConnectedStateForLastMessage.get() : mDatagramWaitTimeForConnectedState.get(); int satelliteModemState = mSatelltieModemState.get(); logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState); if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) { + ", timeout=" + timeout + ", modemState=" + satelliteModemState); if (satelliteModemState == SATELLITE_MODEM_STATE_OFF || satelliteModemState == SATELLITE_MODEM_STATE_IDLE) { return (timeout + mModemImageSwitchingDuration.get()); } return timeout; } } /** * This API can be used by only CTS to timeout durations used by DatagramController module. Loading src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +18 −20 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; Loading Loading @@ -102,6 +103,10 @@ public class DatagramDispatcher extends Handler { /** {@code true} if already sent an emergency datagram during a session */ private AtomicBoolean mIsEmergencyCommunicationEstablished = new AtomicBoolean(false); private AtomicBoolean mSendingInProgress = new AtomicBoolean(false); private AtomicLong mWaitTimeForDatagramSendingResponse = new AtomicLong(0); private AtomicLong mWaitTimeForDatagramSendingForLastMessageResponse = new AtomicLong(0); @SatelliteManager.DatagramType private AtomicInteger mLastSendRequestDatagramType = new AtomicInteger(DATAGRAM_TYPE_UNKNOWN); private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null; private final Object mLock = new Object(); Loading @@ -112,7 +117,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, SendSatelliteDatagramArgument> mPendingEmergencyDatagramsMap = new LinkedHashMap<>(); /** * Map key: datagramId, value: SendSatelliteDatagramArgument to retry sending non-emergency * datagrams. Loading @@ -120,7 +124,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, SendSatelliteDatagramArgument> mPendingNonEmergencyDatagramsMap = new LinkedHashMap<>(); /** * Map key: messageId, value: {@link PendingRequest} which contains all the information to send * carrier roaming nb iot ntn SMS. Loading @@ -128,12 +131,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, PendingRequest> mPendingSmsMap = new LinkedHashMap<>(); private long mWaitTimeForDatagramSendingResponse; private long mWaitTimeForDatagramSendingForLastMessageResponse; @SatelliteManager.DatagramType private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; @GuardedBy("mLock") private int mModemState = SATELLITE_MODEM_STATE_UNKNOWN; @GuardedBy("mLock") Loading Loading @@ -194,9 +191,9 @@ public class DatagramDispatcher extends Handler { mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context); mSendingInProgress.set(false); mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingForLastMessageResponse = getWaitForDatagramSendingResponseForLastMessageTimeoutMillis(); mWaitTimeForDatagramSendingResponse.set(getWaitForDatagramSendingResponseTimeoutMillis()); mWaitTimeForDatagramSendingForLastMessageResponse.set( getWaitForDatagramSendingResponseForLastMessageTimeoutMillis()); } private static final class DatagramDispatcherHandlerRequest { Loading Loading @@ -464,7 +461,7 @@ public class DatagramDispatcher extends Handler { SendSatelliteDatagramArgument datagramArgs = new SendSatelliteDatagramArgument(subId, datagramId, datagramType, datagram, needFullScreenPointingUI, callback); mLastSendRequestDatagramType = datagramType; mLastSendRequestDatagramType.set(datagramType); synchronized (mLock) { // Add datagram to pending datagram map Loading Loading @@ -866,12 +863,12 @@ public class DatagramDispatcher extends Handler { int subId = SatelliteController.getInstance().getSelectedSatelliteSubId(); if (getPendingMessagesCount() > 0) { mDatagramController.updateSendStatus(subId, mLastSendRequestDatagramType, mLastSendRequestDatagramType.get(), SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED, getPendingMessagesCount(), SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED); } mDatagramController.updateSendStatus(subId, mLastSendRequestDatagramType, mLastSendRequestDatagramType.get(), SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0, SatelliteManager.SATELLITE_RESULT_SUCCESS); abortSendingPendingDatagrams(subId, Loading @@ -884,7 +881,7 @@ public class DatagramDispatcher extends Handler { mIsDemoMode.set(false); mSendSatelliteDatagramRequest = null; mIsAligned.set(false); mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; mLastSendRequestDatagramType.set(DATAGRAM_TYPE_UNKNOWN); mModemState = SATELLITE_MODEM_STATE_UNKNOWN; mHasEnteredConnectedState = false; mShouldPollMtSms = false; Loading Loading @@ -924,9 +921,10 @@ public class DatagramDispatcher extends Handler { */ void setWaitTimeForDatagramSendingResponse(boolean reset, long timeoutMillis) { if (reset) { mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingResponse.set( getWaitForDatagramSendingResponseTimeoutMillis()); } else { mWaitTimeForDatagramSendingResponse = timeoutMillis; mWaitTimeForDatagramSendingResponse.set(timeoutMillis); } } Loading @@ -937,8 +935,8 @@ public class DatagramDispatcher extends Handler { return; } long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType) ? mWaitTimeForDatagramSendingForLastMessageResponse : mWaitTimeForDatagramSendingResponse; ? mWaitTimeForDatagramSendingForLastMessageResponse.get() : mWaitTimeForDatagramSendingResponse.get(); logd("startWaitForDatagramSendingResponseTimer: datagramType=" + argument.datagramType + ", waitTime=" + waitTime); sendMessageDelayed(obtainMessage( Loading Loading @@ -1149,7 +1147,7 @@ public class DatagramDispatcher extends Handler { mPendingSmsMap.put(messageId, pendingSms); int datagramType = pendingSms.isMtSmsPolling ? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS; mLastSendRequestDatagramType = datagramType; mLastSendRequestDatagramType.set(datagramType); if (mDatagramController.needsWaitingForSatelliteConnected(datagramType)) { plogd("sendSms: wait for satellite connected"); Loading src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +81 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ 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; import com.android.internal.telephony.IVoidConsumer; import com.android.internal.telephony.Phone; Loading @@ -73,6 +74,9 @@ public class DatagramReceiver extends Handler { private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 2; private static final int EVENT_WAIT_FOR_DEVICE_ALIGNMENT_IN_DEMO_MODE_TIMED_OUT = 3; private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4; private static final int REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS = 5; private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 6; private static final int REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE = 7; /** Key used to read/write satellite datagramId in shared preferences. */ private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key"; Loading Loading @@ -498,6 +502,43 @@ public class DatagramReceiver extends Handler { handleEventDatagramWaitForConnectedStateTimedOut(); break; case REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS: { plogd("REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS"); SomeArgs args = (SomeArgs) msg.obj; int subId = (int) args.arg1; Consumer<Integer> callback = (Consumer<Integer>) args.arg2; try { handleRequestPollPendingSatelliteDatagrams(subId, callback); } finally { args.recycle(); } break; } case EVENT_SATELLITE_MODEM_STATE_CHANGED: { plogd("EVENT_SATELLITE_MODEM_STATE_CHANGED"); SomeArgs args = (SomeArgs) msg.obj; int state = (int) args.arg1; try { handleEventSatelliteModemStateChanged(state); } finally { args.recycle(); } break; } case REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE: { plogd("REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE"); SomeArgs args = (SomeArgs) msg.obj; boolean isAligned = (boolean) args.arg1; try { handleRequestSetDeviceAlignedWithSatellite(isAligned); } finally { args.recycle(); } break; } default: plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what); break; Loading Loading @@ -570,6 +611,20 @@ public class DatagramReceiver extends Handler { * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = subId; args.arg2 = callback; sendMessage(obtainMessage(REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS, args)); return; } handleRequestPollPendingSatelliteDatagrams(subId, callback); } private void handleRequestPollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { plogd("handleRequestPollPendingSatelliteDatagrams"); if (!mDatagramController.isPollingInIdleState()) { // Poll request should be sent to satellite modem only when it is free. plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams."); Loading Loading @@ -658,6 +713,19 @@ public class DatagramReceiver extends Handler { * @param state Current satellite modem state. */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = state; sendMessage(obtainMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, args)); return; } handleEventSatelliteModemStateChanged(state); } 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) { Loading Loading @@ -775,7 +843,18 @@ public class DatagramReceiver extends Handler { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void setDeviceAlignedWithSatellite(boolean isAligned) { protected void setDeviceAlignedWithSatellite(boolean isAligned) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = isAligned; sendMessage(obtainMessage(REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE, args)); return; } handleRequestSetDeviceAlignedWithSatellite(isAligned); } private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) { synchronized (mLock) { mIsAligned.set(isAligned); plogd("setDeviceAlignedWithSatellite: " + isAligned); Loading Loading @@ -849,7 +928,7 @@ public class DatagramReceiver extends Handler { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean isDatagramWaitForConnectedStateTimerStarted() { protected boolean isDatagramWaitForConnectedStateTimerStarted() { return hasMessages(EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT); } Loading src/java/com/android/internal/telephony/satellite/PointingAppController.java +57 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.Log; 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.flags.FeatureFlags; import java.util.ArrayList; Loading @@ -58,11 +59,14 @@ import java.util.function.Consumer; /** * PointingApp controller to manage interactions with PointingUI app. */ public class PointingAppController { public class PointingAppController extends Handler { private static final String TAG = "PointingAppController"; private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem"; private static final boolean DEBUG = !"user".equals(Build.TYPE); private static final int REQUEST_START_POINTING_UI = 1; private static final int REQUEST_REMOVE_LISTENER_FOR_POINTING_UI = 2; @NonNull private static PointingAppController sInstance; @NonNull private final Context mContext; Loading Loading @@ -125,6 +129,34 @@ public class PointingAppController { mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context); } @Override public void handleMessage(Message msg) { switch (msg.what) { case REQUEST_START_POINTING_UI: { plogd("REQUEST_START_POINTING_UI"); SomeArgs args = (SomeArgs) msg.obj; boolean needFullScreenPointingUI = (boolean) args.arg1; boolean isDemoMode = (boolean) args.arg2; boolean isEmergency = (boolean) args.arg3; try { handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency); } finally { args.recycle(); } break; } case REQUEST_REMOVE_LISTENER_FOR_POINTING_UI: { handleRequestRemoveListenerForPointingUI(); break; } default: ploge("PointingAppControllerHandler: unexpected message code: " + msg.what); break; } } /** * Set the flag mStartedSatelliteTransmissionUpdates to true or false based on the state of * transmission updates Loading Loading @@ -390,6 +422,20 @@ public class PointingAppController { */ public void startPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode, boolean isEmergency) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = needFullScreenPointingUI; args.arg2 = isDemoMode; args.arg3 = isEmergency; sendMessage(obtainMessage(REQUEST_START_POINTING_UI, args)); return; } handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency); } private void handleRequestStartPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode, boolean isEmergency) { String packageName = getPointingUiPackageName(); if (TextUtils.isEmpty(packageName)) { plogd("startPointingUI: config_pointing_ui_package is not set. Ignore the request"); Loading Loading @@ -437,6 +483,16 @@ public class PointingAppController { * Remove the Importance Listener For Pointing UI App once the satellite is disabled */ public void removeListenerForPointingUI() { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { sendMessage(obtainMessage(REQUEST_REMOVE_LISTENER_FOR_POINTING_UI)); return; } handleRequestRemoveListenerForPointingUI(); } private void handleRequestRemoveListenerForPointingUI() { plogd("handleRequestRemoveListenerForPointingUI"); synchronized (mListenerForPointingUIRegisteredLock) { if (mListenerForPointingUIRegistered) { mActivityManager.removeOnUidImportanceListener(mUidImportanceListener); Loading Loading
flags/misc.aconfig +0 −10 Original line number Diff line number Diff line Loading @@ -202,13 +202,3 @@ flag { } } # OWNER=jackyu TARGET=25Q2 flag { name: "carrier_config_changed_callback_fix" namespace: "telephony" description: "Carrier config callback race condition fix" bug:"375526692" metadata { purpose: PURPOSE_BUGFIX } }
src/java/com/android/internal/telephony/satellite/DatagramController.java +46 −47 Original line number Diff line number Diff line Loading @@ -108,9 +108,9 @@ public class DatagramController { private AtomicLong mModemImageSwitchingDuration = new AtomicLong(0); private AtomicBoolean mWaitForDeviceAlignmentInDemoDatagram = new AtomicBoolean(false); private AtomicLong mDatagramWaitTimeForConnectedStateForLastMessage = new AtomicLong(0); @GuardedBy("mLock") @SatelliteManager.SatelliteModemState private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN; private AtomicInteger mSatelltieModemState = new AtomicInteger(SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN); @Nullable private PersistentLogger mPersistentLogger = null; Loading Loading @@ -286,17 +286,15 @@ public class DatagramController { private boolean shouldSuppressDatagramTransferStateUpdate( @SatelliteManager.DatagramType int datagramType) { synchronized (mLock) { if (!SatelliteController.getInstance().isSatelliteAttachRequired()) { return false; } if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { && mSatelltieModemState.get() == SATELLITE_MODEM_STATE_NOT_CONNECTED) { return true; } return false; } } /** * Update receive status to {@link PointingAppController}. Loading Loading @@ -355,10 +353,9 @@ public class DatagramController { * * @param state Current satellite modem state. */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { synchronized (mLock) { mSatelltieModemState = state; } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { mSatelltieModemState.set(state); mDatagramDispatcher.onSatelliteModemStateChanged(state); mDatagramReceiver.onSatelliteModemStateChanged(state); } Loading Loading @@ -404,32 +401,35 @@ public class DatagramController { * before transferring datagrams via satellite. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean needsWaitingForSatelliteConnected( protected boolean needsWaitingForSatelliteConnected( @SatelliteManager.DatagramType int datagramType) { synchronized (mLock) { if (!SatelliteController.getInstance().isSatelliteAttachRequired()) { return false; } int satelliteModemState = mSatelltieModemState.get(); plogd("needsWaitingForSatelliteConnected: datagramType=" + datagramType + " satelliteModemState=" + satelliteModemState); if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) { return false; } boolean allowCheckMessageInNotConnected = mContext.getResources().getBoolean( R.bool.config_satellite_allow_check_message_in_not_connected); if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED && allowCheckMessageInNotConnected && mFeatureFlags.carrierRoamingNbIotNtn()) { return false; } if (mSatelltieModemState != SATELLITE_MODEM_STATE_CONNECTED && mSatelltieModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) { if (satelliteModemState != SATELLITE_MODEM_STATE_CONNECTED && satelliteModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) { return true; } return false; } } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected boolean isSendingInIdleState() { Loading Loading @@ -497,19 +497,18 @@ public class DatagramController { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) protected long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) { synchronized (mLock) { long timeout = isLastSosMessage ? mDatagramWaitTimeForConnectedStateForLastMessage.get() : mDatagramWaitTimeForConnectedState.get(); int satelliteModemState = mSatelltieModemState.get(); logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState); if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) { + ", timeout=" + timeout + ", modemState=" + satelliteModemState); if (satelliteModemState == SATELLITE_MODEM_STATE_OFF || satelliteModemState == SATELLITE_MODEM_STATE_IDLE) { return (timeout + mModemImageSwitchingDuration.get()); } return timeout; } } /** * This API can be used by only CTS to timeout durations used by DatagramController module. Loading
src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java +18 −20 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; Loading Loading @@ -102,6 +103,10 @@ public class DatagramDispatcher extends Handler { /** {@code true} if already sent an emergency datagram during a session */ private AtomicBoolean mIsEmergencyCommunicationEstablished = new AtomicBoolean(false); private AtomicBoolean mSendingInProgress = new AtomicBoolean(false); private AtomicLong mWaitTimeForDatagramSendingResponse = new AtomicLong(0); private AtomicLong mWaitTimeForDatagramSendingForLastMessageResponse = new AtomicLong(0); @SatelliteManager.DatagramType private AtomicInteger mLastSendRequestDatagramType = new AtomicInteger(DATAGRAM_TYPE_UNKNOWN); private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null; private final Object mLock = new Object(); Loading @@ -112,7 +117,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, SendSatelliteDatagramArgument> mPendingEmergencyDatagramsMap = new LinkedHashMap<>(); /** * Map key: datagramId, value: SendSatelliteDatagramArgument to retry sending non-emergency * datagrams. Loading @@ -120,7 +124,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, SendSatelliteDatagramArgument> mPendingNonEmergencyDatagramsMap = new LinkedHashMap<>(); /** * Map key: messageId, value: {@link PendingRequest} which contains all the information to send * carrier roaming nb iot ntn SMS. Loading @@ -128,12 +131,6 @@ public class DatagramDispatcher extends Handler { @GuardedBy("mLock") private final LinkedHashMap<Long, PendingRequest> mPendingSmsMap = new LinkedHashMap<>(); private long mWaitTimeForDatagramSendingResponse; private long mWaitTimeForDatagramSendingForLastMessageResponse; @SatelliteManager.DatagramType private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; @GuardedBy("mLock") private int mModemState = SATELLITE_MODEM_STATE_UNKNOWN; @GuardedBy("mLock") Loading Loading @@ -194,9 +191,9 @@ public class DatagramDispatcher extends Handler { mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context); mSendingInProgress.set(false); mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingForLastMessageResponse = getWaitForDatagramSendingResponseForLastMessageTimeoutMillis(); mWaitTimeForDatagramSendingResponse.set(getWaitForDatagramSendingResponseTimeoutMillis()); mWaitTimeForDatagramSendingForLastMessageResponse.set( getWaitForDatagramSendingResponseForLastMessageTimeoutMillis()); } private static final class DatagramDispatcherHandlerRequest { Loading Loading @@ -464,7 +461,7 @@ public class DatagramDispatcher extends Handler { SendSatelliteDatagramArgument datagramArgs = new SendSatelliteDatagramArgument(subId, datagramId, datagramType, datagram, needFullScreenPointingUI, callback); mLastSendRequestDatagramType = datagramType; mLastSendRequestDatagramType.set(datagramType); synchronized (mLock) { // Add datagram to pending datagram map Loading Loading @@ -866,12 +863,12 @@ public class DatagramDispatcher extends Handler { int subId = SatelliteController.getInstance().getSelectedSatelliteSubId(); if (getPendingMessagesCount() > 0) { mDatagramController.updateSendStatus(subId, mLastSendRequestDatagramType, mLastSendRequestDatagramType.get(), SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED, getPendingMessagesCount(), SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED); } mDatagramController.updateSendStatus(subId, mLastSendRequestDatagramType, mLastSendRequestDatagramType.get(), SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0, SatelliteManager.SATELLITE_RESULT_SUCCESS); abortSendingPendingDatagrams(subId, Loading @@ -884,7 +881,7 @@ public class DatagramDispatcher extends Handler { mIsDemoMode.set(false); mSendSatelliteDatagramRequest = null; mIsAligned.set(false); mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN; mLastSendRequestDatagramType.set(DATAGRAM_TYPE_UNKNOWN); mModemState = SATELLITE_MODEM_STATE_UNKNOWN; mHasEnteredConnectedState = false; mShouldPollMtSms = false; Loading Loading @@ -924,9 +921,10 @@ public class DatagramDispatcher extends Handler { */ void setWaitTimeForDatagramSendingResponse(boolean reset, long timeoutMillis) { if (reset) { mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis(); mWaitTimeForDatagramSendingResponse.set( getWaitForDatagramSendingResponseTimeoutMillis()); } else { mWaitTimeForDatagramSendingResponse = timeoutMillis; mWaitTimeForDatagramSendingResponse.set(timeoutMillis); } } Loading @@ -937,8 +935,8 @@ public class DatagramDispatcher extends Handler { return; } long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType) ? mWaitTimeForDatagramSendingForLastMessageResponse : mWaitTimeForDatagramSendingResponse; ? mWaitTimeForDatagramSendingForLastMessageResponse.get() : mWaitTimeForDatagramSendingResponse.get(); logd("startWaitForDatagramSendingResponseTimer: datagramType=" + argument.datagramType + ", waitTime=" + waitTime); sendMessageDelayed(obtainMessage( Loading Loading @@ -1149,7 +1147,7 @@ public class DatagramDispatcher extends Handler { mPendingSmsMap.put(messageId, pendingSms); int datagramType = pendingSms.isMtSmsPolling ? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS; mLastSendRequestDatagramType = datagramType; mLastSendRequestDatagramType.set(datagramType); if (mDatagramController.needsWaitingForSatelliteConnected(datagramType)) { plogd("sendSms: wait for satellite connected"); Loading
src/java/com/android/internal/telephony/satellite/DatagramReceiver.java +81 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ 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; import com.android.internal.telephony.IVoidConsumer; import com.android.internal.telephony.Phone; Loading @@ -73,6 +74,9 @@ public class DatagramReceiver extends Handler { private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 2; private static final int EVENT_WAIT_FOR_DEVICE_ALIGNMENT_IN_DEMO_MODE_TIMED_OUT = 3; private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4; private static final int REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS = 5; private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 6; private static final int REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE = 7; /** Key used to read/write satellite datagramId in shared preferences. */ private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key"; Loading Loading @@ -498,6 +502,43 @@ public class DatagramReceiver extends Handler { handleEventDatagramWaitForConnectedStateTimedOut(); break; case REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS: { plogd("REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS"); SomeArgs args = (SomeArgs) msg.obj; int subId = (int) args.arg1; Consumer<Integer> callback = (Consumer<Integer>) args.arg2; try { handleRequestPollPendingSatelliteDatagrams(subId, callback); } finally { args.recycle(); } break; } case EVENT_SATELLITE_MODEM_STATE_CHANGED: { plogd("EVENT_SATELLITE_MODEM_STATE_CHANGED"); SomeArgs args = (SomeArgs) msg.obj; int state = (int) args.arg1; try { handleEventSatelliteModemStateChanged(state); } finally { args.recycle(); } break; } case REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE: { plogd("REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE"); SomeArgs args = (SomeArgs) msg.obj; boolean isAligned = (boolean) args.arg1; try { handleRequestSetDeviceAlignedWithSatellite(isAligned); } finally { args.recycle(); } break; } default: plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what); break; Loading Loading @@ -570,6 +611,20 @@ public class DatagramReceiver extends Handler { * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request. */ public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = subId; args.arg2 = callback; sendMessage(obtainMessage(REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS, args)); return; } handleRequestPollPendingSatelliteDatagrams(subId, callback); } private void handleRequestPollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) { plogd("handleRequestPollPendingSatelliteDatagrams"); if (!mDatagramController.isPollingInIdleState()) { // Poll request should be sent to satellite modem only when it is free. plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams."); Loading Loading @@ -658,6 +713,19 @@ public class DatagramReceiver extends Handler { * @param state Current satellite modem state. */ public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = state; sendMessage(obtainMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, args)); return; } handleEventSatelliteModemStateChanged(state); } 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) { Loading Loading @@ -775,7 +843,18 @@ public class DatagramReceiver extends Handler { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public void setDeviceAlignedWithSatellite(boolean isAligned) { protected void setDeviceAlignedWithSatellite(boolean isAligned) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = isAligned; sendMessage(obtainMessage(REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE, args)); return; } handleRequestSetDeviceAlignedWithSatellite(isAligned); } private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) { synchronized (mLock) { mIsAligned.set(isAligned); plogd("setDeviceAlignedWithSatellite: " + isAligned); Loading Loading @@ -849,7 +928,7 @@ public class DatagramReceiver extends Handler { } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public boolean isDatagramWaitForConnectedStateTimerStarted() { protected boolean isDatagramWaitForConnectedStateTimerStarted() { return hasMessages(EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT); } Loading
src/java/com/android/internal/telephony/satellite/PointingAppController.java +57 −1 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.Log; 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.flags.FeatureFlags; import java.util.ArrayList; Loading @@ -58,11 +59,14 @@ import java.util.function.Consumer; /** * PointingApp controller to manage interactions with PointingUI app. */ public class PointingAppController { public class PointingAppController extends Handler { private static final String TAG = "PointingAppController"; private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem"; private static final boolean DEBUG = !"user".equals(Build.TYPE); private static final int REQUEST_START_POINTING_UI = 1; private static final int REQUEST_REMOVE_LISTENER_FOR_POINTING_UI = 2; @NonNull private static PointingAppController sInstance; @NonNull private final Context mContext; Loading Loading @@ -125,6 +129,34 @@ public class PointingAppController { mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context); } @Override public void handleMessage(Message msg) { switch (msg.what) { case REQUEST_START_POINTING_UI: { plogd("REQUEST_START_POINTING_UI"); SomeArgs args = (SomeArgs) msg.obj; boolean needFullScreenPointingUI = (boolean) args.arg1; boolean isDemoMode = (boolean) args.arg2; boolean isEmergency = (boolean) args.arg3; try { handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency); } finally { args.recycle(); } break; } case REQUEST_REMOVE_LISTENER_FOR_POINTING_UI: { handleRequestRemoveListenerForPointingUI(); break; } default: ploge("PointingAppControllerHandler: unexpected message code: " + msg.what); break; } } /** * Set the flag mStartedSatelliteTransmissionUpdates to true or false based on the state of * transmission updates Loading Loading @@ -390,6 +422,20 @@ public class PointingAppController { */ public void startPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode, boolean isEmergency) { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { SomeArgs args = SomeArgs.obtain(); args.arg1 = needFullScreenPointingUI; args.arg2 = isDemoMode; args.arg3 = isEmergency; sendMessage(obtainMessage(REQUEST_START_POINTING_UI, args)); return; } handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency); } private void handleRequestStartPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode, boolean isEmergency) { String packageName = getPointingUiPackageName(); if (TextUtils.isEmpty(packageName)) { plogd("startPointingUI: config_pointing_ui_package is not set. Ignore the request"); Loading Loading @@ -437,6 +483,16 @@ public class PointingAppController { * Remove the Importance Listener For Pointing UI App once the satellite is disabled */ public void removeListenerForPointingUI() { if (mFeatureFlags.satelliteImproveMultiThreadDesign()) { sendMessage(obtainMessage(REQUEST_REMOVE_LISTENER_FOR_POINTING_UI)); return; } handleRequestRemoveListenerForPointingUI(); } private void handleRequestRemoveListenerForPointingUI() { plogd("handleRequestRemoveListenerForPointingUI"); synchronized (mListenerForPointingUIRegisteredLock) { if (mListenerForPointingUIRegistered) { mActivityManager.removeOnUidImportanceListener(mUidImportanceListener); Loading