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

Commit c94096f7 authored by Chris Wren's avatar Chris Wren Committed by Android (Google) Code Review
Browse files

Merge "fix race in getAppActiveNotifications"

parents d4cbb981 6676dab3
Loading
Loading
Loading
Loading
+147 −113
Original line number Diff line number Diff line
@@ -270,6 +270,7 @@ public class NotificationManagerService extends SystemService {
            new ArrayList<NotificationRecord>();
    final ArrayMap<String, NotificationRecord> mNotificationsByKey =
            new ArrayMap<String, NotificationRecord>();
    final ArrayList<NotificationRecord> mEnqueuedNotifications = new ArrayList<>();
    final ArrayMap<Integer, ArrayMap<String, String>> mAutobundledSummaries = new ArrayMap<>();
    final ArrayList<ToastRecord> mToastQueue = new ArrayList<ToastRecord>();
    final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>();
@@ -1614,33 +1615,58 @@ public class NotificationManagerService extends SystemService {
            int userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
                    Binder.getCallingUid(), incomingUserId, true, false,
                    "getAppActiveNotifications", pkg);

            final ArrayList<StatusBarNotification> list
                    = new ArrayList<StatusBarNotification>(mNotificationList.size());
            final ArrayMap<String, StatusBarNotification> map
                    = new ArrayMap<>(mNotificationList.size() + mEnqueuedNotifications.size());

            synchronized (mNotificationList) {
                final int N = mNotificationList.size();
                for (int i = 0; i < N; i++) {
                    final StatusBarNotification sbn = mNotificationList.get(i).sbn;
                    StatusBarNotification sbn = sanitizeSbn(pkg, userId,
                            mNotificationList.get(i).sbn);
                    if (sbn != null) {
                        map.put(sbn.getKey(), sbn);
                    }
                }
                for(NotificationRecord snoozed: mSnoozeHelper.getSnoozed(userId, pkg)) {
                    StatusBarNotification sbn = sanitizeSbn(pkg, userId, snoozed.sbn);
                    if (sbn != null) {
                        map.put(sbn.getKey(), sbn);
                    }
                }
            }
            synchronized (mEnqueuedNotifications) {
                final int N = mEnqueuedNotifications.size();
                for (int i = 0; i < N; i++) {
                    StatusBarNotification sbn = sanitizeSbn(pkg, userId,
                            mEnqueuedNotifications.get(i).sbn);
                    if (sbn != null) {
                        map.put(sbn.getKey(), sbn); // pending update overwrites existing post here
                    }
                }
            }

            final ArrayList<StatusBarNotification> list = new ArrayList<>(map.size());
            list.addAll(map.values());
            return new ParceledListSlice<StatusBarNotification>(list);
        }

        private StatusBarNotification sanitizeSbn(String pkg, int userId,
                StatusBarNotification sbn) {
            if (sbn.getPackageName().equals(pkg) && sbn.getUserId() == userId
                    && (sbn.getNotification().flags
                    & Notification.FLAG_AUTOGROUP_SUMMARY) == 0) {
                // We could pass back a cloneLight() but clients might get confused and
                // try to send this thing back to notify() again, which would not work
                // very well.
                        final StatusBarNotification sbnOut = new StatusBarNotification(
                return new StatusBarNotification(
                        sbn.getPackageName(),
                        sbn.getOpPkg(),
                        sbn.getNotificationChannel(),
                        sbn.getId(), sbn.getTag(), sbn.getUid(), sbn.getInitialPid(),
                        sbn.getNotification().clone(),
                        sbn.getUser(), sbn.getOverrideGroupKey(), sbn.getPostTime());
                        list.add(sbnOut);
                    }
                }
            }

            return new ParceledListSlice<StatusBarNotification>(list);
            return null;
        }

        /**
@@ -2835,6 +2861,9 @@ public class NotificationManagerService extends SystemService {

        // setup local book-keeping
        final NotificationRecord r = new NotificationRecord(getContext(), n);
        synchronized (mEnqueuedNotifications) {
            mEnqueuedNotifications.add(r);
        }
        mHandler.post(new EnqueueNotificationRunnable(userId, r));

        idOut[0] = id;
@@ -2851,7 +2880,7 @@ public class NotificationManagerService extends SystemService {

        @Override
        public void run() {

            try {
                synchronized (mNotificationList) {
                    if (mSnoozeHelper.isSnoozed(userId, r.sbn.getPackageName(), r.getKey())) {
                        // TODO: log to event log
@@ -2967,6 +2996,11 @@ public class NotificationManagerService extends SystemService {

                    buzzBeepBlinkLocked(r);
                }
            } finally {
                synchronized (mEnqueuedNotifications) {
                    mEnqueuedNotifications.remove(r);
                }
            }
        }

        protected boolean isBlocked(NotificationRecord r, NotificationUsageStats usageStats) {
+11 −0
Original line number Diff line number Diff line
@@ -36,6 +36,9 @@ import android.util.Slog;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
@@ -84,6 +87,14 @@ public class SnoozeHelper {
                && mSnoozedNotifications.get(userId).get(pkg).containsKey(key);
    }

    protected Collection<NotificationRecord> getSnoozed(int userId, String pkg) {
        if (mSnoozedNotifications.containsKey(userId)
                && mSnoozedNotifications.get(userId).containsKey(pkg)) {
            mSnoozedNotifications.get(userId).get(pkg).values();
        }
        return Collections.EMPTY_LIST;
    }

    /**
     * Snoozes a notification and schedules an alarm to repost at that time.
     */