StatusBarManagerService.java revision 55bf3809b98dad0b8268804e684d63ea59124148
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;
35664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onoratoimport android.view.View;
360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar;
380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBarService;
390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon;
400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIconList;
4118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport com.android.internal.statusbar.StatusBarNotification;
42105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
4775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.List;
4875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.Map;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
52f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * A note on locking:  We rely on the fact that calls onto mBar are oneway or
53f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * if they are local, that they just enqueue messages to not deadlock.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
55089de88fc2f08d284cf8031aa33cff06011a4162Joe Onoratopublic class StatusBarManagerService extends IStatusBarService.Stub
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
574762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    static final String TAG = "StatusBarManagerService";
58431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato    static final boolean SPEW = false;
59df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato
60f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    final Context mContext;
61f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    Handler mHandler = new Handler();
62f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    NotificationCallbacks mNotificationCallbacks;
634762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    volatile IStatusBar mBar;
64f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    StatusBarIconList mIcons = new StatusBarIconList();
6575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato    HashMap<IBinder,StatusBarNotification> mNotifications
6675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            = new HashMap<IBinder,StatusBarNotification>();
67f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato
68f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    // for disabling the status bar
69f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>();
70f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    int mDisabled = 0;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    Object mLock = new Object();
739305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    // We usually call it lights out mode, but double negatives are annoying
749305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    boolean mLightsOn = true;
75e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    boolean mMenuVisible = false;
7606487a58be22b100daf3f950b9a1d25c3ea42aa2satok    boolean mIMEButtonVisible = false;
77cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok    IBinder mIMEToken = null;
7806487a58be22b100daf3f950b9a1d25c3ea42aa2satok
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class DisableRecord implements IBinder.DeathRecipient {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int what;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder token;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void binderDied() {
858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato            Slog.i(TAG, "binder died for pkg=" + pkg);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            disable(0, token, pkg);
87fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu            token.unlinkToDeath(this, 0);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface NotificationCallbacks {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onSetDisabled(int status);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onClearAll();
946ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana        void onNotificationClick(String pkg, String tag, int id);
950f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        void onNotificationClear(String pkg, String tag, int id);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onPanelRevealed();
979d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        void onNotificationError(String pkg, String tag, int id,
989d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn                int uid, int initialPid, String message);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct the service, add the status bar view to the window manager
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
104089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato    public StatusBarManagerService(Context context) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1060cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1070cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        final Resources res = context.getResources();
10875144ea38e79e3827e69a9f5b53a6fd3a74c4df5Joe Onorato        mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons));
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNotificationCallbacks(NotificationCallbacks listener) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNotificationCallbacks = listener;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
11625f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato    // From IStatusBarService
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
118f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    public void expand() {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceExpandStatusBar();
1204762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
1214762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        if (mBar != null) {
1224762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            try {
1234762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato                mBar.animateExpand();
1244762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            } catch (RemoteException ex) {
1254762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            }
1264762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
129f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato    public void collapse() {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceExpandStatusBar();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        if (mBar != null) {
1334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            try {
1344762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato                mBar.animateCollapse();
1354762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            } catch (RemoteException ex) {
1364762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato            }
1374762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato        }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void disable(int what, IBinder token, String pkg) {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
142f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato
143f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // It's important that the the callback and the call to mBar get done
144f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // in the same order when multiple threads are calling this function
145f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // so they are paired correctly.  The messages on the handler will be
146f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        // handled in the order they were enqueued, but will be outside the lock.
147f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato        synchronized (mDisableRecords) {
148f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            manageDisableListLocked(what, token, pkg);
149f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            final int net = gatherDisableActionsLocked();
150f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            if (net != mDisabled) {
151f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                mDisabled = net;
152f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                mHandler.post(new Runnable() {
153f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        public void run() {
154f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                            mNotificationCallbacks.onSetDisabled(net);
155f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        }
156f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    });
157f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                if (mBar != null) {
158f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    try {
159f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                        mBar.disable(net);
160f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    } catch (RemoteException ex) {
161f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                    }
162f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
1690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
1710cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int index = mIcons.getSlotIndex(slot);
1720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (index < 0) {
1730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
1740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
1750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel);
17766d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato            //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon);
1780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.setIcon(index, icon);
1790cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
1800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (mBar != null) {
1810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                try {
1820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    mBar.setIcon(index, icon);
1830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                } catch (RemoteException ex) {
1840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                }
1850cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
1860cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void setIconVisibility(String slot, boolean visible) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
192514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato        synchronized (mIcons) {
193514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            int index = mIcons.getSlotIndex(slot);
194514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (index < 0) {
195514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
196514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
197514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
198514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            StatusBarIcon icon = mIcons.getIcon(index);
199514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (icon == null) {
200514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                return;
201514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
202514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
203514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            if (icon.visible != visible) {
204514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                icon.visible = visible;
205514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato
206514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                if (mBar != null) {
207514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    try {
208514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                        mBar.setIcon(index, icon);
209514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    } catch (RemoteException ex) {
210514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                    }
211514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato                }
212514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato            }
213514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2160cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void removeIcon(String slot) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceStatusBar();
2180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2190cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
2200cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            int index = mIcons.getSlotIndex(slot);
2210cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (index < 0) {
2220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                throw new SecurityException("invalid status bar icon slot: " + slot);
2230cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
2240cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.removeIcon(index);
2260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
2270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            if (mBar != null) {
2280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                try {
2290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                    mBar.removeIcon(index);
2300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                } catch (RemoteException ex) {
2310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato                }
2320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            }
2330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
236e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    /**
237e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler     * Hide or show the on-screen Menu key. Only call this from the window manager, typically in
238e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler     * response to a window with FLAG_NEEDS_MENU_KEY set.
239e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler     */
240e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    public void setMenuKeyVisible(final boolean visible) {
241e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        enforceStatusBar();
242e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
243e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " MENU key");
244e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
245e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        synchronized(mLock) {
246e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler            if (mMenuVisible != visible) {
247e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                mMenuVisible = visible;
248e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                mHandler.post(new Runnable() {
249e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                        public void run() {
250e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                            if (mBar != null) {
251e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                                try {
252e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                                    mBar.setMenuKeyVisible(visible);
253e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                                } catch (RemoteException ex) {
254e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                                }
255e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                            }
256e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                        }
257e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler                    });
258e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler            }
259e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler        }
260e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler    }
261e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler
262cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok    public void setIMEButtonVisible(final IBinder token, final boolean visible) {
26306487a58be22b100daf3f950b9a1d25c3ea42aa2satok        enforceStatusBar();
26406487a58be22b100daf3f950b9a1d25c3ea42aa2satok
26506487a58be22b100daf3f950b9a1d25c3ea42aa2satok        if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " IME Button");
26606487a58be22b100daf3f950b9a1d25c3ea42aa2satok
26706487a58be22b100daf3f950b9a1d25c3ea42aa2satok        synchronized(mLock) {
26806e0744e9e1a04a07e2e1bf9279124223bd674dasatok            // In case of IME change, we need to call up setIMEButtonVisible() regardless of
26906e0744e9e1a04a07e2e1bf9279124223bd674dasatok            // mIMEButtonVisible because mIMEButtonVisible may not have been set to false when the
27006e0744e9e1a04a07e2e1bf9279124223bd674dasatok            // previous IME was destroyed.
27106e0744e9e1a04a07e2e1bf9279124223bd674dasatok            mIMEButtonVisible = visible;
272cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok            mIMEToken = token;
27306e0744e9e1a04a07e2e1bf9279124223bd674dasatok            mHandler.post(new Runnable() {
27406e0744e9e1a04a07e2e1bf9279124223bd674dasatok                public void run() {
27506e0744e9e1a04a07e2e1bf9279124223bd674dasatok                    if (mBar != null) {
27606e0744e9e1a04a07e2e1bf9279124223bd674dasatok                        try {
277cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok                            mBar.setIMEButtonVisible(token, visible);
27806e0744e9e1a04a07e2e1bf9279124223bd674dasatok                        } catch (RemoteException ex) {
27906487a58be22b100daf3f950b9a1d25c3ea42aa2satok                        }
28006487a58be22b100daf3f950b9a1d25c3ea42aa2satok                    }
28106e0744e9e1a04a07e2e1bf9279124223bd674dasatok                }
28206e0744e9e1a04a07e2e1bf9279124223bd674dasatok            });
28306487a58be22b100daf3f950b9a1d25c3ea42aa2satok        }
28406487a58be22b100daf3f950b9a1d25c3ea42aa2satok    }
28506487a58be22b100daf3f950b9a1d25c3ea42aa2satok
286664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato    public void setSystemUiVisibility(int vis) {
28755bf3809b98dad0b8268804e684d63ea59124148Joe Onorato        // also allows calls from window manager which is in this process.
288f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato        enforceStatusBarService();
289f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato
290f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato        synchronized (mLock) {
291664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato            final boolean lightsOn = (vis & View.STATUS_BAR_HIDDEN) == 0;
292f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato            updateLightsOnLocked(lightsOn);
293f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato        }
294f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato    }
295f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato
296f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato    private void updateLightsOnLocked(final boolean lightsOn) {
297f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato        if (mLightsOn != lightsOn) {
298f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato            mLightsOn = lightsOn;
299f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato            mHandler.post(new Runnable() {
300f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                    public void run() {
301f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                        if (mBar != null) {
302f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                            try {
303f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                                mBar.setLightsOn(lightsOn);
304f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                            } catch (RemoteException ex) {
3059305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato                            }
3069305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato                        }
307f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                    }
308f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato                });
3099305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato        }
3109305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato    }
3119305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceStatusBar() {
3130cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR,
314089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato                "StatusBarManagerService");
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void enforceExpandStatusBar() {
3180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR,
319089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato                "StatusBarManagerService");
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3228bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato    private void enforceStatusBarService() {
3238bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE,
3248bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato                "StatusBarManagerService");
3258bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato    }
3268bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
3274762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
3284762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // ================================================================================
3294762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // Callbacks from the status bar service.
3304762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    // ================================================================================
33175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato    public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList,
3329305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato            List<IBinder> notificationKeys, List<StatusBarNotification> notifications,
333cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok            int switches[], List<IBinder> binders) {
3348bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3358bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
3360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        Slog.i(TAG, "registerStatusBar bar=" + bar);
3370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        mBar = bar;
33875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        synchronized (mIcons) {
33975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            iconList.copyFrom(mIcons);
34075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        }
34175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        synchronized (mNotifications) {
34275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
34375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                notificationKeys.add(e.getKey());
34475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                notifications.add(e.getValue());
34575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
34675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato        }
3479305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato        synchronized (mLock) {
348e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato            switches[0] = gatherDisableActionsLocked();
349e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato            switches[1] = mLightsOn ? 1 : 0;
350e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato            switches[2] = mMenuVisible ? 1 : 0;
351e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato            switches[3] = mIMEButtonVisible ? 1 : 0;
352cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok            binders.add(mIMEToken);
3539305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato        }
3542314aab5064ce09f09270e52fa12a38d07464278Joe Onorato    }
355aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
3564762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    /**
357f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato     * The status bar service should call this each time the user brings the panel from
358f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato     * invisible to visible in order to clear the notification light.
3594762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato     */
360f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato    public void onPanelRevealed() {
3618bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3628bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
363f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato        // tell the notification manager to turn off the lights.
364f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato        mNotificationCallbacks.onPanelRevealed();
3654762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato    }
3664762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato
367aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    public void onNotificationClick(String pkg, String tag, int id) {
3688bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3698bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
370aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato        mNotificationCallbacks.onNotificationClick(pkg, tag, id);
371aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    }
372aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
3739d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn    public void onNotificationError(String pkg, String tag, int id,
3749d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn            int uid, int initialPid, String message) {
3758bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3768bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
377005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato        // WARNING: this will call back into us to do the remove.  Don't hold any locks.
3789d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn        mNotificationCallbacks.onNotificationError(pkg, tag, id, uid, initialPid, message);
379005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato    }
380005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato
3810f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    public void onNotificationClear(String pkg, String tag, int id) {
3820f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        enforceStatusBarService();
3830f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
3840f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler        mNotificationCallbacks.onNotificationClear(pkg, tag, id);
3850f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler    }
3860f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler
387aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    public void onClearAllNotifications() {
3888bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato        enforceStatusBarService();
3898bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato
390aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato        mNotificationCallbacks.onClearAll();
391aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato    }
392aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato
39318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // ================================================================================
39418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // Callbacks for NotificationManagerService.
39518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    // ================================================================================
39618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public IBinder addNotification(StatusBarNotification notification) {
39718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
398a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato            IBinder key = new Binder();
39975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            mNotifications.put(key, notification);
400e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
401e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
402e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.addNotification(key, notification);
403e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
404e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
405e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
40618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato            return key;
40718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
4080cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    }
4092314aab5064ce09f09270e52fa12a38d07464278Joe Onorato
41018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato    public void updateNotification(IBinder key, StatusBarNotification notification) {
41118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
41275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            if (!mNotifications.containsKey(key)) {
41375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                throw new IllegalArgumentException("updateNotification key not found: " + key);
41475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
41575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            mNotifications.put(key, notification);
416e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
417e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
418e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.updateNotification(key, notification);
419e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
420e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
421e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
42218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    public void removeNotification(IBinder key) {
42618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
42775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            final StatusBarNotification n = mNotifications.remove(key);
42875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            if (n == null) {
42975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                throw new IllegalArgumentException("removeNotification key not found: " + key);
43075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
431e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            if (mBar != null) {
432e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                try {
433e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                    mBar.removeNotification(key);
434e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                } catch (RemoteException ex) {
435e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato                }
436e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato            }
43718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // ================================================================================
4410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // Can be called from any thread
4420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato    // ================================================================================
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock on mDisableRecords
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void manageDisableListLocked(int what, IBinder token, String pkg) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (SPEW) {
447f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato            Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // update the list
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mDisableRecords) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mDisableRecords.size();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DisableRecord tok = null;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int i;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (i=0; i<N; i++) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DisableRecord t = mDisableRecords.get(i);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (t.token == token) {
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    tok = t;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (what == 0 || !token.isBinderAlive()) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tok != null) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDisableRecords.remove(i);
464fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu                    tok.token.unlinkToDeath(tok, 0);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (tok == null) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    tok = new DisableRecord();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        token.linkToDeath(tok, 0);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    catch (RemoteException ex) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        return; // give up
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mDisableRecords.add(tok);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.what = what;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.token = token;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tok.pkg = pkg;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // lock on mDisableRecords
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int gatherDisableActionsLocked() {
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = mDisableRecords.size();
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // gather the new net flags
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int net = 0;
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<N; i++) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            net |= mDisableRecords.get(i).what;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return net;
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Always called from UI thread
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // ================================================================================
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                != PackageManager.PERMISSION_GRANTED) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("Permission Denial: can't dump StatusBar from from pid="
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + Binder.getCallingPid()
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", uid=" + Binder.getCallingUid());
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5070cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato
5080cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        synchronized (mIcons) {
5090cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            mIcons.dump(pw);
5100cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato        }
51118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
51218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato        synchronized (mNotifications) {
51375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            int i=0;
51475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            pw.println("Notification list:");
51575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) {
51675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                pw.printf("  %2d: %s\n", i, e.getValue().toString());
51775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato                i++;
51875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato            }
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mDisableRecords) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = mDisableRecords.size();
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.println("  mDisableRecords.size=" + N
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mDisabled=0x" + Integer.toHexString(mDisabled));
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                DisableRecord tok = mDisableRecords.get(i);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pw.println("    [" + i + "] what=0x" + Integer.toHexString(tok.what)
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " pkg=" + tok.pkg + " token=" + tok.token);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onReceive(Context context, Intent intent) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String action = intent.getAction();
536f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato            if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
537f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato                    || Intent.ACTION_SCREEN_OFF.equals(action)) {
538f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato                collapse();
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            /*
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) {
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false),
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getStringExtra(Telephony.Intents.EXTRA_SPN),
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false),
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        intent.getStringExtra(Telephony.Intents.EXTRA_PLMN));
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                updateResources();
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato            */
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
555