From 738b8715ab1ece5941a1a0ea931f697efad7fcb0 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Mon, 18 Mar 2013 23:06:15 -0400 Subject: [PATCH] Optimizations in the notification list: - sort notifications by timestamp - deal with notification bursts better by waiting to refresh the list until things settle down Change-Id: Ie41051afcb0a7a917f2a97a3311628b34626c125 --- .../android/settings/NotificationStation.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/NotificationStation.java b/src/com/android/settings/NotificationStation.java index 5fa37248926..1fdbcab0995 100644 --- a/src/com/android/settings/NotificationStation.java +++ b/src/com/android/settings/NotificationStation.java @@ -30,6 +30,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; @@ -46,6 +47,7 @@ import android.widget.TextView; import com.android.internal.statusbar.StatusBarNotification; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; public class NotificationStation extends SettingsPreferenceFragment { @@ -57,23 +59,43 @@ public class NotificationStation extends SettingsPreferenceFragment { private final PackageReceiver mPackageReceiver = new PackageReceiver(); private INotificationManager mNoMan; + + private Runnable mRefreshListRunnable = new Runnable() { + @Override + public void run() { + refreshList(); + } + }; + private INotificationListener.Stub mListener = new INotificationListener.Stub() { @Override public void onNotificationPosted(StatusBarNotification notification) throws RemoteException { Log.v(TAG, "onNotificationPosted: " + notification); - getListView().post(new Runnable() { public void run() { refreshList(); }}); + final Handler h = getListView().getHandler(); + h.removeCallbacks(mRefreshListRunnable); + h.postDelayed(mRefreshListRunnable, 100); } @Override public void onNotificationRemoved(StatusBarNotification notification) throws RemoteException { - Log.v(TAG, "onNotificationRemoved: " + notification); - getListView().post(new Runnable() { public void run() { refreshList(); }}); + final Handler h = getListView().getHandler(); + h.removeCallbacks(mRefreshListRunnable); + h.postDelayed(mRefreshListRunnable, 100); } }; private NotificationHistoryAdapter mAdapter; private Context mContext; + private final Comparator mNotificationSorter + = new Comparator() { + @Override + public int compare(HistoricalNotificationInfo lhs, + HistoricalNotificationInfo rhs) { + return (int)(rhs.timestamp - lhs.timestamp); + } + }; + @Override public void onAttach(Activity activity) { logd("onAttach(%s)", activity.getClass().getSimpleName()); @@ -146,6 +168,7 @@ public class NotificationStation extends SettingsPreferenceFragment { logd("adding %d infos", infos.size()); mAdapter.clear(); mAdapter.addAll(infos); + mAdapter.sort(mNotificationSorter); } }