StatusBarManagerService.java revision 9d39d0cb361c5d3bba04a6bacf299be2162a6e92
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
177a0f36bd93ad8a5b8cb3e1fe56dbdb43a0ad3a57Joe Onoratopackage com.android.server;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.StatusBarManager;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver;
229e875fcb55dad6795e823207693c5ca877941d3eJoe Onoratoimport android.content.ComponentName;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
32f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onoratoimport android.os.Handler;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
348a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar;
370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBarService;
380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIconList;
4018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport com.android.internal.statusbar.StatusBarNotification;
41105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
4675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.List;
4775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.Map;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
51f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * A note on locking:  We rely on the fact that calls onto mBar are oneway or
52f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * if they are local, that they just enqueue messages to not deadlock.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
54089de88fc2f08d284cf8031aa33cff06011a4162Joe Onoratopublic class StatusBarManagerService extends IStatusBarService.Stub
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
564762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    static final String TAG = "StatusBarManagerService";
57f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    static final boolean SPEW = true;
58df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato
59f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    final Context mContext;
60f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    Handler mHandler = new Handler();
61f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    NotificationCallbacks mNotificationCallbacks;
624762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    volatile IStatusBar mBar;
63f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    StatusBarIconList mIcons = new StatusBarIconList();
6475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato    HashMap<IBinder,StatusBarNotification> mNotifications
6575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            = new HashMap<IBinder,StatusBarNotification>();
66f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato
67f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    // for disabling the status bar
68f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
69f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    int mDisabled = 0;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class DisableRecord implements IBinder.DeathRecipient {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int what;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder token;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void binderDied() {
778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "binder died for pkg=" + pkg);
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            disable(0, token, pkg);
79fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu            token.unlinkToDeath(this, 0);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface NotificationCallbacks {
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onSetDisabled(int status);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onClearAll();
866ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana        void onNotificationClick(String pkg, String tag, int id);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onPanelRevealed();
889d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        void onNotificationError(String pkg, String tag, int id,
899d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn                int uid, int initialPid, String message);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct the service, add the status bar view to the window manager
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
95089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato    public StatusBarManagerService(Context context) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        final Resources res = context.getResources();
9975144ea38e79e3827e69a9f5b53a6fd3a74c4df5Joe Onorato        mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNotificationCallbacks(NotificationCallbacks listener) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotificationCallbacks = listener;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Constructing the view
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void systemReady() {
1112314aab5064ce09f09270e52fa12a38d07464278Joe Onorato    }
1122314aab5064ce09f09270e52fa12a38d07464278Joe Onorato
1132314aab5064ce09f09270e52fa12a38d07464278Joe Onorato    public void systemReady2() {
1149e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato        ComponentName cn = ComponentName.unflattenFromString(
1159e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato                mContext.getString(com.android.internal.R.string.config_statusBarComponent));
1169e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato        Intent intent = new Intent();
1179e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato        intent.setComponent(cn);
1189e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato        Slog.i(TAG, "Starting service: " + cn);
1199e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato        mContext.startService(intent);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1214762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
12325f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato    // From IStatusBarService
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
125f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    public void expand() {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceExpandStatusBar();
1274762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
1284762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        if (mBar != null) {
1294762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            try {
1304762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato                mBar.animateExpand();
1314762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            } catch (RemoteException ex) {
1324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            }
1334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
136f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    public void collapse() {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceExpandStatusBar();
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1394762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        if (mBar != null) {
1404762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            try {
1414762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato                mBar.animateCollapse();
1424762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            } catch (RemoteException ex) {
1434762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            }
1444762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disable(int what, IBinder token, String pkg) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
149f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato
150f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // It's important that the the callback and the call to mBar get done
151f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // in the same order when multiple threads are calling this function
152f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // so they are paired correctly.  The messages on the handler will be
153f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // handled in the order they were enqueued, but will be outside the lock.
154f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        synchronized (mDisableRecords) {
155f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            manageDisableListLocked(what, token, pkg);
156f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            final int net = gatherDisableActionsLocked();
157f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            Slog.d(TAG, "disable... net=0x" + Integer.toHexString(net));
158f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            if (net != mDisabled) {
159f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                mDisabled = net;
160f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                mHandler.post(new Runnable() {
161f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        public void run() {
162f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                            mNotificationCallbacks.onSetDisabled(net);
163f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        }
164f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    });
165f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                if (mBar != null) {
166f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    try {
167f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        mBar.disable(net);
168f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    } catch (RemoteException ex) {
169f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    }
170f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
1770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
1790cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int index = mIcons.getSlotIndex(slot);
1800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (index < 0) {
1810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
1820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
1830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel);
18566d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato            //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon);
1860cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.setIcon(index, icon);
1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1880cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (mBar != null) {
1890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                try {
1900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    mBar.setIcon(index, icon);
1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                } catch (RemoteException ex) {
1920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                }
1930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
1940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void setIconVisibility(String slot, boolean visible) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
1990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
200514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato        synchronized (mIcons) {
201514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            int index = mIcons.getSlotIndex(slot);
202514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (index < 0) {
203514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
204514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
205514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
206514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            StatusBarIcon icon = mIcons.getIcon(index);
207514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (icon == null) {
208514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                return;
209514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
210514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
211514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (icon.visible != visible) {
212514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                icon.visible = visible;
213514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
214514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                if (mBar != null) {
215514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    try {
216514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                        mBar.setIcon(index, icon);
217514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    } catch (RemoteException ex) {
218514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    }
219514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                }
220514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
221514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato        }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2240cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void removeIcon(String slot) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
2260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
2280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int index = mIcons.getSlotIndex(slot);
2290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (index < 0) {
2300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
2310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
2320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.removeIcon(index);
2340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (mBar != null) {
2360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                try {
2370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    mBar.removeIcon(index);
2380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                } catch (RemoteException ex) {
2390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                }
2400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
2410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceStatusBar() {
2450cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR,
246089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato                "StatusBarManagerService");
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceExpandStatusBar() {
2500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR,
251089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato                "StatusBarManagerService");
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2548bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato    private void enforceStatusBarService() {
2558bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
2568bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato                "StatusBarManagerService");
2578bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato    }
2588bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
2594762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
2604762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // ================================================================================
2614762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // Callbacks from the status bar service.
2624762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // ================================================================================
26375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato    public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList,
26475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            List<IBinder> notificationKeys, List<StatusBarNotification> notifications) {
2658bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
2668bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
2670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        Slog.i(TAG, "registerStatusBar bar=" + bar);
2680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mBar = bar;
26975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        synchronized (mIcons) {
27075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            iconList.copyFrom(mIcons);
27175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        }
27275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        synchronized (mNotifications) {
27375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
27475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                notificationKeys.add(e.getKey());
27575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                notifications.add(e.getValue());
27675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
27775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        }
2782314aab5064ce09f09270e52fa12a38d07464278Joe Onorato    }
279aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
2804762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    /**
281f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato     * The status bar service should call this each time the user brings the panel from
282f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato     * invisible to visible in order to clear the notification light.
2834762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato     */
284f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato    public void onPanelRevealed() {
2858bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
2868bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
287f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato        // tell the notification manager to turn off the lights.
288f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato        mNotificationCallbacks.onPanelRevealed();
2894762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    }
2904762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
291aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    public void onNotificationClick(String pkg, String tag, int id) {
2928bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
2938bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
294aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato        mNotificationCallbacks.onNotificationClick(pkg, tag, id);
295aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    }
296aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
2979d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn    public void onNotificationError(String pkg, String tag, int id,
2989d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn            int uid, int initialPid, String message) {
2998bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3008bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
301005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato        // WARNING: this will call back into us to do the remove.  Don't hold any locks.
3029d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        mNotificationCallbacks.onNotificationError(pkg, tag, id, uid, initialPid, message);
303005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato    }
304005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato
305aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    public void onClearAllNotifications() {
3068bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3078bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
308aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato        mNotificationCallbacks.onClearAll();
309aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    }
310aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
31118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // ================================================================================
31218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // Callbacks for NotificationManagerService.
31318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // ================================================================================
31418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public IBinder addNotification(StatusBarNotification notification) {
31518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
316a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato            IBinder key = new Binder();
31775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            mNotifications.put(key, notification);
318e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
319e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
320e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.addNotification(key, notification);
321e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
322e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
323e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
32418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            return key;
32518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
3260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
3272314aab5064ce09f09270e52fa12a38d07464278Joe Onorato
32818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public void updateNotification(IBinder key, StatusBarNotification notification) {
32918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
33075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            if (!mNotifications.containsKey(key)) {
33175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                throw new IllegalArgumentException("updateNotification key not found: " + key);
33275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
33375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            mNotifications.put(key, notification);
334e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
335e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
336e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.updateNotification(key, notification);
337e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
338e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
339e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
34018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void removeNotification(IBinder key) {
34418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
34575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            final StatusBarNotification n = mNotifications.remove(key);
34675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            if (n == null) {
34775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                throw new IllegalArgumentException("removeNotification key not found: " + key);
34875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
349e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
350e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
351e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.removeNotification(key);
352e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
353e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
354e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
35518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3580cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // ================================================================================
3590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // Can be called from any thread
3600cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // ================================================================================
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock on mDisableRecords
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void manageDisableListLocked(int what, IBinder token, String pkg) {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (SPEW) {
365f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // update the list
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mDisableRecords) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mDisableRecords.size();
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisableRecord tok = null;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<N; i++) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DisableRecord t = mDisableRecords.get(i);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (t.token == token) {
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    tok = t;
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (what == 0 || !token.isBinderAlive()) {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tok != null) {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDisableRecords.remove(i);
382fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                    tok.token.unlinkToDeath(tok, 0);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tok == null) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    tok = new DisableRecord();
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        token.linkToDeath(tok, 0);
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    catch (RemoteException ex) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return; // give up
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDisableRecords.add(tok);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.what = what;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.token = token;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.pkg = pkg;
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock on mDisableRecords
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int gatherDisableActionsLocked() {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mDisableRecords.size();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // gather the new net flags
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int net = 0;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            net |= mDisableRecords.get(i).what;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return net;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Always called from UI thread
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != PackageManager.PERMISSION_GRANTED) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Permission Denial: can't dump StatusBar from from pid="
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Binder.getCallingPid()
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", uid=" + Binder.getCallingUid());
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
4260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
4270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.dump(pw);
4280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
42918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
43018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
43175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            int i=0;
43275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            pw.println("Notification list:");
43375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
43475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                pw.printf("  %2d: %s\n", i, e.getValue().toString());
43575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                i++;
43675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mDisableRecords) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mDisableRecords.size();
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("  mDisableRecords.size=" + N
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mDisabled=0x" + Integer.toHexString(mDisabled));
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DisableRecord tok = mDisableRecords.get(i);
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("    [" + i + "] what=0x" + Integer.toHexString(tok.what)
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pkg=" + tok.pkg + " token=" + tok.token);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String action = intent.getAction();
454f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
455f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato                    || Intent.ACTION_SCREEN_OFF.equals(action)) {
456f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                collapse();
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4580cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            /*
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false),
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getStringExtra(Telephony.Intents.EXTRA_SPN),
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false),
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getStringExtra(Telephony.Intents.EXTRA_PLMN));
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateResources();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            */
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
473