| package com.android.server.status; |
| |
| import android.os.IBinder; |
| import android.util.Log; |
| import android.view.View; |
| import java.util.ArrayList; |
| |
| class NotificationViewList { |
| private ArrayList<StatusBarNotification> mOngoing = new ArrayList(); |
| private ArrayList<StatusBarNotification> mLatest = new ArrayList(); |
| |
| NotificationViewList() { |
| } |
| |
| private static final int indexInList(ArrayList<StatusBarNotification> list, NotificationData n){ |
| final int N = list.size(); |
| for (int i=0; i<N; i++) { |
| StatusBarNotification that = list.get(i); |
| if (that.data == n) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| |
| int getIconIndex(NotificationData n) { |
| final int ongoingSize = mOngoing.size(); |
| final int latestSize = mLatest.size(); |
| if (n.ongoingEvent) { |
| int index = indexInList(mOngoing, n); |
| if (index >= 0) { |
| return latestSize + index + 1; |
| } else { |
| return -1; |
| } |
| } else { |
| return indexInList(mLatest, n) + 1; |
| } |
| } |
| |
| void remove(StatusBarNotification notification) { |
| NotificationData n = notification.data; |
| int index; |
| index = indexInList(mOngoing, n); |
| if (index >= 0) { |
| mOngoing.remove(index); |
| return; |
| } |
| index = indexInList(mLatest, n); |
| if (index >= 0) { |
| mLatest.remove(index); |
| return; |
| } |
| } |
| |
| ArrayList<StatusBarNotification> notificationsForPackage(String packageName) { |
| ArrayList<StatusBarNotification> list = new ArrayList<StatusBarNotification>(); |
| int N = mOngoing.size(); |
| for (int i=0; i<N; i++) { |
| if (matchPackage(mOngoing.get(i), packageName)) { |
| list.add(mOngoing.get(i)); |
| } |
| } |
| N = mLatest.size(); |
| for (int i=0; i<N; i++) { |
| if (matchPackage(mLatest.get(i), packageName)) { |
| list.add(mLatest.get(i)); |
| } |
| } |
| return list; |
| } |
| |
| private final boolean matchPackage(StatusBarNotification snb, String packageName) { |
| if (snb.data.contentIntent != null) { |
| if (snb.data.contentIntent.getTargetPackage().equals(packageName)) { |
| return true; |
| } |
| } else if (snb.data.pkg != null && snb.data.pkg.equals(packageName)) { |
| return true; |
| } |
| return false; |
| } |
| |
| private static final int indexForKey(ArrayList<StatusBarNotification> list, IBinder key) { |
| final int N = list.size(); |
| for (int i=0; i<N; i++) { |
| if (list.get(i).key == key) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| |
| StatusBarNotification get(IBinder key) { |
| int index; |
| index = indexForKey(mOngoing, key); |
| if (index >= 0) { |
| return mOngoing.get(index); |
| } |
| index = indexForKey(mLatest, key); |
| if (index >= 0) { |
| return mLatest.get(index); |
| } |
| return null; |
| } |
| |
| // gets the index of the notification in its expanded parent view |
| int getExpandedIndex(StatusBarNotification notification) { |
| ArrayList<StatusBarNotification> list = notification.data.ongoingEvent ? mOngoing : mLatest; |
| return list.size() - indexForKey(list, notification.key) - 1; |
| } |
| |
| void clearViews() { |
| int N = mOngoing.size(); |
| for (int i=0; i<N; i++) { |
| mOngoing.get(i).view = null; |
| } |
| N = mLatest.size(); |
| for (int i=0; i<N; i++) { |
| mLatest.get(i).view = null; |
| } |
| } |
| |
| int ongoingCount() { |
| return mOngoing.size(); |
| } |
| |
| int latestCount() { |
| return mLatest.size(); |
| } |
| |
| StatusBarNotification getOngoing(int index) { |
| return mOngoing.get(index); |
| } |
| |
| StatusBarNotification getLatest(int index) { |
| return mLatest.get(index); |
| } |
| |
| int size() { |
| return mOngoing.size() + mLatest.size(); |
| } |
| |
| void add(StatusBarNotification notification) { |
| ArrayList<StatusBarNotification> list = notification.data.ongoingEvent ? mOngoing : mLatest; |
| long when = notification.data.when; |
| final int N = list.size(); |
| int index = N; |
| for (int i=0; i<N; i++) { |
| StatusBarNotification that = list.get(i); |
| if (that.data.when > when) { |
| index = i; |
| break; |
| } |
| } |
| list.add(index, notification); |
| |
| if (StatusBarService.SPEW) { |
| String s = ""; |
| for (int i=0; i<mOngoing.size(); i++) { |
| StatusBarNotification that = mOngoing.get(i); |
| if (that.key == notification.key) { |
| s += "["; |
| } |
| s += that.data.when; |
| if (that.key == notification.key) { |
| s += "]"; |
| } |
| s += " "; |
| } |
| Log.d(StatusBarService.TAG, "NotificationViewList ongoing index=" + index + ": " + s); |
| |
| s = ""; |
| for (int i=0; i<mLatest.size(); i++) { |
| StatusBarNotification that = mLatest.get(i); |
| if (that.key == notification.key) { |
| s += "["; |
| } |
| s += that.data.when; |
| if (that.key == notification.key) { |
| s += "]"; |
| } |
| s += " "; |
| } |
| Log.d(StatusBarService.TAG, "NotificationViewList latest index=" + index + ": " + s); |
| } |
| } |
| |
| StatusBarNotification get(View view) { |
| int N = mOngoing.size(); |
| for (int i=0; i<N; i++) { |
| StatusBarNotification notification = mOngoing.get(i); |
| View v = notification.view; |
| if (v == view) { |
| return notification; |
| } |
| } |
| N = mLatest.size(); |
| for (int i=0; i<N; i++) { |
| StatusBarNotification notification = mLatest.get(i); |
| View v = notification.view; |
| if (v == view) { |
| return notification; |
| } |
| } |
| return null; |
| } |
| |
| void update(StatusBarNotification notification) { |
| remove(notification); |
| add(notification); |
| } |
| |
| boolean hasClearableItems() { |
| int N = mLatest.size(); |
| for (int i=0; i<N; i++) { |
| if (mLatest.get(i).data.clearable) { |
| return true; |
| } |
| } |
| return false; |
| } |
| } |