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

Commit 830578ff authored by Tony Wickham's avatar Tony Wickham
Browse files

Cancel notification group summary when all children are cancelled.

This requires maintaining notification group information by mapping
groupKey's to the summary key and child keys.

Bug: 65100024
Change-Id: Idd352ce5e243a0762bf30a9c79d36681456a1b17
parent a9e345f8
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.launcher3.notification;

import java.util.HashSet;
import java.util.Set;

/**
 * Contains data related to a group of notifications, like the group summary key and the child keys.
 */
public class NotificationGroup {
    private String mGroupSummaryKey;
    private Set<String> mChildKeys;

    public NotificationGroup() {
        mChildKeys = new HashSet<>();
    }

    public void setGroupSummaryKey(String groupSummaryKey) {
        mGroupSummaryKey = groupSummaryKey;
    }

    public String getGroupSummaryKey() {
        return mGroupSummaryKey;
    }

    public void addChildKey(String childKey) {
        mChildKeys.add(childKey);
    }

    public void removeChildKey(String childKey) {
        mChildKeys.remove(childKey);
    }

    public boolean isEmpty() {
        return mChildKeys.isEmpty();
    }
}
+31 −2
Original line number Diff line number Diff line
@@ -38,7 +38,9 @@ import com.android.launcher3.util.SettingsObserver;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static com.android.launcher3.SettingsActivity.NOTIFICATION_BADGING;
@@ -66,6 +68,8 @@ public class NotificationListener extends NotificationListenerService {
    private final Handler mWorkerHandler;
    private final Handler mUiHandler;
    private final Ranking mTempRanking = new Ranking();
    /** Maps groupKey's to the corresponding group of notifications. */
    private final Map<String, NotificationGroup> mNotificationGroupMap = new HashMap<>();

    private SettingsObserver mNotificationBadgingObserver;

@@ -227,6 +231,15 @@ public class NotificationListener extends NotificationListenerService {
                        NotificationKeyData.fromNotification(sbn));
        mWorkerHandler.obtainMessage(MSG_NOTIFICATION_REMOVED, packageUserKeyAndNotificationKey)
                .sendToTarget();

        NotificationGroup notificationGroup = mNotificationGroupMap.get(sbn.getGroupKey());
        if (notificationGroup != null) {
            notificationGroup.removeChildKey(sbn.getKey());
            if (notificationGroup.isEmpty()) {
                cancelNotification(notificationGroup.getGroupSummaryKey());
                mNotificationGroupMap.remove(sbn.getGroupKey());
            }
        }
    }

    /** This makes a potentially expensive binder call and should be run on a background thread. */
@@ -264,18 +277,34 @@ public class NotificationListener extends NotificationListenerService {
    }

    private boolean shouldBeFilteredOut(StatusBarNotification sbn) {
        Notification notification = sbn.getNotification();

        boolean isGroupHeader = (notification.flags & Notification.FLAG_GROUP_SUMMARY) != 0;
        if (sbn.isGroup()) {
            // Maintain group info so we can cancel the summary when the last child is canceled.
            NotificationGroup notificationGroup = mNotificationGroupMap.get(sbn.getGroupKey());
            if (notificationGroup == null) {
                notificationGroup = new NotificationGroup();
                mNotificationGroupMap.put(sbn.getGroupKey(), notificationGroup);
            }
            if (isGroupHeader) {
                notificationGroup.setGroupSummaryKey(sbn.getKey());
            } else {
                notificationGroup.addChildKey(sbn.getKey());
            }
        }

        getCurrentRanking().getRanking(sbn.getKey(), mTempRanking);
        if (!mTempRanking.canShowBadge()) {
            return true;
        }
        Notification notification = sbn.getNotification();
        if (mTempRanking.getChannel().getId().equals(NotificationChannel.DEFAULT_CHANNEL_ID)) {
            // Special filtering for the default, legacy "Miscellaneous" channel.
            if ((notification.flags & Notification.FLAG_ONGOING_EVENT) != 0) {
                return true;
            }
        }
        boolean isGroupHeader = (notification.flags & Notification.FLAG_GROUP_SUMMARY) != 0;

        CharSequence title = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
        CharSequence text = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
        boolean missingTitleAndText = TextUtils.isEmpty(title) && TextUtils.isEmpty(text);