Loading core/java/android/app/NotificationHistory.java +3 −4 Original line number Diff line number Diff line Loading @@ -22,12 +22,10 @@ import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Slog; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Objects; Loading Loading @@ -387,12 +385,13 @@ public final class NotificationHistory implements Parcelable { /** * Removes all notifications from a conversation and regenerates the string pool */ public boolean removeConversationFromWrite(String packageName, String conversationId) { public boolean removeConversationsFromWrite(String packageName, Set<String> conversationIds) { boolean removed = false; for (int i = mNotificationsToWrite.size() - 1; i >= 0; i--) { HistoricalNotification hn = mNotificationsToWrite.get(i); if (packageName.equals(hn.getPackage()) && conversationId.equals(hn.getConversationId())) { && hn.getConversationId() != null && conversationIds.contains(hn.getConversationId())) { removed = true; mNotificationsToWrite.remove(i); } Loading core/tests/coretests/src/android/app/NotificationHistoryTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat; import android.app.NotificationHistory.HistoricalNotification; import android.graphics.drawable.Icon; import android.os.Parcel; import android.util.Slog; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; Loading @@ -31,6 +30,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; import java.util.Set; @RunWith(AndroidJUnit4.class) public class NotificationHistoryTest { Loading Loading @@ -297,7 +297,7 @@ public class NotificationHistoryTest { for (int i = 1; i <= 10; i++) { HistoricalNotification n = getHistoricalNotification("pkg", i); if (i != 2) { if (i != 2 && i != 4) { postRemoveExpectedStrings.add(n.getPackage()); postRemoveExpectedStrings.add(n.getChannelName()); postRemoveExpectedStrings.add(n.getChannelId()); Loading @@ -318,10 +318,10 @@ public class NotificationHistoryTest { // 1 package name and 20 unique channel names and ids and 5 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(26); history.removeConversationFromWrite("pkg", "convo2"); history.removeConversationsFromWrite("pkg", Set.of("convo2", "convo4")); // 1 package names and 9 * 2 unique channel names and ids and 4 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(23); // 1 package names and 8 * 2 unique channel names and ids and 3 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(20); assertThat(history.getNotificationsToWrite()) .containsExactlyElementsIn(postRemoveExpectedEntries); } Loading services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +10 −12 Original line number Diff line number Diff line Loading @@ -40,15 +40,12 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.Set; /** * Provides an interface to write and query for notification history data for a user from a Protocol Loading Loading @@ -173,8 +170,8 @@ public class NotificationHistoryDatabase { mFileWriteHandler.post(rnr); } public void deleteConversation(String pkg, String conversationId) { RemoveConversationRunnable rcr = new RemoveConversationRunnable(pkg, conversationId); public void deleteConversations(String pkg, Set<String> conversationIds) { RemoveConversationRunnable rcr = new RemoveConversationRunnable(pkg, conversationIds); mFileWriteHandler.post(rcr); } Loading Loading @@ -467,12 +464,12 @@ public class NotificationHistoryDatabase { final class RemoveConversationRunnable implements Runnable { private String mPkg; private String mConversationId; private Set<String> mConversationIds; private NotificationHistory mNotificationHistory; public RemoveConversationRunnable(String pkg, String conversationId) { public RemoveConversationRunnable(String pkg, Set<String> conversationIds) { mPkg = pkg; mConversationId = conversationId; mConversationIds = conversationIds; } @VisibleForTesting Loading @@ -482,10 +479,10 @@ public class NotificationHistoryDatabase { @Override public void run() { if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable " + mPkg + " " + mConversationId); if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable " + mPkg + " " + mConversationIds); synchronized (mLock) { // Remove from pending history mBuffer.removeConversationFromWrite(mPkg, mConversationId); mBuffer.removeConversationsFromWrite(mPkg, mConversationIds); Iterator<AtomicFile> historyFileItr = mHistoryFiles.iterator(); while (historyFileItr.hasNext()) { Loading @@ -496,7 +493,8 @@ public class NotificationHistoryDatabase { : new NotificationHistory(); readLocked(af, notificationHistory, new NotificationHistoryFilter.Builder().build()); if(notificationHistory.removeConversationFromWrite(mPkg, mConversationId)) { if (notificationHistory.removeConversationsFromWrite( mPkg, mConversationIds)) { writeLocked(af, notificationHistory); } } catch (Exception e) { Loading services/core/java/com/android/server/notification/NotificationHistoryManager.java +3 −3 Original line number Diff line number Diff line Loading @@ -38,12 +38,12 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FunctionalUtils; import com.android.server.IoThread; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Keeps track of per-user notification histories. Loading Loading @@ -167,7 +167,7 @@ public class NotificationHistoryManager { } } public void deleteConversation(String pkg, int uid, String conversationId) { public void deleteConversations(String pkg, int uid, Set<String> conversationIds) { synchronized (mLock) { int userId = UserHandle.getUserId(uid); final NotificationHistoryDatabase userHistory = Loading @@ -179,7 +179,7 @@ public class NotificationHistoryManager { + userId); return; } userHistory.deleteConversation(pkg, conversationId); userHistory.deleteConversations(pkg, conversationIds); } } Loading services/core/java/com/android/server/notification/NotificationManagerInternal.java +3 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.notification; import android.app.Notification; import android.app.NotificationChannel; import java.util.Set; public interface NotificationManagerInternal { NotificationChannel getNotificationChannel(String pkg, int uid, String channelId); void enqueueNotification(String pkg, String basePkg, int callingUid, int callingPid, Loading @@ -28,5 +30,5 @@ public interface NotificationManagerInternal { void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId); void onConversationRemoved(String pkg, int uid, String conversationId); void onConversationRemoved(String pkg, int uid, Set<String> shortcuts); } Loading
core/java/android/app/NotificationHistory.java +3 −4 Original line number Diff line number Diff line Loading @@ -22,12 +22,10 @@ import android.graphics.drawable.Icon; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Slog; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Objects; Loading Loading @@ -387,12 +385,13 @@ public final class NotificationHistory implements Parcelable { /** * Removes all notifications from a conversation and regenerates the string pool */ public boolean removeConversationFromWrite(String packageName, String conversationId) { public boolean removeConversationsFromWrite(String packageName, Set<String> conversationIds) { boolean removed = false; for (int i = mNotificationsToWrite.size() - 1; i >= 0; i--) { HistoricalNotification hn = mNotificationsToWrite.get(i); if (packageName.equals(hn.getPackage()) && conversationId.equals(hn.getConversationId())) { && hn.getConversationId() != null && conversationIds.contains(hn.getConversationId())) { removed = true; mNotificationsToWrite.remove(i); } Loading
core/tests/coretests/src/android/app/NotificationHistoryTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat; import android.app.NotificationHistory.HistoricalNotification; import android.graphics.drawable.Icon; import android.os.Parcel; import android.util.Slog; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; Loading @@ -31,6 +30,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; import java.util.Set; @RunWith(AndroidJUnit4.class) public class NotificationHistoryTest { Loading Loading @@ -297,7 +297,7 @@ public class NotificationHistoryTest { for (int i = 1; i <= 10; i++) { HistoricalNotification n = getHistoricalNotification("pkg", i); if (i != 2) { if (i != 2 && i != 4) { postRemoveExpectedStrings.add(n.getPackage()); postRemoveExpectedStrings.add(n.getChannelName()); postRemoveExpectedStrings.add(n.getChannelId()); Loading @@ -318,10 +318,10 @@ public class NotificationHistoryTest { // 1 package name and 20 unique channel names and ids and 5 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(26); history.removeConversationFromWrite("pkg", "convo2"); history.removeConversationsFromWrite("pkg", Set.of("convo2", "convo4")); // 1 package names and 9 * 2 unique channel names and ids and 4 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(23); // 1 package names and 8 * 2 unique channel names and ids and 3 conversation ids assertThat(history.getPooledStringsToWrite().length).isEqualTo(20); assertThat(history.getNotificationsToWrite()) .containsExactlyElementsIn(postRemoveExpectedEntries); } Loading
services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +10 −12 Original line number Diff line number Diff line Loading @@ -40,15 +40,12 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.attribute.BasicFileAttributes; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.LinkedList; import java.util.concurrent.TimeUnit; import java.util.Set; /** * Provides an interface to write and query for notification history data for a user from a Protocol Loading Loading @@ -173,8 +170,8 @@ public class NotificationHistoryDatabase { mFileWriteHandler.post(rnr); } public void deleteConversation(String pkg, String conversationId) { RemoveConversationRunnable rcr = new RemoveConversationRunnable(pkg, conversationId); public void deleteConversations(String pkg, Set<String> conversationIds) { RemoveConversationRunnable rcr = new RemoveConversationRunnable(pkg, conversationIds); mFileWriteHandler.post(rcr); } Loading Loading @@ -467,12 +464,12 @@ public class NotificationHistoryDatabase { final class RemoveConversationRunnable implements Runnable { private String mPkg; private String mConversationId; private Set<String> mConversationIds; private NotificationHistory mNotificationHistory; public RemoveConversationRunnable(String pkg, String conversationId) { public RemoveConversationRunnable(String pkg, Set<String> conversationIds) { mPkg = pkg; mConversationId = conversationId; mConversationIds = conversationIds; } @VisibleForTesting Loading @@ -482,10 +479,10 @@ public class NotificationHistoryDatabase { @Override public void run() { if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable " + mPkg + " " + mConversationId); if (DEBUG) Slog.d(TAG, "RemoveConversationRunnable " + mPkg + " " + mConversationIds); synchronized (mLock) { // Remove from pending history mBuffer.removeConversationFromWrite(mPkg, mConversationId); mBuffer.removeConversationsFromWrite(mPkg, mConversationIds); Iterator<AtomicFile> historyFileItr = mHistoryFiles.iterator(); while (historyFileItr.hasNext()) { Loading @@ -496,7 +493,8 @@ public class NotificationHistoryDatabase { : new NotificationHistory(); readLocked(af, notificationHistory, new NotificationHistoryFilter.Builder().build()); if(notificationHistory.removeConversationFromWrite(mPkg, mConversationId)) { if (notificationHistory.removeConversationsFromWrite( mPkg, mConversationIds)) { writeLocked(af, notificationHistory); } } catch (Exception e) { Loading
services/core/java/com/android/server/notification/NotificationHistoryManager.java +3 −3 Original line number Diff line number Diff line Loading @@ -38,12 +38,12 @@ import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FunctionalUtils; import com.android.server.IoThread; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * Keeps track of per-user notification histories. Loading Loading @@ -167,7 +167,7 @@ public class NotificationHistoryManager { } } public void deleteConversation(String pkg, int uid, String conversationId) { public void deleteConversations(String pkg, int uid, Set<String> conversationIds) { synchronized (mLock) { int userId = UserHandle.getUserId(uid); final NotificationHistoryDatabase userHistory = Loading @@ -179,7 +179,7 @@ public class NotificationHistoryManager { + userId); return; } userHistory.deleteConversation(pkg, conversationId); userHistory.deleteConversations(pkg, conversationIds); } } Loading
services/core/java/com/android/server/notification/NotificationManagerInternal.java +3 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.notification; import android.app.Notification; import android.app.NotificationChannel; import java.util.Set; public interface NotificationManagerInternal { NotificationChannel getNotificationChannel(String pkg, int uid, String channelId); void enqueueNotification(String pkg, String basePkg, int callingUid, int callingPid, Loading @@ -28,5 +30,5 @@ public interface NotificationManagerInternal { void removeForegroundServiceFlagFromNotification(String pkg, int notificationId, int userId); void onConversationRemoved(String pkg, int uid, String conversationId); void onConversationRemoved(String pkg, int uid, Set<String> shortcuts); }