StatusBarManagerService.java revision 6179ea3196e9306d3f14361fe9ef14191b1edba6
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.StatusBarManager; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 26f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onoratoimport android.os.Handler; 276179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.os.IBinder; 286179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganovimport android.os.RemoteException; 298a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 30664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onoratoimport android.view.View; 310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar; 330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBarService; 340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon; 350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIconList; 3618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onoratoimport com.android.internal.statusbar.StatusBarNotification; 37a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.wm.WindowManagerService; 38105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 4375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.List; 4475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.Map; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 48f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * A note on locking: We rely on the fact that calls onto mBar are oneway or 49f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * if they are local, that they just enqueue messages to not deadlock. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 51089de88fc2f08d284cf8031aa33cff06011a4162Joe Onoratopublic class StatusBarManagerService extends IStatusBarService.Stub 522992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown implements WindowManagerService.OnHardKeyboardStatusChangeListener 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 544762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato static final String TAG = "StatusBarManagerService"; 55431bb2269532f2514861b908d5fafda8fa64da79Joe Onorato static final boolean SPEW = false; 56df7dbb68d330eae88c1ca6d03390dc8c18386871Joe Onorato 57f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato final Context mContext; 582992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown final WindowManagerService mWindowManager; 59f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Handler mHandler = new Handler(); 60f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato NotificationCallbacks mNotificationCallbacks; 614762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato volatile IStatusBar mBar; 62f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato StatusBarIconList mIcons = new StatusBarIconList(); 6375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato HashMap<IBinder,StatusBarNotification> mNotifications 6475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato = new HashMap<IBinder,StatusBarNotification>(); 65f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 66f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // for disabling the status bar 67f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); 687bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato IBinder mSysUiVisToken = new Binder(); 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; 75857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato int mImeWindowVis = 0; 76857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato int mImeBackDisposition; 77857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato IBinder mImeToken = null; 7806487a58be22b100daf3f950b9a1d25c3ea42aa2satok 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DisableRecord implements IBinder.DeathRecipient { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int what; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 858a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "binder died for pkg=" + pkg); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disable(0, token, pkg); 87fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(this, 0); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface NotificationCallbacks { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onSetDisabled(int status); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onClearAll(); 946ecaff15836581336b1e8fad6ac42f3ff4a13544Fred Quintana void onNotificationClick(String pkg, String tag, int id); 950f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler void onNotificationClear(String pkg, String tag, int id); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onPanelRevealed(); 979d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn void onNotificationError(String pkg, String tag, int id, 989d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct the service, add the status bar view to the window manager 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1042992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public StatusBarManagerService(Context context, WindowManagerService windowManager) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1062992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mWindowManager = windowManager; 1072992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mWindowManager.setOnHardKeyboardStatusChangeListener(this); 1080cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1090cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato final Resources res = context.getResources(); 11075144ea38e79e3827e69a9f5b53a6fd3a74c4df5Joe Onorato mIcons.defineSlots(res.getStringArray(com.android.internal.R.array.config_statusBarIcons)); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setNotificationCallbacks(NotificationCallbacks listener) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNotificationCallbacks = listener; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 11825f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato // From IStatusBarService 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 1201d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler public void userActivity() { 1211d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler if (mBar != null) try { 1221d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler mBar.userActivity(); 1231d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler } catch (RemoteException ex) {} 1241d4d30aebd2c22627131819cabfe95f97def2c83Daniel Sandler } 125f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void expand() { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1274762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 1284762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1294762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1304762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateExpand(); 1314762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1324762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1334762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 136f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato public void collapse() { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1394762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 1404762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 1414762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato mBar.animateCollapse(); 1424762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 1434762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1444762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disable(int what, IBinder token, String pkg) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 149f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 1507bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato synchronized (mLock) { 1517bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato disableLocked(what, token, pkg); 1527bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 1537bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 1547bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato 1557bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato private void disableLocked(int what, IBinder token, String pkg) { 156f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // It's important that the the callback and the call to mBar get done 157f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // in the same order when multiple threads are calling this function 158f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // so they are paired correctly. The messages on the handler will be 159f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // handled in the order they were enqueued, but will be outside the lock. 1607bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato manageDisableListLocked(what, token, pkg); 1617bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato final int net = gatherDisableActionsLocked(); 1627bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (net != mDisabled) { 1637bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mDisabled = net; 1647bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mHandler.post(new Runnable() { 1657bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato public void run() { 1667bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mNotificationCallbacks.onSetDisabled(net); 167f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 1687bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato }); 1697bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (mBar != null) { 1707bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato try { 1717bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mBar.disable(net); 1727bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } catch (RemoteException ex) { 173f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1786179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public void setIcon(String slot, String iconPackage, int iconId, int iconLevel, 1796179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov String contentDescription) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 1810cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 1830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 1840cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 1850cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 1860cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1886179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov StatusBarIcon icon = new StatusBarIcon(iconPackage, iconId, iconLevel, 0, 1896179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov contentDescription); 19066d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); 1910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.setIcon(index, icon); 1920cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 1930cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 1940cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 1950cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.setIcon(index, icon); 1960cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 1970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1980cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 1990cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2020cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void setIconVisibility(String slot, boolean visible) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 2040cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 205514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato synchronized (mIcons) { 206514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato int index = mIcons.getSlotIndex(slot); 207514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (index < 0) { 208514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 209514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 210514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 211514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato StatusBarIcon icon = mIcons.getIcon(index); 212514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon == null) { 213514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato return; 214514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 215514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 216514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon.visible != visible) { 217514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato icon.visible = visible; 218514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 219514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (mBar != null) { 220514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato try { 221514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato mBar.setIcon(index, icon); 222514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } catch (RemoteException ex) { 223514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 224514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 225514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 226514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2290cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeIcon(String slot) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 2310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 2330cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato int index = mIcons.getSlotIndex(slot); 2340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (index < 0) { 2350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato throw new SecurityException("invalid status bar icon slot: " + slot); 2360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2380cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.removeIcon(index); 2390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 2400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 2410cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 2420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar.removeIcon(index); 2430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 2440cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2450cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2460cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler /** 250e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler * Hide or show the on-screen Menu key. Only call this from the window manager, typically in 251e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler * response to a window with FLAG_NEEDS_MENU_KEY set. 252e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler */ 2537d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn public void topAppWindowChanged(final boolean menuVisible) { 254e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler enforceStatusBar(); 255e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 2567d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn if (SPEW) Slog.d(TAG, (menuVisible?"showing":"hiding") + " MENU key"); 257e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 258e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler synchronized(mLock) { 2597d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn mMenuVisible = menuVisible; 2607d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn mHandler.post(new Runnable() { 2617d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn public void run() { 2627d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn if (mBar != null) { 2637d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn try { 2647d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn mBar.topAppWindowChanged(menuVisible); 2657d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn } catch (RemoteException ex) { 266e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 267e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 2687d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn } 2697d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn }); 270e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 271e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 272e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 273857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato public void setImeWindowStatus(final IBinder token, final int vis, final int backDisposition) { 27406487a58be22b100daf3f950b9a1d25c3ea42aa2satok enforceStatusBar(); 27506487a58be22b100daf3f950b9a1d25c3ea42aa2satok 276857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato if (SPEW) { 277857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato Slog.d(TAG, "swetImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition); 278857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 27906487a58be22b100daf3f950b9a1d25c3ea42aa2satok 28006487a58be22b100daf3f950b9a1d25c3ea42aa2satok synchronized(mLock) { 281857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato // In case of IME change, we need to call up setImeWindowStatus() regardless of 282857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato // mImeWindowVis because mImeWindowVis may not have been set to false when the 28306e0744e9e1a04a07e2e1bf9279124223bd674dasatok // previous IME was destroyed. 284857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeWindowVis = vis; 285857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeBackDisposition = backDisposition; 286857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeToken = token; 28706e0744e9e1a04a07e2e1bf9279124223bd674dasatok mHandler.post(new Runnable() { 28806e0744e9e1a04a07e2e1bf9279124223bd674dasatok public void run() { 28906e0744e9e1a04a07e2e1bf9279124223bd674dasatok if (mBar != null) { 29006e0744e9e1a04a07e2e1bf9279124223bd674dasatok try { 291857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mBar.setImeWindowStatus(token, vis, backDisposition); 29206e0744e9e1a04a07e2e1bf9279124223bd674dasatok } catch (RemoteException ex) { 29306487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 29406487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 29506e0744e9e1a04a07e2e1bf9279124223bd674dasatok } 29606e0744e9e1a04a07e2e1bf9279124223bd674dasatok }); 29706487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 29806487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 29906487a58be22b100daf3f950b9a1d25c3ea42aa2satok 300664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato public void setSystemUiVisibility(int vis) { 30155bf3809b98dad0b8268804e684d63ea59124148Joe Onorato // also allows calls from window manager which is in this process. 302f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato enforceStatusBarService(); 303f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 304f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato synchronized (mLock) { 305664644d9e012aa2a28ac96f305b1ce6499ec8806Joe Onorato final boolean lightsOn = (vis & View.STATUS_BAR_HIDDEN) == 0; 306f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato updateLightsOnLocked(lightsOn); 3077bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato disableLocked(vis & StatusBarManager.DISABLE_MASK, mSysUiVisToken, 3087bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato "WindowManager.LayoutParams"); 309f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 310f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 311f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 312f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato private void updateLightsOnLocked(final boolean lightsOn) { 313f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato if (mLightsOn != lightsOn) { 314f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mLightsOn = lightsOn; 315f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mHandler.post(new Runnable() { 316f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato public void run() { 317f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato if (mBar != null) { 318f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato try { 319f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mBar.setLightsOn(lightsOn); 320f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } catch (RemoteException ex) { 3219305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3229305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 323f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 324f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato }); 3259305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3269305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 3279305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato 3282992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void setHardKeyboardEnabled(final boolean enabled) { 3292992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHandler.post(new Runnable() { 3302992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void run() { 3312992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mWindowManager.setHardKeyboardEnabled(enabled); 3322992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3332992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown }); 3342992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3352992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 3362992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown @Override 3372992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void onHardKeyboardStatusChange(final boolean available, final boolean enabled) { 3382992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mHandler.post(new Runnable() { 3392992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public void run() { 3402992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown if (mBar != null) { 3412992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown try { 3422992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mBar.setHardKeyboardStatus(available, enabled); 3432992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } catch (RemoteException ex) { 3442992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3452992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3462992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3472992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown }); 3482992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown } 3492992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown 3503b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka @Override 3513b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka public void toggleRecentApps() { 3523b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka if (mBar != null) { 3533b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka try { 3543b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka mBar.toggleRecentApps(); 3553b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka } catch (RemoteException ex) {} 3563b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka } 3573b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka } 3583b1fc47d004f6b29af8f40d181baa3460b1e3b15Michael Jurka 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceStatusBar() { 3600cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR, 361089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceExpandStatusBar() { 3650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR, 366089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3698bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato private void enforceStatusBarService() { 3708bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE, 3718bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato "StatusBarManagerService"); 3728bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato } 3738bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 3744762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 3754762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // Callbacks from the status bar service. 3764762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 37775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato public void registerStatusBar(IStatusBar bar, StatusBarIconList iconList, 3789305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato List<IBinder> notificationKeys, List<StatusBarNotification> notifications, 379cd7cd2969f545ad061a9b4ecd0044f15eb1b4abbsatok int switches[], List<IBinder> binders) { 3808bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 3818bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 3820cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato Slog.i(TAG, "registerStatusBar bar=" + bar); 3830cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar = bar; 38475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mIcons) { 38575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato iconList.copyFrom(mIcons); 38675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 38775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mNotifications) { 38875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 38975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notificationKeys.add(e.getKey()); 39075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato notifications.add(e.getValue()); 39175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 39275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 3939305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato synchronized (mLock) { 394e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[0] = gatherDisableActionsLocked(); 395e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[1] = mLightsOn ? 1 : 0; 396e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[2] = mMenuVisible ? 1 : 0; 397857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato switches[3] = mImeWindowVis; 398857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato switches[4] = mImeBackDisposition; 399857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato binders.add(mImeToken); 4009305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 4012992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown switches[5] = mWindowManager.isHardKeyboardAvailable() ? 1 : 0; 4022992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown switches[6] = mWindowManager.isHardKeyboardEnabled() ? 1 : 0; 4032314aab5064ce09f09270e52fa12a38d07464278Joe Onorato } 404aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 4054762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato /** 406f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * The status bar service should call this each time the user brings the panel from 407f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato * invisible to visible in order to clear the notification light. 4084762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato */ 409f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato public void onPanelRevealed() { 4108bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 4118bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 412f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato // tell the notification manager to turn off the lights. 413f1f259165ffaa4095afbd50fea47ed091cbc14b3Joe Onorato mNotificationCallbacks.onPanelRevealed(); 4144762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 4154762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 416aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onNotificationClick(String pkg, String tag, int id) { 4178bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 4188bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 419aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onNotificationClick(pkg, tag, id); 420aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 421aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 4229d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn public void onNotificationError(String pkg, String tag, int id, 4239d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn int uid, int initialPid, String message) { 4248bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 4258bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 426005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato // WARNING: this will call back into us to do the remove. Don't hold any locks. 4279d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn mNotificationCallbacks.onNotificationError(pkg, tag, id, uid, initialPid, message); 428005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 429005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato 4300f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler public void onNotificationClear(String pkg, String tag, int id) { 4310f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler enforceStatusBarService(); 4320f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 4330f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler mNotificationCallbacks.onNotificationClear(pkg, tag, id); 4340f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 4350f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 436aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato public void onClearAllNotifications() { 4378bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 4388bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 439aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato mNotificationCallbacks.onClearAll(); 440aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 441aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 44218e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 44318e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // Callbacks for NotificationManagerService. 44418e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato // ================================================================================ 44518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public IBinder addNotification(StatusBarNotification notification) { 44618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 447a0c56fe93925d20d9c0b830b9664699ce557e78cJoe Onorato IBinder key = new Binder(); 44875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 449e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 450e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 451e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.addNotification(key, notification); 452e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 453e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 454e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 45518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato return key; 45618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 4582314aab5064ce09f09270e52fa12a38d07464278Joe Onorato 45918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato public void updateNotification(IBinder key, StatusBarNotification notification) { 46018e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 46175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (!mNotifications.containsKey(key)) { 46275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("updateNotification key not found: " + key); 46375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 46475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato mNotifications.put(key, notification); 465e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 466e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 467e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.updateNotification(key, notification); 468e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 469e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 470e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 47118e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeNotification(IBinder key) { 47518e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 47675199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato final StatusBarNotification n = mNotifications.remove(key); 47775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato if (n == null) { 47875199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato throw new IllegalArgumentException("removeNotification key not found: " + key); 47975199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 480e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato if (mBar != null) { 481e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato try { 482e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato mBar.removeNotification(key); 483e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } catch (RemoteException ex) { 484e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 485e345fff2f80947b0a821f6674c197a02b7bff08eJoe Onorato } 48618e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4890cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 4900cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // Can be called from any thread 4910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void manageDisableListLocked(int what, IBinder token, String pkg) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 496f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato Slog.d(TAG, "manageDisableList what=0x" + Integer.toHexString(what) + " pkg=" + pkg); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the list 4997bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato final int N = mDisableRecords.size(); 5007bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato DisableRecord tok = null; 5017bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato int i; 5027bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato for (i=0; i<N; i++) { 5037bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato DisableRecord t = mDisableRecords.get(i); 5047bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (t.token == token) { 5057bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok = t; 5067bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato break; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5087bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 5097bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (what == 0 || !token.isBinderAlive()) { 5107bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (tok != null) { 5117bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mDisableRecords.remove(i); 5127bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.token.unlinkToDeath(tok, 0); 5137bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 5147bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } else { 5157bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (tok == null) { 5167bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok = new DisableRecord(); 5177bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato try { 5187bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato token.linkToDeath(tok, 0); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5207bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato catch (RemoteException ex) { 5217bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato return; // give up 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5237bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mDisableRecords.add(tok); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5257bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.what = what; 5267bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.token = token; 5277bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.pkg = pkg; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gatherDisableActionsLocked() { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the new net flags 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net = 0; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project net |= mDisableRecords.get(i).what; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return net; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always called from UI thread 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump StatusBar from from pid=" 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5540cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5550cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 5560cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mIcons.dump(pw); 5570cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 55818e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 55918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato synchronized (mNotifications) { 56075199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato int i=0; 56175199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.println("Notification list:"); 56275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato for (Map.Entry<IBinder,StatusBarNotification> e: mNotifications.entrySet()) { 56375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato pw.printf(" %2d: %s\n", i, e.getValue().toString()); 56475199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato i++; 56575199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56718e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato 5687bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato synchronized (mLock) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDisableRecords.size=" + N 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mDisabled=0x" + Integer.toHexString(mDisabled)); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = mDisableRecords.get(i); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" [" + i + "] what=0x" + Integer.toHexString(tok.what) 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " pkg=" + tok.pkg + " token=" + tok.token); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String action = intent.getAction(); 583f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) 584f9e0e6bd5e070d4c213e0237fa2fb8d4bb558bcbJoe Onorato || Intent.ACTION_SCREEN_OFF.equals(action)) { 585f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato collapse(); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5870cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato /* 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Telephony.Intents.SPN_STRINGS_UPDATED_ACTION.equals(action)) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateNetworkName(intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_SPN, false), 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_SPN), 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getBooleanExtra(Telephony.Intents.EXTRA_SHOW_PLMN, false), 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getStringExtra(Telephony.Intents.EXTRA_PLMN)); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateResources(); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5970cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato */ 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 602