StatusBarManagerService.java revision 0f0b11c8719495ce559b93366fe9cd79782d791c
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 177a0f36bd93ad8a5b8cb3e1fe56dbdb43a0ad3a57Joe Onoratopackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.StatusBarManager; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 229e875fcb55dad6795e823207693c5ca877941d3eJoe Onoratoimport android.content.ComponentName; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 32f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onoratoimport android.os.Handler; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 348a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar; 370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBarService; 380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon; 390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIconList; 4018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport com.android.internal.statusbar.StatusBarNotification; 41105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 4675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.List; 4775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.Map; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 51f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * A note on locking: We rely on the fact that calls onto mBar are oneway or 52f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * if they are local, that they just enqueue messages to not deadlock. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54089de88fc2f08d284cf8031aa33cff06011a4162Joe Onoratopublic class StatusBarManagerService extends IStatusBarService.Stub 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 564762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato static final String TAG = "StatusBarManagerService"; 57f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato static final boolean SPEW = true; 58df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato 59f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato final Context mContext; 60f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Handler mHandler = new Handler(); 61f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato NotificationCallbacks mNotificationCallbacks; 624762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato volatile IStatusBar mBar; 63f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato StatusBarIconList mIcons = new StatusBarIconList(); 6475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato HashMap<IBinder,StatusBarNotification> mNotifications 6575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato = new HashMap<IBinder,StatusBarNotification>(); 66f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 67f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // for disabling the status bar 68f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); 69f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato int mDisabled = 0; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DisableRecord implements IBinder.DeathRecipient { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 778a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "binder died for pkg=" + pkg); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disable(0, token, pkg); 79fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(this, 0); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface NotificationCallbacks { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onSetDisabled(int status); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onClearAll(); 866ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana void onNotificationClick(String pkg, String tag, int id); 870f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler void onNotificationClear(String pkg, String tag, int id); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPanelRevealed(); 899d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn void onNotificationError(String pkg, String tag, int id, 909d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct the service, add the status bar view to the window manager 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 96089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato public StatusBarManagerService(Context context) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato final Resources res = context.getResources(); 10075144ea38e79e3827e69a9f5b53a6fd3a74c4df5Joe Onorato mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons)); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotificationCallbacks(NotificationCallbacks listener) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks = listener; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Constructing the view 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void systemReady() { 1122314aab5064ce09f09270e52fa12a38d07464278Joe Onorato } 1132314aab5064ce09f09270e52fa12a38d07464278Joe Onorato 1142314aab5064ce09f09270e52fa12a38d07464278Joe Onorato public void systemReady2() { 1159e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato ComponentName cn = ComponentName.unflattenFromString( 1169e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato mContext.getString(com.android.internal.R.string.config_statusBarComponent)); 1179e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato Intent intent = new Intent(); 1189e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato intent.setComponent(cn); 1199e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato Slog.i(TAG, "Starting service: " + cn); 1209e875fcb55dad6795e823207693c5ca877941d3eJoe Onorato mContext.startService(intent); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1224762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 12425f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato // From IStatusBarService 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 126f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void expand() { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1284762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 1294762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1304762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1314762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateExpand(); 1324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1344762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 137f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void collapse() { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1404762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1414762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1424762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateCollapse(); 1434762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1444762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1454762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disable(int what, IBinder token, String pkg) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 150f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 151f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // It's important that the the callback and the call to mBar get done 152f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // in the same order when multiple threads are calling this function 153f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // so they are paired correctly. The messages on the handler will be 154f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // handled in the order they were enqueued, but will be outside the lock. 155f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato synchronized (mDisableRecords) { 156f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato manageDisableListLocked(what, token, pkg); 157f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato final int net = gatherDisableActionsLocked(); 158f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Slog.d(TAG, "disable... net=0x" + Integer.toHexString(net)); 159f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato if (net != mDisabled) { 160f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mDisabled = net; 161f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mHandler.post(new Runnable() { 162f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void run() { 163f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mNotificationCallbacks.onSetDisabled(net); 164f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 165f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato }); 166f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato if (mBar != null) { 167f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato try { 168f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato mBar.disable(net); 169f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } catch (RemoteException ex) { 170f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 171f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1760cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void setIcon(String slot, String iconPackage, int iconId, int iconLevel) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 1780cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1790cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 1800cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 1810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 1820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 1830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1850cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel); 18666d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); 1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.setIcon(index, icon); 1880cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 1900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.setIcon(index, icon); 1920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 1930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void setIconVisibility(String slot, boolean visible) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 2000cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 201514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato synchronized (mIcons) { 202514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato int index = mIcons.getSlotIndex(slot); 203514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (index < 0) { 204514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 205514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 206514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 207514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato StatusBarIcon icon = mIcons.getIcon(index); 208514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon == null) { 209514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato return; 210514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 211514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 212514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon.visible != visible) { 213514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato icon.visible = visible; 214514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 215514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (mBar != null) { 216514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato try { 217514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato mBar.setIcon(index, icon); 218514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } catch (RemoteException ex) { 219514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 220514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 221514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 222514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeIcon(String slot) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 2270cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2280cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 2290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 2300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 2310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 2320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.removeIcon(index); 2350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 2370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 2380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.removeIcon(index); 2390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 2400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceStatusBar() { 2460cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR, 247089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceExpandStatusBar() { 2510cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR, 252089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2558bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato private void enforceStatusBarService() { 2568bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE, 2578bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato "StatusBarManagerService"); 2588bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato } 2598bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 2604762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 2614762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 2624762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // Callbacks from the status bar service. 2634762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 26475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList, 26575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato List<IBinder> notificationKeys, List<StatusBarNotification> notifications) { 2668bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 2678bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 2680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato Slog.i(TAG, "registerStatusBar bar=" + bar); 2690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar = bar; 27075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mIcons) { 27175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato iconList.copyFrom(mIcons); 27275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 27375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mNotifications) { 27475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 27575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notificationKeys.add(e.getKey()); 27675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notifications.add(e.getValue()); 27775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 27875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 2792314aab5064ce09f09270e52fa12a38d07464278Joe Onorato } 280aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 2814762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato /** 282f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * The status bar service should call this each time the user brings the panel from 283f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * invisible to visible in order to clear the notification light. 2844762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato */ 285f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato public void onPanelRevealed() { 2868bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 2878bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 288f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato // tell the notification manager to turn off the lights. 289f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato mNotificationCallbacks.onPanelRevealed(); 2904762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 2914762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 292aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onNotificationClick(String pkg, String tag, int id) { 2938bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 2948bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 295aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onNotificationClick(pkg, tag, id); 296aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 297aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 2989d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn public void onNotificationError(String pkg, String tag, int id, 2999d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message) { 3008bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3018bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 302005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato // WARNING: this will call back into us to do the remove. Don't hold any locks. 3039d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn mNotificationCallbacks.onNotificationError(pkg, tag, id, uid, initialPid, message); 304005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 305005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato 3060f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler public void onNotificationClear(String pkg, String tag, int id) { 3070f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler enforceStatusBarService(); 3080f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 3090f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler mNotificationCallbacks.onNotificationClear(pkg, tag, id); 3100f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 3110f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 312aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onClearAllNotifications() { 3138bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3148bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 315aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onClearAll(); 316aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 317aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 31818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 31918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // Callbacks for NotificationManagerService. 32018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 32118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public IBinder addNotification(StatusBarNotification notification) { 32218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 323a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato IBinder key = new Binder(); 32475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 325e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 326e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 327e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.addNotification(key, notification); 328e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 329e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 330e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 33118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return key; 33218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 3330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 3342314aab5064ce09f09270e52fa12a38d07464278Joe Onorato 33518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public void updateNotification(IBinder key, StatusBarNotification notification) { 33618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 33775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (!mNotifications.containsKey(key)) { 33875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("updateNotification key not found: " + key); 33975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 34075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 341e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 342e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 343e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.updateNotification(key, notification); 344e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 345e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 346e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 34718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeNotification(IBinder key) { 35118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 35275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato final StatusBarNotification n = mNotifications.remove(key); 35375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (n == null) { 35475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("removeNotification key not found: " + key); 35575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 356e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 357e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 358e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.removeNotification(key); 359e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 360e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 361e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 36218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 3660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // Can be called from any thread 3670cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void manageDisableListLocked(int what, IBinder token, String pkg) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 372f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the list 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = null; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i=0; i<N; i++) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord t = mDisableRecords.get(i); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t.token == token) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = t; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (what == 0 || !token.isBinderAlive()) { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok != null) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.remove(i); 389fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu tok.token.unlinkToDeath(tok, 0); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tok == null) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok = new DisableRecord(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project token.linkToDeath(tok, 0); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (RemoteException ex) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; // give up 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisableRecords.add(tok); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.what = what; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.token = token; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tok.pkg = pkg; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gatherDisableActionsLocked() { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the new net flags 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net = 0; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project net |= mDisableRecords.get(i).what; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return net; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always called from UI thread 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump StatusBar from from pid=" 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 4330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 4340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.dump(pw); 4350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 43618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 43718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 43875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato int i=0; 43975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.println("Notification list:"); 44075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 44175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.printf(" %2d: %s\n", i, e.getValue().toString()); 44275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato i++; 44375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 44518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mDisableRecords) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisableRecords.size=" + N 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisabled=0x" + Integer.toHexString(mDisabled)); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = mDisableRecords.get(i); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pkg=" + tok.pkg + " token=" + tok.token); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String action = intent.getAction(); 461f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 462f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 463f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato collapse(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato /* 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_SPN), 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateResources(); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 480