Merge "[Satellite] Enhanced the satellite metrics to record datagram count per message type." into main
diff --git a/flags/data.aconfig b/flags/data.aconfig
index ccd5db4..ba1be88 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -121,17 +121,6 @@
}
}
-# OWNER=jackyu TARGET=25Q1
-flag {
- name: "sim_disabled_graceful_tear_down"
- namespace: "telephony"
- description: "Gracefully tear down the networks when SIM is disabled."
- bug: "362372940"
- metadata {
- purpose: PURPOSE_BUGFIX
- }
-}
-
# OWNER=TBD TARGET=TBD
flag {
name: "oem_paid_private"
diff --git a/flags/uicc.aconfig b/flags/uicc.aconfig
index abe4296..aed4bff 100644
--- a/flags/uicc.aconfig
+++ b/flags/uicc.aconfig
@@ -88,3 +88,22 @@
description: "This flag controls the type of API that retrieves ISIM records, either hidden or system type."
bug:"359721349"
}
+
+# OWNER=jinjeong TARGET=25Q2
+flag {
+ name: "carrier_id_from_carrier_identifier"
+ namespace: "telephony"
+ description: "This flag controls to get a carrier id using a carrier identifier."
+ bug:"378778278"
+}
+
+# OWNER=arunvoddu TARGET=25Q2
+flag {
+ name: "force_imsi_certificate_delete"
+ namespace: "telephony"
+ description: "This flag controls the IMSI certificate delete with out any condition."
+ bug:"235296888"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/src/java/com/android/internal/telephony/CarrierInfoManager.java b/src/java/com/android/internal/telephony/CarrierInfoManager.java
index 8364c0a..206770d 100644
--- a/src/java/com/android/internal/telephony/CarrierInfoManager.java
+++ b/src/java/com/android/internal/telephony/CarrierInfoManager.java
@@ -273,21 +273,25 @@
/**
* Resets the Carrier Keys in the database. This involves 2 steps:
- * 1. Delete the keys from the database.
- * 2. Send an intent to download new Certificates.
- * @param context Context
- * @param mPhoneId phoneId
+ * 1. Delete the keys from the database.
+ * 2. Send an intent to download new Certificates.
*
+ * @param context Context
+ * @param mPhoneId phoneId
+ * @param forceResetAll to skip the check of the RESET_CARRIER_KEY_RATE_LIMIT.
*/
- public void resetCarrierKeysForImsiEncryption(Context context, int mPhoneId) {
- Log.i(LOG_TAG, "resetting carrier key");
+ public void resetCarrierKeysForImsiEncryption(Context context, int mPhoneId,
+ boolean forceResetAll) {
+ Log.i(LOG_TAG, "resetting carrier key, forceResetAll = " +forceResetAll);
// Check rate limit.
long now = System.currentTimeMillis();
- if (now - mLastAccessResetCarrierKey < RESET_CARRIER_KEY_RATE_LIMIT) {
- Log.i(LOG_TAG, "resetCarrierKeysForImsiEncryption: Access rate exceeded");
- return;
+ if (!forceResetAll) {
+ if (now - mLastAccessResetCarrierKey < RESET_CARRIER_KEY_RATE_LIMIT) {
+ Log.i(LOG_TAG, "resetCarrierKeysForImsiEncryption: Access rate exceeded");
+ return;
+ }
+ mLastAccessResetCarrierKey = now;
}
- mLastAccessResetCarrierKey = now;
int subId = SubscriptionManager.getSubscriptionId(mPhoneId);
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
diff --git a/src/java/com/android/internal/telephony/EventLogTags.logtags b/src/java/com/android/internal/telephony/EventLogTags.logtags
index b5e458b..2f30c33 100644
--- a/src/java/com/android/internal/telephony/EventLogTags.logtags
+++ b/src/java/com/android/internal/telephony/EventLogTags.logtags
@@ -1,4 +1,4 @@
-# See system/core/logcat/event.logtags for a description of the format of this file.
+# See system/logging/logcat/event.logtags for a description of the format of this file.
option java_package com.android.internal.telephony;
diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
index 6a6e4d0..5a73cae 100644
--- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java
+++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java
@@ -2189,7 +2189,12 @@
@Override
public void resetCarrierKeysForImsiEncryption() {
- mCIM.resetCarrierKeysForImsiEncryption(mContext, mPhoneId);
+ mCIM.resetCarrierKeysForImsiEncryption(mContext, mPhoneId, false);
+ }
+
+ @Override
+ public void resetCarrierKeysForImsiEncryption(boolean forceResetAll) {
+ mCIM.resetCarrierKeysForImsiEncryption(mContext, mPhoneId, forceResetAll);
}
@Override
@@ -3770,6 +3775,13 @@
&& disclosure != null) {
mIdentifierDisclosureNotifier.addDisclosure(mContext, getSubId(), disclosure);
}
+ if (mFeatureFlags.cellularIdentifierDisclosureIndications()
+ && mIdentifierDisclosureNotifier != null
+ && disclosure != null) {
+ logd("EVENT_CELL_IDENTIFIER_DISCLOSURE for non-Safety Center listeners "
+ + "phoneId = " + getPhoneId());
+ mNotifier.notifyCellularIdentifierDisclosedChanged(this, disclosure);
+ }
break;
case EVENT_SET_IDENTIFIER_DISCLOSURE_ENABLED_DONE:
@@ -3780,13 +3792,21 @@
case EVENT_SECURITY_ALGORITHM_UPDATE:
logd("EVENT_SECURITY_ALGORITHM_UPDATE phoneId = " + getPhoneId());
+
+ ar = (AsyncResult) msg.obj;
+ SecurityAlgorithmUpdate update = (SecurityAlgorithmUpdate) ar.result;
+
if (mFeatureFlags.enableModemCipherTransparencyUnsolEvents()
&& mNullCipherNotifier != null) {
- ar = (AsyncResult) msg.obj;
- SecurityAlgorithmUpdate update = (SecurityAlgorithmUpdate) ar.result;
mNullCipherNotifier.onSecurityAlgorithmUpdate(mContext, getPhoneId(),
getSubId(), update);
}
+ if (mFeatureFlags.securityAlgorithmsUpdateIndications()
+ && mNullCipherNotifier != null) {
+ logd("EVENT_SECURITY_ALGORITHM_UPDATE for non-Safety Center listeners "
+ + "phoneId = " + getPhoneId());
+ mNotifier.notifySecurityAlgorithmsChanged(this, update);
+ }
break;
case EVENT_SET_SECURITY_ALGORITHMS_UPDATED_ENABLED_DONE:
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index ab9be76..5998d46 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -4076,6 +4076,16 @@
}
/**
+ * Resets the Carrier Keys in the database. This involves 2 steps:
+ * 1. Delete the keys from the database.
+ * 2. Send an intent to download new Certificates.
+ *
+ * @param forceResetAll : Force delete the downloaded key if any.
+ */
+ public void resetCarrierKeysForImsiEncryption(boolean forceResetAll) {
+ }
+
+ /**
* Return if UT capability of ImsPhone is enabled or not
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index b209d1d..88b9958 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -2738,6 +2738,14 @@
}
/**
+ * Returns the flag specifying whether any part of this {@link SmsTracker} failed to send
+ * or not.
+ */
+ protected boolean isAnyPartFailed() {
+ return mAnyPartFailed != null && mAnyPartFailed.get();
+ }
+
+ /**
* Persist a sent SMS if required:
* 1. It is a text message
* 2. SmsApplication tells us to persist: sent from apps that are not default-SMS app or
diff --git a/src/java/com/android/internal/telephony/SmsDispatchersController.java b/src/java/com/android/internal/telephony/SmsDispatchersController.java
index 58f3490..dd738c0 100644
--- a/src/java/com/android/internal/telephony/SmsDispatchersController.java
+++ b/src/java/com/android/internal/telephony/SmsDispatchersController.java
@@ -1234,7 +1234,8 @@
boolean isOverIms, boolean isLastSmsPart, boolean success) {
notifySmsSentToEmergencyStateTracker(tracker.mDestAddress,
tracker.mMessageId, isOverIms, isLastSmsPart, success);
- notifySmsSentToDatagramDispatcher(tracker.mUniqueMessageId, isLastSmsPart, success);
+ notifySmsSentToDatagramDispatcher(tracker.mUniqueMessageId,
+ tracker.isSinglePartOrLastPart(), !tracker.isAnyPartFailed());
}
/**
@@ -1256,9 +1257,10 @@
private void notifySmsSentToDatagramDispatcher(
long messageId, boolean isLastSmsPart, boolean success) {
- if (SatelliteController.getInstance().shouldSendSmsToDatagramDispatcher(mPhone)) {
+ if (SatelliteController.getInstance().shouldSendSmsToDatagramDispatcher(mPhone)
+ && isLastSmsPart) {
DatagramDispatcher.getInstance().onSendSmsDone(
- mPhone.getSubId(), messageId, isLastSmsPart, success);
+ mPhone.getSubId(), messageId, success);
}
}
diff --git a/src/java/com/android/internal/telephony/data/DataEvaluation.java b/src/java/com/android/internal/telephony/data/DataEvaluation.java
index 40c0081..f5eae91 100644
--- a/src/java/com/android/internal/telephony/data/DataEvaluation.java
+++ b/src/java/com/android/internal/telephony/data/DataEvaluation.java
@@ -225,8 +225,6 @@
SIM_LOADED(true),
/** SIM is removed. */
SIM_REMOVAL(true),
- /** SIM is disabled. */
- SIM_DISABLED(true),
/** Data profiles changed. */
DATA_PROFILES_CHANGED(true),
/** When service state changes.(For now only considering data RAT and data registration). */
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 9e432e1..d5bc741 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -3543,6 +3543,15 @@
}
/**
+ * Called when SIM is absent.
+ */
+ private void onSimAbsent() {
+ log("onSimAbsent");
+ sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
+ DataEvaluationReason.SIM_REMOVAL));
+ }
+
+ /**
* Called when SIM state changes.
*
* @param simState SIM state. (Note this is mixed with card state and application state.)
@@ -3550,22 +3559,13 @@
private void onSimStateChanged(@SimState int simState) {
log("onSimStateChanged: state=" + TelephonyManager.simStateToString(simState));
if (mSimState != simState) {
+ mSimState = simState;
if (simState == TelephonyManager.SIM_STATE_ABSENT) {
- log("onSimStateChanged: SIM absent.");
- sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
- DataEvaluationReason.SIM_REMOVAL));
- } else if (simState == TelephonyManager.SIM_STATE_NOT_READY
- && mSimState == TelephonyManager.SIM_STATE_LOADED) {
- if (mFeatureFlags.simDisabledGracefulTearDown()) {
- log("onSimStateChanged: SIM disabled.");
- sendMessage(obtainMessage(EVENT_REEVALUATE_EXISTING_DATA_NETWORKS,
- DataEvaluationReason.SIM_DISABLED));
- }
+ onSimAbsent();
} else if (simState == TelephonyManager.SIM_STATE_LOADED) {
sendMessage(obtainMessage(EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS,
DataEvaluationReason.SIM_LOADED));
}
- mSimState = simState;
mDataNetworkControllerCallbacks.forEach(callback -> callback.invokeFromExecutor(
() -> callback.onSimStateChanged(mSimState)));
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 3578139..113c3ee 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -406,10 +406,9 @@
SomeArgs args = (SomeArgs) msg.obj;
int subId = (int) args.arg1;
long messageId = (long) args.arg2;
- boolean isLastPartSms = (boolean) args.arg3;
- boolean success = (boolean) args.arg4;
+ boolean success = (boolean) args.arg3;
try {
- handleEventSendSmsDone(subId, messageId, isLastPartSms, success);
+ handleEventSendSmsDone(subId, messageId, success);
} finally {
args.recycle();
}
@@ -1184,15 +1183,13 @@
* Sending MO SMS is completed.
* @param subId subscription ID
* @param messageId message ID of MO SMS
- * @param isLastSmsPart whether this is the last sms part of MO SMS
* @param success boolean specifying whether MO SMS is successfully sent or not.
*/
- public void onSendSmsDone(int subId, long messageId, boolean isLastSmsPart, boolean success) {
+ public void onSendSmsDone(int subId, long messageId, boolean success) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = subId;
args.arg2 = messageId;
- args.arg3 = isLastSmsPart;
- args.arg4 = success;
+ args.arg3 = success;
sendMessage(obtainMessage(EVENT_SEND_SMS_DONE, args));
}
@@ -1233,29 +1230,32 @@
pendingSmsMap.clear();
}
- private void handleEventSendSmsDone(
- int subId, long messageId, boolean isLastPartSms, boolean success) {
+ private void handleEventSendSmsDone(int subId, long messageId, boolean success) {
synchronized (mLock) {
- mSendingInProgress = false;
PendingRequest pendingSms = mPendingSmsMap.remove(messageId);
- int datagramType = pendingSms != null && pendingSms.isMtSmsPolling
+ if (pendingSms == null) {
+ // Just return, the SMS is not sent by DatagramDispatcher such as Data SMS
+ plogd("handleEventSendSmsDone there is no pendingSms for messageId=" + messageId);
+ return;
+ }
+
+ mSendingInProgress = false;
+ int datagramType = pendingSms.isMtSmsPolling
? DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS;
plogd("handleEventSendSmsDone subId=" + subId + " messageId=" + messageId
- + " isLastPartSms=" + isLastPartSms + " success=" + success
- + " datagramType=" + datagramType);
+ + " success=" + success + " datagramType=" + datagramType);
if (success) {
- if (isLastPartSms) {
- // Update send status only after all parts of the SMS are sent
- mDatagramController.updateSendStatus(subId, datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
- getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
- }
+ // Update send status
+ mDatagramController.updateSendStatus(subId, datagramType,
+ SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
+ getPendingMessagesCount(), SATELLITE_RESULT_SUCCESS);
if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS) {
startMtSmsPollingThrottle();
}
} else {
+ // Update send status
mDatagramController.updateSendStatus(subId, datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED,
getPendingMessagesCount(), SATELLITE_RESULT_NETWORK_ERROR);
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 936975a..6283e97 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -35,7 +35,6 @@
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ESOS_SUPPORTED_BOOL;
-import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SUPPORTED_MSG_APPS_STRING_ARRAY;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_NIDD_APN_NAME_STRING;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_ESOS_INACTIVITY_TIMEOUT_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_P2P_SMS_INACTIVITY_TIMEOUT_SEC_INT;
@@ -43,6 +42,7 @@
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE;
+import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SUPPORTED_MSG_APPS_STRING_ARRAY;
import static android.telephony.SubscriptionManager.SATELLITE_ATTACH_ENABLED_FOR_CARRIER;
import static android.telephony.SubscriptionManager.SATELLITE_ENTITLEMENT_STATUS;
import static android.telephony.SubscriptionManager.isValidSubscriptionId;
@@ -134,6 +134,7 @@
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
+import android.telephony.satellite.ISelectedNbIotSatelliteSubscriptionCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
import android.telephony.satellite.SatelliteDatagram;
@@ -193,7 +194,6 @@
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import java.util.stream.Collectors;
-import com.android.internal.R;
/**
* Satellite controller is the backend service of
@@ -304,6 +304,7 @@
private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 57;
private static final int CMD_UPDATE_SYSTEM_SELECTION_CHANNELS = 58;
private static final int EVENT_UPDATE_SYSTEM_SELECTION_CHANNELS_DONE = 59;
+ private static final int EVENT_SELECTED_NB_IOT_SATELLITE_SUBSCRIPTION_CHANGED = 60;
@NonNull private static SatelliteController sInstance;
@NonNull private final Context mContext;
@@ -428,6 +429,13 @@
*/
private final ConcurrentHashMap<IBinder, ISatelliteModemStateCallback>
mTerrestrialNetworkAvailableChangedListeners = new ConcurrentHashMap<>();
+ /**
+ * Map key: binder of the callback, value: callback to receive selected NB IOT satellite
+ * subscription changed
+ */
+ private final ConcurrentHashMap<IBinder, ISelectedNbIotSatelliteSubscriptionCallback>
+ mSelectedNbIotSatelliteSubscriptionChangedListeners = new ConcurrentHashMap<>();
+
private final Object mIsSatelliteSupportedLock = new Object();
@GuardedBy("mIsSatelliteSupportedLock")
private Boolean mIsSatelliteSupported = null;
@@ -649,6 +657,11 @@
private final Object mNtnSmsSupportedByMessagesAppLock = new Object();
@GuardedBy("mNtnSmsSupportedByMessagesAppLock")
private Boolean mNtnSmsSupportedByMessagesApp = null;
+
+ private final Object mSatelliteModemStateLock = new Object();
+ @GuardedBy("mSatelliteModemStateLock")
+ @SatelliteManager.SatelliteModemState
+ private int mSatelliteModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN;
private BroadcastReceiver
mDefaultSmsSubscriptionChangedBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -718,12 +731,13 @@
* (e.g., class name and method name)
*/
public void incrementResultReceiverCount(String caller) {
- if (mFeatureFlags.geofenceEnhancementForBetterUx()) {
+ if (mFeatureFlags.carrierRoamingNbIotNtn()) {
synchronized (mResultReceiverTotalCountLock) {
mResultReceiverTotalCount++;
logd("[incrementResultReceiverCount] : " + caller
+ " | ResultReceiver total count= " + mResultReceiverTotalCount);
- mResultReceiverCountPerMethodMap.compute(caller, (k, v) -> v == null ? 1 : v + 1);
+ mResultReceiverCountPerMethodMap.compute(caller,
+ (k, v) -> v == null ? 1 : v + 1);
if (mResultReceiverTotalCount > RESULT_RECEIVER_COUNT_ANOMALY_THRESHOLD) {
loge("[mResultReceiverTotalCount] is exceeds limits : "
@@ -737,7 +751,7 @@
}
}
} else {
- logd("[incrementResultReceiverCount]: geofenceEnhancementForBetterUx is not enabled");
+ logd("[incrementResultReceiverCount]: carrierRoamingNbIotNtn is not enabled");
}
}
@@ -749,7 +763,7 @@
* (e.g., class name and method name)
*/
public void decrementResultReceiverCount(String caller) {
- if (mFeatureFlags.geofenceEnhancementForBetterUx()) {
+ if (mFeatureFlags.carrierRoamingNbIotNtn()) {
synchronized (mResultReceiverTotalCountLock) {
if (mResultReceiverTotalCount > 0) {
mResultReceiverTotalCount--;
@@ -760,7 +774,7 @@
(k, v) -> v > 0 ? v - 1 : v);
}
} else {
- logd("[decrementResultReceiverCount]: geofenceEnhancementForBetterUx is not enabled");
+ logd("[decrementResultReceiverCount]: carrierRoamingNbIotNtn is not enabled");
}
}
@@ -1096,15 +1110,13 @@
public void onStateChanged(int state, int reason) {
plogd("UwbAdapterStateCallback#onStateChanged() called, state = " + toString(state));
plogd("Adapter state changed reason " + String.valueOf(reason));
- synchronized (mRadioStateLock) {
- if (state == UwbManager.AdapterStateCallback.STATE_DISABLED) {
- mUwbStateEnabled = false;
- evaluateToSendSatelliteEnabledSuccess();
- } else {
- mUwbStateEnabled = true;
- }
- plogd("mUwbStateEnabled: " + mUwbStateEnabled);
+ if (state == UwbManager.AdapterStateCallback.STATE_DISABLED) {
+ setUwbEnabledState(false);
+ evaluateToSendSatelliteEnabledSuccess();
+ } else {
+ setUwbEnabledState(true);
}
+ plogd("mUwbStateEnabled: " + getUwbEnabledState());
}
}
@@ -1121,50 +1133,47 @@
case BluetoothAdapter.ACTION_STATE_CHANGED:
int btState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR);
- synchronized (mRadioStateLock) {
- boolean currentBTStateEnabled = mBTStateEnabled;
- if (btState == BluetoothAdapter.STATE_OFF) {
- mBTStateEnabled = false;
- evaluateToSendSatelliteEnabledSuccess();
- } else if (btState == BluetoothAdapter.STATE_ON) {
- mBTStateEnabled = true;
- }
- if (currentBTStateEnabled != mBTStateEnabled) {
- plogd("mBTStateEnabled=" + mBTStateEnabled);
- }
+ boolean currentBTStateEnabled = getBTEnabledState();
+ if (btState == BluetoothAdapter.STATE_OFF) {
+ setBTEnabledState(false);
+ evaluateToSendSatelliteEnabledSuccess();
+ } else if (btState == BluetoothAdapter.STATE_ON) {
+ setBTEnabledState(true);
+ }
+
+ if (currentBTStateEnabled != getBTEnabledState()) {
+ plogd("mBTStateEnabled=" + getBTEnabledState());
}
break;
case NfcAdapter.ACTION_ADAPTER_STATE_CHANGED:
int nfcState = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, -1);
- synchronized (mRadioStateLock) {
- boolean currentNfcStateEnabled = mNfcStateEnabled;
- if (nfcState == NfcAdapter.STATE_ON) {
- mNfcStateEnabled = true;
- } else if (nfcState == NfcAdapter.STATE_OFF) {
- mNfcStateEnabled = false;
- evaluateToSendSatelliteEnabledSuccess();
- }
- if (currentNfcStateEnabled != mNfcStateEnabled) {
- plogd("mNfcStateEnabled=" + mNfcStateEnabled);
- }
+ boolean currentNfcStateEnabled = getNfcEnabledState();
+ if (nfcState == NfcAdapter.STATE_ON) {
+ setNfcEnabledState(true);
+ } else if (nfcState == NfcAdapter.STATE_OFF) {
+ setNfcEnabledState(false);
+ evaluateToSendSatelliteEnabledSuccess();
+ }
+
+ if (currentNfcStateEnabled != getNfcEnabledState()) {
+ plogd("mNfcStateEnabled=" + getNfcEnabledState());
}
break;
case WifiManager.WIFI_STATE_CHANGED_ACTION:
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
WifiManager.WIFI_STATE_UNKNOWN);
- synchronized (mRadioStateLock) {
- boolean currentWifiStateEnabled = mWifiStateEnabled;
- if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
- mWifiStateEnabled = true;
- } else if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
- mWifiStateEnabled = false;
- evaluateToSendSatelliteEnabledSuccess();
- }
- if (currentWifiStateEnabled != mWifiStateEnabled) {
- plogd("mWifiStateEnabled=" + mWifiStateEnabled);
- }
+ boolean currentWifiStateEnabled = getWifiEnabledState();
+ if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
+ setWifiEnabledState(true);
+ } else if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
+ setWifiEnabledState(false);
+ evaluateToSendSatelliteEnabledSuccess();
+ }
+
+ if (currentWifiStateEnabled != getWifiEnabledState()) {
+ plogd("mWifiStateEnabled=" + getWifiEnabledState());
}
break;
default:
@@ -1236,12 +1245,13 @@
}
private static final class UpdateSystemSelectionChannelsArgument {
- @NonNull SystemSelectionSpecifier mSelectionSpecifier;
+ @NonNull List<SystemSelectionSpecifier> mSystemSelectionSpecifiers;
@NonNull ResultReceiver mResult;
- UpdateSystemSelectionChannelsArgument(@NonNull SystemSelectionSpecifier selectionSpecifier,
+ UpdateSystemSelectionChannelsArgument(
+ @NonNull List<SystemSelectionSpecifier> systemSelectionSpecifiers,
@NonNull ResultReceiver result) {
- this.mSelectionSpecifier = selectionSpecifier;
+ this.mSystemSelectionSpecifiers = systemSelectionSpecifiers;
this.mResult = result;
}
}
@@ -1398,11 +1408,12 @@
if (mNeedsSatellitePointing) {
mPointingAppController.removeListenerForPointingUI();
}
+
+ if (!isWaitingForSatelliteModemOff()) {
+ moveSatelliteToOffStateAndCleanUpResources(SATELLITE_RESULT_SUCCESS);
+ }
+
synchronized (mSatelliteEnabledRequestLock) {
- if (!mWaitingForSatelliteModemOff) {
- moveSatelliteToOffStateAndCleanUpResources(
- SATELLITE_RESULT_SUCCESS);
- }
mWaitingForDisableSatelliteModemResponse = false;
}
}
@@ -1635,13 +1646,14 @@
synchronized (mNeedsSatellitePointingLock) {
mNeedsSatellitePointing = capabilities.isPointingRequired();
}
+
synchronized (mSatelliteCapabilitiesLock) {
mSatelliteCapabilities = capabilities;
- overrideSatelliteCapabilitiesIfApplicable();
- if (DBG) plogd("getSatelliteCapabilities: " + mSatelliteCapabilities);
- bundle.putParcelable(SatelliteManager.KEY_SATELLITE_CAPABILITIES,
- mSatelliteCapabilities);
}
+ overrideSatelliteCapabilitiesIfApplicable();
+ if (DBG) plogd("getSatelliteCapabilities: " + getSatelliteCapabilities());
+ bundle.putParcelable(SatelliteManager.KEY_SATELLITE_CAPABILITIES,
+ getSatelliteCapabilities());
}
}
((ResultReceiver) request.argument).send(error, bundle);
@@ -1701,22 +1713,21 @@
if (mCi.getRadioState() != TelephonyManager.RADIO_POWER_UNAVAILABLE) {
if (mSatelliteModemInterface.isSatelliteServiceConnected()) {
- synchronized (mIsSatelliteSupportedLock) {
- if (mIsSatelliteSupported == null || !mIsSatelliteSupported) {
- final String caller = "SC:CMD_IS_SATELLITE_SUPPORTED";
- ResultReceiver receiver = new ResultReceiver(this) {
- @Override
- protected void onReceiveResult(
- int resultCode, Bundle resultData) {
- decrementResultReceiverCount(caller);
- plogd("onRadioStateChanged.requestIsSatelliteSupported: "
- + "resultCode=" + resultCode
- + ", resultData=" + resultData);
- }
- };
- sendRequestAsync(CMD_IS_SATELLITE_SUPPORTED, receiver, null);
- incrementResultReceiverCount(caller);
- }
+ Boolean isSatelliteSupported = getIsSatelliteSupported();
+ if (isSatelliteSupported == null || !isSatelliteSupported) {
+ final String caller = "SC:CMD_IS_SATELLITE_SUPPORTED";
+ ResultReceiver receiver = new ResultReceiver(this) {
+ @Override
+ protected void onReceiveResult(
+ int resultCode, Bundle resultData) {
+ decrementResultReceiverCount(caller);
+ plogd("onRadioStateChanged.requestIsSatelliteSupported: "
+ + "resultCode=" + resultCode
+ + ", resultData=" + resultData);
+ }
+ };
+ sendRequestAsync(CMD_IS_SATELLITE_SUPPORTED, receiver, null);
+ incrementResultReceiverCount(caller);
}
}
}
@@ -2072,7 +2083,7 @@
onCompleted = obtainMessage(EVENT_UPDATE_SYSTEM_SELECTION_CHANNELS_DONE, request);
mSatelliteModemInterface.updateSystemSelectionChannels(
((UpdateSystemSelectionChannelsArgument) (request.argument))
- .mSelectionSpecifier,
+ .mSystemSelectionSpecifiers,
onCompleted);
break;
}
@@ -2088,6 +2099,16 @@
break;
}
+ case EVENT_SELECTED_NB_IOT_SATELLITE_SUBSCRIPTION_CHANGED: {
+ ar = (AsyncResult) msg.obj;
+ if (ar.result == null) {
+ loge("EVENT_SELECTED_NB_IOT_SATELLITE_SUBSCRIPTION_CHANGED: result is null");
+ } else {
+ handleEventSelectedNbIotSatelliteSubscriptionChanged((int) ar.result);
+ }
+ break;
+ }
+
default:
Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " +
msg.what);
@@ -2202,31 +2223,29 @@
* SATELLITE_RESULT_ERROR error
* 4. ongoing request = enable, current request = disable: send request to modem
*/
+ Boolean isSatelliteEnabled = getIsSatelliteEnabled();
synchronized (mSatelliteEnabledRequestLock) {
if (mFeatureFlags.carrierRoamingNbIotNtn()) {
if (mSatelliteEnabledRequest != null && mNetworkSelectionModeAutoDialog != null
&& mNetworkSelectionModeAutoDialog.isShowing()
&& request.isEmergency && request.enableSatellite) {
- synchronized (mSatellitePhoneLock) {
- sendErrorAndReportSessionMetrics(
- SatelliteManager.SATELLITE_RESULT_ILLEGAL_STATE,
- FunctionalUtils.ignoreRemoteException(
- mSatelliteEnabledRequest.callback::accept));
- }
+ sendErrorAndReportSessionMetrics(
+ SatelliteManager.SATELLITE_RESULT_ILLEGAL_STATE,
+ FunctionalUtils.ignoreRemoteException(
+ mSatelliteEnabledRequest.callback::accept));
mSatelliteEnabledRequest = null;
mNetworkSelectionModeAutoDialog.dismiss();
mNetworkSelectionModeAutoDialog = null;
}
}
if (!isSatelliteEnabledRequestInProgress()) {
- synchronized (mIsSatelliteEnabledLock) {
- if (mIsSatelliteEnabled != null && mIsSatelliteEnabled == enableSatellite) {
- evaluateToUpdateSatelliteEnabledAttributes(result,
- SatelliteManager.SATELLITE_RESULT_SUCCESS, request,
- mIsDemoModeEnabled, mIsEmergency);
- return;
- }
+ if (isSatelliteEnabled != null && isSatelliteEnabled == enableSatellite) {
+ evaluateToUpdateSatelliteEnabledAttributes(result,
+ SatelliteManager.SATELLITE_RESULT_SUCCESS, request,
+ mIsDemoModeEnabled, mIsEmergency);
+ return;
}
+
if (enableSatellite) {
mSatelliteEnabledRequest = request;
} else {
@@ -2445,14 +2464,13 @@
return;
}
- synchronized (mIsSatelliteEnabledLock) {
- if (mIsSatelliteEnabled != null) {
- /* We have already successfully queried the satellite modem. */
- Bundle bundle = new Bundle();
- bundle.putBoolean(SatelliteManager.KEY_SATELLITE_ENABLED, mIsSatelliteEnabled);
- result.send(SATELLITE_RESULT_SUCCESS, bundle);
- return;
- }
+ Boolean isSatelliteEnabled = getIsSatelliteEnabled();
+ if (isSatelliteEnabled != null) {
+ /* We have already successfully queried the satellite modem. */
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(SatelliteManager.KEY_SATELLITE_ENABLED, isSatelliteEnabled);
+ result.send(SATELLITE_RESULT_SUCCESS, bundle);
+ return;
}
sendRequestAsync(CMD_IS_SATELLITE_ENABLED, result, null);
@@ -2588,15 +2606,16 @@
result.send(SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED, null);
return;
}
- synchronized (mIsSatelliteSupportedLock) {
- if (mIsSatelliteSupported != null) {
- /* We have already successfully queried the satellite modem. */
- Bundle bundle = new Bundle();
- bundle.putBoolean(SatelliteManager.KEY_SATELLITE_SUPPORTED, mIsSatelliteSupported);
- bundle.putInt(SATELLITE_SUBSCRIPTION_ID, getSelectedSatelliteSubId());
- result.send(SATELLITE_RESULT_SUCCESS, bundle);
- return;
- }
+
+ int subId = getSelectedSatelliteSubId();
+ Boolean isSatelliteSupported = getIsSatelliteSupported();
+ if (isSatelliteSupported != null) {
+ /* We have already successfully queried the satellite modem. */
+ Bundle bundle = new Bundle();
+ bundle.putBoolean(SatelliteManager.KEY_SATELLITE_SUPPORTED, isSatelliteSupported);
+ bundle.putInt(SATELLITE_SUBSCRIPTION_ID, subId);
+ result.send(SATELLITE_RESULT_SUCCESS, bundle);
+ return;
}
sendRequestAsync(CMD_IS_SATELLITE_SUPPORTED, result, null);
@@ -2615,15 +2634,13 @@
return;
}
- synchronized (mSatelliteCapabilitiesLock) {
- if (mSatelliteCapabilities != null) {
- Bundle bundle = new Bundle();
- overrideSatelliteCapabilitiesIfApplicable();
- bundle.putParcelable(SatelliteManager.KEY_SATELLITE_CAPABILITIES,
- mSatelliteCapabilities);
- result.send(SATELLITE_RESULT_SUCCESS, bundle);
- return;
- }
+ if (getSatelliteCapabilities() != null) {
+ Bundle bundle = new Bundle();
+ overrideSatelliteCapabilitiesIfApplicable();
+ bundle.putParcelable(SatelliteManager.KEY_SATELLITE_CAPABILITIES,
+ getSatelliteCapabilities());
+ result.send(SATELLITE_RESULT_SUCCESS, bundle);
+ return;
}
sendRequestAsync(CMD_GET_SATELLITE_CAPABILITIES, result, null);
@@ -3307,6 +3324,59 @@
}
/**
+ * Registers for selected satellite subscription changed event.
+ *
+ * @param callback The callback to handle the selected satellite subscription changed event.
+ *
+ * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
+ */
+ @SatelliteManager.SatelliteResult
+ public int registerForSelectedNbIotSatelliteSubscriptionChanged(
+ @NonNull ISelectedNbIotSatelliteSubscriptionCallback callback) {
+ if (DBG) plogd("registerForSelectedNbIotSatelliteSubscriptionChanged()");
+
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ plogd("carrierRoamingNbIotNtn flag is disabled");
+ return SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
+ }
+
+ int error = evaluateOemSatelliteRequestAllowed(false);
+ if (error != SATELLITE_RESULT_SUCCESS) return error;
+
+ mSelectedNbIotSatelliteSubscriptionChangedListeners.put(callback.asBinder(), callback);
+ try {
+ callback.onSelectedNbIotSatelliteSubscriptionChanged(getSelectedSatelliteSubId());
+ } catch (RemoteException ex) {
+ ploge("registerForSelectedNbIotSatelliteSubscriptionChanged: RemoteException ex="
+ + ex);
+ }
+ return SATELLITE_RESULT_SUCCESS;
+ }
+
+ /**
+ * Unregisters for the selected satellite subscription changed event.
+ * If callback was not registered before, the request will be ignored.
+ *
+ * @param callback The callback that was passed to {@link
+ * #registerForSelectedNbIotSatelliteSubscriptionChanged(
+ * ISelectedNbIotSatelliteSubscriptionCallback)}.
+ */
+ public void unregisterForSelectedNbIotSatelliteSubscriptionChanged(
+ @NonNull ISelectedNbIotSatelliteSubscriptionCallback callback) {
+ if (DBG) plogd("unregisterForSelectedNbIotSatelliteSubscriptionChanged()");
+
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ plogd("carrierRoamingNbIotNtn flag is disabled");
+ return;
+ }
+
+ int error = evaluateOemSatelliteRequestAllowed(true);
+ if (error == SATELLITE_RESULT_SUCCESS) {
+ mSelectedNbIotSatelliteSubscriptionChangedListeners.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.
@@ -3788,17 +3858,16 @@
return false;
}
- synchronized (mSatelliteCapabilitiesLock) {
- if (mSatelliteCapabilities == null) {
- ploge("isSatelliteAttachRequired: mSatelliteCapabilities is null");
- return false;
- }
- if (mSatelliteCapabilities.getSupportedRadioTechnologies().contains(
- SatelliteManager.NT_RADIO_TECHNOLOGY_NB_IOT_NTN)) {
- return true;
- }
+ SatelliteCapabilities satelliteCapabilities = getSatelliteCapabilities();
+ if (satelliteCapabilities == null) {
+ ploge("isSatelliteAttachRequired: mSatelliteCapabilities is null");
return false;
}
+ if (satelliteCapabilities.getSupportedRadioTechnologies().contains(
+ SatelliteManager.NT_RADIO_TECHNOLOGY_NB_IOT_NTN)) {
+ return true;
+ }
+ return false;
}
/**
@@ -3953,12 +4022,9 @@
* esos session.
*/
public boolean shouldTurnOffCarrierSatelliteForEmergencyCall() {
- synchronized (mSatellitePhoneLock) {
- if (mSatellitePhone == null) return false;
- return !mDatagramController.isEmergencyCommunicationEstablished()
- && getConfigForSubId(mSatellitePhone.getSubId()).getBoolean(
- KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL);
- }
+ return !mDatagramController.isEmergencyCommunicationEstablished()
+ && getConfigForSubId(getSelectedSatelliteSubId()).getBoolean(
+ KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL);
}
/**
@@ -4221,12 +4287,12 @@
* we will retry the query one more time. Otherwise, we will return the cached result.
*/
private Boolean isSatelliteSupportedViaOemInternal() {
- synchronized (mIsSatelliteSupportedLock) {
- if (mIsSatelliteSupported != null) {
- /* We have already successfully queried the satellite modem. */
- return mIsSatelliteSupported;
- }
+ Boolean isSatelliteSupported = getIsSatelliteSupported();
+ if (isSatelliteSupported != null) {
+ /* We have already successfully queried the satellite modem. */
+ return isSatelliteSupported;
}
+
/**
* We have not successfully checked whether the modem supports satellite service.
* Thus, we need to retry it now.
@@ -4711,28 +4777,33 @@
private void handleEventSatelliteModemStateChanged(
@SatelliteManager.SatelliteModemState int state) {
plogd("handleEventSatelliteModemStateChanged: state=" + state);
+
+ synchronized (mSatelliteModemStateLock) {
+ mSatelliteModemState = state;
+ }
+
if (state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE
|| state == SatelliteManager.SATELLITE_MODEM_STATE_OFF) {
+ if (!isWaitingForDisableSatelliteModemResponse()) {
+ moveSatelliteToOffStateAndCleanUpResources(SATELLITE_RESULT_SUCCESS);
+ } else {
+ notifyModemStateChangedToSessionController(
+ SatelliteManager.SATELLITE_MODEM_STATE_OFF);
+ }
+
synchronized (mSatelliteEnabledRequestLock) {
- if (!mWaitingForDisableSatelliteModemResponse) {
- moveSatelliteToOffStateAndCleanUpResources(
- SATELLITE_RESULT_SUCCESS);
- } else {
- notifyModemStateChangedToSessionController(
- SatelliteManager.SATELLITE_MODEM_STATE_OFF);
- }
mWaitingForSatelliteModemOff = false;
}
} else {
if (isSatelliteEnabledOrBeingEnabled() || isSatelliteBeingDisabled()) {
notifyModemStateChangedToSessionController(state);
} else {
- // Telephony framework and modem are out of sync. We need to disable modem
+ // Telephony framework and modem are out of sync. We need to disable
synchronized (mSatelliteEnabledRequestLock) {
plogw("Satellite modem is in a bad state. Disabling satellite modem now ...");
Consumer<Integer> result = integer -> plogd(
"handleEventSatelliteModemStateChanged: disabling satellite result="
- + integer);
+ + integer);
mSatelliteDisabledRequest = new RequestSatelliteEnabledArgument(
false /* enableSatellite */, false /* enableDemoMode */,
false /* isEmergency */, result);
@@ -4787,13 +4858,14 @@
synchronized (mSatelliteCapabilitiesLock) {
mSatelliteCapabilities = capabilities;
- overrideSatelliteCapabilitiesIfApplicable();
}
+ overrideSatelliteCapabilitiesIfApplicable();
+ SatelliteCapabilities satelliteCapabilities = getSatelliteCapabilities();
List<ISatelliteCapabilitiesCallback> deadCallersList = new ArrayList<>();
mSatelliteCapabilitiesChangedListeners.values().forEach(listener -> {
try {
- listener.onSatelliteCapabilitiesChanged(this.mSatelliteCapabilities);
+ listener.onSatelliteCapabilitiesChanged(satelliteCapabilities);
} catch (RemoteException e) {
plogd("handleEventSatelliteCapabilitiesChanged RemoteException: " + e);
deadCallersList.add(listener);
@@ -4807,39 +4879,63 @@
private void handleEventSatelliteSupportedStateChanged(boolean supported) {
plogd("handleSatelliteSupportedStateChangedEvent: supported=" + supported);
- synchronized (mIsSatelliteSupportedLock) {
- if (mIsSatelliteSupported != null && mIsSatelliteSupported == supported) {
- if (DBG) {
- plogd("current satellite support state and new supported state are matched,"
- + " ignore update.");
- }
- return;
+ Boolean isSatelliteSupported = getIsSatelliteSupported();
+ if (isSatelliteSupported != null && isSatelliteSupported == supported) {
+ if (DBG) {
+ plogd("current satellite support state and new supported state are matched,"
+ + " ignore update.");
}
+ return;
+ }
- updateSatelliteSupportedState(supported);
+ updateSatelliteSupportedState(supported);
- /* In case satellite has been reported as not support from modem, but satellite is
+ Boolean isSatelliteEnabled = getIsSatelliteEnabled();
+ /* 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) {
- plogd("Invoke requestSatelliteEnabled(), supported=false, "
- + "mIsSatelliteEnabled=true");
- requestSatelliteEnabled(false /* enableSatellite */, false /* enableDemoMode */,
- false /* isEmergency */,
- new IIntegerConsumer.Stub() {
- @Override
- public void accept(int result) {
- plogd("handleSatelliteSupportedStateChangedEvent: request "
- + "satellite disable, result=" + result);
- }
- });
+ if (!supported && isSatelliteEnabled != null && isSatelliteEnabled) {
+ plogd("Invoke requestSatelliteEnabled(), supported=false, "
+ + "mIsSatelliteEnabled=true");
+ requestSatelliteEnabled(false /* enableSatellite */, false /* enableDemoMode */,
+ false /* isEmergency */,
+ new IIntegerConsumer.Stub() {
+ @Override
+ public void accept(int result) {
+ plogd("handleSatelliteSupportedStateChangedEvent: request "
+ + "satellite disable, result=" + result);
+ }
+ });
- }
- }
+ }
+
+ synchronized (mIsSatelliteSupportedLock) {
mIsSatelliteSupported = supported;
}
}
+ private void handleEventSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ plogd("handleEventSelectedNbIotSatelliteSubscriptionChanged: "
+ + "carrierRoamingNbIotNtn flag is disabled");
+ return;
+ }
+
+ plogd("handleEventSelectedNbIotSatelliteSubscriptionChanged: " + selectedSubId);
+
+ List<ISelectedNbIotSatelliteSubscriptionCallback> deadCallersList = new ArrayList<>();
+ mSelectedNbIotSatelliteSubscriptionChangedListeners.values().forEach(listener -> {
+ try {
+ listener.onSelectedNbIotSatelliteSubscriptionChanged(selectedSubId);
+ } catch (RemoteException e) {
+ logd("handleEventSelectedNbIotSatelliteSubscriptionChanged RemoteException: " + e);
+ deadCallersList.add(listener);
+ }
+ });
+ deadCallersList.forEach(listener -> {
+ mSelectedNbIotSatelliteSubscriptionChangedListeners.remove(listener.asBinder());
+ });
+ }
+
private void notifySatelliteSupportedStateChanged(boolean supported) {
List<ISatelliteSupportedStateCallback> deadCallersList = new ArrayList<>();
mSatelliteSupportedStateChangedListeners.values().forEach(listener -> {
@@ -5018,9 +5114,7 @@
sendRequestAsync(CMD_UPDATE_SATELLITE_ENABLE_ATTRIBUTES,
mSatelliteEnableAttributesUpdateRequest, null);
}
- synchronized (mSatellitePhoneLock) {
- updateLastNotifiedNtnModeAndNotify(mSatellitePhone);
- }
+ updateLastNotifiedNtnModeAndNotify(getSatellitePhone());
}
}
}
@@ -5051,26 +5145,24 @@
public void moveSatelliteToOffStateAndCleanUpResources(
@SatelliteManager.SatelliteResult int resultCode) {
plogd("moveSatelliteToOffStateAndCleanUpResources");
+ setDemoModeEnabled(false);
+ handlePersistentLoggingOnSessionEnd(mIsEmergency);
+ setEmergencyMode(false);
synchronized (mIsSatelliteEnabledLock) {
- setDemoModeEnabled(false);
- handlePersistentLoggingOnSessionEnd(mIsEmergency);
- setEmergencyMode(false);
mIsSatelliteEnabled = false;
- setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
- setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_FALSE);
- abortSatelliteDisableRequest(resultCode);
- abortSatelliteEnableRequest(resultCode);
- abortSatelliteEnableAttributesUpdateRequest(resultCode);
- resetSatelliteEnabledRequest();
- resetSatelliteDisabledRequest();
- // TODO (b/361139260): Stop timer to wait for other radios off
- updateSatelliteEnabledState(
- false, "moveSatelliteToOffStateAndCleanUpResources");
}
+ setSettingsKeyForSatelliteMode(SATELLITE_MODE_ENABLED_FALSE);
+ setSettingsKeyToAllowDeviceRotation(SATELLITE_MODE_ENABLED_FALSE);
+ abortSatelliteDisableRequest(resultCode);
+ abortSatelliteEnableRequest(resultCode);
+ abortSatelliteEnableAttributesUpdateRequest(resultCode);
+ resetSatelliteEnabledRequest();
+ resetSatelliteDisabledRequest();
+ // TODO (b/361139260): Stop timer to wait for other radios off
+ updateSatelliteEnabledState(
+ false, "moveSatelliteToOffStateAndCleanUpResources");
selectBindingSatelliteSubscription(false);
- synchronized (mSatellitePhoneLock) {
- updateLastNotifiedNtnModeAndNotify(mSatellitePhone);
- }
+ updateLastNotifiedNtnModeAndNotify(getSatellitePhone());
}
private void setDemoModeEnabled(boolean enabled) {
@@ -5396,7 +5488,7 @@
/** If the provision state per subscriberId for the cached is not exist, check the database for
* the corresponding value and use it. */
- private void updateSatelliteProvisionedStatePerSubscriberId() {
+ protected void updateSatelliteProvisionedStatePerSubscriberId() {
if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
return;
}
@@ -5755,13 +5847,12 @@
*/
@VisibleForTesting
protected @SatelliteManager.NTRadioTechnology int getSupportedNtnRadioTechnology() {
- synchronized (mSatelliteCapabilitiesLock) {
- if (mSatelliteCapabilities != null) {
- return mSatelliteCapabilities.getSupportedRadioTechnologies()
- .stream().findFirst().orElse(SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN);
- }
- return SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN;
+ SatelliteCapabilities satelliteCapabilities = getSatelliteCapabilities();
+ if (satelliteCapabilities != null) {
+ return satelliteCapabilities.getSupportedRadioTechnologies()
+ .stream().findFirst().orElse(SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN);
}
+ return SatelliteManager.NT_RADIO_TECHNOLOGY_UNKNOWN;
}
/**
@@ -5925,20 +6016,20 @@
return;
}
- boolean eligible = isCarrierRoamingNtnEligible(mSatellitePhone);
+ boolean eligible = isCarrierRoamingNtnEligible(getSatellitePhone());
plogd("evaluateCarrierRoamingNtnEligibilityChange: "
+ "isCarrierRoamingNtnEligible=" + eligible);
- synchronized (mSatellitePhoneLock) {
- if (eligible) {
- if (shouldStartNtnEligibilityHysteresisTimer(eligible)) {
- startNtnEligibilityHysteresisTimer();
- }
- } else {
- mNtnEligibilityHysteresisTimedOut = false;
- stopNtnEligibilityHysteresisTimer();
- updateLastNotifiedNtnEligibilityAndNotify(false);
+ if (eligible) {
+ if (shouldStartNtnEligibilityHysteresisTimer(eligible)) {
+ startNtnEligibilityHysteresisTimer();
}
+ } else {
+ synchronized (mSatellitePhoneLock) {
+ mNtnEligibilityHysteresisTimedOut = false;
+ }
+ stopNtnEligibilityHysteresisTimer();
+ updateLastNotifiedNtnEligibilityAndNotify(false);
}
}
@@ -5962,20 +6053,22 @@
}
private void startNtnEligibilityHysteresisTimer() {
- synchronized (mSatellitePhoneLock) {
- if (mSatellitePhone == null) {
- ploge("startNtnEligibilityHysteresisTimer: mSatellitePhone is null.");
- return;
- }
-
- int subId = getSelectedSatelliteSubId();
- long timeout = getCarrierSupportedSatelliteNotificationHysteresisTimeMillis(subId);
- mNtnEligibilityHysteresisTimedOut = false;
- plogd("startNtnEligibilityHysteresisTimer: sendMessageDelayed subId=" + subId
- + ", phoneId=" + mSatellitePhone.getPhoneId() + ", timeout=" + timeout);
- sendMessageDelayed(obtainMessage(EVENT_NOTIFY_NTN_ELIGIBILITY_HYSTERESIS_TIMED_OUT),
- timeout);
+ Phone satellitePhone = getSatellitePhone();
+ if (satellitePhone == null) {
+ ploge("startNtnEligibilityHysteresisTimer: mSatellitePhone is null.");
+ return;
}
+
+ int subId = getSelectedSatelliteSubId();
+ long timeout = getCarrierSupportedSatelliteNotificationHysteresisTimeMillis(subId);
+ synchronized (mSatellitePhoneLock) {
+ mNtnEligibilityHysteresisTimedOut = false;
+ }
+ plogd("startNtnEligibilityHysteresisTimer: sendMessageDelayed subId=" + subId
+ + ", phoneId=" + satellitePhone.getPhoneId() + ", timeout=" + timeout);
+ sendMessageDelayed(obtainMessage(EVENT_NOTIFY_NTN_ELIGIBILITY_HYSTERESIS_TIMED_OUT),
+ timeout);
+
}
private void stopNtnEligibilityHysteresisTimer() {
@@ -5990,24 +6083,26 @@
return;
}
- if (mOverrideNtnEligibility != null) {
- mSatellitePhone.notifyCarrierRoamingNtnEligibleStateChanged(currentNtnEligibility);
+ Phone satellitePhone = getSatellitePhone();
+ if (satellitePhone == null) {
+ ploge("notifyNtnEligibility: mSatellitePhone is null");
return;
}
- synchronized (mSatellitePhoneLock) {
- if (mSatellitePhone == null) {
- ploge("notifyNtnEligibility: mSatellitePhone is null");
- return;
- }
+ if (mOverrideNtnEligibility != null) {
+ satellitePhone.notifyCarrierRoamingNtnEligibleStateChanged(currentNtnEligibility);
+ return;
+ }
- plogd("notifyNtnEligibility: phoneId=" + mSatellitePhone.getPhoneId()
+ int selectedSatelliteSubId = getSelectedSatelliteSubId();
+ synchronized (mSatellitePhoneLock) {
+ plogd("notifyNtnEligibility: phoneId=" + satellitePhone.getPhoneId()
+ " currentNtnEligibility=" + currentNtnEligibility);
if (mLastNotifiedNtnEligibility == null
|| mLastNotifiedNtnEligibility != currentNtnEligibility) {
mLastNotifiedNtnEligibility = currentNtnEligibility;
- mSatellitePhone.notifyCarrierRoamingNtnEligibleStateChanged(currentNtnEligibility);
- updateSatelliteSystemNotification(getSelectedSatelliteSubId(),
+ satellitePhone.notifyCarrierRoamingNtnEligibleStateChanged(currentNtnEligibility);
+ updateSatelliteSystemNotification(selectedSatelliteSubId,
CarrierConfigManager.CARRIER_ROAMING_NTN_CONNECT_MANUAL,
currentNtnEligibility);
}
@@ -6235,50 +6330,51 @@
+ argument.requestId + ", enableSatellite=" + argument.enableSatellite);
argument.callback.accept(SATELLITE_RESULT_MODEM_TIMEOUT);
- synchronized (mIsSatelliteEnabledLock) {
- if (argument.enableSatellite) {
- resetSatelliteEnabledRequest();
- abortSatelliteEnableAttributesUpdateRequest(SATELLITE_RESULT_REQUEST_ABORTED);
- synchronized (mSatelliteEnabledRequestLock) {
- if (mSatelliteDisabledRequest == null) {
- IIntegerConsumer callback = new IIntegerConsumer.Stub() {
- @Override
- public void accept(int result) {
- plogd("handleEventWaitForSatelliteEnablingResponseTimedOut: "
- + "disable satellite result=" + result);
- }
- };
- Consumer<Integer> result =
- FunctionalUtils.ignoreRemoteException(callback::accept);
- mSatelliteDisabledRequest = new RequestSatelliteEnabledArgument(
- false, false, false, result);
- sendRequestAsync(CMD_SET_SATELLITE_ENABLED, mSatelliteDisabledRequest,
- null);
+ if (argument.enableSatellite) {
+ resetSatelliteEnabledRequest();
+ abortSatelliteEnableAttributesUpdateRequest(SATELLITE_RESULT_REQUEST_ABORTED);
+ if (getSatelliteDisabledRequest() == null) {
+ IIntegerConsumer callback = new IIntegerConsumer.Stub() {
+ @Override
+ public void accept(int result) {
+ plogd("handleEventWaitForSatelliteEnablingResponseTimedOut: "
+ + "disable satellite result=" + result);
}
+ };
+ Consumer<Integer> result =
+ FunctionalUtils.ignoreRemoteException(callback::accept);
+
+ RequestSatelliteEnabledArgument request;
+ synchronized (mSatelliteEnabledRequestLock) {
+ mSatelliteDisabledRequest = new RequestSatelliteEnabledArgument(
+ false, false, false, result);
+ request = mSatelliteDisabledRequest;
}
- mControllerMetricsStats.reportServiceEnablementFailCount();
- mSessionMetricsStats.setInitializationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
- .setSatelliteTechnology(getSupportedNtnRadioTechnology())
- .setInitializationProcessingTime(
- System.currentTimeMillis() - mSessionProcessingTimeStamp)
- .setIsDemoMode(mIsDemoModeEnabled)
- .setCarrierId(getSatelliteCarrierId())
- .reportSessionMetrics();
- } else {
- resetSatelliteDisabledRequest();
- mControllerMetricsStats.onSatelliteDisabled();
- mSessionMetricsStats.setTerminationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
- .setSatelliteTechnology(getSupportedNtnRadioTechnology())
- .setTerminationProcessingTime(
- System.currentTimeMillis() - mSessionProcessingTimeStamp)
- .setSessionDurationSec(calculateSessionDurationTimeSec())
- .reportSessionMetrics();
+ sendRequestAsync(CMD_SET_SATELLITE_ENABLED, request, null);
}
- notifyEnablementFailedToSatelliteSessionController(argument.enableSatellite);
- mSessionStartTimeStamp = 0;
- mSessionProcessingTimeStamp = 0;
+
+ mControllerMetricsStats.reportServiceEnablementFailCount();
+ mSessionMetricsStats.setInitializationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
+ .setInitializationProcessingTime(
+ System.currentTimeMillis() - mSessionProcessingTimeStamp)
+ .setIsDemoMode(mIsDemoModeEnabled)
+ .setCarrierId(getSatelliteCarrierId())
+ .reportSessionMetrics();
+ } else {
+ resetSatelliteDisabledRequest();
+ mControllerMetricsStats.onSatelliteDisabled();
+ mSessionMetricsStats.setTerminationResult(SATELLITE_RESULT_MODEM_TIMEOUT)
+ .setSatelliteTechnology(getSupportedNtnRadioTechnology())
+ .setTerminationProcessingTime(
+ System.currentTimeMillis() - mSessionProcessingTimeStamp)
+ .setSessionDurationSec(calculateSessionDurationTimeSec())
+ .reportSessionMetrics();
}
+ notifyEnablementFailedToSatelliteSessionController(argument.enableSatellite);
+ mSessionStartTimeStamp = 0;
+ mSessionProcessingTimeStamp = 0;
}
private void handleCmdUpdateNtnSignalStrengthReporting(boolean shouldReport) {
@@ -7179,16 +7275,17 @@
}
}
- synchronized (mSatelliteTokenProvisionedLock) {
- if (selectedSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
- && isSatelliteSupportedViaOem()) {
- selectedSubId = getNtnOnlySubscriptionId();
- }
- mSelectedSatelliteSubId = selectedSubId;
- setSatellitePhone(selectedSubId);
+ if (selectedSubId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
+ && isSatelliteSupportedViaOem()) {
+ selectedSubId = getNtnOnlySubscriptionId();
}
- plogd("selectBindingSatelliteSubscription: SelectedSatelliteSubId="
- + mSelectedSatelliteSubId);
+
+ synchronized (mSatelliteTokenProvisionedLock) {
+ mSelectedSatelliteSubId = selectedSubId;
+ }
+ setSatellitePhone(selectedSubId);
+ plogd("selectBindingSatelliteSubscription: SelectedSatelliteSubId=" + selectedSubId);
+ handleEventSelectedNbIotSatelliteSubscriptionChanged(selectedSubId);
}
private int getSubIdFromSubscriberId(String subscriberId) {
@@ -7259,7 +7356,8 @@
* @param result The result receiver that returns if the request is successful or
* an error code if the request failed.
*/
- public void updateSystemSelectionChannels(@NonNull SystemSelectionSpecifier selectionSpecifier,
+ public void updateSystemSelectionChannels(
+ @NonNull List<SystemSelectionSpecifier> selectionSpecifiers,
@NonNull ResultReceiver result) {
if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
plogd("updateSystemSelectionChannels: "
@@ -7269,7 +7367,7 @@
}
sendRequestAsync(CMD_UPDATE_SYSTEM_SELECTION_CHANNELS,
- new UpdateSystemSelectionChannelsArgument(selectionSpecifier, result), null);
+ new UpdateSystemSelectionChannelsArgument(selectionSpecifiers, result), null);
}
/**
@@ -7796,18 +7894,15 @@
* uses the value in the existed mSatelliteCapabilities.
*/
private void overrideSatelliteCapabilitiesIfApplicable() {
- synchronized (this.mSatellitePhoneLock) {
- if (this.mSatellitePhone == null) {
- return;
- }
- }
int subId = getSelectedSatelliteSubId();
PersistableBundle config = getPersistableBundle(subId);
if (config.containsKey(KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE)) {
int datagramSize = config.getInt(KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE);
SubscriptionInfo subInfo = mSubscriptionManagerService.getSubscriptionInfo(subId);
if (!(subInfo == null || subInfo.isOnlyNonTerrestrialNetwork())) {
- this.mSatelliteCapabilities.setMaxBytesPerOutgoingDatagram(datagramSize);
+ synchronized (mSatelliteCapabilitiesLock) {
+ this.mSatelliteCapabilities.setMaxBytesPerOutgoingDatagram(datagramSize);
+ }
}
}
}
@@ -8009,7 +8104,7 @@
NTN_SIGNAL_STRENGTH_NONE);
if (isInCarrierRoamingNbIotNtn(phone)) {
- if (mSatelliteSessionController.isInConnectedState()) {
+ if (isInConnectedState()) {
synchronized (mNtnSignalsStrengthLock) {
carrierRoamingNtnSignalStrength = mNtnSignalStrength;
}
@@ -8029,6 +8124,20 @@
return carrierRoamingNtnSignalStrength;
}
+ private boolean isInConnectedState() {
+ synchronized (mSatelliteModemStateLock) {
+ switch (mSatelliteModemState) {
+ case SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED:
+ case SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING:
+ plogd("isInConnectedState: return true");
+ return true;
+ default:
+ plogd("isInConnectedState: return false");
+ return false;
+ }
+ }
+ }
+
protected void updateLastNotifiedCarrierRoamingNtnSignalStrengthAndNotify(
@Nullable Phone phone) {
if (!mFeatureFlags.carrierRoamingNbIotNtn()) return;
@@ -8051,15 +8160,107 @@
/** Returns whether to send SMS to DatagramDispatcher or not. */
public boolean shouldSendSmsToDatagramDispatcher(@Nullable Phone phone) {
- if (!isInCarrierRoamingNbIotNtn(phone)) {
- return false;
- }
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (!isInCarrierRoamingNbIotNtn(phone)) {
+ return false;
+ }
- if (isDemoModeEnabled()) {
- return false;
- }
+ if (isDemoModeEnabled()) {
+ return false;
+ }
- int[] services = getSupportedServicesOnCarrierRoamingNtn(phone.getSubId());
- return ArrayUtils.contains(services, NetworkRegistrationInfo.SERVICE_TYPE_SMS);
+ int[] services = getSupportedServicesOnCarrierRoamingNtn(phone.getSubId());
+ return ArrayUtils.contains(services, NetworkRegistrationInfo.SERVICE_TYPE_SMS);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private boolean isWaitingForSatelliteModemOff() {
+ synchronized (mSatelliteEnabledRequestLock) {
+ return mWaitingForSatelliteModemOff;
+ }
+ }
+
+ @Nullable
+ private Boolean getIsSatelliteSupported() {
+ synchronized (mIsSatelliteSupportedLock) {
+ return mIsSatelliteSupported;
+ }
+ }
+
+ private boolean isWaitingForDisableSatelliteModemResponse() {
+ synchronized (mSatelliteEnabledRequestLock) {
+ return mWaitingForDisableSatelliteModemResponse;
+ }
+ }
+
+ @Nullable
+ private Boolean getIsSatelliteEnabled() {
+ synchronized (mIsSatelliteEnabledLock) {
+ return mIsSatelliteEnabled;
+ }
+ }
+
+ @Nullable
+ private RequestSatelliteEnabledArgument getSatelliteDisabledRequest() {
+ synchronized (mSatelliteEnabledRequestLock) {
+ return mSatelliteDisabledRequest;
+ }
+ }
+
+ private SatelliteCapabilities getSatelliteCapabilities() {
+ synchronized (mSatelliteCapabilitiesLock) {
+ return mSatelliteCapabilities;
+ }
+ }
+
+ private void setBTEnabledState(boolean enabled) {
+ synchronized (mRadioStateLock) {
+ mBTStateEnabled = enabled;
+ }
+ }
+
+ private boolean getBTEnabledState() {
+ synchronized (mRadioStateLock) {
+ return mBTStateEnabled;
+ }
+ }
+
+ private void setNfcEnabledState(boolean enabled) {
+ synchronized (mRadioStateLock) {
+ mNfcStateEnabled = enabled;
+ }
+ }
+
+ private boolean getNfcEnabledState() {
+ synchronized (mRadioStateLock) {
+ return mNfcStateEnabled;
+ }
+ }
+
+ private void setUwbEnabledState(boolean enabled) {
+ synchronized (mRadioStateLock) {
+ mUwbStateEnabled = enabled;
+ }
+ }
+
+ private boolean getUwbEnabledState() {
+ synchronized (mRadioStateLock) {
+ return mUwbStateEnabled;
+ }
+ }
+
+ private void setWifiEnabledState(boolean enabled) {
+ synchronized (mRadioStateLock) {
+ mWifiStateEnabled = enabled;
+ }
+ }
+
+ private boolean getWifiEnabledState() {
+ synchronized (mRadioStateLock) {
+ return mWifiStateEnabled;
+ }
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
index 6f88f59..5b032e6 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
@@ -1387,18 +1387,18 @@
/**
* Request to update system selection channels
*
- * @param systemSelectionSpecifier system selection specifiers
+ * @param systemSelectionSpecifiers system selection specifiers
* @param message The Message to send to result of the operation to.
*/
public void updateSystemSelectionChannels(
- @NonNull SystemSelectionSpecifier systemSelectionSpecifier,
+ @NonNull List<SystemSelectionSpecifier> systemSelectionSpecifiers,
@Nullable Message message) {
plogd("updateSystemSelectionChannels: SystemSelectionSpecifier: "
- + systemSelectionSpecifier.toString());
+ + systemSelectionSpecifiers.toString());
if (mSatelliteService != null) {
try {
mSatelliteService.updateSystemSelectionChannels(SatelliteServiceUtils
- .toSystemSelectionSpecifier(systemSelectionSpecifier),
+ .toSystemSelectionSpecifier(systemSelectionSpecifiers),
new IIntegerConsumer.Stub() {
@Override
public void accept(int result) {
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
index 182f667..6937b74 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
@@ -24,6 +24,9 @@
import static android.telephony.TelephonyManager.EXTRA_EMERGENCY_CALL_TO_SATELLITE_LAUNCH_INTENT;
import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS;
import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_NOT_PROVISIONED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_NOT_SUPPORTED;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_DISALLOWED_REASON_UNSUPPORTED_DEFAULT_MSG_APP;
import static com.android.internal.telephony.flags.Flags.satellitePersistentLogging;
import static com.android.internal.telephony.satellite.SatelliteController.INVALID_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE;
@@ -262,6 +265,26 @@
return SmsApplication.getDefaultSendToApplication(mContext, false);
}
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected boolean updateAndGetProvisionState() {
+ mSatelliteController.updateSatelliteProvisionedStatePerSubscriberId();
+ return isDeviceProvisioned();
+ }
+
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected boolean isSatelliteAllowedByReasons() {
+ SatelliteManager satelliteManager = mContext.getSystemService(SatelliteManager.class);
+ List<Integer> disallowedReasons = satelliteManager.getSatelliteDisallowedReasons();
+ if (disallowedReasons.stream().anyMatch(r ->
+ (r == SATELLITE_DISALLOWED_REASON_UNSUPPORTED_DEFAULT_MSG_APP
+ || r == SATELLITE_DISALLOWED_REASON_NOT_PROVISIONED
+ || r == SATELLITE_DISALLOWED_REASON_NOT_SUPPORTED))) {
+ plogd("isAllowedForDefaultMessageApp:false, disallowedReasons=" + disallowedReasons);
+ return false;
+ }
+ return true;
+ }
+
private void handleEmergencyCallStartedEvent(@NonNull Connection connection) {
plogd("handleEmergencyCallStartedEvent: connection=" + connection);
mSatelliteController.setLastEmergencyCallTime();
@@ -310,6 +333,8 @@
return;
}
+ updateAndGetProvisionState();
+
/*
* The device might be connected to satellite after the emergency call started. Thus, we
* need to do this check again so that we will have higher chance of sending the event
@@ -321,7 +346,7 @@
boolean isCellularAvailable = SatelliteServiceUtils.isCellularAvailable();
if (!isCellularAvailable
&& isSatelliteAllowed()
- && (isDeviceProvisioned()
+ && ((isDeviceProvisioned() && isSatelliteAllowedByReasons())
|| isSatelliteConnectedViaCarrierWithinHysteresisTime())
&& shouldTrackCall(mEmergencyConnection.getState())) {
plogd("handleTimeoutEvent: Sent EVENT_DISPLAY_EMERGENCY_MESSAGE to Dialer");
@@ -737,7 +762,9 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public int getEmergencyCallToSatelliteHandoverType() {
- if (Flags.carrierRoamingNbIotNtn() && isDeviceProvisioned()
+ if (Flags.carrierRoamingNbIotNtn()
+ && isDeviceProvisioned()
+ && isSatelliteAllowedByReasons()
&& isSatelliteConnectedViaCarrierWithinHysteresisTime()) {
int satelliteSubId = mSatelliteController.getSelectedSatelliteSubId();
return mSatelliteController.getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java b/src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java
index 9217ba1..7aaf936 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java
@@ -36,10 +36,12 @@
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.satellite.AntennaPosition;
+import android.telephony.satellite.EarfcnRange;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.PointingInfo;
import android.telephony.satellite.SatelliteCapabilities;
import android.telephony.satellite.SatelliteDatagram;
+import android.telephony.satellite.SatelliteInfo;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteModemEnableRequestAttributes;
import android.telephony.satellite.SatelliteSubscriptionInfo;
@@ -54,7 +56,6 @@
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.TelephonyUtils;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -544,24 +545,69 @@
return mcc + mnc;
}
- /**
- * Convert SystemSelectionSpecifier from framework definition to service definition
- * @param systemSelectionSpecifier The SystemSelectionSpecifier from the framework.
- * @return The converted SystemSelectionSpecifier for the satellite service.
- */
- @NonNull public static List<android.telephony.satellite.stub
- .SystemSelectionSpecifier> toSystemSelectionSpecifier(
+ @NonNull
+ private static android.telephony.satellite.stub
+ .SystemSelectionSpecifier convertSystemSelectionSpecifierToHALFormat(
@NonNull SystemSelectionSpecifier systemSelectionSpecifier) {
- List<android.telephony.satellite.stub.SystemSelectionSpecifier> converted =
- new ArrayList<>();
android.telephony.satellite.stub.SystemSelectionSpecifier convertedSpecifier =
new android.telephony.satellite.stub.SystemSelectionSpecifier();
convertedSpecifier.mMccMnc = systemSelectionSpecifier.getMccMnc();
convertedSpecifier.mBands = systemSelectionSpecifier.getBands().toArray();
- convertedSpecifier.mEarfcs = systemSelectionSpecifier.getEarfcs().toArray();
- converted.add(convertedSpecifier);
- return converted;
+ convertedSpecifier.mEarfcs = systemSelectionSpecifier.getEarfcns().toArray();
+
+ SatelliteInfo[] satelliteInfos = systemSelectionSpecifier.getSatelliteInfos();
+ android.telephony.satellite.stub.SatelliteInfo[] halSatelliteInfos =
+ new android.telephony.satellite.stub.SatelliteInfo[satelliteInfos.length];
+ for (int i = 0; i < satelliteInfos.length; i++) {
+ halSatelliteInfos[i] = new android.telephony.satellite.stub.SatelliteInfo();
+
+ halSatelliteInfos[i].id = new android.telephony.satellite.stub.UUID();
+ halSatelliteInfos[i].id.mostSigBits =
+ satelliteInfos[i].getSatelliteId().getMostSignificantBits();
+ halSatelliteInfos[i].id.leastSigBits =
+ satelliteInfos[i].getSatelliteId().getLeastSignificantBits();
+
+ halSatelliteInfos[i].position =
+ new android.telephony.satellite.stub.SatellitePosition();
+ halSatelliteInfos[i].position.longitudeDegree =
+ satelliteInfos[i].getSatellitePosition().getLongitudeDegrees();
+ halSatelliteInfos[i].position.altitudeKm =
+ satelliteInfos[i].getSatellitePosition().getAltitudeKm();
+
+ halSatelliteInfos[i].bands = satelliteInfos[i].getBands().stream().mapToInt(
+ Integer::intValue).toArray();
+
+ List<EarfcnRange> earfcnRangeList = satelliteInfos[i].getEarfcnRanges();
+ halSatelliteInfos[i].earfcnRanges =
+ new android.telephony.satellite.stub.EarfcnRange[earfcnRangeList.size()];
+ for (int j = 0; j < earfcnRangeList.size(); j++) {
+ halSatelliteInfos[i].earfcnRanges[j] =
+ new android.telephony.satellite.stub.EarfcnRange();
+ halSatelliteInfos[i].earfcnRanges[j].startEarfcn = earfcnRangeList.get(
+ j).getStartEarfcn();
+ halSatelliteInfos[i].earfcnRanges[j].endEarfcn = earfcnRangeList.get(
+ j).getEndEarfcn();
+ }
+ }
+ convertedSpecifier.satelliteInfos = halSatelliteInfos;
+
+ convertedSpecifier.tagIds = systemSelectionSpecifier.getTagIds().toArray();
+ return convertedSpecifier;
+ }
+
+ /**
+ * Convert SystemSelectionSpecifier from framework definition to service definition
+ * @param systemSelectionSpecifier The SystemSelectionSpecifier from the framework.
+ * @return The converted SystemSelectionSpecifier for the satellite service.
+ */
+ @NonNull
+ public static List<android.telephony.satellite.stub
+ .SystemSelectionSpecifier> toSystemSelectionSpecifier(
+ @NonNull List<SystemSelectionSpecifier> systemSelectionSpecifier) {
+ return systemSelectionSpecifier.stream().map(
+ SatelliteServiceUtils::convertSystemSelectionSpecifierToHALFormat).collect(
+ Collectors.toList());
}
/**
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java b/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
index d1d03a0..b2861d3 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSessionController.java
@@ -68,7 +68,6 @@
import android.util.Log;
import com.android.internal.R;
-import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.DeviceStateMonitor;
import com.android.internal.telephony.ExponentialBackoff;
@@ -586,17 +585,6 @@
}
/**
- * Get whether state machine is in connected state.
- *
- * @return {@code true} if state machine is in connected state and {@code false} otherwise.
- */
- public boolean isInConnectedState() {
- if (DBG) plogd("isInConnectedState: getCurrentState=" + getCurrentState());
- return getCurrentState() == mConnectedState;
- }
-
-
- /**
* Release all resource.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index ee713c6..4cc10d9 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -888,11 +888,8 @@
doReturn(PhoneConstants.State.IDLE).when(mCT).getState();
doReturn(new SubscriptionInfoInternal.Builder().setId(1).build())
.when(mSubscriptionManagerService).getSubscriptionInfoInternal(anyInt());
-
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
- doReturn(true).when(mFeatureFlags).simDisabledGracefulTearDown();
-
when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
doReturn(true).when(mMockPackageManager).hasSystemFeature(anyString());
@@ -4311,7 +4308,7 @@
}
@Test
- public void testImsGracefulTearDownSimRemoval() throws Exception {
+ public void testImsGracefulTearDown() throws Exception {
setImsRegistered(true);
setRcsRegistered(true);
@@ -4357,52 +4354,6 @@
}
@Test
- public void testImsGracefulTearDownSimDisabled() throws Exception {
- setImsRegistered(true);
- setRcsRegistered(true);
-
- NetworkCapabilities netCaps = new NetworkCapabilities();
- netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
- netCaps.maybeMarkCapabilitiesRestricted();
- netCaps.setRequestorPackageName(FAKE_MMTEL_PACKAGE);
-
- NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
- ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
- TelephonyNetworkRequest networkRequest = new TelephonyNetworkRequest(
- nativeNetworkRequest, mPhone, mFeatureFlags);
-
- mDataNetworkControllerUT.addNetworkRequest(networkRequest);
-
- processAllMessages();
- Mockito.clearInvocations(mPhone);
-
- // SIM disabled
- mDataNetworkControllerUT.obtainMessage(9/*EVENT_SIM_STATE_CHANGED*/,
- TelephonyManager.SIM_STATE_NOT_READY, 0).sendToTarget();
- processAllMessages();
-
- // Make sure data network enters disconnecting state
- ArgumentCaptor<PreciseDataConnectionState> pdcsCaptor =
- ArgumentCaptor.forClass(PreciseDataConnectionState.class);
- verify(mPhone).notifyDataConnection(pdcsCaptor.capture());
- PreciseDataConnectionState pdcs = pdcsCaptor.getValue();
- assertThat(pdcs.getState()).isEqualTo(TelephonyManager.DATA_DISCONNECTING);
-
- // IMS de-registered. Now data network is safe to be torn down.
- Mockito.clearInvocations(mPhone);
- setImsRegistered(false);
- setRcsRegistered(false);
- processAllMessages();
-
- // All data should be disconnected.
- verifyAllDataDisconnected();
- verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_IMS);
- verify(mPhone).notifyDataConnection(pdcsCaptor.capture());
- pdcs = pdcsCaptor.getValue();
- assertThat(pdcs.getState()).isEqualTo(TelephonyManager.DATA_DISCONNECTED);
- }
-
- @Test
public void testNoGracefulTearDownForEmergencyDataNetwork() throws Exception {
setImsRegistered(true);
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 db7dfe5..dc973af 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -825,8 +825,7 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
- true, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -860,8 +859,7 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
- true, false);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, false);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -1059,8 +1057,7 @@
eq(SATELLITE_RESULT_SUCCESS));
verify(mMockSmsDispatchersController).sendCarrierRoamingNbIotNtnText(eq(mPendingSms));
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
- true, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
@@ -1111,8 +1108,7 @@
processAllMessages();
verifyZeroInteractions(mMockSatelliteModemInterface);
- mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId,
- true, true);
+ mDatagramDispatcherUT.onSendSmsDone(mPhone.getSubId(), mPendingSms.uniqueMessageId, true);
processAllMessages();
mInOrder.verify(mMockDatagramController)
.updateSendStatus(eq(SUB_ID), eq(datagramTypeSms),
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 cf6f6a9..4a2a963 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -84,6 +84,7 @@
import static com.android.internal.telephony.satellite.SatelliteController.SATELLITE_MODE_ENABLED_FALSE;
import static com.android.internal.telephony.satellite.SatelliteController.SATELLITE_MODE_ENABLED_TRUE;
+import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
@@ -150,6 +151,7 @@
import android.telephony.SignalStrength;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.satellite.EarfcnRange;
import android.telephony.satellite.INtnSignalStrengthCallback;
import android.telephony.satellite.ISatelliteCapabilitiesCallback;
import android.telephony.satellite.ISatelliteDatagramCallback;
@@ -157,17 +159,22 @@
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.ISatelliteSupportedStateCallback;
import android.telephony.satellite.ISatelliteTransmissionUpdateCallback;
+import android.telephony.satellite.ISelectedNbIotSatelliteSubscriptionCallback;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteCapabilities;
import android.telephony.satellite.SatelliteDatagram;
+import android.telephony.satellite.SatelliteInfo;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteManager.SatelliteException;
import android.telephony.satellite.SatelliteModemEnableRequestAttributes;
+import android.telephony.satellite.SatellitePosition;
import android.telephony.satellite.SatelliteSubscriberInfo;
import android.telephony.satellite.SatelliteSubscriberProvisionStatus;
import android.telephony.satellite.SatelliteSubscriptionInfo;
+import android.telephony.satellite.SystemSelectionSpecifier;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.util.IntArray;
import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
@@ -205,10 +212,13 @@
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -540,6 +550,22 @@
}
};
+ private int mQueriedSystemSelectionChannelUpdatedResultCode = SATELLITE_RESULT_SUCCESS;
+ private Semaphore mSystemSelectionChannelUpdatedSemaphore = new Semaphore(0);
+ private ResultReceiver mSystemSelectionChannelUpdatedReceiver = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mQueriedSystemSelectionChannelUpdatedResultCode = resultCode;
+ try {
+ mSystemSelectionChannelUpdatedSemaphore.release();
+ } catch (Exception ex) {
+ fail("mSystemSelectionChannelUpdatedReceiver: Got exception in releasing "
+ + "semaphore, ex="
+ + ex);
+ }
+ }
+ };
+
@Rule
public final CheckFlagsRule mCheckFlagsRule =
DeviceFlagsValueProvider.createCheckFlagsRule();
@@ -3986,6 +4012,96 @@
}
@Test
+ public void testRegisterForSelectedNbIotSatelliteSubscriptionChanged_WithFeatureFlagEnabled() {
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+
+ Semaphore semaphore = new Semaphore(0);
+ final int[] selectedSubIds = new int[1];
+ ISelectedNbIotSatelliteSubscriptionCallback callback =
+ new ISelectedNbIotSatelliteSubscriptionCallback.Stub() {
+ @Override
+ public void onSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
+ logd("onSelectedNbIotSatelliteSubscriptionChanged: selectedSubId="
+ + selectedSubId);
+ try {
+ selectedSubIds[0] = selectedSubId;
+ semaphore.release();
+ } catch (Exception ex) {
+ loge("onSelectedNbIotSatelliteSubscriptionChanged: Got exception in "
+ + "releasing semaphore, ex=" + ex);
+ }
+ }
+ };
+
+ int errorCode = mSatelliteControllerUT.registerForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, errorCode);
+
+ setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
+ verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS);
+ errorCode = mSatelliteControllerUT.registerForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ assertEquals(SATELLITE_RESULT_NOT_SUPPORTED, errorCode);
+
+ // Register the callback and verify that the event is reported.
+ resetSatelliteControllerUT();
+ setUpResponseForRequestIsSatelliteProvisioned(true,SATELLITE_RESULT_SUCCESS);
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ errorCode = mSatelliteControllerUT.registerForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ assertEquals(SATELLITE_RESULT_SUCCESS, errorCode);
+ int expectedSubId = 1;
+ sendSelectedNbIotSatelliteSubscriptionChangedEvent(expectedSubId, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegisterForSelectedNbIotSatelliteSubscriptionChanged"));
+ assertEquals(expectedSubId, selectedSubIds[0]);
+
+ // Unregister the callback and verify that the event is not reported.
+ mSatelliteControllerUT.unregisterForSelectedNbIotSatelliteSubscriptionChanged(callback);
+ sendSelectedNbIotSatelliteSubscriptionChangedEvent(2, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 0, "testRegisterForSelectedNbIotSatelliteSubscriptionChanged"));
+ }
+
+ @Test
+ public void testRegisterForSelectedNbIotSatelliteSubscriptionChanged_WithFeatureFlagDisabled() {
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(false);
+
+ Semaphore semaphore = new Semaphore(0);
+ final int[] selectedSubIds = new int[1];
+ ISelectedNbIotSatelliteSubscriptionCallback callback =
+ new ISelectedNbIotSatelliteSubscriptionCallback.Stub() {
+ @Override
+ public void onSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
+ logd("onSelectedNbIotSatelliteSubscriptionChanged: selectedSubId="
+ + selectedSubId);
+ try {
+ selectedSubIds[0] = selectedSubId;
+ semaphore.release();
+ } catch (Exception ex) {
+ loge("onSelectedNbIotSatelliteSubscriptionChanged: Got exception in "
+ + "releasing semaphore, ex=" + ex);
+ }
+ }
+ };
+
+ int errorCode = mSatelliteControllerUT.registerForSelectedNbIotSatelliteSubscriptionChanged(
+ callback);
+ assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode);
+
+ // Verify that the event is not reported.
+ sendSelectedNbIotSatelliteSubscriptionChangedEvent(1, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 0, "testRegisterForSelectedNbIotSatelliteSubscriptionChanged"));
+
+
+ }
+
+ @Test
public void testIsSatelliteEmergencyMessagingSupportedViaCarrier() {
// Carrier-enabled flag is off
when(mFeatureFlags.carrierEnabledSatelliteFlag()).thenReturn(false);
@@ -5027,6 +5143,147 @@
assertFalse(mSatelliteControllerUT.isApplicationUpdated);
}
+ @Test
+ public void testUpdateSystemSelectionChannels() {
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+
+ String mccmnc = "123455";
+ int[] bands1 = {200, 201, 202};
+ IntArray intArraybands1 = new IntArray(3);
+ intArraybands1.addAll(bands1);
+ int[] earfcns1 = {300, 301, 310, 311};
+ IntArray intArrayEarfcns1 = new IntArray(4);
+ intArrayEarfcns1.addAll(earfcns1);
+ String seed1 = "test-seed-satellite1";
+ UUID uuid1 = UUID.nameUUIDFromBytes(seed1.getBytes());
+ SatellitePosition satellitePosition1 = new SatellitePosition(0, 35876);
+ EarfcnRange earfcnRange1 = new EarfcnRange(301, 300);
+ EarfcnRange earfcnRange2 = new EarfcnRange(311, 310);
+ List<EarfcnRange> earfcnRangeList1 = new ArrayList<>(
+ Arrays.asList(earfcnRange1, earfcnRange2));
+ SatelliteInfo satelliteInfo1 = new SatelliteInfo(uuid1, satellitePosition1, Arrays.stream(
+ bands1).boxed().collect(Collectors.toList()), earfcnRangeList1);
+ int[] tagIds = {1, 2, 3};
+ IntArray intArrayTagIds = new IntArray(3);
+ intArrayTagIds.addAll(tagIds);
+ SystemSelectionSpecifier systemSelectionSpecifier1 = new SystemSelectionSpecifier(mccmnc,
+ intArraybands1, intArrayEarfcns1, new SatelliteInfo[]{satelliteInfo1},
+ intArrayTagIds);
+
+ setUpResponseForUpdateSystemSelectionChannels(SATELLITE_RESULT_ERROR);
+ mSatelliteControllerUT.updateSystemSelectionChannels(
+ new ArrayList<>(List.of(systemSelectionSpecifier1)),
+ mSystemSelectionChannelUpdatedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestUpdateSystemSelectionChannelResult(1));
+ assertEquals(SATELLITE_RESULT_ERROR, mQueriedSystemSelectionChannelUpdatedResultCode);
+
+ // Verify whether callback receives expected result
+ setUpResponseForUpdateSystemSelectionChannels(SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.updateSystemSelectionChannels(
+ new ArrayList<>(List.of(systemSelectionSpecifier1)),
+ mSystemSelectionChannelUpdatedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestUpdateSystemSelectionChannelResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSystemSelectionChannelUpdatedResultCode);
+
+ // Verify whether SatelliteModemInterface API was invoked and data is valid, when single
+ // data was provided.
+ ArgumentCaptor<List<SystemSelectionSpecifier>> systemSelectionSpecifierListCaptor =
+ ArgumentCaptor.forClass(List.class);
+ verify(mMockSatelliteModemInterface, times(2)).updateSystemSelectionChannels(
+ systemSelectionSpecifierListCaptor.capture(), any(Message.class));
+ List<SystemSelectionSpecifier> capturedList = systemSelectionSpecifierListCaptor.getValue();
+ SystemSelectionSpecifier systemSelectionSpecifier = capturedList.getFirst();
+
+ assertEquals(mccmnc, systemSelectionSpecifier.getMccMnc());
+ int[] actualBandsArray = IntStream.range(0, systemSelectionSpecifier.getBands().size()).map(
+ systemSelectionSpecifier.getBands()::get).toArray();
+ assertArrayEquals(bands1, actualBandsArray);
+ int[] actualEarfcnsArray = IntStream.range(0,
+ systemSelectionSpecifier.getEarfcns().size()).map(
+ systemSelectionSpecifier.getEarfcns()::get).toArray();
+ assertArrayEquals(earfcns1, actualEarfcnsArray);
+ assertArrayEquals(new SatelliteInfo[]{satelliteInfo1},
+ systemSelectionSpecifier.getSatelliteInfos());
+ int[] actualTagIdArray = IntStream.range(0,
+ systemSelectionSpecifier.getTagIds().size()).map(
+ systemSelectionSpecifier.getTagIds()::get).toArray();
+ assertArrayEquals(tagIds, actualTagIdArray);
+
+ // Verify whether SatelliteModemInterface API was invoked and data is valid, when list
+ // of data was provided.
+ int[] bands2 = {210, 211, 212};
+ IntArray intArraybands2 = new IntArray(3);
+ intArraybands2.addAll(bands2);
+ int[] earfcns2 = {320, 321, 330, 331};
+ IntArray intArrayEarfcns2 = new IntArray(4);
+ intArrayEarfcns2.addAll(earfcns2);
+ String seed2 = "test-seed-satellite2";
+ UUID uuid2 = UUID.nameUUIDFromBytes(seed2.getBytes());
+ SatellitePosition satellitePosition2 = new SatellitePosition(120, 35876);
+ EarfcnRange earfcnRange3 = new EarfcnRange(321, 320);
+ EarfcnRange earfcnRange4 = new EarfcnRange(331, 330);
+ List<EarfcnRange> earfcnRangeList2 = new ArrayList<>(
+ Arrays.asList(earfcnRange3, earfcnRange4));
+ SatelliteInfo satelliteInfo2 = new SatelliteInfo(uuid2, satellitePosition2, Arrays.stream(
+ bands1).boxed().collect(Collectors.toList()), earfcnRangeList2);
+ SystemSelectionSpecifier systemSelectionSpecifier2 = new SystemSelectionSpecifier(mccmnc,
+ intArraybands2, intArrayEarfcns2, new SatelliteInfo[]{satelliteInfo2},
+ intArrayTagIds);
+
+ // Verify whether callback receives expected result
+ setUpResponseForUpdateSystemSelectionChannels(SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.updateSystemSelectionChannels(
+ new ArrayList<>(List.of(systemSelectionSpecifier1, systemSelectionSpecifier2)),
+ mSystemSelectionChannelUpdatedReceiver);
+ processAllMessages();
+ assertTrue(waitForRequestUpdateSystemSelectionChannelResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, mQueriedSystemSelectionChannelUpdatedResultCode);
+
+ // Verify whether SatelliteModemInterface API was invoked and data is valid,
+ verify(mMockSatelliteModemInterface, times(3)).updateSystemSelectionChannels(
+ systemSelectionSpecifierListCaptor.capture(), any(Message.class));
+ capturedList = systemSelectionSpecifierListCaptor.getValue();
+ SystemSelectionSpecifier capturedSystemSelectionSpecifier1 = capturedList.getFirst();
+ SystemSelectionSpecifier capturedSystemSelectionSpecifier2 = capturedList.get(1);
+
+ // Verify first SystemSelectionSpecifier
+ assertEquals(mccmnc, systemSelectionSpecifier.getMccMnc());
+ actualBandsArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier1.getBands().size()).map(
+ capturedSystemSelectionSpecifier1.getBands()::get).toArray();
+ assertArrayEquals(bands1, actualBandsArray);
+ actualEarfcnsArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier1.getEarfcns().size()).map(
+ capturedSystemSelectionSpecifier1.getEarfcns()::get).toArray();
+ assertArrayEquals(earfcns1, actualEarfcnsArray);
+ assertArrayEquals(new SatelliteInfo[]{satelliteInfo1},
+ capturedSystemSelectionSpecifier1.getSatelliteInfos());
+ actualTagIdArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier1.getTagIds().size()).map(
+ capturedSystemSelectionSpecifier1.getTagIds()::get).toArray();
+ assertArrayEquals(tagIds, actualTagIdArray);
+
+ // Verify second SystemSelectionSpecifier
+ assertEquals(mccmnc, systemSelectionSpecifier.getMccMnc());
+ actualBandsArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier2.getBands().size()).map(
+ capturedSystemSelectionSpecifier2.getBands()::get).toArray();
+ assertArrayEquals(bands2, actualBandsArray);
+ actualEarfcnsArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier2.getEarfcns().size()).map(
+ capturedSystemSelectionSpecifier2.getEarfcns()::get).toArray();
+ assertArrayEquals(earfcns2, actualEarfcnsArray);
+ assertArrayEquals(new SatelliteInfo[]{satelliteInfo2},
+ capturedSystemSelectionSpecifier2.getSatelliteInfos());
+ actualTagIdArray = IntStream.range(0,
+ capturedSystemSelectionSpecifier2.getTagIds().size()).map(
+ capturedSystemSelectionSpecifier2.getTagIds()::get).toArray();
+ assertArrayEquals(tagIds, actualTagIdArray);
+ }
+
private void verifyProvisionStatusPerSubscriberIdGetFromDb(boolean provision) {
doReturn(provision).when(
mMockSubscriptionManagerService).isSatelliteProvisionedForNonIpDatagram(anyInt());
@@ -5341,6 +5598,19 @@
}).when(mMockSatelliteModemInterface).stopSendingNtnSignalStrength(any(Message.class));
}
+ private void setUpResponseForUpdateSystemSelectionChannels(
+ @SatelliteManager.SatelliteResult int error) {
+ SatelliteException exception = (error == SATELLITE_RESULT_SUCCESS)
+ ? null : new SatelliteException(error);
+ doAnswer(invocation -> {
+ Message message = (Message) invocation.getArguments()[1];
+ AsyncResult.forMessage(message, null, exception);
+ message.sendToTarget();
+ return null;
+ }).when(mMockSatelliteModemInterface).updateSystemSelectionChannels(anyList(),
+ any(Message.class));
+ }
+
private boolean waitForRequestIsSatelliteSupportedResult(int expectedNumberOfEvents) {
for (int i = 0; i < expectedNumberOfEvents; i++) {
try {
@@ -5464,6 +5734,24 @@
return true;
}
+ private boolean waitForRequestUpdateSystemSelectionChannelResult(int expectedNumberOfEvents) {
+ for (int i = 0; i < expectedNumberOfEvents; i++) {
+ try {
+ if (!mSystemSelectionChannelUpdatedSemaphore.tryAcquire(TIMEOUT,
+ TimeUnit.MILLISECONDS)) {
+ logd("Timeout to receive "
+ + "updateSystemSelectionChannel()"
+ + " callback");
+ return false;
+ }
+ } catch (Exception ex) {
+ logd("updateSystemSelectionChannel: Got exception=" + ex);
+ return false;
+ }
+ }
+ return true;
+ }
+
private void verifySatelliteSupported(boolean supported, int expectedErrorCode) {
mSatelliteSupportSemaphore.drainPermits();
mSatelliteControllerUT.requestIsSatelliteSupported(mSatelliteSupportReceiver);
@@ -5591,6 +5879,14 @@
msg.sendToTarget();
}
+ private void sendSelectedNbIotSatelliteSubscriptionChangedEvent(int selectedSubId,
+ Throwable exception) {
+ Message msg = mSatelliteControllerUT.obtainMessage(
+ 60 /* EVENT_SELECTED_NB_IOT_SATELLITE_SUBSCRIPTION_CHANGED */);
+ msg.obj = new AsyncResult(null, selectedSubId, exception);
+ msg.sendToTarget();
+ }
+
private void setRadioPower(boolean on) {
mSimulatedCommands.setRadioPower(on, false, false, null);
}
@@ -5974,14 +6270,14 @@
final String callerSC = "SC:ResultReceiver";
final String callerSAC = "SAC:ResultReceiver";
- doReturn(false).when(mFeatureFlags).geofenceEnhancementForBetterUx();
+ doReturn(false).when(mFeatureFlags).carrierRoamingNbIotNtn();
mSatelliteControllerUT.incrementResultReceiverCount(callerSC);
assertEquals(0, mSatelliteControllerUT.getResultReceiverTotalCount());
mSatelliteControllerUT.decrementResultReceiverCount(callerSC);
assertEquals(0, mSatelliteControllerUT.getResultReceiverTotalCount());
- doReturn(true).when(mFeatureFlags).geofenceEnhancementForBetterUx();
+ doReturn(true).when(mFeatureFlags).carrierRoamingNbIotNtn();
mSatelliteControllerUT.incrementResultReceiverCount(callerSC);
assertEquals(1, mSatelliteControllerUT.getResultReceiverTotalCount());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java
index 56d5731..46847aa 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommenderTest.java
@@ -983,6 +983,8 @@
private ComponentName mSmsAppComponent = new ComponentName(
DEFAULT_SATELLITE_MESSAGING_PACKAGE, DEFAULT_SATELLITE_MESSAGING_CLASS);
private boolean mIsDialerNotified;
+ private boolean mProvisionState = true;
+ private boolean mSatelliteAllowedByReasons = true;
/**
* Create an instance of SatelliteSOSMessageRecommender.
@@ -1017,6 +1019,16 @@
mIsDialerNotified = isDialerNotified;
}
+ @Override
+ protected boolean updateAndGetProvisionState() {
+ return mProvisionState;
+ }
+
+ @Override
+ protected boolean isSatelliteAllowedByReasons() {
+ return mSatelliteAllowedByReasons;
+ }
+
public boolean isTimerStarted() {
return hasMessages(EVENT_TIME_OUT);
}