StatusBarManagerService.java revision e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1
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"; 57431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato static final boolean SPEW = false; 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 719305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato Object mLock = new Object(); 729305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato // We usually call it lights out mode, but double negatives are annoying 739305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato boolean mLightsOn = true; 74e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler boolean mMenuVisible = false; 7506487a58be22b100daf3f950b9a1d25c3ea42aa2satok boolean mIMEButtonVisible = false; 7606487a58be22b100daf3f950b9a1d25c3ea42aa2satok 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DisableRecord implements IBinder.DeathRecipient { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 838a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "binder died for pkg=" + pkg); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disable(0, token, pkg); 85fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(this, 0); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface NotificationCallbacks { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onSetDisabled(int status); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onClearAll(); 926ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana void onNotificationClick(String pkg, String tag, int id); 930f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler void onNotificationClear(String pkg, String tag, int id); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPanelRevealed(); 959d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn void onNotificationError(String pkg, String tag, int id, 969d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct the service, add the status bar view to the window manager 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 102089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato public StatusBarManagerService(Context context) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1050cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato final Resources res = context.getResources(); 10675144ea38e79e3827e69a9f5b53a6fd3a74c4df5Joe Onorato mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons)); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotificationCallbacks(NotificationCallbacks listener) { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks = listener; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 11425f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato // From IStatusBarService 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 116f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void expand() { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1184762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 1194762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1204762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1214762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateExpand(); 1224762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1234762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1244762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 127f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void collapse() { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1304762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1314762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateCollapse(); 1334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1344762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1354762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disable(int what, IBinder token, String pkg) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 140f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 141f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // It's important that the the callback and the call to mBar get done 142f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // in the same order when multiple threads are calling this function 143f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // so they are paired correctly. The messages on the handler will be 144f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // handled in the order they were enqueued, but will be outside the lock. 145f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato synchronized (mDisableRecords) { 146f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato manageDisableListLocked(what, token, pkg); 147f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato final int net = gatherDisableActionsLocked(); 148f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato if (net != mDisabled) { 149f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mDisabled = net; 150f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mHandler.post(new Runnable() { 151f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void run() { 152f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mNotificationCallbacks.onSetDisabled(net); 153f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 154f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato }); 155f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato if (mBar != null) { 156f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato try { 157f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mBar.disable(net); 158f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } catch (RemoteException ex) { 159f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 160f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 1670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 1690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 1700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 1710cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 1720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel); 17566d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); 1760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.setIcon(index, icon); 1770cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 1790cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 1800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.setIcon(index, icon); 1810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 1820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void setIconVisibility(String slot, boolean visible) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 1890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 190514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato synchronized (mIcons) { 191514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato int index = mIcons.getSlotIndex(slot); 192514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (index < 0) { 193514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 194514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 195514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 196514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato StatusBarIcon icon = mIcons.getIcon(index); 197514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon == null) { 198514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato return; 199514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 200514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 201514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon.visible != visible) { 202514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato icon.visible = visible; 203514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 204514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (mBar != null) { 205514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato try { 206514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato mBar.setIcon(index, icon); 207514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } catch (RemoteException ex) { 208514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 209514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 210514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 211514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeIcon(String slot) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 2160cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2170cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 2180cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 2190cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 2200cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 2210cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2220cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2230cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.removeIcon(index); 2240cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 2260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 2270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.removeIcon(index); 2280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 2290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 234e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler /** 235e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler * Hide or show the on-screen Menu key. Only call this from the window manager, typically in 236e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler * response to a window with FLAG_NEEDS_MENU_KEY set. 237e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler */ 238e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler public void setMenuKeyVisible(final boolean visible) { 239e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler enforceStatusBar(); 240e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 241e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " MENU key"); 242e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 243e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler synchronized(mLock) { 244e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler if (mMenuVisible != visible) { 245e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler mMenuVisible = visible; 246e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler mHandler.post(new Runnable() { 247e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler public void run() { 248e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler if (mBar != null) { 249e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler try { 250e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler mBar.setMenuKeyVisible(visible); 251e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } catch (RemoteException ex) { 252e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 253e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 254e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 255e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler }); 256e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 257e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 258e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 259e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 26006487a58be22b100daf3f950b9a1d25c3ea42aa2satok public void setIMEButtonVisible(final boolean visible) { 26106487a58be22b100daf3f950b9a1d25c3ea42aa2satok enforceStatusBar(); 26206487a58be22b100daf3f950b9a1d25c3ea42aa2satok 26306487a58be22b100daf3f950b9a1d25c3ea42aa2satok if (SPEW) Slog.d(TAG, (visible?"showing":"hiding") + " IME Button"); 26406487a58be22b100daf3f950b9a1d25c3ea42aa2satok 26506487a58be22b100daf3f950b9a1d25c3ea42aa2satok synchronized(mLock) { 26606487a58be22b100daf3f950b9a1d25c3ea42aa2satok if (mIMEButtonVisible != visible) { 26706487a58be22b100daf3f950b9a1d25c3ea42aa2satok mIMEButtonVisible = visible; 26806487a58be22b100daf3f950b9a1d25c3ea42aa2satok mHandler.post(new Runnable() { 26906487a58be22b100daf3f950b9a1d25c3ea42aa2satok public void run() { 27006487a58be22b100daf3f950b9a1d25c3ea42aa2satok if (mBar != null) { 27106487a58be22b100daf3f950b9a1d25c3ea42aa2satok try { 27206487a58be22b100daf3f950b9a1d25c3ea42aa2satok mBar.setIMEButtonVisible(visible); 27306487a58be22b100daf3f950b9a1d25c3ea42aa2satok } catch (RemoteException ex) { 27406487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 27506487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 27606487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 27706487a58be22b100daf3f950b9a1d25c3ea42aa2satok }); 27806487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 27906487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 28006487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 28106487a58be22b100daf3f950b9a1d25c3ea42aa2satok 282f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato /** 283f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * This is used for the automatic version of lights-out mode. Only call this from 284f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * the window manager. 285f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * 286f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * @see setLightsOn(boolean) 287f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato */ 2889305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato public void setActiveWindowIsFullscreen(boolean fullscreen) { 2899305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato // We could get away with a separate permission here, but STATUS_BAR is 2909305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato // signatureOrSystem which is probably good enough. There is no public API 2919305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato // for this, so the question is a security issue, not an API compatibility issue. 2929305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato enforceStatusBar(); 2939305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato 2949305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato synchronized (mLock) { 295f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato updateLightsOnLocked(!fullscreen); 296f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 297f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 298f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 299f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato /** 300f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * This is used for the user-controlled version of lights-out mode. Only call this from 301f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * the status bar itself. 302f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * 303f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * We have two different functions here, because I think we're going to want to 304f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * tweak the behavior when the user keeps turning lights-out mode off and the 305f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * app keeps trying to turn it on. For now they can just fight it out. Having 306f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato * these two separte inputs will allow us to keep that change local to here. --joeo 307f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato */ 308f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato public void setLightsOn(boolean lightsOn) { 309f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato enforceStatusBarService(); 310f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 311f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato synchronized (mLock) { 312f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato updateLightsOnLocked(lightsOn); 313f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 314f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 315f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 316f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato private void updateLightsOnLocked(final boolean lightsOn) { 317f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato if (mLightsOn != lightsOn) { 318f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mLightsOn = lightsOn; 319f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mHandler.post(new Runnable() { 320f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato public void run() { 321f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato if (mBar != null) { 322f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato try { 323f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mBar.setLightsOn(lightsOn); 324f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } catch (RemoteException ex) { 3259305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3269305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 327f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 328f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato }); 3299305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3309305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3319305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceStatusBar() { 3330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR, 334089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceExpandStatusBar() { 3380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR, 339089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3428bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato private void enforceStatusBarService() { 3438bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE, 3448bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato "StatusBarManagerService"); 3458bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato } 3468bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 3474762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 3484762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 3494762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // Callbacks from the status bar service. 3504762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 35175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList, 3529305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato List<IBinder> notificationKeys, List<StatusBarNotification> notifications, 353e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato int switches[]) { 3548bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3558bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 3560cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato Slog.i(TAG, "registerStatusBar bar=" + bar); 3570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar = bar; 35875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mIcons) { 35975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato iconList.copyFrom(mIcons); 36075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 36175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mNotifications) { 36275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 36375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notificationKeys.add(e.getKey()); 36475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notifications.add(e.getValue()); 36575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 36675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 3679305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato synchronized (mLock) { 368e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[0] = gatherDisableActionsLocked(); 369e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[1] = mLightsOn ? 1 : 0; 370e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[2] = mMenuVisible ? 1 : 0; 371e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[3] = mIMEButtonVisible ? 1 : 0; 3729305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3732314aab5064ce09f09270e52fa12a38d07464278Joe Onorato } 374aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 3754762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato /** 376f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * The status bar service should call this each time the user brings the panel from 377f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * invisible to visible in order to clear the notification light. 3784762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato */ 379f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato public void onPanelRevealed() { 3808bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3818bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 382f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato // tell the notification manager to turn off the lights. 383f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato mNotificationCallbacks.onPanelRevealed(); 3844762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 3854762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 386aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onNotificationClick(String pkg, String tag, int id) { 3878bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3888bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 389aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onNotificationClick(pkg, tag, id); 390aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 391aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 3929d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn public void onNotificationError(String pkg, String tag, int id, 3939d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message) { 3948bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3958bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 396005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato // WARNING: this will call back into us to do the remove. Don't hold any locks. 3979d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn mNotificationCallbacks.onNotificationError(pkg, tag, id, uid, initialPid, message); 398005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 399005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato 4000f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler public void onNotificationClear(String pkg, String tag, int id) { 4010f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler enforceStatusBarService(); 4020f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 4030f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler mNotificationCallbacks.onNotificationClear(pkg, tag, id); 4040f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 4050f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 406aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onClearAllNotifications() { 4078bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 4088bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 409aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onClearAll(); 410aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 411aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 41218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 41318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // Callbacks for NotificationManagerService. 41418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 41518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public IBinder addNotification(StatusBarNotification notification) { 41618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 417a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato IBinder key = new Binder(); 41875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 419e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 420e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 421e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.addNotification(key, notification); 422e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 423e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 424e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 42518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return key; 42618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 4282314aab5064ce09f09270e52fa12a38d07464278Joe Onorato 42918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public void updateNotification(IBinder key, StatusBarNotification notification) { 43018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 43175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (!mNotifications.containsKey(key)) { 43275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("updateNotification key not found: " + key); 43375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 43475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 435e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 436e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 437e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.updateNotification(key, notification); 438e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 439e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 440e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 44118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4440cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeNotification(IBinder key) { 44518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 44675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato final StatusBarNotification n = mNotifications.remove(key); 44775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (n == null) { 44875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("removeNotification key not found: " + key); 44975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 450e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 451e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 452e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.removeNotification(key); 453e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 454e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 455e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 45618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 4600cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // Can be called from any thread 4610cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void manageDisableListLocked(int what, IBinder token, String pkg) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 466f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the list 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = null; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord t = mDisableRecords.get(i); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.token == token) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = t; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (what == 0 || !token.isBinderAlive()) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok != null) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.remove(i); 483fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu tok.token.unlinkToDeath(tok, 0); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok == null) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = new DisableRecord(); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.linkToDeath(tok, 0); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RemoteException ex) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // give up 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.add(tok); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.what = what; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.token = token; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.pkg = pkg; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gatherDisableActionsLocked() { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the new net flags 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net = 0; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project net |= mDisableRecords.get(i).what; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return net; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always called from UI thread 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump StatusBar from from pid=" 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5260cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 5280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.dump(pw); 5290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 53018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 53118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 53275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato int i=0; 53375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.println("Notification list:"); 53475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 53575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.printf(" %2d: %s\n", i, e.getValue().toString()); 53675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato i++; 53775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisableRecords.size=" + N 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisabled=0x" + Integer.toHexString(mDisabled)); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = mDisableRecords.get(i); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pkg=" + tok.pkg + " token=" + tok.token); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String action = intent.getAction(); 555f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 556f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 557f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato collapse(); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5590cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato /* 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_SPN), 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateResources(); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 574