1f715fd998b172c4e8658715a26a41c69144380beChris Wren/*
2f715fd998b172c4e8658715a26a41c69144380beChris Wren * Copyright (C) 2014 The Android Open Source Project
3f715fd998b172c4e8658715a26a41c69144380beChris Wren *
4f715fd998b172c4e8658715a26a41c69144380beChris Wren * Licensed under the Apache License, Version 2.0 (the "License");
5f715fd998b172c4e8658715a26a41c69144380beChris Wren * you may not use this file except in compliance with the License.
6f715fd998b172c4e8658715a26a41c69144380beChris Wren * You may obtain a copy of the License at
7f715fd998b172c4e8658715a26a41c69144380beChris Wren *
8f715fd998b172c4e8658715a26a41c69144380beChris Wren *      http://www.apache.org/licenses/LICENSE-2.0
9f715fd998b172c4e8658715a26a41c69144380beChris Wren *
10f715fd998b172c4e8658715a26a41c69144380beChris Wren * Unless required by applicable law or agreed to in writing, software
11f715fd998b172c4e8658715a26a41c69144380beChris Wren * distributed under the License is distributed on an "AS IS" BASIS,
12f715fd998b172c4e8658715a26a41c69144380beChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f715fd998b172c4e8658715a26a41c69144380beChris Wren * See the License for the specific language governing permissions and
14f715fd998b172c4e8658715a26a41c69144380beChris Wren * limitations under the License.
15f715fd998b172c4e8658715a26a41c69144380beChris Wren */
16f715fd998b172c4e8658715a26a41c69144380beChris Wrenpackage com.android.example.notificationlistener;
17f715fd998b172c4e8658715a26a41c69144380beChris Wren
18f715fd998b172c4e8658715a26a41c69144380beChris Wren
19f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.app.Notification;
20f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.app.PendingIntent;
21f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.content.BroadcastReceiver;
22f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.content.Context;
23f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.content.Intent;
24f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.content.IntentFilter;
25f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.os.Handler;
26f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.os.Message;
27f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.service.notification.NotificationListenerService;
281390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studerimport android.service.notification.NotificationListenerService.Ranking;
291390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studerimport android.service.notification.NotificationListenerService.RankingMap;
30f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.service.notification.StatusBarNotification;
31f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.support.v4.content.LocalBroadcastManager;
32f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.text.TextUtils;
33f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport android.util.Log;
34f715fd998b172c4e8658715a26a41c69144380beChris Wren
35f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport java.util.ArrayList;
36f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport java.util.Collections;
37a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wrenimport java.util.Comparator;
38f715fd998b172c4e8658715a26a41c69144380beChris Wrenimport java.util.List;
39f715fd998b172c4e8658715a26a41c69144380beChris Wren
40f715fd998b172c4e8658715a26a41c69144380beChris Wrenpublic class Listener extends NotificationListenerService {
41f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final String TAG = "SampleListener";
42f715fd998b172c4e8658715a26a41c69144380beChris Wren
43f715fd998b172c4e8658715a26a41c69144380beChris Wren    // Message tags
44f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_NOTIFY = 1;
45f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_CANCEL = 2;
46f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_STARTUP = 3;
47f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_ORDER = 4;
48f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_DISMISS = 5;
49f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int MSG_LAUNCH = 6;
50f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static final int PAGE = 10;
51f715fd998b172c4e8658715a26a41c69144380beChris Wren
52f715fd998b172c4e8658715a26a41c69144380beChris Wren    static final String ACTION_DISMISS = "com.android.example.notificationlistener.DISMISS";
53f715fd998b172c4e8658715a26a41c69144380beChris Wren    static final String ACTION_LAUNCH = "com.android.example.notificationlistener.LAUNCH";
54f715fd998b172c4e8658715a26a41c69144380beChris Wren    static final String ACTION_REFRESH = "com.android.example.notificationlistener.REFRESH";
55f715fd998b172c4e8658715a26a41c69144380beChris Wren    static final String EXTRA_KEY = "key";
56f715fd998b172c4e8658715a26a41c69144380beChris Wren
57f715fd998b172c4e8658715a26a41c69144380beChris Wren    private static ArrayList<StatusBarNotification> sNotifications;
58f715fd998b172c4e8658715a26a41c69144380beChris Wren
59f715fd998b172c4e8658715a26a41c69144380beChris Wren    public static List<StatusBarNotification> getNotifications() {
60f715fd998b172c4e8658715a26a41c69144380beChris Wren        return sNotifications;
61f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
62f715fd998b172c4e8658715a26a41c69144380beChris Wren
6369729ee4eea5c88169956f363951c5b580edc077Christoph Studer    private final Ranking mTmpRanking = new Ranking();
6469729ee4eea5c88169956f363951c5b580edc077Christoph Studer
65f715fd998b172c4e8658715a26a41c69144380beChris Wren    private class Delta {
66f715fd998b172c4e8658715a26a41c69144380beChris Wren        final StatusBarNotification mSbn;
671390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer        final RankingMap mRankingMap;
68f715fd998b172c4e8658715a26a41c69144380beChris Wren
691390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer        public Delta(StatusBarNotification sbn, RankingMap rankingMap) {
70f715fd998b172c4e8658715a26a41c69144380beChris Wren            mSbn = sbn;
711390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer            mRankingMap = rankingMap;
72f715fd998b172c4e8658715a26a41c69144380beChris Wren        }
73f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
74f715fd998b172c4e8658715a26a41c69144380beChris Wren
75a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren    private final Comparator<StatusBarNotification> mRankingComparator =
76a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren            new Comparator<StatusBarNotification>() {
7769729ee4eea5c88169956f363951c5b580edc077Christoph Studer
7869729ee4eea5c88169956f363951c5b580edc077Christoph Studer                private final Ranking mLhsRanking = new Ranking();
7969729ee4eea5c88169956f363951c5b580edc077Christoph Studer                private final Ranking mRhsRanking = new Ranking();
8069729ee4eea5c88169956f363951c5b580edc077Christoph Studer
81a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                @Override
82a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                public int compare(StatusBarNotification lhs, StatusBarNotification rhs) {
8369729ee4eea5c88169956f363951c5b580edc077Christoph Studer                    mRankingMap.getRanking(lhs.getKey(), mLhsRanking);
8469729ee4eea5c88169956f363951c5b580edc077Christoph Studer                    mRankingMap.getRanking(rhs.getKey(), mRhsRanking);
8569729ee4eea5c88169956f363951c5b580edc077Christoph Studer                    return Integer.compare(mLhsRanking.getRank(), mRhsRanking.getRank());
86a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                }
87a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren            };
88a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren
89f715fd998b172c4e8658715a26a41c69144380beChris Wren    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
90f715fd998b172c4e8658715a26a41c69144380beChris Wren        @Override
91f715fd998b172c4e8658715a26a41c69144380beChris Wren        public void onReceive(Context context, Intent intent) {
92f715fd998b172c4e8658715a26a41c69144380beChris Wren            String key = intent.getStringExtra(EXTRA_KEY);
93f715fd998b172c4e8658715a26a41c69144380beChris Wren            int what = MSG_DISMISS;
94f715fd998b172c4e8658715a26a41c69144380beChris Wren            if (ACTION_LAUNCH.equals(intent.getAction())) {
95f715fd998b172c4e8658715a26a41c69144380beChris Wren                what = MSG_LAUNCH;
96f715fd998b172c4e8658715a26a41c69144380beChris Wren            }
97f715fd998b172c4e8658715a26a41c69144380beChris Wren            Log.d(TAG, "received an action broadcast " + intent.getAction());
98f715fd998b172c4e8658715a26a41c69144380beChris Wren            if (!TextUtils.isEmpty(key)) {
99f715fd998b172c4e8658715a26a41c69144380beChris Wren                Log.d(TAG, "  on " + key);
100f715fd998b172c4e8658715a26a41c69144380beChris Wren                Message.obtain(mHandler, what, key).sendToTarget();
101f715fd998b172c4e8658715a26a41c69144380beChris Wren            }
102f715fd998b172c4e8658715a26a41c69144380beChris Wren        }
103f715fd998b172c4e8658715a26a41c69144380beChris Wren    };
104f715fd998b172c4e8658715a26a41c69144380beChris Wren
105a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren    private final Handler mHandler = new Handler() {
106f715fd998b172c4e8658715a26a41c69144380beChris Wren        @Override
107f715fd998b172c4e8658715a26a41c69144380beChris Wren        public void handleMessage(Message msg) {
108f715fd998b172c4e8658715a26a41c69144380beChris Wren            Delta delta = null;
109f715fd998b172c4e8658715a26a41c69144380beChris Wren            if (msg.obj instanceof Delta) {
110f715fd998b172c4e8658715a26a41c69144380beChris Wren                delta = (Delta) msg.obj;
111f715fd998b172c4e8658715a26a41c69144380beChris Wren            }
11269729ee4eea5c88169956f363951c5b580edc077Christoph Studer
113f715fd998b172c4e8658715a26a41c69144380beChris Wren            switch (msg.what) {
114f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_NOTIFY:
115f715fd998b172c4e8658715a26a41c69144380beChris Wren                    Log.i(TAG, "notify: " + delta.mSbn.getKey());
116f715fd998b172c4e8658715a26a41c69144380beChris Wren                    synchronized (sNotifications) {
11769729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        boolean exists = mRankingMap.getRanking(delta.mSbn.getKey(), mTmpRanking);
11869729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        if (!exists) {
119f715fd998b172c4e8658715a26a41c69144380beChris Wren                            sNotifications.add(delta.mSbn);
120f715fd998b172c4e8658715a26a41c69144380beChris Wren                        } else {
12169729ee4eea5c88169956f363951c5b580edc077Christoph Studer                            int position = mTmpRanking.getRank();
122f715fd998b172c4e8658715a26a41c69144380beChris Wren                            sNotifications.set(position, delta.mSbn);
123f715fd998b172c4e8658715a26a41c69144380beChris Wren                        }
1241390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                        mRankingMap = delta.mRankingMap;
125a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                        Collections.sort(sNotifications, mRankingComparator);
126f715fd998b172c4e8658715a26a41c69144380beChris Wren                        Log.i(TAG, "finish with: " + sNotifications.size());
127f715fd998b172c4e8658715a26a41c69144380beChris Wren                    }
128f715fd998b172c4e8658715a26a41c69144380beChris Wren                    LocalBroadcastManager.getInstance(Listener.this)
129f715fd998b172c4e8658715a26a41c69144380beChris Wren                            .sendBroadcast(new Intent(ACTION_REFRESH)
130f715fd998b172c4e8658715a26a41c69144380beChris Wren                            .putExtra(EXTRA_KEY, delta.mSbn.getKey()));
131f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
132f715fd998b172c4e8658715a26a41c69144380beChris Wren
133f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_CANCEL:
134f715fd998b172c4e8658715a26a41c69144380beChris Wren                    Log.i(TAG, "remove: " + delta.mSbn.getKey());
135f715fd998b172c4e8658715a26a41c69144380beChris Wren                    synchronized (sNotifications) {
13669729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        boolean exists = mRankingMap.getRanking(delta.mSbn.getKey(), mTmpRanking);
13769729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        if (exists) {
13869729ee4eea5c88169956f363951c5b580edc077Christoph Studer                            sNotifications.remove(mTmpRanking.getRank());
139f715fd998b172c4e8658715a26a41c69144380beChris Wren                        }
1401390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                        mRankingMap = delta.mRankingMap;
141a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                        Collections.sort(sNotifications, mRankingComparator);
142f715fd998b172c4e8658715a26a41c69144380beChris Wren                    }
143f715fd998b172c4e8658715a26a41c69144380beChris Wren                    LocalBroadcastManager.getInstance(Listener.this)
144f715fd998b172c4e8658715a26a41c69144380beChris Wren                            .sendBroadcast(new Intent(ACTION_REFRESH));
145f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
146f715fd998b172c4e8658715a26a41c69144380beChris Wren
147f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_ORDER:
148f715fd998b172c4e8658715a26a41c69144380beChris Wren                    Log.i(TAG, "reorder");
149f715fd998b172c4e8658715a26a41c69144380beChris Wren                    synchronized (sNotifications) {
1501390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                        mRankingMap = delta.mRankingMap;
151a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren                        Collections.sort(sNotifications, mRankingComparator);
152f715fd998b172c4e8658715a26a41c69144380beChris Wren                    }
153f715fd998b172c4e8658715a26a41c69144380beChris Wren                    LocalBroadcastManager.getInstance(Listener.this)
154f715fd998b172c4e8658715a26a41c69144380beChris Wren                            .sendBroadcast(new Intent(ACTION_REFRESH));
155f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
156f715fd998b172c4e8658715a26a41c69144380beChris Wren
157f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_STARTUP:
158f715fd998b172c4e8658715a26a41c69144380beChris Wren                    fetchActive();
159f715fd998b172c4e8658715a26a41c69144380beChris Wren                    Log.i(TAG, "start with: " + sNotifications.size() + " notifications.");
160f715fd998b172c4e8658715a26a41c69144380beChris Wren                    LocalBroadcastManager.getInstance(Listener.this)
161f715fd998b172c4e8658715a26a41c69144380beChris Wren                            .sendBroadcast(new Intent(ACTION_REFRESH));
162f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
163f715fd998b172c4e8658715a26a41c69144380beChris Wren
164f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_DISMISS:
165f715fd998b172c4e8658715a26a41c69144380beChris Wren                    if (msg.obj instanceof String) {
166f715fd998b172c4e8658715a26a41c69144380beChris Wren                        final String key = (String) msg.obj;
16769729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        mRankingMap.getRanking(key, mTmpRanking);
16869729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        StatusBarNotification sbn = sNotifications.get(mTmpRanking.getRank());
169f715fd998b172c4e8658715a26a41c69144380beChris Wren                        if ((sbn.getNotification().flags & Notification.FLAG_AUTO_CANCEL) != 0 &&
170f715fd998b172c4e8658715a26a41c69144380beChris Wren                                sbn.getNotification().contentIntent != null) {
171f715fd998b172c4e8658715a26a41c69144380beChris Wren                            try {
172f715fd998b172c4e8658715a26a41c69144380beChris Wren                                sbn.getNotification().contentIntent.send();
173f715fd998b172c4e8658715a26a41c69144380beChris Wren                            } catch (PendingIntent.CanceledException e) {
174f715fd998b172c4e8658715a26a41c69144380beChris Wren                                Log.d(TAG, "failed to send intent for " + sbn.getKey(), e);
175f715fd998b172c4e8658715a26a41c69144380beChris Wren                            }
176f715fd998b172c4e8658715a26a41c69144380beChris Wren                        }
177f715fd998b172c4e8658715a26a41c69144380beChris Wren                        cancelNotification(key);
178f715fd998b172c4e8658715a26a41c69144380beChris Wren                    }
179f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
180f715fd998b172c4e8658715a26a41c69144380beChris Wren
181f715fd998b172c4e8658715a26a41c69144380beChris Wren                case MSG_LAUNCH:
182f715fd998b172c4e8658715a26a41c69144380beChris Wren                    if (msg.obj instanceof String) {
183f715fd998b172c4e8658715a26a41c69144380beChris Wren                        final String key = (String) msg.obj;
18469729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        mRankingMap.getRanking(key, mTmpRanking);
18569729ee4eea5c88169956f363951c5b580edc077Christoph Studer                        StatusBarNotification sbn = sNotifications.get(mTmpRanking.getRank());
186f715fd998b172c4e8658715a26a41c69144380beChris Wren                        if (sbn.getNotification().contentIntent != null) {
187f715fd998b172c4e8658715a26a41c69144380beChris Wren                            try {
188f715fd998b172c4e8658715a26a41c69144380beChris Wren                                sbn.getNotification().contentIntent.send();
189f715fd998b172c4e8658715a26a41c69144380beChris Wren                            } catch (PendingIntent.CanceledException e) {
190f715fd998b172c4e8658715a26a41c69144380beChris Wren                                Log.d(TAG, "failed to send intent for " + sbn.getKey(), e);
191f715fd998b172c4e8658715a26a41c69144380beChris Wren                            }
192f715fd998b172c4e8658715a26a41c69144380beChris Wren                        }
193f715fd998b172c4e8658715a26a41c69144380beChris Wren                        if ((sbn.getNotification().flags & Notification.FLAG_AUTO_CANCEL) != 0) {
194f715fd998b172c4e8658715a26a41c69144380beChris Wren                            cancelNotification(key);
195f715fd998b172c4e8658715a26a41c69144380beChris Wren                        }
196f715fd998b172c4e8658715a26a41c69144380beChris Wren                    }
197f715fd998b172c4e8658715a26a41c69144380beChris Wren                    break;
198f715fd998b172c4e8658715a26a41c69144380beChris Wren            }
199f715fd998b172c4e8658715a26a41c69144380beChris Wren        }
200f715fd998b172c4e8658715a26a41c69144380beChris Wren    };
201f715fd998b172c4e8658715a26a41c69144380beChris Wren
2021390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer    private RankingMap mRankingMap;
203a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren
204f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
205f715fd998b172c4e8658715a26a41c69144380beChris Wren    public void onCreate() {
206f715fd998b172c4e8658715a26a41c69144380beChris Wren        super.onCreate();
207f715fd998b172c4e8658715a26a41c69144380beChris Wren        Log.d(TAG, "registering broadcast listener");
208f715fd998b172c4e8658715a26a41c69144380beChris Wren        final IntentFilter intentFilter = new IntentFilter();
209f715fd998b172c4e8658715a26a41c69144380beChris Wren        intentFilter.addAction(ACTION_DISMISS);
210f715fd998b172c4e8658715a26a41c69144380beChris Wren        intentFilter.addAction(ACTION_LAUNCH);
211f715fd998b172c4e8658715a26a41c69144380beChris Wren        LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, intentFilter);
212f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
213f715fd998b172c4e8658715a26a41c69144380beChris Wren
214f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
215f715fd998b172c4e8658715a26a41c69144380beChris Wren    public void onDestroy() {
216f715fd998b172c4e8658715a26a41c69144380beChris Wren        LocalBroadcastManager.getInstance(this).unregisterReceiver(mBroadcastReceiver);
217f715fd998b172c4e8658715a26a41c69144380beChris Wren        super.onDestroy();
218f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
219f715fd998b172c4e8658715a26a41c69144380beChris Wren
220f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
2212b5b44a436d80fa89db4ddc55e429902943dc2c4Christoph Studer    public void onListenerConnected() {
222f715fd998b172c4e8658715a26a41c69144380beChris Wren        Message.obtain(mHandler, MSG_STARTUP).sendToTarget();
223f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
224f715fd998b172c4e8658715a26a41c69144380beChris Wren
225f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
2261390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer    public void onNotificationRankingUpdate(RankingMap rankingMap) {
227f715fd998b172c4e8658715a26a41c69144380beChris Wren        Message.obtain(mHandler, MSG_ORDER,
2281390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                new Delta(null, rankingMap)).sendToTarget();
229f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
230f715fd998b172c4e8658715a26a41c69144380beChris Wren
231f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
2321390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer    public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
233f715fd998b172c4e8658715a26a41c69144380beChris Wren        Message.obtain(mHandler, MSG_NOTIFY,
2341390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                new Delta(sbn, rankingMap)).sendToTarget();
235f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
236f715fd998b172c4e8658715a26a41c69144380beChris Wren
237f715fd998b172c4e8658715a26a41c69144380beChris Wren    @Override
2381390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer    public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
239f715fd998b172c4e8658715a26a41c69144380beChris Wren        Message.obtain(mHandler, MSG_CANCEL,
2401390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer                new Delta(sbn, rankingMap)).sendToTarget();
241f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
242f715fd998b172c4e8658715a26a41c69144380beChris Wren
243f715fd998b172c4e8658715a26a41c69144380beChris Wren    private void fetchActive() {
2441390028a0de623a60bec7fcf99362539dcbab7b9Christoph Studer        mRankingMap = getCurrentRanking();
245f715fd998b172c4e8658715a26a41c69144380beChris Wren        sNotifications = new ArrayList<StatusBarNotification>();
2462b5b44a436d80fa89db4ddc55e429902943dc2c4Christoph Studer        for (StatusBarNotification sbn : getActiveNotifications()) {
2472b5b44a436d80fa89db4ddc55e429902943dc2c4Christoph Studer            sNotifications.add(sbn);
248f715fd998b172c4e8658715a26a41c69144380beChris Wren        }
249a02d4fd5137f17e8192e6643f35d38e0d9f1dd10Chris Wren        Collections.sort(sNotifications, mRankingComparator);
250f715fd998b172c4e8658715a26a41c69144380beChris Wren    }
251f715fd998b172c4e8658715a26a41c69144380beChris Wren}
252