NotificationGroupManager.java revision b5605e58cb8080c8c887b1885336b707596c8094
125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek/* 225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * Copyright (C) 2015 The Android Open Source Project 325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * Licensed under the Apache License, Version 2.0 (the "License"); 525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * you may not use this file except in compliance with the License. 625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * You may obtain a copy of the License at 725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * http://www.apache.org/licenses/LICENSE-2.0 925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 1025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * Unless required by applicable law or agreed to in writing, software 1125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * distributed under the License is distributed on an "AS IS" BASIS, 1225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * See the License for the specific language governing permissions and 1425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * limitations under the License 1525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 1625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 1725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekpackage com.android.systemui.statusbar.phone; 1825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 1925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport android.app.Notification; 2025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport android.service.notification.StatusBarNotification; 2125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 2225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport com.android.systemui.statusbar.ExpandableNotificationRow; 2325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport com.android.systemui.statusbar.NotificationData; 2425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport com.android.systemui.statusbar.StatusBarState; 2525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 2625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport java.util.HashMap; 2725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport java.util.HashSet; 2825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport java.util.Map; 2925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekimport java.util.Set; 3025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 3125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek/** 3225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * A class to handle notifications and their corresponding groups. 3325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 3425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinekpublic class NotificationGroupManager { 3525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 3625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private final HashMap<String, NotificationGroup> mGroupMap = new HashMap<>(); 3725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private OnGroupChangeListener mListener; 3825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private int mBarState = -1; 3925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 4025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void setOnGroupChangeListener(OnGroupChangeListener listener) { 4125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mListener = listener; 4225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 4325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 4425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public boolean isGroupExpanded(StatusBarNotification sbn) { 4525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 4625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group == null) { 4725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 4825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 4925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return group.expanded; 5025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 5125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 5225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void setGroupExpanded(StatusBarNotification sbn, boolean expanded) { 5325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 5425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group == null) { 5525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return; 5625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 5725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek setGroupExpanded(group, expanded); 5825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 5925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 6025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private void setGroupExpanded(NotificationGroup group, boolean expanded) { 6125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group.expanded = expanded; 6225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.summary != null) { 6325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mListener.onGroupExpansionChanged(group.summary.row, expanded); 6425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 6525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 6625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 6725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void onEntryRemoved(NotificationData.Entry removed) { 6825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek onEntryRemovedInternal(removed, removed.notification); 6925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 7025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 7125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek /** 7225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * An entry was removed. 7325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 7425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @param removed the removed entry 7525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @param sbn the notification the entry has, which doesn't need to be the same as it's internal 7625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * notification 7725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 7825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private void onEntryRemovedInternal(NotificationData.Entry removed, 7925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek final StatusBarNotification sbn) { 8025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek Notification notif = sbn.getNotification(); 8125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek String groupKey = sbn.getGroupKey(); 8225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek final NotificationGroup group = mGroupMap.get(groupKey); 8325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (notif.isGroupSummary()) { 8425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group.summary = null; 8525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } else { 8625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group.children.remove(removed); 8725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 8825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.children.isEmpty()) { 8925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.summary == null) { 9025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mGroupMap.remove(groupKey); 9125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } else { 9225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.expanded) { 9325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek // only the summary is left. Change it to unexpanded in a few ms. We do this to 9425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek // avoid raceconditions 9525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek removed.row.post(new Runnable() { 9625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek @Override 9725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void run() { 9825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.children.isEmpty()) { 9925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek setGroupExpanded(sbn, false); 10025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek }); 103b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek } else { 104b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek group.summary.row.updateExpandButton(); 10525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 10925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 11025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void onEntryAdded(NotificationData.Entry added) { 11125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek StatusBarNotification sbn = added.notification; 11225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek Notification notif = sbn.getNotification(); 11325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek String groupKey = sbn.getGroupKey(); 11425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(groupKey); 11525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group == null) { 11625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group = new NotificationGroup(); 11725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mGroupMap.put(groupKey, group); 11825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 11925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (notif.isGroupSummary()) { 12025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group.summary = added; 121b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek group.expanded = added.row.areChildrenExpanded(); 12225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (!group.children.isEmpty()) { 12325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mListener.onGroupCreatedFromChildren(group); 12425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 12525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } else { 12625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek group.children.add(added); 127b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek if (group.summary != null && group.children.size() == 1 && !group.expanded) { 128b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek group.summary.row.updateExpandButton(); 129b5605e58cb8080c8c887b1885336b707596c8094Selim Cinek } 13025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 13125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 13225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 13325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void onEntryUpdated(NotificationData.Entry entry, 13425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek StatusBarNotification oldNotification) { 13525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (mGroupMap.get(oldNotification.getGroupKey()) != null) { 13625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek onEntryRemovedInternal(entry, oldNotification); 13725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 13825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek onEntryAdded(entry); 13925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 14025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 14125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public boolean isVisible(StatusBarNotification sbn) { 14225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (!sbn.getNotification().isGroupChild()) { 14325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return true; 14425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 14525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 14625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group != null && group.expanded) { 14725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return true; 14825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 14925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 15025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 15125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 15225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public boolean hasGroupChildren(StatusBarNotification sbn) { 15325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (areGroupsProhibited()) { 15425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 15525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 15625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (!sbn.getNotification().isGroupSummary()) { 15725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 15825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 15925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 16025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group == null) { 16125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 16225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 16325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return !group.children.isEmpty(); 16425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 16525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 16625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public void setStatusBarState(int newState) { 16725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (mBarState == newState) { 16825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return; 16925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 17025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek boolean prohibitedBefore = areGroupsProhibited(); 17125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mBarState = newState; 17225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek boolean nowProhibited = areGroupsProhibited(); 17325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (nowProhibited != prohibitedBefore) { 17425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (nowProhibited) { 17525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek for (NotificationGroup group : mGroupMap.values()) { 17625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group.expanded) { 17725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek setGroupExpanded(group, false); 17825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 17925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 18025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 18125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek mListener.onGroupsProhibitedChanged(); 18225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 18325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 18425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 18525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek private boolean areGroupsProhibited() { 18625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return mBarState == StatusBarState.KEYGUARD; 18725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 18825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 18925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek /** 19025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @return whether a given notification is a child in a group which has a summary 19125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 19225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public boolean isChildInGroupWithSummary(StatusBarNotification sbn) { 19325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (!sbn.getNotification().isGroupChild()) { 19425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 19525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 19625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 19725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek if (group == null || group.summary == null) { 19825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return false; 19925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 20025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return true; 20125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 20225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 20325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public ExpandableNotificationRow getGroupSummary(StatusBarNotification sbn) { 20425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek NotificationGroup group = mGroupMap.get(sbn.getGroupKey()); 20525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek return group == null ? null 20625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek : group.summary == null ? null 20725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek : group.summary.row; 20825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 20925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 21025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public static class NotificationGroup { 21125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public final HashSet<NotificationData.Entry> children = new HashSet<>(); 21225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public NotificationData.Entry summary; 21325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public boolean expanded; 21425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 21525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 21625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek public interface OnGroupChangeListener { 21725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek /** 21825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * The expansion of a group has changed. 21925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 22025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @param changedRow the row for which the expansion has changed, which is also the summary 22125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @param expanded a boolean indicating the new expanded state 22225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 22325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek void onGroupExpansionChanged(ExpandableNotificationRow changedRow, boolean expanded); 22425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 22525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek /** 22625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * Children group policy has changed and children may no be prohibited or allowed. 22725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 22825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek void onGroupsProhibitedChanged(); 22925fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek 23025fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek /** 23125fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * A group of children just received a summary notification and should therefore become 23225fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * children of it. 23325fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * 23425fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek * @param group the group created 23525fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek */ 23625fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek void onGroupCreatedFromChildren(NotificationGroup group); 23725fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek } 23825fd4e2be731fe893685faa48828d8fa4526cb1aSelim Cinek} 239