Merge "Synchronize the execution of exitEmergencyMode and setEmergencyMode" into 24D1-dev
diff --git a/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
index e3eed00..fddeb06 100644
--- a/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
@@ -35,7 +35,9 @@
import android.telephony.DomainSelector;
import android.telephony.EmergencyRegistrationResult;
import android.telephony.NetworkRegistrationInfo;
+import android.telephony.PreciseDisconnectCause;
import android.telephony.data.ApnSetting;
+import android.telephony.ims.ImsReasonInfo;
import android.util.LocalLog;
import android.util.Log;
@@ -351,6 +353,10 @@
private boolean mIsTestMode = false;
+ private int mDisconnectCause = DisconnectCause.NOT_VALID;
+ private int mPreciseDisconnectCause = PreciseDisconnectCause.NOT_VALID;
+ private String mReasonMessage = null;
+
/**
* Creates an instance.
*
@@ -789,6 +795,51 @@
}
/**
+ * Save call disconnect info for error propagation.
+ * @param disconnectCause The code for the reason for the disconnect.
+ * @param preciseDisconnectCause The code for the precise reason for the disconnect.
+ * @param reasonMessage Description of the reason for the disconnect, not intended for the user
+ * to see.
+ */
+ public void setDisconnectCause(int disconnectCause, int preciseDisconnectCause,
+ String reasonMessage) {
+ mDisconnectCause = disconnectCause;
+ mPreciseDisconnectCause = preciseDisconnectCause;
+ mReasonMessage = reasonMessage;
+ }
+
+ public int getDisconnectCause() {
+ return mDisconnectCause;
+ }
+
+ public int getPreciseDisconnectCause() {
+ return mPreciseDisconnectCause;
+ }
+
+ public String getReasonMessage() {
+ return mReasonMessage;
+ }
+
+ /**
+ * @return imsReasonInfo Reason for the IMS call failure.
+ */
+ public @Nullable ImsReasonInfo getImsReasonInfo() {
+ if (getSelectionAttributes() == null) {
+ // Neither selectDomain(...) nor reselectDomain(...) has been called yet.
+ return null;
+ }
+
+ return getSelectionAttributes().getPsDisconnectCause();
+ }
+
+ /**
+ * @return phoneId To support localized message based on phoneId
+ */
+ public int getPhoneId() {
+ return getPhone().getPhoneId();
+ }
+
+ /**
* Dumps local log.
*/
public void dump(@NonNull PrintWriter printWriter) {
diff --git a/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
index 0fd9201..095d61f 100644
--- a/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
@@ -24,11 +24,9 @@
import android.telecom.PhoneAccount;
import android.telephony.AccessNetworkConstants.RadioAccessNetworkType;
import android.telephony.Annotation.DisconnectCauses;
-import android.telephony.DisconnectCause;
import android.telephony.DomainSelectionService;
import android.telephony.DomainSelectionService.EmergencyScanType;
import android.telephony.NetworkRegistrationInfo;
-import android.telephony.PreciseDisconnectCause;
import android.telephony.ims.ImsReasonInfo;
import com.android.internal.telephony.Phone;
@@ -41,9 +39,6 @@
public class NormalCallDomainSelectionConnection extends DomainSelectionConnection {
private static final boolean DBG = false;
- private int mDisconnectCause = DisconnectCause.NOT_VALID;
- private int mPreciseDisconnectCause = PreciseDisconnectCause.NOT_VALID;
- private String mReasonMessage = null;
private @Nullable DomainSelectionConnectionCallback mCallback;
@@ -130,49 +125,4 @@
}
return builder.build();
}
-
- /**
- * Save call disconnect info for error propagation.
- * @param disconnectCause The code for the reason for the disconnect.
- * @param preciseDisconnectCause The code for the precise reason for the disconnect.
- * @param reasonMessage Description of the reason for the disconnect, not intended for the user
- * to see.
- */
- public void setDisconnectCause(int disconnectCause, int preciseDisconnectCause,
- String reasonMessage) {
- mDisconnectCause = disconnectCause;
- mPreciseDisconnectCause = preciseDisconnectCause;
- mReasonMessage = reasonMessage;
- }
-
- public int getDisconnectCause() {
- return mDisconnectCause;
- }
-
- public int getPreciseDisconnectCause() {
- return mPreciseDisconnectCause;
- }
-
- public String getReasonMessage() {
- return mReasonMessage;
- }
-
- /**
- * @return imsReasonInfo Reason for the IMS call failure.
- */
- public @Nullable ImsReasonInfo getImsReasonInfo() {
- if (getSelectionAttributes() == null) {
- // Neither selectDomain(...) nor reselectDomain(...) has been called yet.
- return null;
- }
-
- return getSelectionAttributes().getPsDisconnectCause();
- }
-
- /**
- * @return phoneId To support localized message based on phoneId
- */
- public int getPhoneId() {
- return getPhone().getPhoneId();
- }
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramController.java b/src/java/com/android/internal/telephony/satellite/DatagramController.java
index 6783e38..204fc8e 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramController.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramController.java
@@ -16,10 +16,13 @@
package com.android.internal.telephony.satellite;
+import static android.telephony.SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_IDLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_OFF;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import android.annotation.NonNull;
import android.content.Context;
@@ -72,7 +75,7 @@
private int mSendSubId;
@GuardedBy("mLock")
private @SatelliteManager.SatelliteDatagramTransferState int mSendDatagramTransferState =
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
+ SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
@GuardedBy("mLock")
private int mSendPendingCount = 0;
@GuardedBy("mLock")
@@ -82,7 +85,7 @@
private int mReceiveSubId;
@GuardedBy("mLock")
private @SatelliteManager.SatelliteDatagramTransferState int mReceiveDatagramTransferState =
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
+ SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
@GuardedBy("mLock")
private int mReceivePendingCount = 0;
@GuardedBy("mLock")
@@ -132,7 +135,7 @@
* about datagram transfer state changes.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- protected DatagramController(@NonNull Context context, @NonNull Looper looper,
+ public DatagramController(@NonNull Context context, @NonNull Looper looper,
@NonNull PointingAppController pointingAppController) {
mContext = context;
mPointingAppController = pointingAppController;
@@ -188,6 +191,7 @@
* @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
*/
public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
+ logd("pollPendingSatelliteDatagrams");
mDatagramReceiver.pollPendingSatelliteDatagrams(subId, callback);
}
@@ -213,7 +217,6 @@
public void sendSatelliteDatagram(int subId, @SatelliteManager.DatagramType int datagramType,
@NonNull SatelliteDatagram datagram, boolean needFullScreenPointingUI,
@NonNull Consumer<Integer> callback) {
- pushDemoModeDatagram(datagramType, datagram);
mDatagramDispatcher.sendSatelliteDatagram(subId, datagramType, datagram,
needFullScreenPointingUI, callback);
}
@@ -239,10 +242,10 @@
mSendDatagramTransferState = datagramTransferState;
mSendPendingCount = sendPendingCount;
mSendErrorCode = errorCode;
-
notifyDatagramTransferStateChangedToSessionController();
mPointingAppController.updateSendDatagramTransferState(mSendSubId,
mSendDatagramTransferState, mSendPendingCount, mSendErrorCode);
+ retryPollPendingDatagramsInDemoMode();
}
}
@@ -271,6 +274,7 @@
notifyDatagramTransferStateChangedToSessionController();
mPointingAppController.updateReceiveDatagramTransferState(mReceiveSubId,
mReceiveDatagramTransferState, mReceivePendingCount, mReceiveErrorCode);
+ retryPollPendingDatagramsInDemoMode();
}
if (isPollingInIdleState()) {
@@ -300,9 +304,16 @@
mDatagramReceiver.onSatelliteModemStateChanged(state);
}
- void setDeviceAlignedWithSatellite(boolean isAligned) {
+ /**
+ * Set whether the device is aligned with the satellite.
+ */
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void setDeviceAlignedWithSatellite(boolean isAligned) {
mDatagramDispatcher.setDeviceAlignedWithSatellite(isAligned);
mDatagramReceiver.setDeviceAlignedWithSatellite(isAligned);
+ if (isAligned) {
+ retryPollPendingDatagramsInDemoMode();
+ }
}
@VisibleForTesting
@@ -332,14 +343,14 @@
public boolean isSendingInIdleState() {
synchronized (mLock) {
return (mSendDatagramTransferState
- == SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
+ == SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
}
}
public boolean isPollingInIdleState() {
synchronized (mLock) {
return (mReceiveDatagramTransferState
- == SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
+ == SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
}
}
@@ -380,8 +391,8 @@
* @param datagramType datagram type, only DATAGRAM_TYPE_SOS_MESSAGE will be saved
* @param datagram datagram The last datagram saved when sendSatelliteDatagramForDemo is called
*/
- @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- protected void pushDemoModeDatagram(@SatelliteManager.DatagramType int datagramType,
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void pushDemoModeDatagram(@SatelliteManager.DatagramType int datagramType,
SatelliteDatagram datagram) {
if (mIsDemoMode && datagramType == SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE) {
synchronized (mLock) {
@@ -484,6 +495,23 @@
mDatagramDispatcher.setShouldSendDatagramToModemInDemoMode(shouldSendToModemInDemoMode);
}
+ private void retryPollPendingDatagramsInDemoMode() {
+ synchronized (mLock) {
+ if (mIsDemoMode && isSendingInIdleState() && isPollingInIdleState()
+ && !mDemoModeDatagramList.isEmpty()) {
+ Consumer<Integer> internalCallback = new Consumer<Integer>() {
+ @Override
+ public void accept(Integer result) {
+ if (result != SATELLITE_RESULT_SUCCESS) {
+ logd("retryPollPendingDatagramsInDemoMode result: " + result);
+ }
+ }
+ };
+ pollPendingSatelliteDatagrams(DEFAULT_SUBSCRIPTION_ID, internalCallback);
+ }
+ }
+ }
+
private static void logd(@NonNull String log) {
Rlog.d(TAG, log);
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 83caf2e..1f98168 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -18,6 +18,7 @@
import static android.telephony.satellite.SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import static com.android.internal.telephony.satellite.DatagramController.ROUNDING_UNIT;
@@ -62,7 +63,7 @@
private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4;
private static final int EVENT_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_TIMED_OUT = 5;
private static final int EVENT_ABORT_SENDING_SATELLITE_DATAGRAMS_DONE = 6;
- private static final int CMD_POLL_PENDING_SATELLITE_DATAGRAMS = 7;
+ private static final int EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT = 7;
private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);
@NonNull private static DatagramDispatcher sInstance;
@NonNull private final Context mContext;
@@ -238,7 +239,8 @@
break;
}
}
- logd("EVENT_SEND_SATELLITE_DATAGRAM_DONE error: " + error);
+ logd("EVENT_SEND_SATELLITE_DATAGRAM_DONE error: " + error
+ + ", mIsDemoMode=" + mIsDemoMode);
/*
* The response should be ignored if either of the following hold
@@ -271,11 +273,7 @@
getPendingDatagramCount(), error);
mControllerMetricsStats.reportOutgoingDatagramSuccessCount(
argument.datagramType);
- if (mIsDemoMode) {
- sendMessageDelayed(
- obtainMessage(CMD_POLL_PENDING_SATELLITE_DATAGRAMS, request),
- getDemoTimeoutDuration());
- }
+ startWaitForSimulatedPollDatagramsDelayTimer(request);
if (getPendingDatagramCount() > 0) {
// Send response for current datagram
argument.callback.accept(error);
@@ -323,13 +321,10 @@
handleEventDatagramWaitForConnectedStateTimedOut();
break;
- case CMD_POLL_PENDING_SATELLITE_DATAGRAMS:
- if (mIsDemoMode) {
- request = (DatagramDispatcherHandlerRequest) msg.obj;
- SendSatelliteDatagramArgument argument =
- (SendSatelliteDatagramArgument) request.argument;
- pollPendingSatelliteDatagrams(argument.subId);
- }
+ case EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT:
+ request = (DatagramDispatcherHandlerRequest) msg.obj;
+ handleEventWaitForSimulatedPollDatagramsDelayTimedOut(
+ (SendSatelliteDatagramArgument) request.argument);
break;
default:
@@ -413,8 +408,11 @@
logd("setDemoMode: mIsDemoMode=" + mIsDemoMode);
}
+ /**
+ * Set whether the device is aligned with the satellite.
+ */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
- protected void setDeviceAlignedWithSatellite(boolean isAligned) {
+ public void setDeviceAlignedWithSatellite(boolean isAligned) {
synchronized (mLock) {
mIsAligned = isAligned;
logd("setDeviceAlignedWithSatellite: " + mIsAligned);
@@ -464,7 +462,7 @@
mSendSatelliteDatagramRequest = null;
SatelliteManager.SatelliteException exception =
new SatelliteManager.SatelliteException(
- SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
+ SATELLITE_RESULT_NOT_REACHABLE);
Message message = obtainMessage(EVENT_SEND_SATELLITE_DATAGRAM_DONE, request);
AsyncResult.forMessage(message, null, exception);
message.sendToTarget();
@@ -646,6 +644,7 @@
stopSatelliteAlignedTimer();
stopDatagramWaitForConnectedStateTimer();
stopWaitForDatagramSendingResponseTimer();
+ stopWaitForSimulatedPollDatagramsDelayTimer();
mIsDemoMode = false;
mSendSatelliteDatagramRequest = null;
mIsAligned = false;
@@ -703,12 +702,12 @@
mDatagramController.updateSendStatus(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED,
getPendingDatagramCount(),
- SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
+ SATELLITE_RESULT_NOT_REACHABLE);
mDatagramController.updateSendStatus(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
0, SatelliteManager.SATELLITE_RESULT_SUCCESS);
abortSendingPendingDatagrams(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
- SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
+ SATELLITE_RESULT_NOT_REACHABLE);
}
}
@@ -811,15 +810,38 @@
}
}
- private void pollPendingSatelliteDatagrams(int subId) {
- logd("pollPendingSatelliteDatagrams");
- Consumer<Integer> internalCallback = new Consumer<Integer>() {
- @Override
- public void accept(Integer result) {
- logd("pollPendingSatelliteDatagrams result: " + result);
- }
- };
- mDatagramController.pollPendingSatelliteDatagrams(subId, internalCallback);
+ private void startWaitForSimulatedPollDatagramsDelayTimer(
+ @NonNull DatagramDispatcherHandlerRequest request) {
+ if (mIsDemoMode) {
+ logd("startWaitForSimulatedPollDatagramsDelayTimer");
+ sendMessageDelayed(
+ obtainMessage(EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT, request),
+ getDemoTimeoutDuration());
+ } else {
+ logd("Should not start WaitForSimulatedPollDatagramsDelayTimer in non-demo mode");
+ }
+ }
+
+ private void stopWaitForSimulatedPollDatagramsDelayTimer() {
+ removeMessages(EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT);
+ }
+
+ private void handleEventWaitForSimulatedPollDatagramsDelayTimedOut(
+ @NonNull SendSatelliteDatagramArgument argument) {
+ if (mIsDemoMode) {
+ logd("handleEventWaitForSimulatedPollDatagramsDelayTimedOut");
+ mDatagramController.pushDemoModeDatagram(argument.datagramType, argument.datagram);
+ Consumer<Integer> internalCallback = new Consumer<Integer>() {
+ @Override
+ public void accept(Integer result) {
+ logd("pollPendingSatelliteDatagrams result: " + result);
+ }
+ };
+ mDatagramController.pollPendingSatelliteDatagrams(argument.subId, internalCallback);
+ } else {
+ logd("Unexpected EVENT_WAIT_FOR_SIMULATED_POLL_DATAGRAMS_DELAY_TIMED_OUT in "
+ + "non-demo mode");
+ }
}
long getDemoTimeoutDuration() {
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
index 6c52a8c..a4b1193 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramReceiver.java
@@ -743,7 +743,7 @@
}
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
- protected void setDeviceAlignedWithSatellite(boolean isAligned) {
+ public void setDeviceAlignedWithSatellite(boolean isAligned) {
synchronized (mLock) {
mIsAligned = isAligned;
logd("setDeviceAlignedWithSatellite: " + mIsAligned);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 287f839..d4dcb2d 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -78,6 +78,7 @@
import android.os.UserHandle;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
+import android.telephony.NetworkRegistrationInfo;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
@@ -87,6 +88,7 @@
import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
@@ -195,6 +197,7 @@
private static final int EVENT_SATELLITE_CAPABILITIES_CHANGED = 38;
private static final int EVENT_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMED_OUT = 39;
private static final int EVENT_SATELLITE_CONFIG_DATA_UPDATED = 40;
+ private static final int EVENT_SATELLITE_SUPPORTED_STATE_CHANGED = 41;
@NonNull private static SatelliteController sInstance;
@NonNull private final Context mContext;
@@ -248,7 +251,10 @@
private final AtomicBoolean mRegisteredForNtnSignalStrengthChanged = new AtomicBoolean(false);
private final AtomicBoolean mRegisteredForSatelliteCapabilitiesChanged =
new AtomicBoolean(false);
- private final AtomicBoolean mShouldReportNtnSignalStrength = new AtomicBoolean(false);
+ private final AtomicBoolean mIsModemEnabledReportingNtnSignalStrength =
+ new AtomicBoolean(false);
+ private final AtomicBoolean mRegisteredForSatelliteSupportedStateChanged =
+ new AtomicBoolean(false);
/**
* Map key: subId, value: callback to get error code of the provision request.
*/
@@ -272,6 +278,11 @@
*/
private final ConcurrentHashMap<IBinder, ISatelliteCapabilitiesCallback>
mSatelliteCapabilitiesChangedListeners = new ConcurrentHashMap<>();
+ /**
+ * Map key: binder of the callback, value: callback to receive supported state changed events.
+ */
+ private final ConcurrentHashMap<IBinder, ISatelliteSupportedStateCallback>
+ mSatelliteSupportedStateChangedListeners = new ConcurrentHashMap<>();
private final Object mIsSatelliteSupportedLock = new Object();
@GuardedBy("mIsSatelliteSupportedLock")
private Boolean mIsSatelliteSupported = null;
@@ -333,6 +344,14 @@
@NonNull private final SparseBooleanArray
mWasSatelliteConnectedViaCarrier = new SparseBooleanArray();
+ /**
+ * Key: Subscription ID; Value: set of
+ * {@link android.telephony.NetworkRegistrationInfo.ServiceType}
+ */
+ @GuardedBy("mSatelliteConnectedLock")
+ @NonNull private final Map<Integer, List<Integer>>
+ mSatModeCapabilitiesForCarrierRoaming = new HashMap<>();
+
@GuardedBy("mSatelliteConnectedLock")
@NonNull private final SparseBooleanArray
mIsSatelliteConnectedViaCarrierHysteresisTimeExpired = new SparseBooleanArray();
@@ -938,6 +957,8 @@
mWaitingForDisableSatelliteModemResponse = false;
}
}
+ // Request Ntn signal strength report when satellite enabled or disabled done.
+ updateNtnSignalStrengthReporting(argument.enableSatellite);
} else {
synchronized (mSatelliteEnabledRequestLock) {
if (mSatelliteEnabledRequest != null &&
@@ -1265,24 +1286,7 @@
if (DBG) {
logd("CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING: shouldReport=" + shouldReport);
}
- request = new SatelliteControllerHandlerRequest(shouldReport,
- SatelliteServiceUtils.getPhone());
- if (SATELLITE_RESULT_SUCCESS != evaluateOemSatelliteRequestAllowed(true)) {
- return;
- }
- if (!isSatelliteEnabled() || mShouldReportNtnSignalStrength.get() == shouldReport) {
- if (DBG) {
- logd("CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING: ignore request.");
- }
- return;
- }
- onCompleted = obtainMessage(EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE,
- request);
- if (shouldReport) {
- mSatelliteModemInterface.startSendingNtnSignalStrength(onCompleted);
- } else {
- mSatelliteModemInterface.stopSendingNtnSignalStrength(onCompleted);
- }
+ handleCmdUpdateNtnSignalStrengthReporting(shouldReport);
break;
}
@@ -1291,9 +1295,10 @@
request = (SatelliteControllerHandlerRequest) ar.userObj;
boolean shouldReport = (boolean) request.argument;
int errorCode = SatelliteServiceUtils.getSatelliteError(ar,
- "EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE");
+ "EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE: shouldReport="
+ + shouldReport);
if (errorCode == SATELLITE_RESULT_SUCCESS) {
- mShouldReportNtnSignalStrength.set(shouldReport);
+ mIsModemEnabledReportingNtnSignalStrength.set(shouldReport);
} else {
loge(((boolean) request.argument ? "startSendingNtnSignalStrength"
: "stopSendingNtnSignalStrength") + "returns " + errorCode);
@@ -1316,6 +1321,16 @@
break;
}
+ case EVENT_SATELLITE_SUPPORTED_STATE_CHANGED: {
+ ar = (AsyncResult) msg.obj;
+ if (ar.result == null) {
+ loge("EVENT_SATELLITE_SUPPORTED_STATE_CHANGED: result is null");
+ } else {
+ handleEventSatelliteSupportedStateChanged((boolean) ar.result);
+ }
+ break;
+ }
+
case EVENT_SATELLITE_CONFIG_DATA_UPDATED: {
handleEventConfigDataUpdated();
mSatelliteConfigUpdateChangedRegistrants.notifyRegistrants();
@@ -2166,6 +2181,43 @@
}
/**
+ * Registers for the satellite supported state changed.
+ *
+ * @param subId The subId of the subscription to register for supported state changed.
+ * @param callback The callback to handle the satellite supported state changed event.
+ *
+ * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+ */
+ @SatelliteManager.SatelliteResult public int registerForSatelliteSupportedStateChanged(
+ int subId, @NonNull ISatelliteSupportedStateCallback callback) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ logd("registerForSatelliteSupportedStateChanged: oemEnabledSatelliteFlag is disabled");
+ return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
+ }
+
+ mSatelliteSupportedStateChangedListeners.put(callback.asBinder(), callback);
+ return SATELLITE_RESULT_SUCCESS;
+ }
+
+ /**
+ * Unregisters for the satellite supported state changed.
+ * If callback was not registered before, the request will be ignored.
+ *
+ * @param subId The subId of the subscription to unregister for supported state changed.
+ * @param callback The callback that was passed to
+ * {@link #registerForSatelliteSupportedStateChanged(int, ISatelliteSupportedStateCallback)}.
+ */
+ public void unregisterForSatelliteSupportedStateChanged(
+ int subId, @NonNull ISatelliteSupportedStateCallback callback) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ logd("unregisterForSatelliteSupportedStateChanged: "
+ + "oemEnabledSatelliteFlag is disabled");
+ return;
+ }
+ mSatelliteSupportedStateChangedListeners.remove(callback.asBinder());
+ }
+
+ /**
* This API can be used by only CTS to update satellite vendor service package name.
*
* @param servicePackageName The package name of the satellite vendor service.
@@ -2579,33 +2631,92 @@
return true;
}
for (Phone phone : PhoneFactory.getPhones()) {
- if (isSatelliteSupportedViaCarrier(phone.getSubId())) {
- synchronized (mSatelliteConnectedLock) {
- Boolean isHysteresisTimeExpired =
- mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.get(
- phone.getSubId());
- if (isHysteresisTimeExpired != null && isHysteresisTimeExpired) {
- continue;
- }
-
- Long lastDisconnectedTime =
- mLastSatelliteDisconnectedTimesMillis.get(phone.getSubId());
- long satelliteConnectionHysteresisTime =
- getSatelliteConnectionHysteresisTimeMillis(phone.getSubId());
- if (lastDisconnectedTime != null
- && (getElapsedRealtime() - lastDisconnectedTime)
- <= satelliteConnectionHysteresisTime) {
- return true;
- } else {
- mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put(
- phone.getSubId(), true);
- }
- }
+ if (isInSatelliteModeForCarrierRoaming(phone)) {
+ logd("isSatelliteConnectedViaCarrierWithinHysteresisTime: "
+ + "subId:" + phone.getSubId()
+ + " is connected to satellite within hysteresis time");
+ return true;
}
}
return false;
}
+ /**
+ * Get whether device is connected to satellite via carrier.
+ *
+ * @param phone phone object
+ * @return {@code true} if the device is connected to satellite using the phone within the
+ * {@link CarrierConfigManager#KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT}
+ * duration, {@code false} otherwise.
+ */
+ public boolean isInSatelliteModeForCarrierRoaming(@Nullable Phone phone) {
+ if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
+ logd("isInSatelliteModeForCarrierRoaming: carrierEnabledSatelliteFlag is disabled");
+ return false;
+ }
+
+ if (phone == null) {
+ return false;
+ }
+
+ if (!isSatelliteSupportedViaCarrier(phone.getSubId())) {
+ return false;
+ }
+
+ ServiceState serviceState = phone.getServiceState();
+ if (serviceState != null && serviceState.isUsingNonTerrestrialNetwork()) {
+ return true;
+ }
+
+ synchronized (mSatelliteConnectedLock) {
+ Boolean isHysteresisTimeExpired =
+ mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.get(
+ phone.getSubId());
+ if (isHysteresisTimeExpired != null && isHysteresisTimeExpired) {
+ return false;
+ }
+
+ Long lastDisconnectedTime =
+ mLastSatelliteDisconnectedTimesMillis.get(phone.getSubId());
+ long satelliteConnectionHysteresisTime =
+ getSatelliteConnectionHysteresisTimeMillis(phone.getSubId());
+ if (lastDisconnectedTime != null
+ && (getElapsedRealtime() - lastDisconnectedTime)
+ <= satelliteConnectionHysteresisTime) {
+ return true;
+ } else {
+ mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put(
+ phone.getSubId(), true);
+ mSatModeCapabilitiesForCarrierRoaming.remove(phone.getSubId());
+ return false;
+ }
+ }
+ }
+
+ /**
+ * Return capabilities of carrier roaming satellite network.
+ *
+ * @param phone phone object
+ * @return The list of services supported by the carrier associated with the {@code subId}
+ */
+ @NonNull
+ public List<Integer> getCapabilitiesForCarrierRoamingSatelliteMode(Phone phone) {
+ if (!mFeatureFlags.carrierEnabledSatelliteFlag()) {
+ logd("getCapabilitiesForCarrierRoamingSatelliteMode: carrierEnabledSatelliteFlag"
+ + " is disabled");
+ return new ArrayList<>();
+ }
+
+ synchronized (mSatelliteConnectedLock) {
+ int subId = phone.getSubId();
+ if (mSatModeCapabilitiesForCarrierRoaming.containsKey(subId)) {
+ return mSatModeCapabilitiesForCarrierRoaming.get(subId);
+ }
+ }
+
+ return new ArrayList<>();
+ }
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected long getElapsedRealtime() {
return SystemClock.elapsedRealtime();
@@ -2888,6 +2999,7 @@
registerForSatelliteModemStateChanged();
registerForNtnSignalStrengthChanged();
registerForCapabilitiesChanged();
+ registerForSatelliteSupportedStateChanged();
requestIsSatelliteProvisioned(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
new ResultReceiver(this) {
@@ -2927,7 +3039,7 @@
loge(caller + ": mSatelliteSessionController is not initialized yet");
}
if (!enabled) {
- mShouldReportNtnSignalStrength.set(false);
+ mIsModemEnabledReportingNtnSignalStrength.set(false);
}
}
@@ -2991,6 +3103,16 @@
}
}
+ private void registerForSatelliteSupportedStateChanged() {
+ if (mSatelliteModemInterface.isSatelliteServiceSupported()) {
+ if (!mRegisteredForSatelliteSupportedStateChanged.get()) {
+ mSatelliteModemInterface.registerForSatelliteSupportedStateChanged(
+ this, EVENT_SATELLITE_SUPPORTED_STATE_CHANGED, null);
+ mRegisteredForSatelliteSupportedStateChanged.set(true);
+ }
+ }
+ }
+
private void handleEventSatelliteProvisionStateChanged(boolean provisioned) {
logd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned);
@@ -3099,6 +3221,53 @@
});
}
+ private void handleEventSatelliteSupportedStateChanged(boolean supported) {
+ logd("handleSatelliteSupportedStateChangedEvent: supported=" + supported);
+
+ synchronized (mIsSatelliteSupportedLock) {
+ if (mIsSatelliteSupported != null && mIsSatelliteSupported == supported) {
+ if (DBG) {
+ logd("current satellite support state and new supported state are matched,"
+ + " ignore update.");
+ }
+ return;
+ }
+ /* In case satellite has been reported as not support from modem, but satellite is
+ enabled, request disable satellite. */
+ synchronized (mIsSatelliteEnabledLock) {
+ if (!supported && mIsSatelliteEnabled != null && mIsSatelliteEnabled) {
+ logd("Invoke requestSatelliteEnabled(), supported=false, "
+ + "mIsSatelliteEnabled=true");
+ requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+ false /* enableSatellite */, false /* enableDemoMode */,
+ new IIntegerConsumer.Stub() {
+ @Override
+ public void accept(int result) {
+ logd("handleSatelliteSupportedStateChangedEvent: request "
+ + "satellite disable, result="
+ + result);
+ }
+ });
+
+ }
+ }
+ mIsSatelliteSupported = supported;
+ }
+
+ List<ISatelliteSupportedStateCallback> deadCallersList = new ArrayList<>();
+ mSatelliteSupportedStateChangedListeners.values().forEach(listener -> {
+ try {
+ listener.onSatelliteSupportedStateChanged(supported);
+ } catch (RemoteException e) {
+ logd("handleSatelliteSupportedStateChangedEvent RemoteException: " + e);
+ deadCallersList.add(listener);
+ }
+ });
+ deadCallersList.forEach(listener -> {
+ mSatelliteSupportedStateChangedListeners.remove(listener.asBinder());
+ });
+ }
+
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected void setSettingsKeyForSatelliteMode(int val) {
logd("setSettingsKeyForSatelliteMode val: " + val);
@@ -3224,12 +3393,17 @@
private void updatePlmnListPerCarrier(int subId) {
synchronized (mSupportedSatelliteServicesLock) {
List<String> carrierPlmnList, entitlementPlmnList;
- entitlementPlmnList = mEntitlementPlmnListPerCarrier.get(subId,
- new ArrayList<>()).stream().toList();
- if (!entitlementPlmnList.isEmpty()) {
- mMergedPlmnListPerCarrier.put(subId, entitlementPlmnList);
- logd("update it using entitlementPlmnList=" + entitlementPlmnList);
- return;
+ if (getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL,
+ false)) {
+ entitlementPlmnList = mEntitlementPlmnListPerCarrier.get(subId,
+ new ArrayList<>()).stream().toList();
+ logd("updatePlmnListPerCarrier: entitlementPlmnList=" + entitlementPlmnList
+ + " size=" + entitlementPlmnList.size());
+ if (!entitlementPlmnList.isEmpty()) {
+ mMergedPlmnListPerCarrier.put(subId, entitlementPlmnList);
+ logd("update it using entitlementPlmnList=" + entitlementPlmnList);
+ return;
+ }
}
SatelliteConfig satelliteConfig = getSatelliteConfig();
@@ -3356,8 +3530,10 @@
}
}
- /** If there is no cached entitlement plmn list, read it from the db and use it if it is not an
- * empty list. */
+ /**
+ * If there is no cached entitlement plmn list, read it from the db and use it if it is not an
+ * empty list.
+ */
private void updateEntitlementPlmnListPerCarrier(int subId) {
if (!getConfigForSubId(subId).getBoolean(KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, false)) {
logd("don't support entitlement");
@@ -3371,7 +3547,7 @@
List<String> entitlementPlmnList =
mSubscriptionManagerService.getSatelliteEntitlementPlmnList(subId);
if (entitlementPlmnList.isEmpty()) {
- loge("updateEntitlementPlmnListPerCarrier: no data for subId(" + subId + ")");
+ logd("updateEntitlementPlmnListPerCarrier: read empty list");
return;
}
logd("updateEntitlementPlmnListPerCarrier: entitlementPlmnList="
@@ -3722,6 +3898,14 @@
mWasSatelliteConnectedViaCarrier.put(phone.getSubId(), true);
mIsSatelliteConnectedViaCarrierHysteresisTimeExpired.put(
phone.getSubId(), false);
+
+ for (NetworkRegistrationInfo nri
+ : serviceState.getNetworkRegistrationInfoList()) {
+ if (nri.isNonTerrestrialNetwork()) {
+ mSatModeCapabilitiesForCarrierRoaming.put(phone.getSubId(),
+ nri.getAvailableServices());
+ }
+ }
} else {
Boolean connected = mWasSatelliteConnectedViaCarrier.get(phone.getSubId());
if (connected != null && connected) {
@@ -3925,6 +4109,49 @@
}
}
+ private void handleCmdUpdateNtnSignalStrengthReporting(boolean shouldReport) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ logd("handleCmdUpdateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ + "disabled");
+ return;
+ }
+
+ if (!isSatelliteEnabled()) {
+ logd("handleCmdUpdateNtnSignalStrengthReporting: ignore request, satellite is "
+ + "disabled");
+ return;
+ }
+
+ if (mIsModemEnabledReportingNtnSignalStrength.get() == shouldReport) {
+ logd("handleCmdUpdateNtnSignalStrengthReporting: ignore request. "
+ + "mIsModemEnabledReportingNtnSignalStrength="
+ + mIsModemEnabledReportingNtnSignalStrength.get());
+ return;
+ }
+
+ updateNtnSignalStrengthReporting(shouldReport);
+ }
+
+ private void updateNtnSignalStrengthReporting(boolean shouldReport) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ logd("updateNtnSignalStrengthReporting: oemEnabledSatelliteFlag is "
+ + "disabled");
+ return;
+ }
+
+ SatelliteControllerHandlerRequest request = new SatelliteControllerHandlerRequest(
+ shouldReport, SatelliteServiceUtils.getPhone());
+ Message onCompleted = obtainMessage(EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE,
+ request);
+ if (shouldReport) {
+ logd("updateNtnSignalStrengthReporting: startSendingNtnSignalStrength");
+ mSatelliteModemInterface.startSendingNtnSignalStrength(onCompleted);
+ } else {
+ logd("updateNtnSignalStrengthReporting: stopSendingNtnSignalStrength");
+ mSatelliteModemInterface.stopSendingNtnSignalStrength(onCompleted);
+ }
+ }
+
/**
* 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
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
index e51042f..7432d91 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
@@ -93,6 +93,8 @@
new RegistrantList();
@NonNull private final RegistrantList mSatelliteCapabilitiesChangedRegistrants =
new RegistrantList();
+ @NonNull private final RegistrantList mSatelliteSupportedStateChangedRegistrants =
+ new RegistrantList();
@NonNull private final ISatelliteListener mListener = new ISatelliteListener.Stub() {
@Override
@@ -158,6 +160,11 @@
mSatelliteCapabilitiesChangedRegistrants.notifyResult(
SatelliteServiceUtils.fromSatelliteCapabilities(satelliteCapabilities));
}
+
+ @Override
+ public void onSatelliteSupportedStateChanged(boolean supported) {
+ mSatelliteSupportedStateChangedRegistrants.notifyResult(supported);
+ }
};
/**
@@ -505,6 +512,27 @@
}
/**
+ * Registers for the satellite supported state changed.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ public void registerForSatelliteSupportedStateChanged(
+ @NonNull Handler h, int what, @Nullable Object obj) {
+ mSatelliteSupportedStateChangedRegistrants.add(h, what, obj);
+ }
+
+ /**
+ * Unregisters for the satellite supported state changed.
+ *
+ * @param h Handler to be removed from the registrant list.
+ */
+ public void unregisterForSatelliteSupportedStateChanged(@NonNull Handler h) {
+ mSatelliteSupportedStateChangedRegistrants.remove(h);
+ }
+
+ /**
* Request to enable or disable the satellite service listening mode.
* Listening mode allows the satellite service to listen for incoming pages.
*
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionInfoInternal.java b/src/java/com/android/internal/telephony/subscription/SubscriptionInfoInternal.java
index 82af4e8..bb77d5c 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionInfoInternal.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionInfoInternal.java
@@ -1217,7 +1217,22 @@
* @return {@code true} if the subscription is visible to the user.
*/
public boolean isVisible() {
- return !isOpportunistic() || TextUtils.isEmpty(mGroupUuid);
+ // Provisioning profile
+ if (getProfileClass() == SubscriptionManager.PROFILE_CLASS_PROVISIONING) {
+ return false;
+ }
+
+ // Satellite profile
+ if (getOnlyNonTerrestrialNetwork() == 1) {
+ return false;
+ }
+
+ // Opportunistic profile
+ if (isOpportunistic() && !TextUtils.isEmpty(mGroupUuid)) {
+ return false;
+ }
+
+ return true;
}
/**
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index fcbd9d0..bae43b6 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -124,6 +124,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
@@ -4412,13 +4413,12 @@
public List<String> getSatelliteEntitlementPlmnList(int subId) {
SubscriptionInfoInternal subInfo = mSubscriptionDatabaseManager.getSubscriptionInfoInternal(
subId);
- if (subInfo == null) {
- loge("getSatelliteEntitlementPlmnList: invalid subId=" + subId);
- return new ArrayList<>();
- }
- return Arrays.stream(subInfo.getSatelliteEntitlementPlmns().split(",")).collect(
- Collectors.toList());
+ return Optional.ofNullable(subInfo)
+ .map(SubscriptionInfoInternal::getSatelliteEntitlementPlmns)
+ .filter(s -> !s.isEmpty())
+ .map(s -> Arrays.stream(s.split(",")).collect(Collectors.toList()))
+ .orElse(new ArrayList<>());
}
/**
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
index 47f8ce2..5fd7a77 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
@@ -22,6 +22,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@@ -42,8 +43,10 @@
import android.telecom.PhoneAccount;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
+import android.telephony.DisconnectCause;
import android.telephony.DomainSelectionService;
import android.telephony.EmergencyRegistrationResult;
+import android.telephony.PreciseDisconnectCause;
import android.telephony.data.ApnSetting;
import android.telephony.ims.ImsReasonInfo;
import android.testing.AndroidTestingRunner;
@@ -773,6 +776,26 @@
verify(mDomainSelectionController, times(1)).selectDomain(any(), eq(transportCallback));
}
+ @Test
+ @SmallTest
+ public void testSetDisconnectCause() throws Exception {
+ mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
+ mDomainSelectionController);
+
+ assertEquals(DisconnectCause.NOT_VALID, mDsc.getDisconnectCause());
+ assertEquals(PreciseDisconnectCause.NOT_VALID, mDsc.getPreciseDisconnectCause());
+ assertEquals(mPhone.getPhoneId(), mDsc.getPhoneId());
+
+ String reason = "No SIM or SIM error";
+ mDsc.setDisconnectCause(DisconnectCause.ICC_ERROR,
+ PreciseDisconnectCause.NO_VALID_SIM, reason);
+
+ assertEquals(DisconnectCause.ICC_ERROR, mDsc.getDisconnectCause());
+ assertEquals(PreciseDisconnectCause.NO_VALID_SIM, mDsc.getPreciseDisconnectCause());
+ assertEquals(reason, mDsc.getReasonMessage());
+ assertEquals(mPhone.getPhoneId(), mDsc.getPhoneId());
+ }
+
private DomainSelectionConnection createConnection(Phone phone, int selectorType,
boolean isEmergency, DomainSelectionController controller) throws Exception {
DomainSelectionConnection dsc = new DomainSelectionConnection(phone,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java
new file mode 100644
index 0000000..e6689dd
--- /dev/null
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramControllerTest.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony.satellite;
+
+import static android.telephony.satellite.SatelliteManager.DATAGRAM_TYPE_SOS_MESSAGE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.Looper;
+import android.telephony.satellite.SatelliteDatagram;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import com.android.internal.telephony.TelephonyTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.function.Consumer;
+
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class DatagramControllerTest extends TelephonyTest {
+ private static final String TAG = "DatagramControllerTest";
+
+ private DatagramController mDatagramControllerUT;
+
+ @Mock private DatagramReceiver mMockDatagramReceiver;
+ @Mock private DatagramDispatcher mMockDatagramDispatcher;
+ @Mock private PointingAppController mMockPointingAppController;
+ @Mock private SatelliteSessionController mMockSatelliteSessionController;
+
+ private static final int SUB_ID = 0;
+
+ @Before
+ public void setUp() throws Exception {
+ super.setUp(getClass().getSimpleName());
+ MockitoAnnotations.initMocks(this);
+ logd(TAG + " Setup!");
+
+ replaceInstance(DatagramDispatcher.class, "sInstance", null,
+ mMockDatagramDispatcher);
+ replaceInstance(DatagramReceiver.class, "sInstance", null,
+ mMockDatagramReceiver);
+ replaceInstance(SatelliteSessionController.class, "sInstance", null,
+ mMockSatelliteSessionController);
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ mDatagramControllerUT = new DatagramController(
+ mContext, Looper.myLooper(), mMockPointingAppController);
+
+ // Move both send and receive to IDLE state
+ mDatagramControllerUT.updateSendStatus(SUB_ID, SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
+ 0, SATELLITE_RESULT_SUCCESS);
+ mDatagramControllerUT.updateReceiveStatus(SUB_ID, SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
+ 0, SATELLITE_RESULT_SUCCESS);
+ pushDemoModeSosDatagram();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ logd(TAG + " tearDown");
+ super.tearDown();
+ }
+
+ @Test
+ public void testUpdateSendStatus() throws Exception {
+ testUpdateSendStatus(true, SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING);
+ testUpdateSendStatus(true, SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
+ testUpdateSendStatus(false, SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING);
+ }
+
+ @Test
+ public void testUpdateReceiveStatus() throws Exception {
+ testUpdateReceiveStatus(true, SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING);
+ testUpdateReceiveStatus(true, SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE);
+ testUpdateReceiveStatus(false, SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING);
+ }
+
+ @Test
+ public void testSetDeviceAlignedWithSatellite() throws Exception {
+ testSetDeviceAlignedWithSatellite(true);
+ testSetDeviceAlignedWithSatellite(false);
+ }
+
+ private void testUpdateSendStatus(boolean isDemoMode, int sendState) {
+ mDatagramControllerUT.setDemoMode(isDemoMode);
+ clearAllInvocations();
+
+ int sendPendingCount = 1;
+ int errorCode = SATELLITE_RESULT_SUCCESS;
+ mDatagramControllerUT.updateSendStatus(SUB_ID, sendState, sendPendingCount, errorCode);
+
+ verify(mMockSatelliteSessionController)
+ .onDatagramTransferStateChanged(eq(sendState), anyInt());
+ verify(mMockPointingAppController).updateSendDatagramTransferState(
+ eq(SUB_ID), eq(sendState), eq(sendPendingCount), eq(errorCode));
+
+ if (isDemoMode) {
+ if (sendState == SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE) {
+ verify(mMockDatagramReceiver).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ }
+ } else {
+ verify(mMockDatagramReceiver, never()).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ }
+ }
+
+ private void testUpdateReceiveStatus(boolean isDemoMode, int receiveState) {
+ mDatagramControllerUT.setDemoMode(isDemoMode);
+ clearAllInvocations();
+
+ int receivePendingCount = 1;
+ int errorCode = SATELLITE_RESULT_SUCCESS;
+ mDatagramControllerUT.updateReceiveStatus(
+ SUB_ID, receiveState, receivePendingCount, errorCode);
+
+ verify(mMockSatelliteSessionController)
+ .onDatagramTransferStateChanged(anyInt(), eq(receiveState));
+ verify(mMockPointingAppController).updateReceiveDatagramTransferState(
+ eq(SUB_ID), eq(receiveState), eq(receivePendingCount), eq(errorCode));
+
+ if (isDemoMode && receiveState == SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE) {
+ verify(mMockDatagramReceiver).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ } else {
+ verify(mMockDatagramReceiver, never()).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ }
+ }
+
+ private void testSetDeviceAlignedWithSatellite(boolean isAligned) {
+ mDatagramControllerUT.setDemoMode(true);
+ clearAllInvocations();
+
+ mDatagramControllerUT.setDeviceAlignedWithSatellite(isAligned);
+ verify(mMockDatagramDispatcher).setDeviceAlignedWithSatellite(eq(isAligned));
+ verify(mMockDatagramReceiver).setDeviceAlignedWithSatellite(eq(isAligned));
+ if (isAligned) {
+ verify(mMockDatagramReceiver).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ } else {
+ verify(mMockDatagramReceiver, never()).pollPendingSatelliteDatagrams(
+ anyInt(), any(Consumer.class));
+ }
+ }
+
+ private void clearAllInvocations() {
+ clearInvocations(mMockSatelliteSessionController);
+ clearInvocations(mMockPointingAppController);
+ clearInvocations(mMockDatagramReceiver);
+ clearInvocations(mMockDatagramDispatcher);
+ }
+
+ private void pushDemoModeSosDatagram() {
+ String testMessage = "This is a test datagram message";
+ SatelliteDatagram datagram = new SatelliteDatagram(testMessage.getBytes());
+ mDatagramControllerUT.setDemoMode(true);
+ mDatagramControllerUT.pushDemoModeDatagram(DATAGRAM_TYPE_SOS_MESSAGE, datagram);
+ }
+}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
index 79f1928..cfb8a8d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -17,6 +17,7 @@
package com.android.internal.telephony.satellite;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import static com.android.internal.telephony.satellite.DatagramController.SATELLITE_ALIGN_TIMEOUT;
@@ -91,8 +92,7 @@
TimeUnit.SECONDS.toMillis(60);
private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);
- private DatagramDispatcher mDatagramDispatcherUT;
- private TestDatagramDispatcher mTestDemoModeDatagramDispatcher;
+ private TestDatagramDispatcher mDatagramDispatcherUT;
@Mock private DatagramController mMockDatagramController;
@Mock private DatagramReceiver mMockDatagramReceiver;
@@ -139,9 +139,7 @@
mMockSatelliteSessionController);
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
- mDatagramDispatcherUT = DatagramDispatcher.make(mContext, Looper.myLooper(),
- mMockDatagramController);
- mTestDemoModeDatagramDispatcher = new TestDatagramDispatcher(mContext, Looper.myLooper(),
+ mDatagramDispatcherUT = new TestDatagramDispatcher(mContext, Looper.myLooper(),
mMockDatagramController);
mResultListener = new LinkedBlockingQueue<>(1);
@@ -155,7 +153,6 @@
logd(TAG + " tearDown");
mDatagramDispatcherUT.destroy();
mDatagramDispatcherUT = null;
- mTestDemoModeDatagramDispatcher = null;
mResultListener = null;
mDatagram = null;
mInOrder = null;
@@ -185,7 +182,7 @@
mInOrder.verify(mMockDatagramController).needsWaitingForSatelliteConnected();
mInOrder.verify(mMockDatagramController).updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController).getDatagramWaitTimeForConnectedState();
verifyZeroInteractions(mMockSatelliteModemInterface);
assertTrue(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
@@ -198,21 +195,21 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
- assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
@@ -239,7 +236,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
assertEquals(1, mResultListener.size());
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
@@ -308,19 +305,19 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
- assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
@@ -338,7 +335,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(1),
@@ -346,7 +343,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
@@ -378,7 +375,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED), eq(0),
@@ -386,7 +383,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
assertThat(mResultListener.peek()).isEqualTo(
@@ -397,16 +394,16 @@
public void testSendSatelliteDatagram_DemoMode_Align_Success() throws Exception {
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[3];
- mTestDemoModeDatagramDispatcher.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
+ mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
new AsyncResult(message.obj, null, null))
.sendToTarget();
return null;
}).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
anyBoolean(), anyBoolean(), any(Message.class));
- mTestDemoModeDatagramDispatcher.setDemoMode(true);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(true);
+ mDatagramDispatcherUT.setDemoMode(true);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
true, mResultListener::offer);
processAllMessages();
@@ -416,43 +413,43 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
- assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
- mTestDemoModeDatagramDispatcher.setDemoMode(false);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(false);
+ eq(SATELLITE_RESULT_SUCCESS));
+ assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
+ mDatagramDispatcherUT.setDemoMode(false);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
}
@Test
public void testSendSatelliteDatagram_DemoMode_Align_failed() throws Exception {
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[3];
- mTestDemoModeDatagramDispatcher.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
+ mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
new AsyncResult(message.obj, null, null))
.sendToTarget();
return null;
}).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
anyBoolean(), anyBoolean(), any(Message.class));
- long previousTimer = mTestDemoModeDatagramDispatcher.getSatelliteAlignedTimeoutDuration();
- mTestDemoModeDatagramDispatcher.setDemoMode(true);
- mTestDemoModeDatagramDispatcher.setDuration(TEST_EXPIRE_TIMER_SATELLITE_ALIGN);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(false);
+ long previousTimer = mDatagramDispatcherUT.getSatelliteAlignedTimeoutDuration();
+ mDatagramDispatcherUT.setDemoMode(true);
+ mDatagramDispatcherUT.setDuration(TEST_EXPIRE_TIMER_SATELLITE_ALIGN);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
true, mResultListener::offer);
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
processAllFutureMessages();
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
@@ -461,12 +458,15 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
- mTestDemoModeDatagramDispatcher.setDemoMode(false);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(false);
- mTestDemoModeDatagramDispatcher.setDuration(previousTimer);
+ verify(mMockDatagramController, never()).pollPendingSatelliteDatagrams(anyInt(), any());
+ verify(mMockDatagramController, never()).pushDemoModeDatagram(
+ anyInt(), any(SatelliteDatagram.class));
+ mDatagramDispatcherUT.setDemoMode(false);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
+ mDatagramDispatcherUT.setDuration(previousTimer);
}
@Test
@@ -474,16 +474,16 @@
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[3];
mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
- new AsyncResult(message.obj, SatelliteManager.SATELLITE_RESULT_SUCCESS,
+ new AsyncResult(message.obj, SATELLITE_RESULT_SUCCESS,
null)).sendToTarget();
return null;
}).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
anyBoolean(), anyBoolean(), any(Message.class));
- mTestDemoModeDatagramDispatcher.setDemoMode(true);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(true);
+ mDatagramDispatcherUT.setDemoMode(true);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
replaceInstance(PhoneFactory.class, "sPhones", null, new Phone[] {mPhone});
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE2, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE2, mDatagram,
true, mResultListener::offer);
processAllMessages();
@@ -493,22 +493,22 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING), eq(1),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
- assertThat(mResultListener.peek()).isEqualTo(SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
- eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(SATELLITE_RESULT_SUCCESS));
- mTestDemoModeDatagramDispatcher.setDemoMode(false);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(false);
+ mDatagramDispatcherUT.setDemoMode(false);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
}
@Test
@@ -549,7 +549,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(anyInt(),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
- eq(0), eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(0), eq(SATELLITE_RESULT_SUCCESS));
}
@Test
@@ -562,7 +562,7 @@
mInOrder.verify(mMockDatagramController)
.updateSendStatus(anyInt(),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE),
- eq(0), eq(SatelliteManager.SATELLITE_RESULT_SUCCESS));
+ eq(0), eq(SATELLITE_RESULT_SUCCESS));
}
@Test
@@ -572,68 +572,84 @@
doAnswer(invocation -> {
Message message = (Message) invocation.getArguments()[3];
- mTestDemoModeDatagramDispatcher.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
+ mDatagramDispatcherUT.obtainMessage(2 /*EVENT_SEND_SATELLITE_DATAGRAM_DONE*/,
new AsyncResult(message.obj, null, null))
.sendToTarget();
return null;
}).when(mMockSatelliteModemInterface).sendSatelliteDatagram(any(SatelliteDatagram.class),
anyBoolean(), anyBoolean(), any(Message.class));
- mTestDemoModeDatagramDispatcher.setDemoMode(true);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(true);
+ mDatagramDispatcherUT.setDemoMode(true);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(true);
mIntegerConsumerSemaphore.drainPermits();
// Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is true
- mTestDemoModeDatagramDispatcher.setShouldSendDatagramToModemInDemoMode(null);
+ mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null);
mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, true);
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
true, mIntegerConsumer);
processAllMessages();
+ moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
+ processAllMessages();
waitForIntegerConsumerResult(1);
- assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS,
+ assertEquals(SATELLITE_RESULT_SUCCESS,
(int) mIntegerConsumerResult.get(0));
mIntegerConsumerResult.clear();
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
+ moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
+ processAllMessages();
+ verify(mMockDatagramController).pushDemoModeDatagram(
+ anyInt(), any(SatelliteDatagram.class));
+ verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());
+
// Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is false
reset(mMockSatelliteModemInterface);
- mTestDemoModeDatagramDispatcher.setShouldSendDatagramToModemInDemoMode(null);
+ mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null);
mContextFixture.putBooleanResource(mConfigSendSatelliteDatagramToModemInDemoMode, false);
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
true, mIntegerConsumer);
processAllMessages();
moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
processAllMessages();
- verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());
-
waitForIntegerConsumerResult(1);
- assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS,
+ assertEquals(SATELLITE_RESULT_SUCCESS,
(int) mIntegerConsumerResult.get(0));
mIntegerConsumerResult.clear();
verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
+ moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
+ processAllMessages();
+ verify(mMockDatagramController, times(2)).pushDemoModeDatagram(
+ anyInt(), any(SatelliteDatagram.class));
+ verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any());
+
// Send datagram one more time
reset(mMockSatelliteModemInterface);
- mTestDemoModeDatagramDispatcher.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
+ mDatagramDispatcherUT.sendSatelliteDatagram(SUB_ID, DATAGRAM_TYPE1, mDatagram,
true, mIntegerConsumer);
processAllMessages();
moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
processAllMessages();
- verify(mMockDatagramController, times(2)).pollPendingSatelliteDatagrams(anyInt(), any());
-
waitForIntegerConsumerResult(1);
- assertEquals(SatelliteManager.SATELLITE_RESULT_SUCCESS,
+ assertEquals(SATELLITE_RESULT_SUCCESS,
(int) mIntegerConsumerResult.get(0));
mIntegerConsumerResult.clear();
verify(mMockSatelliteModemInterface, never()).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
- mTestDemoModeDatagramDispatcher.setDemoMode(false);
- mTestDemoModeDatagramDispatcher.setDeviceAlignedWithSatellite(false);
- mTestDemoModeDatagramDispatcher.setShouldSendDatagramToModemInDemoMode(null);
+ moveTimeForward(TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE);
+ processAllMessages();
+ verify(mMockDatagramController, times(3)).pushDemoModeDatagram(
+ anyInt(), any(SatelliteDatagram.class));
+ verify(mMockDatagramController, times(3)).pollPendingSatelliteDatagrams(anyInt(), any());
+
+ mDatagramDispatcherUT.setDemoMode(false);
+ mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
+ mDatagramDispatcherUT.setShouldSendDatagramToModemInDemoMode(null);
}
private boolean waitForIntegerConsumerResult(int expectedNumberOfEvents) {
@@ -665,7 +681,7 @@
}
@Override
- protected void setDeviceAlignedWithSatellite(boolean isAligned) {
+ public void setDeviceAlignedWithSatellite(boolean isAligned) {
super.setDeviceAlignedWithSatellite(isAligned);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
index 5a1a8f7..0a07f03 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramReceiverTest.java
@@ -324,6 +324,7 @@
mTestDemoModeDatagramReceiver.setDemoMode(true);
mTestDemoModeDatagramReceiver.setDeviceAlignedWithSatellite(true);
when(mMockDatagramController.popDemoModeDatagram()).thenReturn(mDatagram);
+
mTestDemoModeDatagramReceiver.pollPendingSatelliteDatagrams(SUB_ID, mResultListener::offer);
processAllMessages();
verify(mMockDatagramController, times(1)).popDemoModeDatagram();
@@ -478,7 +479,7 @@
}
@Override
- protected void setDeviceAlignedWithSatellite(boolean isAligned) {
+ public void setDeviceAlignedWithSatellite(boolean isAligned) {
super.setDeviceAlignedWithSatellite(isAligned);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index 0f77e31..b6e4b6b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -106,6 +106,7 @@
import android.telephony.satellite.ISatelliteDatagramCallback;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
+import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
@@ -2477,12 +2478,16 @@
processAllMessages();
mSatelliteControllerUT.elapsedRealtime = 0;
assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
when(mServiceState.isUsingNonTerrestrialNetwork()).thenReturn(false);
when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false);
sendServiceStateChangedEvent();
processAllMessages();
assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
// Last satellite connected time of Phone2 should be 0
when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(true);
@@ -2492,6 +2497,8 @@
mSatelliteControllerUT.elapsedRealtime = 2 * 60 * 1000;
// But Phone2 is connected to NTN right now
assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
+ assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
// Last satellite disconnected time of Phone2 should be 2 * 60 * 1000
when(mServiceState2.isUsingNonTerrestrialNetwork()).thenReturn(false);
@@ -2499,10 +2506,14 @@
processAllMessages();
// Current time (2) - last disconnected time (2) < hysteresis timeout (1)
assertTrue(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
+ assertTrue(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
// Current time (4) - last disconnected time (2) > hysteresis timeout (1)
mSatelliteControllerUT.elapsedRealtime = 4 * 60 * 1000;
assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime());
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone));
+ assertFalse(mSatelliteControllerUT.isInSatelliteModeForCarrierRoaming(mPhone2));
}
@Test
@@ -2669,67 +2680,41 @@
throws Exception {
logd("testPassSatellitePlmnToModemAfterUpdateSatelliteEntitlementStatus");
when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true);
+
replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier",
mSatelliteControllerUT, new SparseArray<>());
- List<String> overlayConfigPlmnList = new ArrayList<>();
+ List<String> overlayConfigPlmnList = new ArrayList<>();
replaceInstance(SatelliteController.class, "mSatellitePlmnListFromOverlayConfig",
mSatelliteControllerUT, overlayConfigPlmnList);
+ mCarrierConfigBundle.putBoolean(
+ CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
+ mCarrierConfigBundle.putBoolean(CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL,
+ true);
- // If the PlmnListPerCarrier and the overlay config plmn list are empty verify passing to
- // the modem.
+ // If the entitlement plmn list, the carrier plmn list and the overlay config plmn list
+ // are empty verify not passing to the modem.
+ reset(mMockSatelliteModemInterface);
List<String> entitlementPlmnList = new ArrayList<>();
mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
entitlementPlmnList, mIIntegerConsumer);
+ verify(mMockSatelliteModemInterface, never()).requestSatelliteEnabled(anyBoolean(),
+ anyBoolean(), any(Message.class));
- List<String> plmnListPerCarrier = mSatelliteControllerUT.getSatellitePlmnsForCarrier(
- SUB_ID);
- List<String> allSatellitePlmnList = SatelliteServiceUtils.mergeStrLists(
- plmnListPerCarrier, overlayConfigPlmnList);
-
- assertEquals(new ArrayList<>(), plmnListPerCarrier);
- assertEquals(new ArrayList<>(), allSatellitePlmnList);
- verify(mMockSatelliteModemInterface, times(1)).setSatellitePlmn(anyInt(),
- eq(plmnListPerCarrier), eq(allSatellitePlmnList), any(Message.class));
-
- // If the PlmnListPerCarrier and the overlay config plmn list are exist but
- // KEY_SATELLITE_ATTACH_SUPPORTED_BOOL is false, verify passing to the modem.
+ // If the entitlement plmn list and the overlay config plmn list are available and the
+ // carrier plmn list is empty verify passing to the modem.
+ reset(mMockSatelliteModemInterface);
entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "00103"}).toList();
+ List<String> mergedPlmnList = entitlementPlmnList;
overlayConfigPlmnList =
Arrays.stream(new String[]{"00101", "00102", "00104"}).toList();
replaceInstance(SatelliteController.class, "mSatellitePlmnListFromOverlayConfig",
mSatelliteControllerUT, overlayConfigPlmnList);
+ verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
+ overlayConfigPlmnList);
- mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, true,
- entitlementPlmnList, mIIntegerConsumer);
-
- plmnListPerCarrier = mSatelliteControllerUT.getSatellitePlmnsForCarrier(SUB_ID);
- assertEquals(new ArrayList<>(), plmnListPerCarrier);
- allSatellitePlmnList = SatelliteServiceUtils.mergeStrLists(
- entitlementPlmnList, overlayConfigPlmnList);
- verify(mMockSatelliteModemInterface, times(1)).setSatellitePlmn(anyInt(),
- eq(entitlementPlmnList), eq(allSatellitePlmnList), any(Message.class));
-
- // If the PlmnListPerCarrier and the overlay config plmn list are exist and
- // KEY_SATELLITE_ATTACH_SUPPORTED_BOOL is true verify passing the modem.
+ // If the entitlement plmn list, the overlay config plmn list and the carrier plmn list
+ // are available, verify passing to the modem.
reset(mMockSatelliteModemInterface);
- mCarrierConfigBundle.putBoolean(CarrierConfigManager.KEY_SATELLITE_ATTACH_SUPPORTED_BOOL,
- true);
-
- mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, true,
- entitlementPlmnList, mIIntegerConsumer);
-
- plmnListPerCarrier = mSatelliteControllerUT.getSatellitePlmnsForCarrier(SUB_ID);
- allSatellitePlmnList = SatelliteServiceUtils.mergeStrLists(
- plmnListPerCarrier, overlayConfigPlmnList);
-
- assertEquals(entitlementPlmnList, plmnListPerCarrier);
- verify(mMockSatelliteModemInterface, times(1)).setSatellitePlmn(anyInt(),
- eq(plmnListPerCarrier), eq(allSatellitePlmnList), any(Message.class));
-
- // If the PlmnListPerCarrier and the overlay config plmn list are exist verify passing
- // the modem.
- reset(mMockSatelliteModemInterface);
- entitlementPlmnList = Arrays.stream(new String[]{"00101", "00102", "00103"}).toList();
Map<Integer, Map<String, Set<Integer>>>
satelliteServicesSupportedByCarriers = new HashMap<>();
List<String> carrierConfigPlmnList = Arrays.stream(new String[]{"00105", "00106"}).toList();
@@ -2739,19 +2724,32 @@
satelliteServicesSupportedByCarriers.put(SUB_ID, plmnAndService);
replaceInstance(SatelliteController.class, "mSatelliteServicesSupportedByCarriers",
mSatelliteControllerUT, satelliteServicesSupportedByCarriers);
- overlayConfigPlmnList = Arrays.stream(new String[]{"00101", "00102", "00104"}).toList();
- replaceInstance(SatelliteController.class, "mSatellitePlmnListFromOverlayConfig",
- mSatelliteControllerUT, overlayConfigPlmnList);
- List<String> mergedPlmnList = entitlementPlmnList;
+ verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
+ overlayConfigPlmnList);
- mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, true,
+ // If the entitlement plmn list is empty and the overlay config plmn list and the carrier
+ // plmn list are available, verify not passing to the modem.
+ reset(mMockSatelliteModemInterface);
+ entitlementPlmnList = new ArrayList<>();
+ mergedPlmnList = carrierConfigPlmnList;
+ verifyPassingToModemAfterQueryCompleted(entitlementPlmnList, mergedPlmnList,
+ overlayConfigPlmnList);
+ }
+
+ private void verifyPassingToModemAfterQueryCompleted(List<String> entitlementPlmnList,
+ List<String> mergedPlmnList, List<String> overlayConfigPlmnList) {
+ mSatelliteControllerUT.onSatelliteEntitlementStatusUpdated(SUB_ID, false,
entitlementPlmnList, mIIntegerConsumer);
- plmnListPerCarrier = mSatelliteControllerUT.getSatellitePlmnsForCarrier(SUB_ID);
- allSatellitePlmnList = SatelliteServiceUtils.mergeStrLists(
+ List<String> plmnListPerCarrier = mSatelliteControllerUT.getSatellitePlmnsForCarrier(
+ SUB_ID);
+ List<String> allSatellitePlmnList = SatelliteServiceUtils.mergeStrLists(
plmnListPerCarrier, overlayConfigPlmnList);
assertEquals(mergedPlmnList, plmnListPerCarrier);
+ if (overlayConfigPlmnList.isEmpty()) {
+ assertEquals(plmnListPerCarrier, allSatellitePlmnList);
+ }
verify(mMockSatelliteModemInterface, times(1)).setSatellitePlmn(anyInt(),
eq(plmnListPerCarrier), eq(allSatellitePlmnList), any(Message.class));
}
@@ -2879,8 +2877,11 @@
public void testUpdatePlmnListPerCarrier() throws Exception {
logd("testUpdatePlmnListPerCarrier");
when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true);
+
replaceInstance(SatelliteController.class, "mMergedPlmnListPerCarrier",
mSatelliteControllerUT, new SparseArray<>());
+ mCarrierConfigBundle.putBoolean(
+ CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL, true);
List<String> plmnListPerCarrier;
// verify whether an empty list is returned with conditions below
@@ -2996,8 +2997,8 @@
logd("testUpdateEntitlementPlmnListPerCarrier");
when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(true);
- // If the Satellite entitlement plmn list read from the DB is empty and carrier config
- // plmn list also is empty , check whether an empty list is returned when calling
+ // If the Satellite entitlement plmn list read from the DB is empty list and carrier
+ // config plmn list also is empty , check whether an empty list is returned when calling
// getSatellitePlmnsForCarrier before the entitlement query.
doReturn(new ArrayList<>()).when(
mMockSubscriptionManagerService).getSatelliteEntitlementPlmnList(anyInt());
@@ -3196,6 +3197,212 @@
verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
}
+ @Test
+ public void testUpdateNtnSignalStrentghReportWithFeatureFlagEnabled() {
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+
+ mIsSatelliteEnabledSemaphore.drainPermits();
+ mIIntegerConsumerResults.clear();
+ resetSatelliteControllerUT();
+
+ // Successfully provisioned
+ reset(mMockSatelliteModemInterface);
+ doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ sendProvisionedStateChangedEvent(true, null);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+ sendProvisionedStateChangedEvent(true, null);
+ processAllMessages();
+ verifySatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+
+ // startSendingNtnSignalStrength should be invoked when satellite is enabled
+ mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertEquals(
+ SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
+ verify(mMockSatelliteModemInterface, times(1)).startSendingNtnSignalStrength(
+ any(Message.class));
+
+ // Ignore request ntn signal strength for redundant enable request
+ reset(mMockSatelliteModemInterface);
+ doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
+ verify(mMockSatelliteModemInterface, never()).startSendingNtnSignalStrength(
+ any(Message.class));
+
+ // stopSendingNtnSignalStrength should be invoked when satellite is successfully off.
+ mIIntegerConsumerResults.clear();
+ reset(mMockSatelliteModemInterface);
+ doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
+ setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, false, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
+ verify(mMockSatelliteModemInterface, times(1)).stopSendingNtnSignalStrength(
+ any(Message.class));
+
+ // Ignore redundant request for stop reporting ntn signal strength.
+ mIIntegerConsumerResults.clear();
+ reset(mMockSatelliteModemInterface);
+ doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, false, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
+ verify(mMockSatelliteModemInterface, never()).stopSendingNtnSignalStrength(
+ any(Message.class));
+
+ // startSendingNtnSignalStrength is invoked when satellite is enabled again.
+ mIIntegerConsumerResults.clear();
+ reset(mMockSatelliteModemInterface);
+ doReturn(true).when(mMockSatelliteModemInterface).isSatelliteServiceSupported();
+ mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
+ assertTrue(mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled);
+ assertEquals(
+ SATELLITE_MODE_ENABLED_TRUE, mSatelliteControllerUT.satelliteModeSettingValue);
+ verify(mMockSatelliteModemInterface, times(1)).startSendingNtnSignalStrength(
+ any(Message.class));
+ }
+
+ @Test
+ public void testRegisterForSatelliteSupportedStateChanged_WithFeatureFlagEnabled() {
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+
+ Semaphore semaphore = new Semaphore(0);
+ final boolean[] isSupported = new boolean[1];
+ ISatelliteSupportedStateCallback callback =
+ new ISatelliteSupportedStateCallback.Stub() {
+ @Override
+ public void onSatelliteSupportedStateChanged(boolean supported) {
+ logd("onSatelliteSupportedStateChanged: supported=" + supported);
+ isSupported[0] = supported;
+ try {
+ semaphore.release();
+ } catch (Exception ex) {
+ loge("onSatelliteSupportedStateChanged: Got exception in releasing "
+ + "semaphore, ex=" + ex);
+ }
+ }
+ };
+
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ int errorCode = mSatelliteControllerUT.registerForSatelliteSupportedStateChanged(
+ SUB_ID, callback);
+ assertEquals(SATELLITE_RESULT_SUCCESS, errorCode);
+
+ sendSatelliteSupportedStateChangedEvent(true, null);
+ processAllMessages();
+ // Verify redundant report is ignored
+ assertFalse(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+
+ // Verify updated state is reported
+ sendSatelliteSupportedStateChangedEvent(false, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ assertEquals(false, isSupported[0]);
+ verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
+
+ // Verify redundant report is ignored
+ sendSatelliteSupportedStateChangedEvent(false, null);
+ processAllMessages();
+ assertFalse(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
+
+ // Verify updated state is reported
+ sendSatelliteSupportedStateChangedEvent(true, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ assertEquals(true, isSupported[0]);
+ verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+
+ // Successfully enable satellite
+ sendProvisionedStateChangedEvent(true, null);
+ processAllMessages();
+ verifySatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestSatelliteEnabled(true, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
+
+ // Send satellite is not supported state from modem to disable satellite
+ setUpResponseForRequestSatelliteEnabled(false, false, SATELLITE_RESULT_SUCCESS);
+ sendSatelliteSupportedStateChangedEvent(false, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ assertEquals(false, isSupported[0]);
+
+ // It is needed to set satellite as support to check whether satellite is enabled or not
+ sendSatelliteSupportedStateChangedEvent(true, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ assertEquals(true, isSupported[0]);
+ // Verify satellite was disabled
+ verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
+
+ mSatelliteControllerUT.unregisterForSatelliteSupportedStateChanged(SUB_ID, callback);
+ sendSatelliteSupportedStateChangedEvent(true, null);
+ processAllMessages();
+ assertFalse(waitForForEvents(
+ semaphore, 1, "testRegisterForSatelliteSupportedStateChanged"));
+ }
+
+ @Test
+ public void testRegisterForSatelliteSupportedStateChanged_WithFeatureFlagDisabled() {
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(false);
+
+ Semaphore semaphore = new Semaphore(0);
+ ISatelliteSupportedStateCallback callback =
+ new ISatelliteSupportedStateCallback.Stub() {
+ @Override
+ public void onSatelliteSupportedStateChanged(boolean supported) {
+ logd("onSatelliteSupportedStateChanged: supported=" + supported);
+ try {
+ semaphore.release();
+ } catch (Exception ex) {
+ loge("onSatelliteSupportedStateChanged: Got exception in releasing "
+ + "semaphore, ex=" + ex);
+ }
+ }
+ };
+ int errorCode = mSatelliteControllerUT.registerForSatelliteSupportedStateChanged(
+ SUB_ID, callback);
+ assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode);
+ }
+
private void resetSatelliteControllerUTEnabledState() {
logd("resetSatelliteControllerUTEnabledState");
setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_RADIO_NOT_AVAILABLE);
@@ -3713,6 +3920,13 @@
msg.sendToTarget();
}
+ private void sendSatelliteSupportedStateChangedEvent(boolean supported, Throwable exception) {
+ Message msg = mSatelliteControllerUT.obtainMessage(
+ 41 /* EVENT_SATELLITE_SUPPORTED_STATE_CHANGED */);
+ msg.obj = new AsyncResult(null, supported, exception);
+ msg.sendToTarget();
+ }
+
private void setRadioPower(boolean on) {
mSimulatedCommands.setRadioPower(on, false, false, null);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionInfoInternalTest.java b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionInfoInternalTest.java
index 6e2c5bf..de43b85 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionInfoInternalTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionInfoInternalTest.java
@@ -341,4 +341,69 @@
assertThat(subInfoNull.getCountryIso()).isEqualTo("");
assertThat(subInfoNull.getGroupOwner()).isEqualTo("");
}
+
+ @Test
+ public void testIsVisible() {
+ // Regular profile
+ SubscriptionInfoInternal regularSub =
+ new SubscriptionInfoInternal.Builder()
+ .setId(2)
+ .setIccId(SubscriptionDatabaseManagerTest.FAKE_ICCID1)
+ .setSimSlotIndex(0)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL)
+ .setOnlyNonTerrestrialNetwork(0)
+ .setOpportunistic(0)
+ .setGroupUuid(SubscriptionDatabaseManagerTest.FAKE_UUID1)
+ .build();
+ assertThat(regularSub.isVisible()).isTrue();
+
+ // Provisioning profile
+ SubscriptionInfoInternal provSub =
+ new SubscriptionInfoInternal.Builder()
+ .setId(2)
+ .setIccId(SubscriptionDatabaseManagerTest.FAKE_ICCID1)
+ .setSimSlotIndex(0)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING)
+ .setOnlyNonTerrestrialNetwork(0)
+ .setOpportunistic(0)
+ .build();
+ assertThat(provSub.isVisible()).isFalse();
+
+ // NTN profile
+ SubscriptionInfoInternal ntnSub =
+ new SubscriptionInfoInternal.Builder()
+ .setId(2)
+ .setIccId(SubscriptionDatabaseManagerTest.FAKE_ICCID1)
+ .setSimSlotIndex(0)
+ .setOnlyNonTerrestrialNetwork(1)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL)
+ .setOpportunistic(0)
+ .build();
+ assertThat(ntnSub.isVisible()).isFalse();
+
+ // Opportunistic profile without group UUID
+ SubscriptionInfoInternal opportunisticSub =
+ new SubscriptionInfoInternal.Builder()
+ .setId(2)
+ .setIccId(SubscriptionDatabaseManagerTest.FAKE_ICCID1)
+ .setSimSlotIndex(0)
+ .setOnlyNonTerrestrialNetwork(0)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL)
+ .setOpportunistic(1)
+ .build();
+ assertThat(opportunisticSub.isVisible()).isTrue();
+
+ // Opportunistic profile with group UUID
+ SubscriptionInfoInternal opportunisticSubUuid =
+ new SubscriptionInfoInternal.Builder()
+ .setId(2)
+ .setIccId(SubscriptionDatabaseManagerTest.FAKE_ICCID1)
+ .setSimSlotIndex(0)
+ .setOnlyNonTerrestrialNetwork(0)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL)
+ .setOpportunistic(1)
+ .setGroupUuid(SubscriptionDatabaseManagerTest.FAKE_UUID1)
+ .build();
+ assertThat(opportunisticSubUuid.isVisible()).isFalse();
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
index defa730..9fee311 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
@@ -43,13 +43,16 @@
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_PHONE_NUMBER2;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_RCS_CONFIG1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_RCS_CONFIG2;
+import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_SATELLITE_ENTITLEMENT_PLMNS1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_SUBSCRIPTION_INFO1;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_SUBSCRIPTION_INFO2;
import static com.android.internal.telephony.subscription.SubscriptionDatabaseManagerTest.FAKE_UUID1;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -131,11 +134,13 @@
import java.io.StringWriter;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -3202,4 +3207,60 @@
System.setProperty("persist.radio.allow_mock_modem", "false");
doReturn(false).when(mFlags).oemEnabledSatelliteFlag();
}
+
+ @Test
+ public void testGetSatelliteEntitlementPlmnList() throws Exception {
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
+
+ // When the empty list is stored, verify whether SubscriptionInfoInternal returns an
+ // empty string and SubscriptionManagerService returns an empty List.
+ insertSubscription(FAKE_SUBSCRIPTION_INFO1);
+ List<String> expectedPlmnList = new ArrayList<>();
+ int subId = 1;
+
+ SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
+ .getSubscriptionInfoInternal(subId);
+ assertTrue(subInfo.getSatelliteEntitlementPlmns().isEmpty());
+ assertEquals(expectedPlmnList,
+ mSubscriptionManagerServiceUT.getSatelliteEntitlementPlmnList(subId));
+
+ // When the list is stored as [123123,12310], verify whether SubscriptionInfoInternal
+ // returns the string as "123123,12310" and SubscriptionManagerService returns the List as
+ // [123123,12310].
+ insertSubscription(FAKE_SUBSCRIPTION_INFO2);
+ String expectedPlmn = FAKE_SATELLITE_ENTITLEMENT_PLMNS1;
+ expectedPlmnList = Arrays.stream(expectedPlmn.split(",")).collect(Collectors.toList());
+ subId = 2;
+
+ subInfo = mSubscriptionManagerServiceUT.getSubscriptionInfoInternal(subId);
+ assertEquals(expectedPlmn, subInfo.getSatelliteEntitlementPlmns());
+ assertEquals(expectedPlmnList,
+ mSubscriptionManagerServiceUT.getSatelliteEntitlementPlmnList(subId));
+
+ // When calling SubscriptionDatabaseManager#getSubscriptionInfoInternalreturns returns a
+ // null, then verify the SubscriptionManagerService returns an empty List.
+ SubscriptionDatabaseManager mockSubscriptionDatabaseManager = Mockito.mock(
+ SubscriptionDatabaseManager.class);
+ Field field = SubscriptionManagerService.class.getDeclaredField(
+ "mSubscriptionDatabaseManager");
+ field.setAccessible(true);
+ field.set(mSubscriptionManagerServiceUT, mockSubscriptionDatabaseManager);
+
+ doReturn(null).when(mockSubscriptionDatabaseManager).getSubscriptionInfoInternal(anyInt());
+ expectedPlmnList = new ArrayList<>();
+ assertEquals(expectedPlmnList,
+ mSubscriptionManagerServiceUT.getSatelliteEntitlementPlmnList(subId));
+
+ // When calling SubscriptionDatabaseManager#getSubscriptionInfoInternalreturns returns a
+ // non null. And when calling SubscriptionInfoInternal#getSatelliteEntitlementPlmns
+ // returns a null, then verify the SubscriptionManagerService returns an empty List.
+ SubscriptionInfoInternal mockSubscriptionInfoInternal = Mockito.mock(
+ SubscriptionInfoInternal.class);
+ doReturn(mockSubscriptionInfoInternal).when(
+ mockSubscriptionDatabaseManager).getSubscriptionInfoInternal(anyInt());
+ doReturn(null).when(mockSubscriptionInfoInternal).getSatelliteEntitlementPlmns();
+
+ assertEquals(expectedPlmnList,
+ mSubscriptionManagerServiceUT.getSatelliteEntitlementPlmnList(subId));
+ }
}