am 75199e3d: Populate the notifications at startup of SystemUI.apk.
This commit is contained in:
@@ -19,6 +19,7 @@ package com.android.internal.statusbar;
|
||||
import com.android.internal.statusbar.IStatusBar;
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.statusbar.StatusBarIconList;
|
||||
import com.android.internal.statusbar.StatusBarNotification;
|
||||
|
||||
/** @hide */
|
||||
interface IStatusBarService
|
||||
@@ -31,7 +32,8 @@ interface IStatusBarService
|
||||
void removeIcon(String slot);
|
||||
|
||||
// ---- Methods below are for use by the status bar policy services ----
|
||||
void registerStatusBar(IStatusBar callbacks, out StatusBarIconList state);
|
||||
void registerStatusBar(IStatusBar callbacks, out StatusBarIconList iconList,
|
||||
out List<IBinder> notificationKeys, out List<StatusBarNotification> notifications);
|
||||
void visibilityChanged(boolean visible);
|
||||
void onNotificationClick(String pkg, String tag, int id);
|
||||
void onClearAllNotifications();
|
||||
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.internal.statusbar;
|
||||
|
||||
import android.os.Binder;
|
||||
import android.os.IBinder;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Contains a list of status bar notifications and IBinder keys in no particular order.
|
||||
*/
|
||||
public class StatusBarNotificationList implements Parcelable {
|
||||
private class Entry {
|
||||
IBinder key;
|
||||
public StatusBarNotification notification;
|
||||
|
||||
void writeToParcel(Parcel out, int flags) {
|
||||
out.writeStrongBinder(key);
|
||||
notification.writeToParcel(out, flags);
|
||||
}
|
||||
|
||||
void readFromParcel(Parcel in) {
|
||||
key = in.readStrongBinder();
|
||||
notification = new StatusBarNotification(in);
|
||||
}
|
||||
|
||||
public Entry clone() {
|
||||
Entry that = new Entry();
|
||||
that.key = this.key;
|
||||
that.notification = this.notification.clone();
|
||||
return that;
|
||||
}
|
||||
}
|
||||
|
||||
private ArrayList<Entry> mEntries = new ArrayList<Entry>();
|
||||
|
||||
public StatusBarNotificationList() {
|
||||
}
|
||||
|
||||
public StatusBarNotificationList(Parcel in) {
|
||||
readFromParcel(in);
|
||||
}
|
||||
|
||||
public void readFromParcel(Parcel in) {
|
||||
final int N = in.readInt();
|
||||
for (int i=0; i<N; i++) {
|
||||
Entry e = new Entry();
|
||||
e.readFromParcel(in);
|
||||
mEntries.add(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void writeToParcel(Parcel out, int flags) {
|
||||
final int N = mEntries.size();
|
||||
out.writeInt(N);
|
||||
for (int i=0; i<N; i++) {
|
||||
mEntries.get(i).writeToParcel(out, flags);
|
||||
}
|
||||
}
|
||||
|
||||
public int describeContents() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parcelable.Creator that instantiates StatusBarNotificationList objects
|
||||
*/
|
||||
public static final Parcelable.Creator<StatusBarNotificationList> CREATOR
|
||||
= new Parcelable.Creator<StatusBarNotificationList>()
|
||||
{
|
||||
public StatusBarNotificationList createFromParcel(Parcel parcel)
|
||||
{
|
||||
return new StatusBarNotificationList(parcel);
|
||||
}
|
||||
|
||||
public StatusBarNotificationList[] newArray(int size)
|
||||
{
|
||||
return new StatusBarNotificationList[size];
|
||||
}
|
||||
};
|
||||
|
||||
public void copyFrom(StatusBarNotificationList that) {
|
||||
mEntries.clear();
|
||||
final int N = that.mEntries.size();
|
||||
for (int i=0; i<N; i++) {
|
||||
mEntries.add(that.mEntries.get(i).clone());
|
||||
}
|
||||
}
|
||||
|
||||
public void dump(PrintWriter pw) {
|
||||
final int N = mEntries.size();
|
||||
pw.println("Notification list:");
|
||||
for (int i=0; i<N; i++) {
|
||||
Entry e = mEntries.get(i);
|
||||
pw.printf(" %2d: %s\n", i, e.notification.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int size() {
|
||||
return mEntries.size();
|
||||
}
|
||||
|
||||
public void add(IBinder key, StatusBarNotification notification) {
|
||||
if (notification == null) throw new NullPointerException();
|
||||
|
||||
Entry entry = new Entry();
|
||||
entry.key = key;
|
||||
entry.notification = notification.clone();
|
||||
|
||||
mEntries.add(entry);
|
||||
}
|
||||
|
||||
public void update(IBinder key, StatusBarNotification notification) {
|
||||
final int index = getIndex(key);
|
||||
if (index < 0) {
|
||||
throw new IllegalArgumentException("got invalid key: " + key);
|
||||
}
|
||||
mEntries.get(index).notification = notification.clone();
|
||||
}
|
||||
|
||||
public void remove(IBinder key) {
|
||||
final int index = getIndex(key);
|
||||
if (index < 0) {
|
||||
throw new IllegalArgumentException("got invalid key: " + key);
|
||||
}
|
||||
mEntries.remove(index);
|
||||
}
|
||||
|
||||
public int getIndex(IBinder key) {
|
||||
final ArrayList<Entry> entries = mEntries;
|
||||
final int N = entries.size();
|
||||
for (int i=0; i<N; i++) {
|
||||
if (entries.get(i).key == key) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public StatusBarNotification getNotification(int index) {
|
||||
return mEntries.get(index).notification;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ import com.android.internal.statusbar.IStatusBar;
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.statusbar.StatusBarIconList;
|
||||
import com.android.internal.statusbar.StatusBarNotification;
|
||||
import com.android.internal.statusbar.StatusBarNotificationList;
|
||||
|
||||
/**
|
||||
* This class takes the functions from IStatusBar that come in on
|
||||
|
||||
@@ -24,6 +24,7 @@ import android.os.IBinder;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.SystemClock;
|
||||
import android.util.Log;
|
||||
import android.util.Slog;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
@@ -36,6 +37,10 @@ import com.android.internal.statusbar.IStatusBar;
|
||||
import com.android.internal.statusbar.IStatusBarService;
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.statusbar.StatusBarIconList;
|
||||
import com.android.internal.statusbar.StatusBarNotification;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public abstract class StatusBarService extends Service implements CommandQueue.Callbacks {
|
||||
private static final String TAG = "StatusBarService";
|
||||
@@ -53,17 +58,19 @@ public abstract class StatusBarService extends Service implements CommandQueue.C
|
||||
public void onCreate() {
|
||||
// Connect in to the status bar manager service
|
||||
StatusBarIconList iconList = new StatusBarIconList();
|
||||
ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
|
||||
ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
|
||||
mCommandQueue = new CommandQueue(this, iconList);
|
||||
mBarService = IStatusBarService.Stub.asInterface(
|
||||
ServiceManager.getService(Context.STATUS_BAR_SERVICE));
|
||||
try {
|
||||
mBarService.registerStatusBar(mCommandQueue, iconList);
|
||||
mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications);
|
||||
} catch (RemoteException ex) {
|
||||
// If the system process isn't there we're doomed anyway.
|
||||
}
|
||||
|
||||
// Set up the initial icon state
|
||||
final int N = iconList.size();
|
||||
int N = iconList.size();
|
||||
int viewIndex = 0;
|
||||
for (int i=0; i<N; i++) {
|
||||
StatusBarIcon icon = iconList.getIcon(i);
|
||||
@@ -73,6 +80,18 @@ public abstract class StatusBarService extends Service implements CommandQueue.C
|
||||
}
|
||||
}
|
||||
|
||||
// Set up the initial notification state
|
||||
N = notificationKeys.size();
|
||||
Slog.d(TAG, "installing " + N + " initial notifications");
|
||||
if (N == notifications.size()) {
|
||||
for (int i=0; i<N; i++) {
|
||||
addNotification(notificationKeys.get(i), notifications.get(i));
|
||||
}
|
||||
} else {
|
||||
Log.wtf(TAG, "Notification list length mismatch: keys=" + N
|
||||
+ " notifications=" + notifications.size());
|
||||
}
|
||||
|
||||
// Put up the view
|
||||
addStatusBarView();
|
||||
}
|
||||
|
||||
@@ -37,12 +37,13 @@ import com.android.internal.statusbar.IStatusBarService;
|
||||
import com.android.internal.statusbar.StatusBarIcon;
|
||||
import com.android.internal.statusbar.StatusBarIconList;
|
||||
import com.android.internal.statusbar.StatusBarNotification;
|
||||
import com.android.internal.statusbar.StatusBarNotificationList;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
/**
|
||||
@@ -62,7 +63,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
NotificationCallbacks mNotificationCallbacks;
|
||||
volatile IStatusBar mBar;
|
||||
StatusBarIconList mIcons = new StatusBarIconList();
|
||||
StatusBarNotificationList mNotifications = new StatusBarNotificationList();
|
||||
HashMap<IBinder,StatusBarNotification> mNotifications
|
||||
= new HashMap<IBinder,StatusBarNotification>();
|
||||
|
||||
// for disabling the status bar
|
||||
ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
|
||||
@@ -250,10 +252,19 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
// ================================================================================
|
||||
// Callbacks from the status bar service.
|
||||
// ================================================================================
|
||||
public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList) {
|
||||
public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList,
|
||||
List<IBinder> notificationKeys, List<StatusBarNotification> notifications) {
|
||||
Slog.i(TAG, "registerStatusBar bar=" + bar);
|
||||
mBar = bar;
|
||||
iconList.copyFrom(mIcons);
|
||||
synchronized (mIcons) {
|
||||
iconList.copyFrom(mIcons);
|
||||
}
|
||||
synchronized (mNotifications) {
|
||||
for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
|
||||
notificationKeys.add(e.getKey());
|
||||
notifications.add(e.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -277,8 +288,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
// ================================================================================
|
||||
public IBinder addNotification(StatusBarNotification notification) {
|
||||
synchronized (mNotifications) {
|
||||
Slog.d(TAG, "addNotification notification=" + notification);
|
||||
IBinder key = new Binder();
|
||||
mNotifications.add(key, notification);
|
||||
mNotifications.put(key, notification);
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.addNotification(key, notification);
|
||||
@@ -291,7 +303,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
|
||||
public void updateNotification(IBinder key, StatusBarNotification notification) {
|
||||
synchronized (mNotifications) {
|
||||
mNotifications.update(key, notification);
|
||||
if (!mNotifications.containsKey(key)) {
|
||||
throw new IllegalArgumentException("updateNotification key not found: " + key);
|
||||
}
|
||||
mNotifications.put(key, notification);
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.updateNotification(key, notification);
|
||||
@@ -303,7 +318,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
|
||||
public void removeNotification(IBinder key) {
|
||||
synchronized (mNotifications) {
|
||||
mNotifications.remove(key);
|
||||
final StatusBarNotification n = mNotifications.remove(key);
|
||||
if (n == null) {
|
||||
throw new IllegalArgumentException("removeNotification key not found: " + key);
|
||||
}
|
||||
if (mBar != null) {
|
||||
try {
|
||||
mBar.removeNotification(key);
|
||||
@@ -386,7 +404,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub
|
||||
}
|
||||
|
||||
synchronized (mNotifications) {
|
||||
mNotifications.dump(pw);
|
||||
int i=0;
|
||||
pw.println("Notification list:");
|
||||
for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
|
||||
pw.printf(" %2d: %s\n", i, e.getValue().toString());
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
synchronized (mDisableRecords) {
|
||||
|
||||
Reference in New Issue
Block a user