1503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato/* 2503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Copyright (C) 2008 The Android Open Source Project 3503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * 4503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * you may not use this file except in compliance with the License. 6503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * You may obtain a copy of the License at 7503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * 8503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * 10503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * Unless required by applicable law or agreed to in writing, software 11503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * See the License for the specific language governing permissions and 14503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato * limitations under the License. 15503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato */ 16503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 1779de0c550037a5328bbc7f4fddaf02f192a5c283Joe Onoratopackage com.android.systemui.statusbar; 18503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 1920da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onoratoimport android.app.Notification; 20e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport android.os.IBinder; 21e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport android.view.View; 2280a44401a22344f7eabce6976372ab144ef22893Joe Onoratoimport android.widget.ImageView; 23503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato 24e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport com.android.internal.statusbar.StatusBarNotification; 25e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato 26379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandlerimport java.util.Comparator; 27e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onoratoimport java.util.ArrayList; 28e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato 29e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato/** 30e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato * The list of currently displaying notifications. 31e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato */ 32503007dd023668b1e45de948d3673e594d7f5a82Joe Onoratopublic class NotificationData { 33e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato public static final class Entry { 34e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato public IBinder key; 35e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato public StatusBarNotification notification; 3666b4c5bb36f57a9d83bb7f34288235b82f9be407Joe Onorato public StatusBarIconView icon; 379c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato public View row; // the outer expanded view 389c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato public View content; // takes the click events and sends the PendingIntent 399c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato public View expanded; // the inflated RemoteViews 4080a44401a22344f7eabce6976372ab144ef22893Joe Onorato public ImageView largeIcon; 413eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler public Entry() {} 423eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) { 433eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler this.key = key; 443eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler this.notification = n; 453eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler this.icon = ic; 463eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 47e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 48e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato private final ArrayList<Entry> mEntries = new ArrayList<Entry>(); 49379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() { 50379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler public int compare(Entry a, Entry b) { 51a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler final StatusBarNotification na = a.notification; 52a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler final StatusBarNotification nb = b.notification; 53a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler int priDiff = na.priority - nb.priority; 54a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler return (priDiff != 0) 55a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler ? priDiff 56a31e4190cb44eaa51bb8dee7d715fcd72d6c0b03Daniel Sandler : (int)(na.notification.when - nb.notification.when); 57379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler } 58379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler }; 59e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato 60e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato public int size() { 61e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato return mEntries.size(); 62e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 63e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato 640f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler public Entry get(int i) { 650f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler return mEntries.get(i); 660f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 670f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 68379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler public Entry findByKey(IBinder key) { 69379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler for (Entry e : mEntries) { 70379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (e.key == key) { 71379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler return e; 720e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato } 730e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato } 74379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler return null; 750e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato } 760e26dffd6cfcb09b08a94a857b891fdef7fe2b1eJoe Onorato 773eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler public int add(Entry entry) { 78379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler int i; 79379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler int N = mEntries.size(); 80379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler for (i=0; i<N; i++) { 81379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (mEntryCmp.compare(mEntries.get(i), entry) > 0) { 82379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler break; 83379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler } 84379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler } 85379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler mEntries.add(i, entry); 86379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler return i; 873eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler } 883eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler 899c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato public int add(IBinder key, StatusBarNotification notification, View row, View content, 909c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato View expanded, StatusBarIconView icon) { 91e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato Entry entry = new Entry(); 92e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato entry.key = key; 93e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato entry.notification = notification; 949c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato entry.row = row; 959c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato entry.content = content; 96e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato entry.expanded = expanded; 9766b4c5bb36f57a9d83bb7f34288235b82f9be407Joe Onorato entry.icon = icon; 9880a44401a22344f7eabce6976372ab144ef22893Joe Onorato entry.largeIcon = null; // TODO add support for large icons 993eebd1ffbf4583270e6926e9c74ff088a2113e07Daniel Sandler return add(entry); 100e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 101e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato 10266b4c5bb36f57a9d83bb7f34288235b82f9be407Joe Onorato public Entry remove(IBinder key) { 103379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler Entry e = findByKey(key); 104379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (e != null) { 105379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler mEntries.remove(e); 106e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 107379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler return e; 108503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato } 10920da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato 11020da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato /** 11120da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato * Return whether there are any visible items (i.e. items without an error). 11220da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato */ 11320da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato public boolean hasVisibleItems() { 114379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler for (Entry e : mEntries) { 115379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (e.expanded != null) { // the view successfully inflated 1169c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato return true; 1179c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato } 1189c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato } 1199c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato return false; 12020da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato } 12120da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato 12220da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato /** 12320da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato * Return whether there are any clearable items (that aren't errors). 12420da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato */ 12520da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato public boolean hasClearableItems() { 126379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler for (Entry e : mEntries) { 127379020aec619c66d3e040de01f0726687fd2ad85Daniel Sandler if (e.expanded != null) { // the view successfully inflated 1285dd1169ae95162383acf00d1e9a1886e0ac99a70Joe Onorato if (e.notification.isClearable()) { 1299c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato return true; 1309c1d823465fa0bd782b2ea4afc518835b4bfecceJoe Onorato } 13120da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato } 13220da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato } 13320da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato return false; 13420da8f8ac9cfc8b845231c6b93f5b64a764ab39aJoe Onorato } 135503007dd023668b1e45de948d3673e594d7f5a82Joe Onorato} 136