Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ce302adb authored by Julia Reynolds's avatar Julia Reynolds Committed by Android (Google) Code Review
Browse files

Merge "Bulk process shortcut removals"

parents 343552e1 2b381875
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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);
            }
+5 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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 {
@@ -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());
@@ -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);
    }
+10 −12
Original line number Diff line number Diff line
@@ -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
@@ -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);
    }

@@ -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
@@ -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()) {
@@ -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) {
+3 −3
Original line number Diff line number Diff line
@@ -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.
@@ -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 =
@@ -179,7 +179,7 @@ public class NotificationHistoryManager {
                        + userId);
                return;
            }
            userHistory.deleteConversation(pkg, conversationId);
            userHistory.deleteConversations(pkg, conversationIds);
        }
    }

+3 −1
Original line number Diff line number Diff line
@@ -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,
@@ -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