am 75199e3d: Populate the notifications at startup of SystemUI.apk.

This commit is contained in:
Joe Onorato
2010-06-02 16:27:26 -07:00
committed by Android Git Automerger
5 changed files with 55 additions and 175 deletions

View File

@@ -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();

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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) {