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);
         }
     }