Don't invoke resultReceiver more than once
When delivering the SMS_RECEIVED broadcasts to multiple users,
don't invoke the resultReceiver for each of them. Only invoke
for the primary user.
Bug: 17058511
Change-Id: Id59c8c7b1cbaf1d7d7fd05134465e1987cded817
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index 8fc7d7a..bf99333 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -28,6 +28,7 @@
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.UserInfo;
import android.database.Cursor;
import android.database.SQLException;
import android.net.Uri;
@@ -772,25 +773,40 @@
BroadcastReceiver resultReceiver, UserHandle user) {
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId());
- int[] users = null;
if (user.equals(UserHandle.ALL)) {
// Get a list of currently started users.
+ int[] users = null;
try {
users = ActivityManagerNative.getDefault().getRunningUserIds();
} catch (RemoteException re) {
}
- }
- if (users == null) {
- users = new int[] {user.getIdentifier()};
- }
- // Deliver the broadcast only to those running users that are permitted
- // by user policy.
- for (int i = 0; i < users.length; i++) {
- UserHandle targetUser = new UserHandle(users[i]);
- if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_SMS, targetUser)) {
- mContext.sendOrderedBroadcastAsUser(intent, targetUser, permission, appOp,
- resultReceiver, getHandler(), Activity.RESULT_OK, null, null);
+ if (users == null) {
+ users = new int[] {user.getIdentifier()};
}
+ // Deliver the broadcast only to those running users that are permitted
+ // by user policy.
+ for (int i = users.length - 1; i >= 0; i--) {
+ UserHandle targetUser = new UserHandle(users[i]);
+ if (users[i] != UserHandle.USER_OWNER) {
+ // Is the user not allowed to use SMS?
+ if (mUserManager.hasUserRestriction(UserManager.DISALLOW_SMS, targetUser)) {
+ continue;
+ }
+ // Skip unknown users and managed profiles as well
+ UserInfo info = mUserManager.getUserInfo(users[i]);
+ if (info == null || info.isManagedProfile()) {
+ continue;
+ }
+ }
+ // Only pass in the resultReceiver when the USER_OWNER is processed.
+ mContext.sendOrderedBroadcastAsUser(intent, targetUser, permission, appOp,
+ users[i] == UserHandle.USER_OWNER ? resultReceiver : null,
+ getHandler(), Activity.RESULT_OK, null, null);
+ }
+ } else {
+ mContext.sendOrderedBroadcastAsUser(intent, user, permission, appOp,
+ resultReceiver,
+ getHandler(), Activity.RESULT_OK, null, null);
}
}