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

Commit 2b381875 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Bulk process shortcut removals

This will reduce file writes for notification history

Test: atest
Bug: 169100698
Change-Id: If6488808087ad06023a994d51e00fb739ef11bd1
parent 1d65ce9b
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