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