• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.os.IBinder;
20 import android.service.notification.StatusBarNotification;
21 import android.view.View;
22 import android.widget.ImageView;
23 
24 import com.android.systemui.R;
25 
26 import java.util.ArrayList;
27 import java.util.Comparator;
28 
29 /**
30  * The list of currently displaying notifications.
31  */
32 public class NotificationData {
33     public static final class Entry {
34         public IBinder key;
35         public StatusBarNotification notification;
36         public StatusBarIconView icon;
37         public ExpandableNotificationRow row; // the outer expanded view
38         public View content; // takes the click events and sends the PendingIntent
39         public View expanded; // the inflated RemoteViews
40         public ImageView largeIcon;
41         private View expandedBig;
42         private boolean interruption;
Entry()43         public Entry() {}
Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic)44         public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) {
45             this.key = key;
46             this.notification = n;
47             this.icon = ic;
48         }
setBigContentView(View bigContentView)49         public void setBigContentView(View bigContentView) {
50             this.expandedBig = bigContentView;
51             row.setExpandable(bigContentView != null);
52         }
getBigContentView()53         public View getBigContentView() {
54             return expandedBig;
55         }
56         /**
57          * Set the flag indicating that this is being touched by the user.
58          */
setUserLocked(boolean userLocked)59         public void setUserLocked(boolean userLocked) {
60             row.setUserLocked(userLocked);
61         }
62 
setInterruption()63         public void setInterruption() {
64             interruption = true;
65         }
66     }
67     private final ArrayList<Entry> mEntries = new ArrayList<Entry>();
68     private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() {
69         // sort first by score, then by when
70         public int compare(Entry a, Entry b) {
71             final StatusBarNotification na = a.notification;
72             final StatusBarNotification nb = b.notification;
73             int d = na.getScore() - nb.getScore();
74 	    if (a.interruption != b.interruption) {
75 	      return a.interruption ? 1 : -1;
76 	    } else if (d != 0) {
77                 return d;
78             } else {
79                 return (int) (na.getNotification().when - nb.getNotification().when);
80             }
81         }
82     };
83 
size()84     public int size() {
85         return mEntries.size();
86     }
87 
get(int i)88     public Entry get(int i) {
89         return mEntries.get(i);
90     }
91 
findByKey(IBinder key)92     public Entry findByKey(IBinder key) {
93         for (Entry e : mEntries) {
94             if (e.key == key) {
95                 return e;
96             }
97         }
98         return null;
99     }
100 
add(Entry entry)101     public int add(Entry entry) {
102         int i;
103         int N = mEntries.size();
104         for (i=0; i<N; i++) {
105             if (mEntryCmp.compare(mEntries.get(i), entry) > 0) {
106                 break;
107             }
108         }
109         mEntries.add(i, entry);
110         return i;
111     }
112 
add(IBinder key, StatusBarNotification notification, ExpandableNotificationRow row, View content, View expanded, StatusBarIconView icon)113     public int add(IBinder key, StatusBarNotification notification, ExpandableNotificationRow row,
114             View content, View expanded, StatusBarIconView icon) {
115         Entry entry = new Entry();
116         entry.key = key;
117         entry.notification = notification;
118         entry.row = row;
119         entry.content = content;
120         entry.expanded = expanded;
121         entry.icon = icon;
122         entry.largeIcon = null; // TODO add support for large icons
123         return add(entry);
124     }
125 
remove(IBinder key)126     public Entry remove(IBinder key) {
127         Entry e = findByKey(key);
128         if (e != null) {
129             mEntries.remove(e);
130         }
131         return e;
132     }
133 
134     /**
135      * Return whether there are any visible items (i.e. items without an error).
136      */
hasVisibleItems()137     public boolean hasVisibleItems() {
138         for (Entry e : mEntries) {
139             if (e.expanded != null) { // the view successfully inflated
140                 return true;
141             }
142         }
143         return false;
144     }
145 
146     /**
147      * Return whether there are any clearable items (that aren't errors).
148      */
hasClearableItems()149     public boolean hasClearableItems() {
150         for (Entry e : mEntries) {
151             if (e.expanded != null) { // the view successfully inflated
152                 if (e.notification.isClearable()) {
153                     return true;
154                 }
155             }
156         }
157         return false;
158     }
159 }
160