1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.statusbar;
18
19import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator.ExpandAnimationParameters;
20
21import android.view.View;
22import android.view.ViewGroup;
23
24import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper;
25
26/**
27 * Interface representing the entity that contains notifications. It can have
28 * notification views added and removed from it, and will manage displaying them to the user.
29 */
30public interface NotificationListContainer {
31
32    /**
33     * Called when a child is being transferred.
34     *
35     * @param childTransferInProgress whether child transfer is in progress
36     */
37    void setChildTransferInProgress(boolean childTransferInProgress);
38
39    /**
40     * Change the position of child to a new location
41     *
42     * @param child the view to change the position for
43     * @param newIndex the new index
44     */
45    void changeViewPosition(View child, int newIndex);
46
47    /**
48     * Called when a child was added to a group.
49     *
50     * @param row row of the group child that was added
51     */
52    void notifyGroupChildAdded(View row);
53
54    /**
55     * Called when a child was removed from a group.
56     *
57     * @param row row of the child that was removed
58     * @param childrenContainer ViewGroup of the group that the child was removed from
59     */
60    void notifyGroupChildRemoved(View row, ViewGroup childrenContainer);
61
62    /**
63     * Generate an animation for an added child view.
64     *
65     * @param child The view to be added.
66     * @param fromMoreCard Whether this add is coming from the "more" card on lockscreen.
67     */
68    void generateAddAnimation(View child, boolean fromMoreCard);
69
70    /**
71     * Generate a child order changed event.
72     */
73    void generateChildOrderChangedEvent();
74
75    /**
76     * Returns the number of children in the NotificationListContainer.
77     *
78     * @return the number of children in the NotificationListContainer
79     */
80    int getContainerChildCount();
81
82    /**
83     * Gets the ith child in the NotificationListContainer.
84     *
85     * @param i ith child to get
86     * @return the ith child in the list container
87     */
88    View getContainerChildAt(int i);
89
90    /**
91     * Remove a view from the container
92     *
93     * @param v view to remove
94     */
95    void removeContainerView(View v);
96
97    /**
98     * Add a view to the container
99     *
100     * @param v view to add
101     */
102    void addContainerView(View v);
103
104    /**
105     * Sets the maximum number of notifications to display.
106     *
107     * @param maxNotifications max number of notifications to display
108     */
109    void setMaxDisplayedNotifications(int maxNotifications);
110
111    /**
112     * Handle snapping a non-dismissable row back if the user tried to dismiss it.
113     *
114     * @param row row to snap back
115     */
116    void snapViewIfNeeded(ExpandableNotificationRow row);
117
118    /**
119     * Get the view parent for a notification entry. For example, NotificationStackScrollLayout.
120     *
121     * @param entry entry to get the view parent for
122     * @return the view parent for entry
123     */
124    ViewGroup getViewParentForNotification(NotificationData.Entry entry);
125
126    /**
127     * Called when the height of an expandable view changes.
128     *
129     * @param view view whose height changed
130     * @param animate whether this change should be animated
131     */
132    void onHeightChanged(ExpandableView view, boolean animate);
133
134    /**
135     * Resets the currently exposed menu view.
136     *
137     * @param animate whether to animate the closing/change of menu view
138     * @param force reset the menu view even if it looks like it is already reset
139     */
140    void resetExposedMenuView(boolean animate, boolean force);
141
142    /**
143     * Returns the NotificationSwipeActionHelper for the NotificationListContainer.
144     *
145     * @return swipe action helper for the list container
146     */
147    NotificationSwipeActionHelper getSwipeActionHelper();
148
149    /**
150     * Called when a notification is removed from the shade. This cleans up the state for a
151     * given view.
152     *
153     * @param view view to clean up view state for
154     */
155    void cleanUpViewState(View view);
156
157    /**
158     * Returns whether an ExpandableNotificationRow is in a visible location or not.
159     *
160     * @param row
161     * @return true if row is in a visible location
162     */
163    boolean isInVisibleLocation(ExpandableNotificationRow row);
164
165    /**
166     * Sets a listener to listen for changes in notification locations.
167     *
168     * @param listener listener to set
169     */
170    void setChildLocationsChangedListener(
171            NotificationLogger.OnChildLocationsChangedListener listener);
172
173    /**
174     * Called when an update to the notification view hierarchy is completed.
175     */
176    default void onNotificationViewUpdateFinished() {}
177
178    /**
179     * Returns true if there are pulsing notifications.
180     *
181     * @return true if has pulsing notifications
182     */
183    boolean hasPulsingNotifications();
184
185    /**
186     * Apply parameters of the expand animation to the layout
187     */
188    default void applyExpandAnimationParams(ExpandAnimationParameters params) {}
189
190    default void setExpandingNotification(ExpandableNotificationRow row) {}
191
192    /**
193     * Bind a newly created row.
194     *
195     * @param row The notification to bind.
196     */
197    default void bindRow(ExpandableNotificationRow row) {}
198}
199