Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 75199e3d authored by Joe Onorato's avatar Joe Onorato
Browse files

Populate the notifications at startup of SystemUI.apk.

Change-Id: Ie0b3fd9ed4bc9a012791372e6276f0b5908370a5
parent b77f53b2
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.internal.statusbar;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarNotification;


/** @hide */
/** @hide */
interface IStatusBarService
interface IStatusBarService
@@ -31,7 +32,8 @@ interface IStatusBarService
    void removeIcon(String slot);
    void removeIcon(String slot);


    // ---- Methods below are for use by the status bar policy services ----
    // ---- 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 visibilityChanged(boolean visible);
    void onNotificationClick(String pkg, String tag, int id);
    void onNotificationClick(String pkg, String tag, int id);
    void onClearAllNotifications();
    void onClearAllNotifications();
+0 −163
Original line number Original line Diff line number Diff line
/*
 * 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;
    }
}
+0 −1
Original line number Original line Diff line number Diff line
@@ -25,7 +25,6 @@ import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.internal.statusbar.StatusBarNotificationList;


/**
/**
 * This class takes the functions from IStatusBar that come in on
 * This class takes the functions from IStatusBar that come in on
+21 −2
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemClock;
import android.util.Log;
import android.util.Slog;
import android.util.Slog;
import android.view.Gravity;
import android.view.Gravity;
import android.view.View;
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.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
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 {
public abstract class StatusBarService extends Service implements CommandQueue.Callbacks {
    private static final String TAG = "StatusBarService";
    private static final String TAG = "StatusBarService";
@@ -53,17 +58,19 @@ public abstract class StatusBarService extends Service implements CommandQueue.C
    public void onCreate() {
    public void onCreate() {
        // Connect in to the status bar manager service
        // Connect in to the status bar manager service
        StatusBarIconList iconList = new StatusBarIconList();
        StatusBarIconList iconList = new StatusBarIconList();
        ArrayList<IBinder> notificationKeys = new ArrayList<IBinder>();
        ArrayList<StatusBarNotification> notifications = new ArrayList<StatusBarNotification>();
        mCommandQueue = new CommandQueue(this, iconList);
        mCommandQueue = new CommandQueue(this, iconList);
        mBarService = IStatusBarService.Stub.asInterface(
        mBarService = IStatusBarService.Stub.asInterface(
                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
        try {
        try {
            mBarService.registerStatusBar(mCommandQueue, iconList);
            mBarService.registerStatusBar(mCommandQueue, iconList, notificationKeys, notifications);
        } catch (RemoteException ex) {
        } catch (RemoteException ex) {
            // If the system process isn't there we're doomed anyway.
            // If the system process isn't there we're doomed anyway.
        }
        }


        // Set up the initial icon state
        // Set up the initial icon state
        final int N = iconList.size();
        int N = iconList.size();
        int viewIndex = 0;
        int viewIndex = 0;
        for (int i=0; i<N; i++) {
        for (int i=0; i<N; i++) {
            StatusBarIcon icon = iconList.getIcon(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
        // Put up the view
        addStatusBarView();
        addStatusBarView();
    }
    }
+31 −8
Original line number Original line Diff line number Diff line
@@ -37,12 +37,13 @@ import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarIconList;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.internal.statusbar.StatusBarNotification;
import com.android.internal.statusbar.StatusBarNotificationList;


import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;




/**
/**
@@ -62,7 +63,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub
    NotificationCallbacks mNotificationCallbacks;
    NotificationCallbacks mNotificationCallbacks;
    volatile IStatusBar mBar;
    volatile IStatusBar mBar;
    StatusBarIconList mIcons = new StatusBarIconList();
    StatusBarIconList mIcons = new StatusBarIconList();
    StatusBarNotificationList mNotifications = new StatusBarNotificationList();
    HashMap<IBinder,StatusBarNotification> mNotifications
            = new HashMap<IBinder,StatusBarNotification>();


    // for disabling the status bar
    // for disabling the status bar
    ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
    ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
@@ -250,11 +252,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub
    // ================================================================================
    // ================================================================================
    // Callbacks from the status bar service.
    // 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);
        Slog.i(TAG, "registerStatusBar bar=" + bar);
        mBar = bar;
        mBar = bar;
        synchronized (mIcons) {
            iconList.copyFrom(mIcons);
            iconList.copyFrom(mIcons);
        }
        }
        synchronized (mNotifications) {
            for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
                notificationKeys.add(e.getKey());
                notifications.add(e.getValue());
            }
        }
    }


    /**
    /**
     * The status bar service should call this when the user changes whether
     * The status bar service should call this when the user changes whether
@@ -277,8 +288,9 @@ public class StatusBarManagerService extends IStatusBarService.Stub
    // ================================================================================
    // ================================================================================
    public IBinder addNotification(StatusBarNotification notification) {
    public IBinder addNotification(StatusBarNotification notification) {
        synchronized (mNotifications) {
        synchronized (mNotifications) {
            Slog.d(TAG, "addNotification notification=" + notification);
            IBinder key = new Binder();
            IBinder key = new Binder();
            mNotifications.add(key, notification);
            mNotifications.put(key, notification);
            if (mBar != null) {
            if (mBar != null) {
                try {
                try {
                    mBar.addNotification(key, notification);
                    mBar.addNotification(key, notification);
@@ -291,7 +303,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub


    public void updateNotification(IBinder key, StatusBarNotification notification) {
    public void updateNotification(IBinder key, StatusBarNotification notification) {
        synchronized (mNotifications) {
        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) {
            if (mBar != null) {
                try {
                try {
                    mBar.updateNotification(key, notification);
                    mBar.updateNotification(key, notification);
@@ -303,7 +318,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub


    public void removeNotification(IBinder key) {
    public void removeNotification(IBinder key) {
        synchronized (mNotifications) {
        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) {
            if (mBar != null) {
                try {
                try {
                    mBar.removeNotification(key);
                    mBar.removeNotification(key);
@@ -386,7 +404,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub
        }
        }


        synchronized (mNotifications) {
        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) {
        synchronized (mDisableRecords) {