Home | History | Annotate | Download | only in statusbar
      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;
     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 setBigContentView(View bigContentView) {
     50             this.expandedBig = bigContentView;
     51             row.setExpandable(bigContentView != null);
     52         }
     53         public View getBigContentView() {
     54             return expandedBig;
     55         }
     56         /**
     57          * Set the flag indicating that this is being touched by the user.
     58          */
     59         public void setUserLocked(boolean userLocked) {
     60             row.setUserLocked(userLocked);
     61         }
     62 
     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 
     84     public int size() {
     85         return mEntries.size();
     86     }
     87 
     88     public Entry get(int i) {
     89         return mEntries.get(i);
     90     }
     91 
     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 
    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 
    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 
    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      */
    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      */
    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