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