Merge "Implement API for SatelliteManager#requestIsEmergencyModeEnabled()" into main
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index 49d1adc..65d113d 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -30,6 +30,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
@@ -73,6 +74,7 @@
import com.android.internal.telephony.SmsConstants.MessageClass;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.internal.telephony.util.NotificationChannelController;
@@ -284,6 +286,8 @@
private List<SmsFilter> mSmsFilters;
+ protected final @NonNull FeatureFlags mFeatureFlags;
+
/**
* Create a new SMS broadcast helper.
* @param name the class name for logging
@@ -291,14 +295,15 @@
* @param storageMonitor the SmsStorageMonitor to check for storage availability
*/
protected InboundSmsHandler(String name, Context context, SmsStorageMonitor storageMonitor,
- Phone phone, Looper looper) {
+ Phone phone, Looper looper, FeatureFlags featureFlags) {
super(name, looper);
+ mFeatureFlags = featureFlags;
mContext = context;
mStorageMonitor = storageMonitor;
mPhone = phone;
mResolver = context.getContentResolver();
- mWapPush = new WapPushOverSms(context);
+ mWapPush = new WapPushOverSms(context, mFeatureFlags);
boolean smsCapable = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_sms_capable);
@@ -1324,6 +1329,7 @@
* @param user user to deliver the intent to
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ @SuppressLint("MissingPermission")
public void dispatchIntent(Intent intent, String permission, String appOp,
Bundle opts, SmsBroadcastReceiver resultReceiver, UserHandle user, int subId) {
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
@@ -1352,12 +1358,17 @@
// Get a list of currently started users.
int[] users = null;
final List<UserHandle> userHandles = mUserManager.getUserHandles(false);
+ final UserHandle mainUser = mUserManager.getMainUser();
final List<UserHandle> runningUserHandles = new ArrayList();
for (UserHandle handle : userHandles) {
if (mUserManager.isUserRunning(handle)) {
runningUserHandles.add(handle);
} else {
- if (handle.equals(UserHandle.SYSTEM)) {
+ if (mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()
+ && handle.equals(mainUser)) {
+ logeWithLocalLog("dispatchIntent: MAIN user is not running",
+ resultReceiver.mInboundSmsTracker.getMessageId());
+ } else if (handle.equals(UserHandle.SYSTEM)) {
logeWithLocalLog("dispatchIntent: SYSTEM user is not running",
resultReceiver.mInboundSmsTracker.getMessageId());
}
@@ -1375,7 +1386,7 @@
// by user policy.
for (int i = users.length - 1; i >= 0; i--) {
UserHandle targetUser = UserHandle.of(users[i]);
- if (users[i] != UserHandle.SYSTEM.getIdentifier()) {
+ if (!isMainUser(users[i])) {
// Is the user not allowed to use SMS?
if (hasUserRestriction(UserManager.DISALLOW_SMS, targetUser)) {
continue;
@@ -1385,14 +1396,14 @@
continue;
}
}
- // Only pass in the resultReceiver when the user SYSTEM is processed.
+ // Only pass in the resultReceiver when the MAIN user is processed.
try {
- if (users[i] == UserHandle.SYSTEM.getIdentifier()) {
+ if (isMainUser(users[i])) {
resultReceiver.setWaitingForIntent(intent);
}
mContext.createPackageContextAsUser(mContext.getPackageName(), 0, targetUser)
.sendOrderedBroadcast(intent, Activity.RESULT_OK, permission, appOp,
- users[i] == UserHandle.SYSTEM.getIdentifier()
+ isMainUser(users[i])
? resultReceiver : null, getHandler(),
null /* initialData */, null /* initialExtras */, opts);
} catch (PackageManager.NameNotFoundException ignored) {
@@ -1416,6 +1427,15 @@
return (sources != null && !sources.isEmpty());
}
+ @SuppressLint("MissingPermission")
+ private boolean isMainUser(int userId) {
+ if (mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()) {
+ return userId == mUserManager.getMainUser().getIdentifier();
+ } else {
+ return userId == UserHandle.SYSTEM.getIdentifier();
+ }
+ }
+
/**
* Helper for {@link SmsBroadcastUndelivered} to delete an old message in the raw table.
*/
@@ -1511,7 +1531,11 @@
}
if (userHandle == null) {
- userHandle = UserHandle.SYSTEM;
+ if (mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()) {
+ userHandle = mUserManager.getMainUser();
+ } else {
+ userHandle = UserHandle.SYSTEM;
+ }
}
Bundle options = handleSmsWhitelisting(intent.getComponent(), isClass0);
dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,
@@ -1739,6 +1763,7 @@
handleAction(intent, true);
}
+ @SuppressLint("MissingPermission")
private synchronized void handleAction(@NonNull Intent intent, boolean onReceive) {
String action = intent.getAction();
if (mWaitingForIntent == null || !mWaitingForIntent.getAction().equals(action)) {
@@ -1795,9 +1820,15 @@
String mimeType = intent.getType();
setWaitingForIntent(intent);
- dispatchIntent(intent, WapPushOverSms.getPermissionForType(mimeType),
- WapPushOverSms.getAppOpsStringPermissionForIntent(mimeType), options, this,
- UserHandle.SYSTEM, subId);
+ if (mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()) {
+ dispatchIntent(intent, WapPushOverSms.getPermissionForType(mimeType),
+ WapPushOverSms.getAppOpsStringPermissionForIntent(mimeType), options,
+ this, mUserManager.getMainUser(), subId);
+ } else {
+ dispatchIntent(intent, WapPushOverSms.getPermissionForType(mimeType),
+ WapPushOverSms.getAppOpsStringPermissionForIntent(mimeType), options,
+ this, UserHandle.SYSTEM, subId);
+ }
} else {
// Now that the intents have been deleted we can clean up the PDU data.
if (!Intents.DATA_SMS_RECEIVED_ACTION.equals(action)
diff --git a/src/java/com/android/internal/telephony/SmsDispatchersController.java b/src/java/com/android/internal/telephony/SmsDispatchersController.java
index bc1e1a8..568cf66 100644
--- a/src/java/com/android/internal/telephony/SmsDispatchersController.java
+++ b/src/java/com/android/internal/telephony/SmsDispatchersController.java
@@ -381,9 +381,9 @@
mImsSmsDispatcher = new ImsSmsDispatcher(phone, this, ImsManager::getConnector);
mCdmaDispatcher = new CdmaSMSDispatcher(phone, this);
mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
- storageMonitor, phone, looper);
+ storageMonitor, phone, looper, mFeatureFlags);
mCdmaInboundSmsHandler = CdmaInboundSmsHandler.makeInboundSmsHandler(phone.getContext(),
- storageMonitor, phone, (CdmaSMSDispatcher) mCdmaDispatcher, looper);
+ storageMonitor, phone, (CdmaSMSDispatcher) mCdmaDispatcher, looper, mFeatureFlags);
mGsmDispatcher = new GsmSMSDispatcher(phone, this, mGsmInboundSmsHandler);
SmsBroadcastUndelivered.initialize(phone.getContext(),
mGsmInboundSmsHandler, mCdmaInboundSmsHandler);
diff --git a/src/java/com/android/internal/telephony/WapPushOverSms.java b/src/java/com/android/internal/telephony/WapPushOverSms.java
index 7669411..9bede69 100644
--- a/src/java/com/android/internal/telephony/WapPushOverSms.java
+++ b/src/java/com/android/internal/telephony/WapPushOverSms.java
@@ -23,6 +23,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
@@ -45,6 +46,7 @@
import android.telephony.SubscriptionManager;
import android.text.TextUtils;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.util.TelephonyUtils;
import com.android.telephony.Rlog;
@@ -67,8 +69,14 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private final Context mContext;
+
+ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ private UserManager mUserManager;
+
PowerWhitelistManager mPowerWhitelistManager;
+ protected final @NonNull FeatureFlags mFeatureFlags;
+
private String mWapPushManagerPackage;
/** Assigned from ServiceConnection callback on main threaad. */
@@ -128,11 +136,11 @@
if (DBG) Rlog.v(TAG, "wappush manager disconnected.");
}
- public WapPushOverSms(Context context) {
+ public WapPushOverSms(Context context, FeatureFlags featureFlags) {
+ mFeatureFlags = featureFlags;
mContext = context;
mPowerWhitelistManager = mContext.getSystemService(PowerWhitelistManager.class);
-
- UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ mUserManager = mContext.getSystemService(UserManager.class);
bindWapPushManagerService(mContext);
}
@@ -325,6 +333,7 @@
* {@link Activity#RESULT_OK} if the message has been broadcast
* to applications
*/
+ @SuppressLint("MissingPermission")
public int dispatchWapPdu(byte[] pdu, InboundSmsHandler.SmsBroadcastReceiver receiver,
InboundSmsHandler handler, String address, int subId, long messageId) {
DecodedResult result = decodeWapPdu(pdu, handler);
@@ -422,7 +431,11 @@
}
if (userHandle == null) {
- userHandle = UserHandle.SYSTEM;
+ if (mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()) {
+ userHandle = mUserManager.getMainUser();
+ } else {
+ userHandle = UserHandle.SYSTEM;
+ }
}
handler.dispatchIntent(intent, getPermissionForType(result.mimeType),
getAppOpsStringPermissionForIntent(result.mimeType), options, receiver,
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java b/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java
index 784c974..9a85329 100644
--- a/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaInboundSmsHandler.java
@@ -41,6 +41,7 @@
import com.android.internal.telephony.cdma.sms.BearerData;
import com.android.internal.telephony.cdma.sms.CdmaSmsAddress;
import com.android.internal.telephony.cdma.sms.SmsEnvelope;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.util.HexDump;
import java.io.ByteArrayOutputStream;
@@ -78,8 +79,9 @@
* Create a new inbound SMS handler for CDMA.
*/
private CdmaInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor,
- Phone phone, CdmaSMSDispatcher smsDispatcher, Looper looper) {
- super("CdmaInboundSmsHandler", context, storageMonitor, phone, looper);
+ Phone phone, CdmaSMSDispatcher smsDispatcher, Looper looper,
+ FeatureFlags featureFlags) {
+ super("CdmaInboundSmsHandler", context, storageMonitor, phone, looper, featureFlags);
mSmsDispatcher = smsDispatcher;
phone.mCi.setOnNewCdmaSms(getHandler(), EVENT_NEW_SMS, null);
@@ -171,9 +173,9 @@
*/
public static CdmaInboundSmsHandler makeInboundSmsHandler(Context context,
SmsStorageMonitor storageMonitor, Phone phone, CdmaSMSDispatcher smsDispatcher,
- Looper looper) {
+ Looper looper, FeatureFlags featureFlags) {
CdmaInboundSmsHandler handler = new CdmaInboundSmsHandler(context, storageMonitor,
- phone, smsDispatcher, looper);
+ phone, smsDispatcher, looper, featureFlags);
handler.start();
return handler;
}
diff --git a/src/java/com/android/internal/telephony/data/DataConfigManager.java b/src/java/com/android/internal/telephony/data/DataConfigManager.java
index a5db8fb..d9ddde0 100644
--- a/src/java/com/android/internal/telephony/data/DataConfigManager.java
+++ b/src/java/com/android/internal/telephony/data/DataConfigManager.java
@@ -1506,14 +1506,6 @@
}
/**
- * {@code True} enables mms to be attempted on iwlan if possible, even if existing cellular
- * networks already supports iwlan.
- */
- public boolean isForceIwlanMmsFeatureEnabled() {
- return mResources.getBoolean(com.android.internal.R.bool.force_iwlan_mms_feature_enabled);
- }
-
- /**
* Log debug messages.
* @param s debug messages
*/
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index f47abfc..eaa0962 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -1266,7 +1266,7 @@
getHandler(), EVENT_VOICE_CALL_ENDED, null);
}
- if (mFlags.forceIwlanMms() && mDataConfigManager.isForceIwlanMmsFeatureEnabled()) {
+ if (mFlags.forceIwlanMms()) {
if (mDataProfile.canSatisfy(NetworkCapabilities.NET_CAPABILITY_MMS)) {
mAccessNetworksManagerCallback = new AccessNetworksManagerCallback(
getHandler()::post) {
@@ -1292,8 +1292,7 @@
@Override
public void exit() {
logv("Unregistering all events.");
- if (mFlags.forceIwlanMms() && mAccessNetworksManagerCallback != null
- && mDataConfigManager.isForceIwlanMmsFeatureEnabled()) {
+ if (mFlags.forceIwlanMms() && mAccessNetworksManagerCallback != null) {
mAccessNetworksManager.unregisterCallback(mAccessNetworksManagerCallback);
}
@@ -2492,8 +2491,7 @@
// will be attempted on IWLAN if possible, even if existing cellular networks already
// supports IWLAN.
if (mFlags.forceIwlanMms() && builder.build()
- .hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)
- && mDataConfigManager.isForceIwlanMmsFeatureEnabled()) {
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_MMS)) {
// If QNS sets MMS preferred on IWLAN, and it is possible to setup an MMS network on
// IWLAN, then we need to remove the MMS capability on the cellular network. This will
// allow the new MMS network to be brought up on IWLAN when MMS network request arrives.
diff --git a/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java b/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java
index 907f158..bf8098f 100644
--- a/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/gsm/GsmInboundSmsHandler.java
@@ -38,6 +38,7 @@
import com.android.internal.telephony.SmsMessageBase;
import com.android.internal.telephony.SmsStorageMonitor;
import com.android.internal.telephony.VisualVoicemailSmsFilter;
+import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.uicc.UsimServiceTable;
/**
@@ -58,8 +59,8 @@
* Create a new GSM inbound SMS handler.
*/
private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor,
- Phone phone, Looper looper) {
- super("GsmInboundSmsHandler", context, storageMonitor, phone, looper);
+ Phone phone, Looper looper, FeatureFlags featureFlags) {
+ super("GsmInboundSmsHandler", context, storageMonitor, phone, looper, featureFlags);
phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null);
mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi, phone.getPhoneId());
mCellBroadcastServiceManager.enable();
@@ -129,9 +130,10 @@
* Wait for state machine to enter startup state. We can't send any messages until then.
*/
public static GsmInboundSmsHandler makeInboundSmsHandler(Context context,
- SmsStorageMonitor storageMonitor, Phone phone, Looper looper) {
+ SmsStorageMonitor storageMonitor, Phone phone, Looper looper,
+ FeatureFlags featureFlags) {
GsmInboundSmsHandler handler =
- new GsmInboundSmsHandler(context, storageMonitor, phone, looper);
+ new GsmInboundSmsHandler(context, storageMonitor, phone, looper, featureFlags);
handler.start();
return handler;
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 97b0492..3b15cfd 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -34,6 +34,7 @@
import static android.telephony.satellite.SatelliteManager.KEY_NTN_SIGNAL_STRENGTH;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_INVALID_ARGUMENTS;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
@@ -440,7 +441,7 @@
private Map<String, Integer> mSubscriberIdPerSub = new HashMap<>();
// key : priority, low value is high, value : List<SubscriptionInfo>
@GuardedBy("mSatelliteTokenProvisionedLock")
- Map<Integer, List<SubscriptionInfo>> mSubsInfoListPerPriority = new HashMap<>();
+ private Map<Integer, List<SubscriptionInfo>> mSubsInfoListPerPriority = new HashMap<>();
@NonNull private final Object mSatelliteTokenProvisionedLock = new Object();
private long mWaitTimeForSatelliteEnablingResponse;
private long mDemoPointingAlignedDurationMillis;
@@ -1529,12 +1530,12 @@
Consumer<Integer> result = new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
- logd("invoke CMD_PROVISION_SATELLITE_SERVICE done.");
+ logd("invoke CMD_PROVISION_SATELLITE_TOKEN_UPDATED done.");
}
};
ProvisionSatelliteServiceArgument internalArgument =
new ProvisionSatelliteServiceArgument(iccId, null, result, subId);
- sendMessage(obtainMessage(CMD_PROVISION_SATELLITE_SERVICE, internalArgument));
+ sendRequestAsync(CMD_PROVISION_SATELLITE_SERVICE, internalArgument, null);
break;
}
@@ -1545,7 +1546,7 @@
(RequestProvisionSatelliteArgument) request.argument;
int error = SatelliteServiceUtils.getSatelliteError(ar,
"updateSatelliteSubscription");
- logd("EVENT_PROVISION_SATELLITE_TOKEN_UPDATED = " + error);
+ logd("EVENT_PROVISION_SATELLITE_TOKEN_UPDATED =" + error);
Bundle bundle = new Bundle();
bundle.putBoolean(SatelliteManager.KEY_PROVISION_SATELLITE_TOKENS, true);
argument.mResult.send(SATELLITE_RESULT_SUCCESS, bundle);
@@ -1637,7 +1638,7 @@
ploge("Received invalid demo mode while satellite session is enabled"
+ " enableDemoMode = " + enableDemoMode);
sendErrorAndReportSessionMetrics(
- SatelliteManager.SATELLITE_RESULT_INVALID_ARGUMENTS, result);
+ SATELLITE_RESULT_INVALID_ARGUMENTS, result);
return;
} else {
plogd("Enable request matches with current state"
@@ -5192,7 +5193,6 @@
return TimeUnit.SECONDS.toMillis(duration);
}
-
/**
* Calculate priority
* 1. Active eSOS profiles are higher priority than inactive eSOS profiles.
@@ -5201,6 +5201,9 @@
* the highest priority.
*/
private void evaluateESOSProfilesPrioritization() {
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ return;
+ }
List<SubscriptionInfo> allSubInfos = mSubscriptionManagerService.getAllSubInfoList(
mContext.getOpPackageName(), mContext.getAttributionTag());
//key : priority, low value is high, value : List<SubscriptionInfo>
@@ -5212,7 +5215,6 @@
boolean isNtnOnly = info.isOnlyNonTerrestrialNetwork();
boolean isESOSSupported = info.isSatelliteESOSSupported();
if (!isNtnOnly && !isESOSSupported) {
- logd("evaluateESOSProfilesPrioritization: !isNtnOnly && !isESOS");
continue;
}
@@ -5240,28 +5242,30 @@
}
// The subscriberId for ntnOnly SIMs is the Iccid, whereas for ESOS supported SIMs, the
- // subscriberId is the Imsi prefix 6 digit + msisdn.
- private String getSubscriberId(int subId, SubscriptionInfo info, boolean isNtnOnly) {
- if (isNtnOnly) {
+ // subscriberId is the Imsi prefix 6 digit + phone number.
+ private @NonNull String getSubscriberId(SubscriptionInfo info) {
+ if (info.isSatelliteESOSSupported()) {
+ return getPhoneNumberBasedCarrier(info.getSubscriptionId());
+ }
+ if (info.isOnlyNonTerrestrialNetwork()) {
return info.getIccId();
}
- return getSubscriberIdForCarrier(subId);
+ return "";
}
- private String getSubscriberIdForCarrier(int subId) {
+ private String getPhoneNumberBasedCarrier(int subId) {
SubscriptionInfoInternal internal = mSubscriptionManagerService.getSubscriptionInfoInternal(
- 0);
- String msisdn = "";
- for (Phone phone : PhoneFactory.getPhones()) {
- if (subId == phone.getSubId()) {
- msisdn = phone.getMsisdn();
- }
- }
- if (msisdn == null) {
- logd("getSubscriberIdForCarrier: msisdn null");
+ subId);
+ SubscriptionManager subscriptionManager = mContext.getSystemService(
+ SubscriptionManager.class);
+ String phoneNumber = subscriptionManager.getPhoneNumber(subId);
+
+ if (phoneNumber == null) {
+ logd("getPhoneNumberBasedCarrier: phoneNumber null");
return "";
}
- return internal.getImsi().substring(0, 6) + msisdn;
+ return internal.getImsi() == null ? "" : internal.getImsi().substring(0, 6)
+ + phoneNumber.replaceFirst("^\\+", "");
}
private boolean isPriorityChanged(Map<Integer, List<SubscriptionInfo>> currentMap,
@@ -5276,10 +5280,10 @@
if (currentList == null || currentList.size() != newList.size()) {
return true;
}
- logd("isPriorityChanged: current.size=" + currentList.size() + " , new.size="
- + newList.size());
for (int i = 0; i < currentList.size(); i++) {
- if (!currentList.get(i).equals(newList.get(i))) {
+ if (currentList.get(i).getSubscriptionId() != newList.get(i).getSubscriptionId()) {
+ logd("isPriorityChanged: cur=" + currentList.get(i) + " , new=" + newList.get(
+ i));
return true;
}
}
@@ -5327,11 +5331,14 @@
List<ProvisionSubscriberId> list = new ArrayList<>();
synchronized (mSatelliteTokenProvisionedLock) {
mSubscriberIdPerSub = new HashMap<>();
- for (int i = 0; i < mSubsInfoListPerPriority.size(); i++) {
- List<SubscriptionInfo> infoList = mSubsInfoListPerPriority.get(i);
+ for (int priority : mSubsInfoListPerPriority.keySet()) {
+ List<SubscriptionInfo> infoList = mSubsInfoListPerPriority.get(priority);
+ if (infoList == null) {
+ logd("requestProvisionSubscriberIds: no exist this priority " + priority);
+ continue;
+ }
for (SubscriptionInfo info : infoList) {
- String subscriberId = getSubscriberId(info.getSubscriptionId(), info,
- info.isOnlyNonTerrestrialNetwork());
+ String subscriberId = getSubscriberId(info);
int carrierId = info.getCarrierId();
logd("requestProvisionSubscriberIds: subscriberId:" + subscriberId
+ " , carrierId=" + carrierId);
@@ -5346,7 +5353,7 @@
}
}
- logd("requestProvisionSubscriberIds: size=" + list.size());
+ logd("requestProvisionSubscriberIds: " + list);
final Bundle bundle = new Bundle();
bundle.putParcelableList(SatelliteManager.KEY_REQUEST_PROVISION_SUBSCRIBER_ID_TOKEN, list);
result.send(SATELLITE_RESULT_SUCCESS, bundle);
@@ -5359,11 +5366,16 @@
* @param result The result receiver, which returns the provisioned status of the token if the
* request is successful or an error code if the request failed.
*/
- public void requestIsProvisioned(String satelliteSubscriberId, @NonNull ResultReceiver result) {
+ public void requestIsProvisioned(@NonNull String satelliteSubscriberId,
+ @NonNull ResultReceiver result) {
if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
return;
}
+ if (satelliteSubscriberId.isEmpty()) {
+ result.send(SATELLITE_RESULT_INVALID_ARGUMENTS, null);
+ return;
+ }
boolean isProvisioned = false;
synchronized (mSatelliteTokenProvisionedLock) {
@@ -5391,8 +5403,12 @@
result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
return;
}
+ if (list.size() == 0) {
+ result.send(SATELLITE_RESULT_INVALID_ARGUMENTS, null);
+ return;
+ }
- logd("provisionSatellite: size=" + list.size());
+ logd("provisionSatellite:" + list);
for (ProvisionSubscriberId subscriberId : list) {
synchronized (mSatelliteTokenProvisionedLock) {
mProvisionedSubscriberId.put(subscriberId.getSubscriberId(), true);
@@ -5401,6 +5417,6 @@
RequestProvisionSatelliteArgument request = new RequestProvisionSatelliteArgument(list,
result);
- sendMessage(obtainMessage(CMD_PROVISION_SATELLITE_TOKEN_UPDATED, request));
+ sendRequestAsync(CMD_PROVISION_SATELLITE_TOKEN_UPDATED, request, null);
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/WapPushOverSmsTest.java b/tests/telephonytests/src/com/android/internal/telephony/WapPushOverSmsTest.java
index c3db35c..58e5617 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/WapPushOverSmsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/WapPushOverSmsTest.java
@@ -30,17 +30,23 @@
import static org.mockito.Mockito.when;
import android.app.AppOpsManager;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Telephony;
import androidx.test.filters.SmallTest;
+import com.android.internal.telephony.flags.FeatureFlags;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
public class WapPushOverSmsTest extends TelephonyTest {
// Mocked classes
@@ -48,6 +54,9 @@
private WapPushOverSms mWapPushOverSmsUT;
+ @Mock private FeatureFlags mFeatureFlags;
+ private static final UserHandle MOCKED_MAIN_USER = UserHandle.of(10);
+
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
@@ -56,9 +65,14 @@
// Note that this replaces only cached services in ServiceManager. If a service is not found
// in the cache, a real instance is used.
mServiceManagerMockedServices.put("isms", mISmsStub);
+ mFeatureFlags = Mockito.mock(FeatureFlags.class);
+ doReturn(true).when(mFeatureFlags).smsMmsDeliverBroadcastsRedirectToMainUser();
doReturn(mISmsStub).when(mISmsStub).queryLocalInterface(anyString());
- mWapPushOverSmsUT = new WapPushOverSms(mContext);
+ UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ doReturn(MOCKED_MAIN_USER).when(userManager).getMainUser();
+
+ mWapPushOverSmsUT = new WapPushOverSms(mContext, mFeatureFlags);
}
@After
@@ -94,7 +108,7 @@
eq(AppOpsManager.OPSTR_RECEIVE_WAP_PUSH),
nullable(Bundle.class),
isNull(InboundSmsHandler.SmsBroadcastReceiver.class),
- eq(UserHandle.SYSTEM),
+ eq(MOCKED_MAIN_USER),
anyInt());
Intent intent = intentArgumentCaptor.getValue();
assertEquals(Telephony.Sms.Intents.WAP_PUSH_DELIVER_ACTION, intent.getAction());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/cdma/CdmaInboundSmsHandlerTest.java b/tests/telephonytests/src/com/android/internal/telephony/cdma/CdmaInboundSmsHandlerTest.java
index 24f7d2c..cab76f7 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/cdma/CdmaInboundSmsHandlerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/cdma/CdmaInboundSmsHandlerTest.java
@@ -83,6 +83,7 @@
private InboundSmsTracker mInboundSmsTracker;
private final byte[] mSmsPdu = new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
private final int mSubId0 = 0;
+ private static final UserHandle MOCKED_MAIN_USER = UserHandle.of(10);
private IState getCurrentState() {
try {
@@ -108,10 +109,13 @@
UserManager userManager = (UserManager) mContextFixture.getTestDouble().
getSystemService(Context.USER_SERVICE);
+ doReturn(MOCKED_MAIN_USER).when(userManager).getMainUser();
doReturn(true).when(userManager).isUserUnlocked();
+ doReturn(true).when(mFeatureFlags).smsMmsDeliverBroadcastsRedirectToMainUser();
try {
- doReturn(new int[]{UserHandle.USER_SYSTEM}).when(mIActivityManager).getRunningUserIds();
+ doReturn(new int[]{0, MOCKED_MAIN_USER.getIdentifier()})
+ .when(mIActivityManager).getRunningUserIds();
} catch (RemoteException re) {
StringWriter reString = new StringWriter();
re.printStackTrace(new PrintWriter(reString));
@@ -157,7 +161,8 @@
Telephony.Sms.CONTENT_URI.getAuthority(), mContentProvider);
mCdmaInboundSmsHandler = CdmaInboundSmsHandler.makeInboundSmsHandler(mContext,
- mSmsStorageMonitor, mPhone, null, mTestableLooper.getLooper());
+ mSmsStorageMonitor, mPhone, null, mTestableLooper.getLooper(),
+ mFeatureFlags);
monitorTestableLooper(new TestableLooper(mCdmaInboundSmsHandler.getHandler().getLooper()));
processAllMessages();
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index 1a5c1af..8be0f8b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -2419,7 +2419,6 @@
@Test
public void testMmsCapabilityRemovedWhenMmsPreferredOnIwlan() throws Exception {
doReturn(true).when(mFeatureFlags).forceIwlanMms();
- doReturn(true).when(mDataConfigManager).isForceIwlanMmsFeatureEnabled();
setupDataNetwork();
TelephonyNetworkAgent mockNetworkAgent = Mockito.mock(TelephonyNetworkAgent.class);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
index c261afe..ed19fd3 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/gsm/GsmInboundSmsHandlerTest.java
@@ -44,6 +44,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncResult;
@@ -109,6 +110,7 @@
private static final String RAW_TABLE_NAME = "raw";
private static final Uri sRawUri = Uri.withAppendedPath(Telephony.Sms.CONTENT_URI,
RAW_TABLE_NAME);
+ private static final UserHandle MOCKED_MAIN_USER = UserHandle.of(0);
private final String mMessageBody = "This is the message body of a single-part message";
private final String mMessageBodyPart1 = "This is the first part of a multi-part message";
@@ -165,6 +167,7 @@
mSmsFilter = Mockito.mock(InboundSmsHandler.SmsFilter.class);
mSmsFilter2 = Mockito.mock(InboundSmsHandler.SmsFilter.class);
+ when(mFeatureFlags.smsMmsDeliverBroadcastsRedirectToMainUser()).thenReturn(true);
doReturn(true).when(mTelephonyManager).getSmsReceiveCapableForPhone(anyInt(), anyBoolean());
doReturn(true).when(mSmsStorageMonitor).isStorageAvailable();
@@ -173,7 +176,9 @@
doReturn(true).when(userManager).isUserRunning(any(UserHandle.class));
List<UserHandle> userHandles = new ArrayList();
- userHandles.add(UserHandle.SYSTEM);
+ userHandles.add(MOCKED_MAIN_USER);
+
+ doReturn(MOCKED_MAIN_USER).when(userManager).getMainUser();
doReturn(userHandles).when(userManager).getUserHandles(anyBoolean());
mSmsMessage.mWrappedSmsMessage = mGsmSmsMessage;
@@ -204,7 +209,7 @@
Telephony.Sms.CONTENT_URI.getAuthority(), mContentProvider);
mGsmInboundSmsHandler = GsmInboundSmsHandler.makeInboundSmsHandler(mContext,
- mSmsStorageMonitor, mPhone, mTestableLooper.getLooper());
+ mSmsStorageMonitor, mPhone, mTestableLooper.getLooper(), mFeatureFlags);
mSmsFilters = new ArrayList<>();
mSmsFilters.add(mSmsFilter);
mSmsFilters.add(mSmsFilter2);
@@ -331,6 +336,33 @@
@Test
@MediumTest
+ public void testNewSMSProcessedThroughMainUser() {
+ transitionFromStartupToIdle();
+ UserHandle mockedMainSecUser = UserHandle.of(10);
+
+ UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ List<UserHandle> userHandles = new ArrayList();
+ userHandles.add(mockedMainSecUser);
+ doReturn(mockedMainSecUser).when(userManager).getMainUser();
+ doReturn(userHandles).when(userManager).getUserHandles(anyBoolean());
+
+ // send new SMS to state machine and verify that it triggers SMS_DELIVER_ACTION
+ // and context being used is from the MAIN user
+ sendNewSms();
+
+ // Verify that the context created to send the broadcast is created from the MAIN user.
+ try {
+ verify(mContext).createPackageContextAsUser(any(String.class),
+ any(Integer.class), eq(mockedMainSecUser));
+ } catch (PackageManager.NameNotFoundException e) {
+ fail(e.toString());
+ }
+
+ verifySmsIntentBroadcasts(0);
+ }
+
+ @Test
+ @MediumTest
public void testNewSmsFromBlockedNumber_noBroadcastsSent() {
String blockedNumber = "1234567890";
mFakeBlockedNumberContentProvider.mBlockedNumbers.add(blockedNumber);
@@ -1042,7 +1074,7 @@
mContentProvider.insert(sRawUri, mInboundSmsTracker.getContentValues());
// user locked
- UserManager userManager = (UserManager)mContext.getSystemService(Context.USER_SERVICE);
+ UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
doReturn(false).when(userManager).isUserUnlocked();
SmsBroadcastUndelivered.initialize(mContext, mGsmInboundSmsHandler, mCdmaInboundSmsHandler);