diff options
| -rw-r--r-- | services/people/java/com/android/server/people/data/DataManager.java | 55 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java | 28 |
2 files changed, 58 insertions, 25 deletions
diff --git a/services/people/java/com/android/server/people/data/DataManager.java b/services/people/java/com/android/server/people/data/DataManager.java index 1bd5031d6c69..ae8dd4180dc8 100644 --- a/services/people/java/com/android/server/people/data/DataManager.java +++ b/services/people/java/com/android/server/people/data/DataManager.java @@ -271,22 +271,22 @@ public class DataManager { private ConversationChannel getConversationChannel(String packageName, int userId, String shortcutId, ConversationInfo conversationInfo) { ShortcutInfo shortcutInfo = getShortcut(packageName, userId, shortcutId); - return getConversationChannel(shortcutInfo, conversationInfo); + return getConversationChannel( + shortcutInfo, conversationInfo, packageName, userId, shortcutId); } @Nullable private ConversationChannel getConversationChannel(ShortcutInfo shortcutInfo, - ConversationInfo conversationInfo) { + ConversationInfo conversationInfo, String packageName, int userId, String shortcutId) { if (conversationInfo == null || conversationInfo.isDemoted()) { return null; } if (shortcutInfo == null) { - Slog.e(TAG, " Shortcut no longer found"); + Slog.e(TAG, "Shortcut no longer found"); + mInjector.getBackgroundExecutor().execute( + () -> removeConversations(packageName, userId, Set.of(shortcutId))); return null; } - String packageName = shortcutInfo.getPackage(); - String shortcutId = shortcutInfo.getId(); - int userId = shortcutInfo.getUserId(); int uid = mPackageManagerInternal.getPackageUid(packageName, 0, userId); NotificationChannel parentChannel = mNotificationManagerInternal.getNotificationChannel(packageName, uid, @@ -1130,30 +1130,33 @@ public class DataManager { public void onShortcutsRemoved(@NonNull String packageName, @NonNull List<ShortcutInfo> shortcuts, @NonNull UserHandle user) { mInjector.getBackgroundExecutor().execute(() -> { - int uid = Process.INVALID_UID; - try { - uid = mContext.getPackageManager().getPackageUidAsUser( - packageName, user.getIdentifier()); - } catch (PackageManager.NameNotFoundException e) { - Slog.e(TAG, "Package not found: " + packageName, e); - } - PackageData packageData = getPackage(packageName, user.getIdentifier()); - Set<String> shortcutIds = new HashSet<>(); + HashSet<String> shortcutIds = new HashSet<>(); for (ShortcutInfo shortcutInfo : shortcuts) { - if (packageData != null) { - if (DEBUG) Log.d(TAG, "Deleting shortcut: " + shortcutInfo.getId()); - packageData.deleteDataForConversation(shortcutInfo.getId()); - } shortcutIds.add(shortcutInfo.getId()); } - if (uid != Process.INVALID_UID) { - mNotificationManagerInternal.onConversationRemoved( - packageName, uid, shortcutIds); - } + removeConversations(packageName, user.getIdentifier(), shortcutIds); }); } } + private void removeConversations( + @NonNull String packageName, @NonNull int userId, @NonNull Set<String> shortcutIds) { + PackageData packageData = getPackage(packageName, userId); + if (packageData != null) { + for (String shortcutId : shortcutIds) { + if (DEBUG) Log.d(TAG, "Deleting shortcut: " + shortcutId); + packageData.deleteDataForConversation(shortcutId); + } + } + try { + int uid = mContext.getPackageManager().getPackageUidAsUser( + packageName, userId); + mNotificationManagerInternal.onConversationRemoved(packageName, uid, shortcutIds); + } catch (PackageManager.NameNotFoundException e) { + Slog.e(TAG, "Package not found when removing conversation: " + packageName, e); + } + } + /** Listener for the notifications and their settings changes. */ private class NotificationListener extends NotificationListenerService { @@ -1349,9 +1352,11 @@ public class DataManager { } private void updateConversationStoreThenNotifyListeners(ConversationStore cs, - ConversationInfo modifiedConv, ShortcutInfo shortcutInfo) { + ConversationInfo modifiedConv, @NonNull ShortcutInfo shortcutInfo) { cs.addOrUpdate(modifiedConv); - ConversationChannel channel = getConversationChannel(shortcutInfo, modifiedConv); + ConversationChannel channel = getConversationChannel( + shortcutInfo, modifiedConv, shortcutInfo.getPackage(), shortcutInfo.getUserId(), + shortcutInfo.getId()); if (channel != null) { notifyConversationsListeners(Arrays.asList(channel)); } diff --git a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java index 304344ea6bff..fa8d866089b4 100644 --- a/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/people/data/DataManagerTest.java @@ -687,6 +687,34 @@ public final class DataManagerTest { } @Test + public void testGetConversation_unsyncedShortcut() { + mDataManager.onUserUnlocked(USER_ID_PRIMARY); + ShortcutInfo shortcut = buildShortcutInfo(TEST_PKG_NAME, USER_ID_PRIMARY, TEST_SHORTCUT_ID, + buildPerson()); + shortcut.setCached(ShortcutInfo.FLAG_PINNED); + mDataManager.addOrUpdateConversationInfo(shortcut); + assertThat(mDataManager.getConversation(TEST_PKG_NAME, USER_ID_PRIMARY, + TEST_SHORTCUT_ID)).isNotNull(); + assertThat(mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY) + .getConversationStore() + .getConversation(TEST_SHORTCUT_ID)).isNotNull(); + + when(mShortcutServiceInternal.getShortcuts( + anyInt(), anyString(), anyLong(), anyString(), anyList(), any(), any(), + anyInt(), anyInt(), anyInt(), anyInt())) + .thenReturn(Collections.emptyList()); + assertThat(mDataManager.getConversation(TEST_PKG_NAME, USER_ID_PRIMARY, + TEST_SHORTCUT_ID)).isNull(); + + // Conversation is removed from store as there is no matching shortcut in ShortcutManager + assertThat(mDataManager.getPackage(TEST_PKG_NAME, USER_ID_PRIMARY) + .getConversationStore() + .getConversation(TEST_SHORTCUT_ID)).isNull(); + verify(mNotificationManagerInternal) + .onConversationRemoved(TEST_PKG_NAME, TEST_PKG_UID, Set.of(TEST_SHORTCUT_ID)); + } + + @Test public void testOnNotificationChannelModified() { mDataManager.onUserUnlocked(USER_ID_PRIMARY); assertThat(mDataManager.getConversation(TEST_PKG_NAME, USER_ID_PRIMARY, |