From 0e683cd154bda2ccf523686564938554bd4770bf Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 3 Dec 2020 09:40:46 -0500 Subject: [PATCH] Filter conversation list by current users Test: atest, verification in Settings multiuser Fixes: 174582049 Change-Id: I31bfc8d1045776884676d397be03298ebe2190c3 --- .../NotificationManagerService.java | 3 +- .../notification/PreferencesHelper.java | 54 ++++++++++--------- .../notification/PreferencesHelperTest.java | 48 +++++++++++++++-- 3 files changed, 76 insertions(+), 29 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index dfeb6822c8e8f..c658bc1b174c3 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -3583,8 +3583,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 2f990c62305fb..2d3c97a7e85aa 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -52,6 +52,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; @@ -1385,36 +1386,39 @@ public class PreferencesHelper implements RankingConfig { return null; } - 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 7ec8689e53873..97be5e118f830 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -97,6 +97,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; @@ -3318,7 +3319,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)); @@ -3326,6 +3328,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"; @@ -3356,7 +3396,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)); @@ -3394,7 +3435,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));