diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 4cf9ae21f44d8..346be75d3d3d0 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3534,8 +3534,9 @@ public class NotificationManagerService extends SystemService { public ParceledListSlice getConversations( boolean onlyImportant) { enforceSystemOrSystemUI("getConversations"); + IntArray userIds = mUserProfiles.getCurrentProfileIds(); ArrayList conversations = - mPreferencesHelper.getConversations(onlyImportant); + mPreferencesHelper.getConversations(userIds, onlyImportant); for (ConversationChannelWrapper conversation : conversations) { if (mShortcutHelper == null) { conversation.setShortcutInfo(null); diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index c3cb42f95cc62..fd4a3024179c1 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -51,6 +51,7 @@ import android.service.notification.RankingHelperProto; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IntArray; import android.util.Pair; import android.util.Slog; import android.util.SparseBooleanArray; @@ -1348,36 +1349,39 @@ public class PreferencesHelper implements RankingConfig { return groups; } - public ArrayList getConversations(boolean onlyImportant) { + public ArrayList getConversations(IntArray userIds, + boolean onlyImportant) { synchronized (mPackagePreferences) { ArrayList conversations = new ArrayList<>(); - for (PackagePreferences p : mPackagePreferences.values()) { - int N = p.channels.size(); - for (int i = 0; i < N; i++) { - final NotificationChannel nc = p.channels.valueAt(i); - if (!TextUtils.isEmpty(nc.getConversationId()) && !nc.isDeleted() - && !nc.isDemoted() - && (nc.isImportantConversation() || !onlyImportant)) { - ConversationChannelWrapper conversation = new ConversationChannelWrapper(); - conversation.setPkg(p.pkg); - conversation.setUid(p.uid); - conversation.setNotificationChannel(nc); - conversation.setParentChannelLabel( - p.channels.get(nc.getParentChannelId()).getName()); - boolean blockedByGroup = false; - if (nc.getGroup() != null) { - NotificationChannelGroup group = p.groups.get(nc.getGroup()); - if (group != null) { - if (group.isBlocked()) { - blockedByGroup = true; - } else { - conversation.setGroupLabel(group.getName()); + if (userIds.binarySearch(UserHandle.getUserId(p.uid)) >= 0) { + int N = p.channels.size(); + for (int i = 0; i < N; i++) { + final NotificationChannel nc = p.channels.valueAt(i); + if (!TextUtils.isEmpty(nc.getConversationId()) && !nc.isDeleted() + && !nc.isDemoted() + && (nc.isImportantConversation() || !onlyImportant)) { + ConversationChannelWrapper conversation = + new ConversationChannelWrapper(); + conversation.setPkg(p.pkg); + conversation.setUid(p.uid); + conversation.setNotificationChannel(nc); + conversation.setParentChannelLabel( + p.channels.get(nc.getParentChannelId()).getName()); + boolean blockedByGroup = false; + if (nc.getGroup() != null) { + NotificationChannelGroup group = p.groups.get(nc.getGroup()); + if (group != null) { + if (group.isBlocked()) { + blockedByGroup = true; + } else { + conversation.setGroupLabel(group.getName()); + } } } - } - if (!blockedByGroup) { - conversations.add(conversation); + if (!blockedByGroup) { + conversations.add(conversation); + } } } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java index a118e0df13386..3b1059761357f 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -96,6 +96,7 @@ import android.test.suitebuilder.annotation.SmallTest; import android.testing.TestableContentResolver; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IntArray; import android.util.Pair; import android.util.StatsEvent; import android.util.Xml; @@ -3284,7 +3285,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { channel2.setImportantConversation(true); mHelper.createNotificationChannel(PKG_O, UID_O, channel2, true, false); - List convos = mHelper.getConversations(false); + List convos = + mHelper.getConversations(IntArray.wrap(new int[] {0}), false); assertEquals(3, convos.size()); assertTrue(conversationWrapperContainsChannel(convos, channel)); @@ -3292,6 +3294,44 @@ public class PreferencesHelperTest extends UiServiceTestCase { assertTrue(conversationWrapperContainsChannel(convos, channel2)); } + @Test + public void testGetConversations_multiUser() { + String convoId = "convo"; + NotificationChannel messages = + new NotificationChannel("messages", "Messages", IMPORTANCE_DEFAULT); + mHelper.createNotificationChannel(PKG_O, UID_O, messages, true, false); + + NotificationChannel messagesUser10 = + new NotificationChannel("messages", "Messages", IMPORTANCE_DEFAULT); + mHelper.createNotificationChannel( + PKG_O, UID_O + UserHandle.PER_USER_RANGE, messagesUser10, true, false); + + NotificationChannel messagesFromB = + new NotificationChannel("B person msgs", "messages from B", IMPORTANCE_DEFAULT); + messagesFromB.setConversationId(messages.getId(), "different convo"); + mHelper.createNotificationChannel(PKG_O, UID_O, messagesFromB, true, false); + + NotificationChannel messagesFromBUser10 = + new NotificationChannel("B person msgs", "messages from B", IMPORTANCE_DEFAULT); + messagesFromBUser10.setConversationId(messagesUser10.getId(), "different convo"); + mHelper.createNotificationChannel( + PKG_O, UID_O + UserHandle.PER_USER_RANGE, messagesFromBUser10, true, false); + + + List convos = + mHelper.getConversations(IntArray.wrap(new int[] {0}), false); + + assertEquals(1, convos.size()); + assertTrue(conversationWrapperContainsChannel(convos, messagesFromB)); + + convos = + mHelper.getConversations(IntArray.wrap(new int[] {0, UserHandle.getUserId(UID_O + UserHandle.PER_USER_RANGE)}), false); + + assertEquals(2, convos.size()); + assertTrue(conversationWrapperContainsChannel(convos, messagesFromB)); + assertTrue(conversationWrapperContainsChannel(convos, messagesFromBUser10)); + } + @Test public void testGetConversations_notDemoted() { String convoId = "convo"; @@ -3322,7 +3362,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { channel2.setImportantConversation(true); mHelper.createNotificationChannel(PKG_O, UID_O, channel2, true, false); - List convos = mHelper.getConversations(false); + List convos = + mHelper.getConversations(IntArray.wrap(new int[] {0}), false); assertEquals(2, convos.size()); assertTrue(conversationWrapperContainsChannel(convos, channel)); @@ -3360,7 +3401,8 @@ public class PreferencesHelperTest extends UiServiceTestCase { channel2.setConversationId(calls.getId(), convoId); mHelper.createNotificationChannel(PKG_O, UID_O, channel2, true, false); - List convos = mHelper.getConversations(true); + List convos = + mHelper.getConversations(IntArray.wrap(new int[] {0}), true); assertEquals(2, convos.size()); assertTrue(conversationWrapperContainsChannel(convos, channel));