OSDN Git Service

am fa2dbd69: Merge "Doc change: GCM category & dry_run params" into jb-dev-docs
[android-x86/frameworks-base.git] / packages / SystemUI / src / com / android / systemui / statusbar / NotificationData.java
1 /*
2  * Copyright (C) 2008 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
17 package com.android.systemui.statusbar;
18
19 import android.app.Notification;
20 import android.os.IBinder;
21 import android.view.View;
22 import android.widget.ImageView;
23
24 import com.android.internal.statusbar.StatusBarNotification;
25 import com.android.systemui.R;
26
27 import java.util.Comparator;
28 import java.util.ArrayList;
29
30 /**
31  * The list of currently displaying notifications.
32  */
33 public class NotificationData {
34     public static final class Entry {
35         public IBinder key;
36         public StatusBarNotification notification;
37         public StatusBarIconView icon;
38         public View row; // the outer expanded view
39         public View content; // takes the click events and sends the PendingIntent
40         public View expanded; // the inflated RemoteViews
41         public ImageView largeIcon;
42         protected View expandedLarge;
43         public Entry() {}
44         public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) {
45             this.key = key;
46             this.notification = n;
47             this.icon = ic;
48         }
49         public void setLargeView(View expandedLarge) {
50             this.expandedLarge = expandedLarge;
51             writeBooleanTag(row, R.id.expandable_tag, expandedLarge != null);
52         }
53         public View getLargeView() {
54             return expandedLarge;
55         }
56         /**
57          * Return whether the entry can be expanded.
58          */
59         public boolean expandable() {
60             return NotificationData.getIsExpandable(row);
61         }
62         /**
63          * Return whether the entry has been manually expanded by the user.
64          */
65         public boolean userExpanded() {
66             return NotificationData.getUserExpanded(row);
67         }
68         /**
69          * Set the flag indicating that this was manually expanded by the user.
70          */
71         public boolean setUserExpanded(boolean userExpanded) {
72             return NotificationData.setUserExpanded(row, userExpanded);
73         }
74         /**
75          * Return whether the entry is being touched by the user.
76          */
77         public boolean userLocked() {
78             return NotificationData.getUserLocked(row);
79         }
80         /**
81          * Set the flag indicating that this is being touched by the user.
82          */
83         public boolean setUserLocked(boolean userLocked) {
84             return NotificationData.setUserLocked(row, userLocked);
85         }
86     }
87     private final ArrayList<Entry> mEntries = new ArrayList<Entry>();
88     private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() {
89         // sort first by score, then by when
90         public int compare(Entry a, Entry b) {
91             final StatusBarNotification na = a.notification;
92             final StatusBarNotification nb = b.notification;
93             int d = na.score - nb.score;
94             return (d != 0)
95                 ? d
96                 : (int)(na.notification.when - nb.notification.when);
97         }
98     };
99
100     public int size() {
101         return mEntries.size();
102     }
103
104     public Entry get(int i) {
105         return mEntries.get(i);
106     }
107
108     public Entry findByKey(IBinder key) {
109         for (Entry e : mEntries) {
110             if (e.key == key) {
111                 return e;
112             }
113         }
114         return null;
115     }
116
117     public int add(Entry entry) {
118         int i;
119         int N = mEntries.size();
120         for (i=0; i<N; i++) {
121             if (mEntryCmp.compare(mEntries.get(i), entry) > 0) {
122                 break;
123             }
124         }
125         mEntries.add(i, entry);
126         return i;
127     }
128
129     public int add(IBinder key, StatusBarNotification notification, View row, View content,
130             View expanded, StatusBarIconView icon) {
131         Entry entry = new Entry();
132         entry.key = key;
133         entry.notification = notification;
134         entry.row = row;
135         entry.content = content;
136         entry.expanded = expanded;
137         entry.icon = icon;
138         entry.largeIcon = null; // TODO add support for large icons
139         return add(entry);
140     }
141
142     public Entry remove(IBinder key) {
143         Entry e = findByKey(key);
144         if (e != null) {
145             mEntries.remove(e);
146         }
147         return e;
148     }
149
150     /**
151      * Return whether there are any visible items (i.e. items without an error).
152      */
153     public boolean hasVisibleItems() {
154         for (Entry e : mEntries) {
155             if (e.expanded != null) { // the view successfully inflated
156                 return true;
157             }
158         }
159         return false;
160     }
161
162     /**
163      * Return whether there are any clearable items (that aren't errors).
164      */
165     public boolean hasClearableItems() {
166         for (Entry e : mEntries) {
167             if (e.expanded != null) { // the view successfully inflated
168                 if (e.notification.isClearable()) {
169                     return true;
170                 }
171             }
172         }
173         return false;
174     }
175
176     protected static boolean readBooleanTag(View view, int id)  {
177         if (view != null) {
178             Object value = view.getTag(id);
179             return value != null && value instanceof Boolean && ((Boolean) value).booleanValue();
180         }
181         return false;
182     }
183
184     protected static boolean writeBooleanTag(View view, int id, boolean value)  {
185         if (view != null) {
186             view.setTag(id, Boolean.valueOf(value));
187             return value;
188         }
189         return false;
190     }
191
192     /**
193      * Return whether the entry can be expanded.
194      */
195     public static boolean getIsExpandable(View row) {
196         return readBooleanTag(row, R.id.expandable_tag);
197     }
198
199     /**
200      * Return whether the entry has been manually expanded by the user.
201      */
202     public static boolean getUserExpanded(View row) {
203         return readBooleanTag(row, R.id.user_expanded_tag);
204     }
205
206     /**
207      * Set whether the entry has been manually expanded by the user.
208      */
209     public static boolean setUserExpanded(View row, boolean userExpanded) {
210         return writeBooleanTag(row, R.id.user_expanded_tag, userExpanded);
211     }
212
213     /**
214      * Return whether the entry is being touched by the user.
215      */
216     public static boolean getUserLocked(View row) {
217         return readBooleanTag(row, R.id.user_lock_tag);
218     }
219
220     /**
221      * Set whether the entry is being touched by the user.
222      */
223     public static boolean setUserLocked(View row, boolean userLocked) {
224         return writeBooleanTag(row, R.id.user_lock_tag, userLocked);
225     }
226 }