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 17182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskipackage com.android.server.statusbar; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19a82b62678a0e1eaba50ec5adce93862683dac065Adam Lesinskiimport android.app.ActivityThread; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.StatusBarManager; 217e53f20c835ae2614c92717a6fc222b345c75036Jason Monkimport android.content.ComponentName; 2207473cea3a6007d5e72b25d3445437a175735fa9Jason Monkimport android.content.Context; 2386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggiimport android.graphics.Rect; 24182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.os.Binder; 25165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggiimport android.os.Bundle; 26182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.os.Handler; 27182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.os.IBinder; 28361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monkimport android.os.PowerManager; 297e53f20c835ae2614c92717a6fc222b345c75036Jason Monkimport android.os.Process; 30182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.os.RemoteException; 317e53f20c835ae2614c92717a6fc222b345c75036Jason Monkimport android.os.ResultReceiver; 32354736e196ff79962b3ddb52619a674044d773e2Dianne Hackbornimport android.os.ShellCallback; 33182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport android.os.UserHandle; 34f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandlerimport android.text.TextUtils; 3507473cea3a6007d5e72b25d3445437a175735fa9Jason Monkimport android.util.ArrayMap; 368a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 3707e0384a4e931bc94550c108ddd9b9514100161eJim Miller 38b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monkimport com.android.internal.R; 390cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBar; 400cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.IStatusBarService; 41d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wrenimport com.android.internal.statusbar.NotificationVisibility; 420cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onoratoimport com.android.internal.statusbar.StatusBarIcon; 43fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils; 44182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport com.android.server.LocalServices; 45182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinskiimport com.android.server.notification.NotificationDelegate; 46361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monkimport com.android.server.power.ShutdownThread; 47361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monkimport com.android.server.statusbar.StatusBarManagerInternal.GlobalActionsListener; 48a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackbornimport com.android.server.wm.WindowManagerService; 49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 5375199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onoratoimport java.util.List; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 57f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * A note on locking: We rely on the fact that calls onto mBar are oneway or 58f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato * if they are local, that they just enqueue messages to not deadlock. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 60665366a3055c7baa36242b8c92c5ff85b1c3394bMichael Wrightpublic class StatusBarManagerService extends IStatusBarService.Stub { 61182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private static final String TAG = "StatusBarManagerService"; 62182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private static final boolean SPEW = false; 63182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski 64182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final Context mContext; 65a82b62678a0e1eaba50ec5adce93862683dac065Adam Lesinski 66182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final WindowManagerService mWindowManager; 67182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private Handler mHandler = new Handler(); 68182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private NotificationDelegate mNotificationDelegate; 69182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private volatile IStatusBar mBar; 7007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk private ArrayMap<String, StatusBarIcon> mIcons = new ArrayMap<>(); 71f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 72f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // for disabling the status bar 73182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final ArrayList<DisableRecord> mDisableRecords = new ArrayList<DisableRecord>(); 74361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk private GlobalActionsListener mGlobalActionListener; 75182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private IBinder mSysUiVisToken = new Binder(); 76cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz private int mDisabled1 = 0; 77cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz private int mDisabled2 = 0; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 792a6291069187756a1c45786215716db3f37097f7Adrian Roos private final Object mLock = new Object(); 8060ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler // encompasses lights-out mode and other flags defined on View 81182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private int mSystemUiVisibility = 0; 8286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private int mFullscreenStackSysUiVisibility; 8386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private int mDockedStackSysUiVisibility; 8486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private final Rect mFullscreenStackBounds = new Rect(); 8586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private final Rect mDockedStackBounds = new Rect(); 86182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private boolean mMenuVisible = false; 87182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private int mImeWindowVis = 0; 88182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private int mImeBackDisposition; 89b605fecd9e4282823af754b3968b21205d64554aJason Monk private boolean mShowImeSwitcher; 90182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private IBinder mImeToken = null; 91182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private int mCurrentUserId; 9206487a58be22b100daf3f950b9a1d25c3ea42aa2satok 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class DisableRecord implements IBinder.DeathRecipient { 9413451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock int userId; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkg; 96cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz int what1; 97cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz int what2; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder token; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void binderDied() { 1018a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.i(TAG, "binder died for pkg=" + pkg); 102ea2ec97f37c649881f2be8a5cc40bf44080cc632Benjamin Franz disableForUser(0, token, pkg, userId); 103cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz disable2ForUser(0, token, pkg, userId); 104fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu token.unlinkToDeath(this, 0); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct the service, add the status bar view to the window manager 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1112992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown public StatusBarManagerService(Context context, WindowManagerService windowManager) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1132992ea782fa61780d8e0de7a36a2a84622f8694bJeff Brown mWindowManager = windowManager; 1140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 115182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski LocalServices.addService(StatusBarManagerInternal.class, mInternalService); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 118182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski /** 119182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski * Private API used by NotificationManagerService. 120182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski */ 121182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski private final StatusBarManagerInternal mInternalService = new StatusBarManagerInternal() { 122cb566aab57cafb69c628809fc0a0ffa2151c7d6eJohn Spurlock private boolean mNotificationLightOn; 123cb566aab57cafb69c628809fc0a0ffa2151c7d6eJohn Spurlock 124182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 125182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski public void setNotificationDelegate(NotificationDelegate delegate) { 126e71fefcc8b382947f6f6a8bf816b3889fb368fedChristoph Studer mNotificationDelegate = delegate; 127182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 128cb566aab57cafb69c628809fc0a0ffa2151c7d6eJohn Spurlock 129cad5768e22e5132efb2e5179f4988a763c7a8d9eJohn Spurlock @Override 1300f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian public void showScreenPinningRequest(int taskId) { 1315565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk if (mBar != null) { 1325565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk try { 1330f051f5abdb31024d862a954cc4c4716b1dde616Andrii Kulian mBar.showScreenPinningRequest(taskId); 1345565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk } catch (RemoteException e) { 1355565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk } 1365565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk } 1375565cb42f2ac07fcdbe3aab2503de07fbeb39504Jason Monk } 1384f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos 1394f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos @Override 1404f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos public void showAssistDisclosure() { 1414f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos if (mBar != null) { 1424f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos try { 1434f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos mBar.showAssistDisclosure(); 1444f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } catch (RemoteException e) { 1454f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } 1464f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } 1474f43dc042bf76ec6c3b340b2297dec7c4cdd9098Adrian Roos } 148165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi 149165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi @Override 150165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi public void startAssist(Bundle args) { 151165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi if (mBar != null) { 152165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi try { 153165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi mBar.startAssist(args); 154165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi } catch (RemoteException e) { 155165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi } 156165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi } 157165ce066b701ba0153000f0692bfc7032655d17dJorim Jaggi } 158372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek 159372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek @Override 16040aa8811bc817293d7400c14fa60350d2350d29fJorim Jaggi public void onCameraLaunchGestureDetected(int source) { 161372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek if (mBar != null) { 162372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek try { 16340aa8811bc817293d7400c14fa60350d2350d29fJorim Jaggi mBar.onCameraLaunchGestureDetected(source); 164372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } catch (RemoteException e) { 165372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } 166372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } 167372d1bdd54fe977c71bdaae895687c76ac35202aSelim Cinek } 16886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi 16986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi @Override 17086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi public void topAppWindowChanged(boolean menuVisible) { 17186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi StatusBarManagerService.this.topAppWindowChanged(menuVisible); 17286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi } 17386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi 17486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi @Override 17586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi public void setSystemUiVisibility(int vis, int fullscreenStackVis, int dockedStackVis, 17686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi int mask, 17786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi Rect fullscreenBounds, Rect dockedBounds, String cause) { 17886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi StatusBarManagerService.this.setSystemUiVisibility(vis, fullscreenStackVis, 17986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi dockedStackVis, mask, fullscreenBounds, dockedBounds, cause); 18086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi } 181315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver 182315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver @Override 183315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver public void toggleSplitScreen() { 184315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver enforceStatusBarService(); 185315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver if (mBar != null) { 186315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver try { 187315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver mBar.toggleSplitScreen(); 188315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver } catch (RemoteException ex) {} 189315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver } 190315c34e7d62ce4b609f2d08b18a11a2d44e93abaPhil Weaver } 1912adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi 1922adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi public void appTransitionFinished() { 1932adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi enforceStatusBarService(); 1942adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi if (mBar != null) { 1952adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi try { 1962adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi mBar.appTransitionFinished(); 1972adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi } catch (RemoteException ex) {} 1982adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi } 1992adba07d75419462873dfeef40d4c983d832ed99Jorim Jaggi } 200f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 201f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 202f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void toggleRecentApps() { 203f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 204f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 205f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.toggleRecentApps(); 206f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 207f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 208f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 209f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 210f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 211f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void setCurrentUser(int newUserId) { 212f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (SPEW) Slog.d(TAG, "Setting current user to user " + newUserId); 213f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mCurrentUserId = newUserId; 214f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 215f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 216f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 217f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 218f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void preloadRecentApps() { 219f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 220f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 221f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.preloadRecentApps(); 222f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 223f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 224f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 225f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 226f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 227f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void cancelPreloadRecentApps() { 228f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 229f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 230f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.cancelPreloadRecentApps(); 231f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 232f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 233f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 234f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 235f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 236f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void showRecentApps(boolean triggeredFromAltTab, boolean fromHome) { 237f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 238f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 239f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.showRecentApps(triggeredFromAltTab, fromHome); 240f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 241f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 242f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 243f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 244f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 245f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) { 246f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 247f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 248f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.hideRecentApps(triggeredFromAltTab, triggeredFromHomeKey); 249f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 250f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 251f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 252f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 253f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 2540bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu public void dismissKeyboardShortcutsMenu() { 2550bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu if (mBar != null) { 2560bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu try { 2570bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu mBar.dismissKeyboardShortcutsMenu(); 2580bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu } catch (RemoteException ex) {} 2590bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu } 2600bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu } 2610bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu 2620bf096f1b45959e260b09b2483e79187c1991f54Andrei Stingaceanu @Override 263f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void toggleKeyboardShortcutsMenu(int deviceId) { 264f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 265f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 266f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.toggleKeyboardShortcutsMenu(deviceId); 267f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 268f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 269f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 270f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 271f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 272ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung public void showPictureInPictureMenu() { 273f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 274f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 275ac52f2892d5c72c26387d510093ddfc741a8a632Winson Chung mBar.showPictureInPictureMenu(); 276f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 277f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 278f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 279f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 280f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 281f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void setWindowState(int window, int state) { 282f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 283f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 284f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.setWindowState(window, state); 285f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 286f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 287f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 288f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 289f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 290f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void appTransitionPending() { 291f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 292f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 293f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.appTransitionPending(); 294f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 295f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 296f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 297f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 298f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 299f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void appTransitionCancelled() { 300f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 301f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 302f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.appTransitionCancelled(); 303f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 304f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 305f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 306f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos 307f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos @Override 308f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos public void appTransitionStarting(long statusBarAnimationsStartTime, 309f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos long statusBarAnimationsDuration) { 310f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos if (mBar != null) { 311f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos try { 312f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos mBar.appTransitionStarting( 313f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos statusBarAnimationsStartTime, statusBarAnimationsDuration); 314f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } catch (RemoteException ex) {} 315f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 316f2efdd8c7ca65745245a0ac26c681a8d376adb87Adrian Roos } 317361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 318361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 319361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void setGlobalActionsListener(GlobalActionsListener listener) { 320361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mGlobalActionListener = listener; 321361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mGlobalActionListener.onStatusBarConnectedChanged(mBar != null); 322361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 323361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 324361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 325361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void showGlobalActions() { 326361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk if (mBar != null) { 327361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 328361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mBar.showGlobalActionsMenu(); 329361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } catch (RemoteException ex) {} 330361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 331361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 332b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk 333b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk @Override 3343a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek public void setTopAppHidesStatusBar(boolean hidesStatusBar) { 3353a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek if (mBar != null) { 3363a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek try { 3373a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek mBar.setTopAppHidesStatusBar(hidesStatusBar); 3383a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek } catch (RemoteException ex) {} 3393a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek } 3403a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek } 3413a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek 3423a49ba2e402701170a61f18632652d1a9379cf15Selim Cinek @Override 343b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk public boolean showShutdownUi(boolean isReboot, String reason) { 344b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk if (!mContext.getResources().getBoolean(R.bool.config_showSysuiShutdown)) { 345b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk return false; 346b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk } 347b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk if (mBar != null) { 348b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk try { 349b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk mBar.showShutdownUi(isReboot, reason); 350b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk return true; 351b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk } catch (RemoteException ex) {} 352b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk } 353b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk return false; 354b4302182bc916ba0f5ee08756c1b2d15cb845874Jason Monk } 355182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski }; 356182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 35825f95f92005594f2ef094001c54cb4c39eec3adeJoe Onorato // From IStatusBarService 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 360182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 36111cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler public void expandNotificationsPanel() { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 3634762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 3644762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 3654762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 36611cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler mBar.animateExpandNotificationsPanel(); 3674762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 3684762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 3694762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 372182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 37311cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler public void collapsePanels() { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceExpandStatusBar(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3764762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato if (mBar != null) { 3774762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato try { 37811cf178100e71d3f9f34ab5865e03a277c5eadaaDaniel Sandler mBar.animateCollapsePanels(); 379e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov } catch (RemoteException ex) { 380e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov } 381e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov } 382e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov } 383e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov 384182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 3859ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen public void togglePanel() { 3869ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen enforceExpandStatusBar(); 3879ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen 3889ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen if (mBar != null) { 3899ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen try { 3909ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen mBar.togglePanel(); 3919ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen } catch (RemoteException ex) { 3929ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen } 3939ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen } 3949ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen } 3959ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen 3969ad00e090d2a6d979dbc6e7eae056e1655c8ef2bAnthony Chen @Override 397a9927325eda025504d59bb6594fee8e240d95b01Jason Monk public void expandSettingsPanel(String subPanel) { 398e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov enforceExpandStatusBar(); 399e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov 400e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov if (mBar != null) { 401e20a177d3f147f3011647c3bdab401f90b2c5d1dSvetoslav Ganov try { 402a9927325eda025504d59bb6594fee8e240d95b01Jason Monk mBar.animateExpandSettingsPanel(subPanel); 4034762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } catch (RemoteException ex) { 4044762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 4054762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4087e53f20c835ae2614c92717a6fc222b345c75036Jason Monk public void addTile(ComponentName component) { 4097e53f20c835ae2614c92717a6fc222b345c75036Jason Monk enforceStatusBarOrShell(); 4107e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 4117e53f20c835ae2614c92717a6fc222b345c75036Jason Monk if (mBar != null) { 4127e53f20c835ae2614c92717a6fc222b345c75036Jason Monk try { 4137e53f20c835ae2614c92717a6fc222b345c75036Jason Monk mBar.addQsTile(component); 4147e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } catch (RemoteException ex) { 4157e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4167e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4177e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4187e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 4197e53f20c835ae2614c92717a6fc222b345c75036Jason Monk public void remTile(ComponentName component) { 4207e53f20c835ae2614c92717a6fc222b345c75036Jason Monk enforceStatusBarOrShell(); 4217e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 4227e53f20c835ae2614c92717a6fc222b345c75036Jason Monk if (mBar != null) { 4237e53f20c835ae2614c92717a6fc222b345c75036Jason Monk try { 4247e53f20c835ae2614c92717a6fc222b345c75036Jason Monk mBar.remQsTile(component); 4257e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } catch (RemoteException ex) { 4267e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4277e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4287e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4297e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 4307e53f20c835ae2614c92717a6fc222b345c75036Jason Monk public void clickTile(ComponentName component) { 4317e53f20c835ae2614c92717a6fc222b345c75036Jason Monk enforceStatusBarOrShell(); 4327e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 4337e53f20c835ae2614c92717a6fc222b345c75036Jason Monk if (mBar != null) { 4347e53f20c835ae2614c92717a6fc222b345c75036Jason Monk try { 4357e53f20c835ae2614c92717a6fc222b345c75036Jason Monk mBar.clickQsTile(component); 4367e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } catch (RemoteException ex) { 4377e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4387e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4397e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 4407e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 441182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 442c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn public void handleSystemKey(int key) throws RemoteException { 44307e0384a4e931bc94550c108ddd9b9514100161eJim Miller enforceExpandStatusBar(); 44407e0384a4e931bc94550c108ddd9b9514100161eJim Miller 44507e0384a4e931bc94550c108ddd9b9514100161eJim Miller if (mBar != null) { 44607e0384a4e931bc94550c108ddd9b9514100161eJim Miller try { 447c3a503d8fd505d3f14b52d4af1c6e2509de7d6b5Philip Quinn mBar.handleSystemKey(key); 44807e0384a4e931bc94550c108ddd9b9514100161eJim Miller } catch (RemoteException ex) { 44907e0384a4e931bc94550c108ddd9b9514100161eJim Miller } 45007e0384a4e931bc94550c108ddd9b9514100161eJim Miller } 45107e0384a4e931bc94550c108ddd9b9514100161eJim Miller } 45207e0384a4e931bc94550c108ddd9b9514100161eJim Miller 45307e0384a4e931bc94550c108ddd9b9514100161eJim Miller @Override 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void disable(int what, IBinder token, String pkg) { 455ea2ec97f37c649881f2be8a5cc40bf44080cc632Benjamin Franz disableForUser(what, token, pkg, mCurrentUserId); 45613451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock } 45713451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock 458ea2ec97f37c649881f2be8a5cc40bf44080cc632Benjamin Franz @Override 459ea2ec97f37c649881f2be8a5cc40bf44080cc632Benjamin Franz public void disableForUser(int what, IBinder token, String pkg, int userId) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 461f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato 4627bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato synchronized (mLock) { 463cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz disableLocked(userId, what, token, pkg, 1); 4647bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 4657bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 4667bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato 467cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz /** 468cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * Disable additional status bar features. Pass the bitwise-or of the DISABLE2_* flags. 469cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * To re-enable everything, pass {@link #DISABLE_NONE}. 470cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * 471cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags. 472cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz */ 473cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz @Override 474cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz public void disable2(int what, IBinder token, String pkg) { 475292a0a96939394518e6ba6532ab5e21b09c68244Benjamin Franz disable2ForUser(what, token, pkg, mCurrentUserId); 476cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz } 477cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz 478cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz /** 479cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * Disable additional status bar features for a given user. Pass the bitwise-or of the 480cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * DISABLE2_* flags. To re-enable everything, pass {@link #DISABLE_NONE}. 481cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * 482cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz * Warning: Only pass DISABLE2_* flags into this function, do not use DISABLE_* flags. 483cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz */ 484cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz @Override 485cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz public void disable2ForUser(int what, IBinder token, String pkg, int userId) { 486cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz enforceStatusBar(); 487cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz 488cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz synchronized (mLock) { 489cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz disableLocked(userId, what, token, pkg, 2); 490cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz } 491cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz } 492cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz 493cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz private void disableLocked(int userId, int what, IBinder token, String pkg, int whichFlag) { 494f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // It's important that the the callback and the call to mBar get done 495f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // in the same order when multiple threads are calling this function 496f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // so they are paired correctly. The messages on the handler will be 497f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato // handled in the order they were enqueued, but will be outside the lock. 498cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz manageDisableListLocked(userId, what, token, pkg, whichFlag); 4998f3e6d5c836353444082e4696f5e933266384580John Spurlock 5008f3e6d5c836353444082e4696f5e933266384580John Spurlock // Ensure state for the current user is applied, even if passed a non-current user. 501cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz final int net1 = gatherDisableActionsLocked(mCurrentUserId, 1); 502cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz final int net2 = gatherDisableActionsLocked(mCurrentUserId, 2); 503cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz if (net1 != mDisabled1 || net2 != mDisabled2) { 504cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz mDisabled1 = net1; 505cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz mDisabled2 = net2; 5067bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mHandler.post(new Runnable() { 5077bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato public void run() { 508cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz mNotificationDelegate.onSetDisabled(net1); 509f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 5107bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato }); 5117bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (mBar != null) { 5127bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato try { 513cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz mBar.disable(net1, net2); 5147bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } catch (RemoteException ex) { 515f3f0e053f0cc66249a11639eb67d0cdc2da26dedJoe Onorato } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 520182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 5216179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov public void setIcon(String slot, String iconPackage, int iconId, int iconLevel, 5226179ea3196e9306d3f14361fe9ef14191b1edba6Svetoslav Ganov String contentDescription) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 5240cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5250cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 526e4de5a0d3b6e0c897c1cea0912b58e11db962365Xiaohui Chen StatusBarIcon icon = new StatusBarIcon(iconPackage, UserHandle.SYSTEM, iconId, 527e4de5a0d3b6e0c897c1cea0912b58e11db962365Xiaohui Chen iconLevel, 0, contentDescription); 52866d7d01ed91968f4ed2e2669fd306aa2af61cd16Joe Onorato //Slog.d(TAG, "setIcon slot=" + slot + " index=" + index + " icon=" + icon); 52907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk mIcons.put(slot, icon); 5300cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 5320cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 53307473cea3a6007d5e72b25d3445437a175735fa9Jason Monk mBar.setIcon(slot, icon); 5340cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 5350cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5360cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5370cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 540182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 54107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk public void setIconVisibility(String slot, boolean visibility) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 5430cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 544514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato synchronized (mIcons) { 54507473cea3a6007d5e72b25d3445437a175735fa9Jason Monk StatusBarIcon icon = mIcons.get(slot); 546514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (icon == null) { 547514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato return; 548514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 54907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk if (icon.visible != visibility) { 55007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk icon.visible = visibility; 551514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato 552514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato if (mBar != null) { 553514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato try { 55407473cea3a6007d5e72b25d3445437a175735fa9Jason Monk mBar.setIcon(slot, icon); 555514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } catch (RemoteException ex) { 556514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 557514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 558514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 559514ad663f0a8b239cc59409175e0bd489c591aa0Joe Onorato } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 562182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 5630cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato public void removeIcon(String slot) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceStatusBar(); 5650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5660cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato synchronized (mIcons) { 56707473cea3a6007d5e72b25d3445437a175735fa9Jason Monk mIcons.remove(slot); 5680cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 5690cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato if (mBar != null) { 5700cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato try { 57107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk mBar.removeIcon(slot); 5720cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } catch (RemoteException ex) { 5730cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5740cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5750cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 578393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale /** 579e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler * Hide or show the on-screen Menu key. Only call this from the window manager, typically in 580393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * response to a window with {@link android.view.WindowManager.LayoutParams#needsMenuKey} set 581393b1c1e88cbdd0f65c8f217c495dbbe8de9125dWale Ogunwale * to {@link android.view.WindowManager.LayoutParams#NEEDS_MENU_SET_TRUE}. 582e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler */ 58386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private void topAppWindowChanged(final boolean menuVisible) { 584e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler enforceStatusBar(); 585e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 5867d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn if (SPEW) Slog.d(TAG, (menuVisible?"showing":"hiding") + " MENU key"); 587e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 588e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler synchronized(mLock) { 5897d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn mMenuVisible = menuVisible; 5907d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn mHandler.post(new Runnable() { 59186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi public void run() { 59286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi if (mBar != null) { 59386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi try { 59486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mBar.topAppWindowChanged(menuVisible); 59586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi } catch (RemoteException ex) { 596e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 5977d04932ef5c001769ccef244f551b75773f1666bDianne Hackborn } 59886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi } 59986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi }); 600e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 601e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler } 602e02d808abf370965c3c4e4d38af11bc69110fde2Daniel Sandler 603182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 604b605fecd9e4282823af754b3968b21205d64554aJason Monk public void setImeWindowStatus(final IBinder token, final int vis, final int backDisposition, 605b605fecd9e4282823af754b3968b21205d64554aJason Monk final boolean showImeSwitcher) { 60606487a58be22b100daf3f950b9a1d25c3ea42aa2satok enforceStatusBar(); 60706487a58be22b100daf3f950b9a1d25c3ea42aa2satok 608857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato if (SPEW) { 609857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato Slog.d(TAG, "swetImeWindowStatus vis=" + vis + " backDisposition=" + backDisposition); 610857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato } 61106487a58be22b100daf3f950b9a1d25c3ea42aa2satok 61206487a58be22b100daf3f950b9a1d25c3ea42aa2satok synchronized(mLock) { 613857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato // In case of IME change, we need to call up setImeWindowStatus() regardless of 614857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato // mImeWindowVis because mImeWindowVis may not have been set to false when the 61506e0744e9e1a04a07e2e1bf9279124223bd674dasatok // previous IME was destroyed. 616857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeWindowVis = vis; 617857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeBackDisposition = backDisposition; 618857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato mImeToken = token; 619b605fecd9e4282823af754b3968b21205d64554aJason Monk mShowImeSwitcher = showImeSwitcher; 62006e0744e9e1a04a07e2e1bf9279124223bd674dasatok mHandler.post(new Runnable() { 62106e0744e9e1a04a07e2e1bf9279124223bd674dasatok public void run() { 62206e0744e9e1a04a07e2e1bf9279124223bd674dasatok if (mBar != null) { 62306e0744e9e1a04a07e2e1bf9279124223bd674dasatok try { 624b605fecd9e4282823af754b3968b21205d64554aJason Monk mBar.setImeWindowStatus(token, vis, backDisposition, showImeSwitcher); 62506e0744e9e1a04a07e2e1bf9279124223bd674dasatok } catch (RemoteException ex) { 62606487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 62706487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 62806e0744e9e1a04a07e2e1bf9279124223bd674dasatok } 62906e0744e9e1a04a07e2e1bf9279124223bd674dasatok }); 63006487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 63106487a58be22b100daf3f950b9a1d25c3ea42aa2satok } 63206487a58be22b100daf3f950b9a1d25c3ea42aa2satok 633182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 63453f28eccc546504cb1e894c02176ecce3139264eAdrian Roos public void setSystemUiVisibility(int vis, int mask, String cause) { 63586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi setSystemUiVisibility(vis, 0, 0, mask, mFullscreenStackBounds, mDockedStackBounds, cause); 63686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi } 63786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi 63886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private void setSystemUiVisibility(int vis, int fullscreenStackVis, int dockedStackVis, int mask, 63986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi Rect fullscreenBounds, Rect dockedBounds, String cause) { 64055bf3809b98dad0b8268804e684d63ea59124148Joe Onorato // also allows calls from window manager which is in this process. 641f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato enforceStatusBarService(); 642f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 6434519a02608b9e02a2c0dbc7dff37c21167db8f24Jeff Sharkey if (SPEW) Slog.d(TAG, "setSystemUiVisibility(0x" + Integer.toHexString(vis) + ")"); 64460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler 645f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato synchronized (mLock) { 64686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi updateUiVisibilityLocked(vis, fullscreenStackVis, dockedStackVis, mask, 64786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi fullscreenBounds, dockedBounds); 64813451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock disableLocked( 64913451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock mCurrentUserId, 65013451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock vis & StatusBarManager.DISABLE_MASK, 65113451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock mSysUiVisToken, 652cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz cause, 1); 653f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 654f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 655f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato 65686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi private void updateUiVisibilityLocked(final int vis, 65786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi final int fullscreenStackVis, final int dockedStackVis, final int mask, 65886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi final Rect fullscreenBounds, final Rect dockedBounds) { 65986905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi if (mSystemUiVisibility != vis 66086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi || mFullscreenStackSysUiVisibility != fullscreenStackVis 66186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi || mDockedStackSysUiVisibility != dockedStackVis 66286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi || !mFullscreenStackBounds.equals(fullscreenBounds) 66386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi || !mDockedStackBounds.equals(dockedBounds)) { 66460ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler mSystemUiVisibility = vis; 66586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mFullscreenStackSysUiVisibility = fullscreenStackVis; 66686905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mDockedStackSysUiVisibility = dockedStackVis; 66786905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mFullscreenStackBounds.set(fullscreenBounds); 66886905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mDockedStackBounds.set(dockedBounds); 669f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato mHandler.post(new Runnable() { 670f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato public void run() { 671f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato if (mBar != null) { 672f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato try { 67386905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mBar.setSystemUiVisibility(vis, fullscreenStackVis, dockedStackVis, 67486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi mask, fullscreenBounds, dockedBounds); 675f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } catch (RemoteException ex) { 6769305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 6779305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 678f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato } 679f63b0f44eb53f535a65bd83dbc1d8b95abc501daJoe Onorato }); 6809305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 6819305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 6829305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato 6837e53f20c835ae2614c92717a6fc222b345c75036Jason Monk private void enforceStatusBarOrShell() { 6847e53f20c835ae2614c92717a6fc222b345c75036Jason Monk if (Binder.getCallingUid() == Process.SHELL_UID) { 6857e53f20c835ae2614c92717a6fc222b345c75036Jason Monk return; 6867e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 6877e53f20c835ae2614c92717a6fc222b345c75036Jason Monk enforceStatusBar(); 6887e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 6897e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceStatusBar() { 6910cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR, 692089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void enforceExpandStatusBar() { 6960cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.EXPAND_STATUS_BAR, 697089de88fc2f08d284cf8031aa33cff06011a4162Joe Onorato "StatusBarManagerService"); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7008bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato private void enforceStatusBarService() { 7018bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato mContext.enforceCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR_SERVICE, 7028bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato "StatusBarManagerService"); 7038bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato } 7048bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 7054762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 7064762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // Callbacks from the status bar service. 7074762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato // ================================================================================ 708182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 70907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk public void registerStatusBar(IStatusBar bar, List<String> iconSlots, 71086905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi List<StatusBarIcon> iconList, int switches[], List<IBinder> binders, 71186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi Rect fullscreenStackBounds, Rect dockedStackBounds) { 7128bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 7138bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato 7140cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato Slog.i(TAG, "registerStatusBar bar=" + bar); 7150cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato mBar = bar; 716361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 717361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mBar.asBinder().linkToDeath(new DeathRecipient() { 718361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 719361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void binderDied() { 720361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mBar = null; 721361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk notifyBarAttachChanged(); 722361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 723361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk }, 0); 724361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } catch (RemoteException e) { 725361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 726361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk notifyBarAttachChanged(); 72775199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato synchronized (mIcons) { 72807473cea3a6007d5e72b25d3445437a175735fa9Jason Monk for (String slot : mIcons.keySet()) { 72907473cea3a6007d5e72b25d3445437a175735fa9Jason Monk iconSlots.add(slot); 73007473cea3a6007d5e72b25d3445437a175735fa9Jason Monk iconList.add(mIcons.get(slot)); 73107473cea3a6007d5e72b25d3445437a175735fa9Jason Monk } 73275199e3ddcf7886c8ee5fbf8b486a8c21335bf14Joe Onorato } 7339305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato synchronized (mLock) { 734cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz switches[0] = gatherDisableActionsLocked(mCurrentUserId, 1); 73560ee25643e0a7b8841063a4e97b0f18c51807e91Daniel Sandler switches[1] = mSystemUiVisibility; 736e4c7b3f25ee3cb8d3fba4d15a8fbb97bc83d8dd1Joe Onorato switches[2] = mMenuVisible ? 1 : 0; 737857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato switches[3] = mImeWindowVis; 738857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato switches[4] = mImeBackDisposition; 739665366a3055c7baa36242b8c92c5ff85b1c3394bMichael Wright switches[5] = mShowImeSwitcher ? 1 : 0; 740cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz switches[6] = gatherDisableActionsLocked(mCurrentUserId, 2); 74186905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi switches[7] = mFullscreenStackSysUiVisibility; 74286905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi switches[8] = mDockedStackSysUiVisibility; 743857fd9b8562c29913e03ed29288bd1802d37dc60Joe Onorato binders.add(mImeToken); 74486905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi fullscreenStackBounds.set(mFullscreenStackBounds); 74586905582411c5c77a3e7641589cf206c6e5770f5Jorim Jaggi dockedStackBounds.set(mDockedStackBounds); 7469305647eb61bb60a1f42481a0c0d208dc9bbe965Joe Onorato } 7472314aab5064ce09f09270e52fa12a38d07464278Joe Onorato } 748aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 749361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk private void notifyBarAttachChanged() { 750361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mHandler.post(() -> { 751361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk if (mGlobalActionListener == null) return; 752361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mGlobalActionListener.onStatusBarConnectedChanged(mBar != null); 753361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk }); 754361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 755361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 7564762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato /** 7571f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer * @param clearNotificationEffects whether to consider notifications as "shown" and stop 7581f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer * LED, vibration, and ringing 7594762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato */ 760182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 761b659c4f44a839e6ad7ef6834cc0d35954e04460aChris Wren public void onPanelRevealed(boolean clearNotificationEffects, int numItems) { 7628bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 763182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski long identity = Binder.clearCallingIdentity(); 764182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski try { 765b659c4f44a839e6ad7ef6834cc0d35954e04460aChris Wren mNotificationDelegate.onPanelRevealed(clearNotificationEffects, numItems); 7661f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer } finally { 7671f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer Binder.restoreCallingIdentity(identity); 7681f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer } 7691f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer } 7701f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer 7711f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer @Override 7721f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer public void clearNotificationEffects() throws RemoteException { 7731f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer enforceStatusBarService(); 7741f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer long identity = Binder.clearCallingIdentity(); 7751f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer try { 7761f32c65697c22f423c2888cf4c53da1c95d602c1Christoph Studer mNotificationDelegate.clearEffects(); 777182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } finally { 778182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski Binder.restoreCallingIdentity(identity); 779182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 7804762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato } 7814762c2d75a55e0854bbff2f996748116d4ab1a37Joe Onorato 782182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 783760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer public void onPanelHidden() throws RemoteException { 784760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer enforceStatusBarService(); 785760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer long identity = Binder.clearCallingIdentity(); 786760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer try { 787760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer mNotificationDelegate.onPanelHidden(); 788760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer } finally { 789760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer Binder.restoreCallingIdentity(identity); 790760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer } 791760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer } 792760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer 793361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk /** 794361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * Allows the status bar to shutdown the device. 795361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk */ 796361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 797361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void shutdown() { 798361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk enforceStatusBarService(); 799361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk long identity = Binder.clearCallingIdentity(); 800361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 8016cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright // ShutdownThread displays UI, so give it a UI context. 802361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mHandler.post(() -> 8036cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright ShutdownThread.shutdown(getUiContext(), 8046cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright PowerManager.SHUTDOWN_USER_REQUESTED, false)); 805361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } finally { 806361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk Binder.restoreCallingIdentity(identity); 807361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 808361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 809361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 810361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk /** 811361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk * Allows the status bar to reboot the device. 812361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk */ 813361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 814361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void reboot(boolean safeMode) { 815361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk enforceStatusBarService(); 816361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk long identity = Binder.clearCallingIdentity(); 817361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 818361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mHandler.post(() -> { 819a82b62678a0e1eaba50ec5adce93862683dac065Adam Lesinski // ShutdownThread displays UI, so give it a UI context. 820361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk if (safeMode) { 821bdb0e494b63f4e4e2974d5671a8c336dfa6357fcShunta Sato ShutdownThread.rebootSafeMode(getUiContext(), true); 822361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } else { 8236cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright ShutdownThread.reboot(getUiContext(), 8246cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright PowerManager.SHUTDOWN_USER_REQUESTED, false); 825361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 826361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk }); 827361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } finally { 828361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk Binder.restoreCallingIdentity(identity); 829361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 830361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 831361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 832361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 833361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void onGlobalActionsShown() { 834361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk enforceStatusBarService(); 835361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk long identity = Binder.clearCallingIdentity(); 836361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 837361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk if (mGlobalActionListener == null) return; 838361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mGlobalActionListener.onGlobalActionsShown(); 839361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } finally { 840361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk Binder.restoreCallingIdentity(identity); 841361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 842361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 843361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 844361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk @Override 845361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk public void onGlobalActionsHidden() { 846361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk enforceStatusBarService(); 847361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk long identity = Binder.clearCallingIdentity(); 848361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk try { 849361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk if (mGlobalActionListener == null) return; 850361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk mGlobalActionListener.onGlobalActionsDismissed(); 851361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } finally { 852361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk Binder.restoreCallingIdentity(identity); 853361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 854361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk } 855361915c727fc2ad137bfeed7ff74b3eadde96597Jason Monk 856760ea554d0022fd88bbe13e3ef7c75cbe8613af6Christoph Studer @Override 85703b87a2f40c26948b7b0c9409c33ad44857218cfChristoph Studer public void onNotificationClick(String key) { 8588bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 859e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingUid = Binder.getCallingUid(); 860e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingPid = Binder.getCallingPid(); 861182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski long identity = Binder.clearCallingIdentity(); 862182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski try { 86303b87a2f40c26948b7b0c9409c33ad44857218cfChristoph Studer mNotificationDelegate.onNotificationClick(callingUid, callingPid, key); 864182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } finally { 865182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski Binder.restoreCallingIdentity(identity); 866182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 867aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato } 868aaba60b281713d45a0f232580302c7b54a7207dfJoe Onorato 869182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 8704da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer public void onNotificationActionClick(String key, int actionIndex) { 8714da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer enforceStatusBarService(); 8724da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer final int callingUid = Binder.getCallingUid(); 8734da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer final int callingPid = Binder.getCallingPid(); 8744da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer long identity = Binder.clearCallingIdentity(); 8754da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer try { 8764da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer mNotificationDelegate.onNotificationActionClick(callingUid, callingPid, key, 8774da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer actionIndex); 8784da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer } finally { 8794da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer Binder.restoreCallingIdentity(identity); 8804da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer } 8814da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer } 8824da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer 8834da84cd56582fb4025eb5a9a1d4bb5b5b4a50cefChristoph Studer @Override 8849d39d0cb361c5d3bba04a6bacf299be2162a6e92Dianne Hackborn public void onNotificationError(String pkg, String tag, int id, 8853a7c4a5669420ae9b01eda88d1d60114e99d70ffKenny Guy int uid, int initialPid, String message, int userId) { 8868bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 887e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingUid = Binder.getCallingUid(); 888e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingPid = Binder.getCallingPid(); 889182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski long identity = Binder.clearCallingIdentity(); 890182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski try { 891182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski // WARNING: this will call back into us to do the remove. Don't hold any locks. 892e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock mNotificationDelegate.onNotificationError(callingUid, callingPid, 893e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock pkg, tag, id, uid, initialPid, message, userId); 894182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } finally { 895182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski Binder.restoreCallingIdentity(identity); 896182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 897005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato } 898005847b03b2ebe3eb1a974a8a04ad51bca6636cdJoe Onorato 899182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 9003a7c4a5669420ae9b01eda88d1d60114e99d70ffKenny Guy public void onNotificationClear(String pkg, String tag, int id, int userId) { 9010f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler enforceStatusBarService(); 902e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingUid = Binder.getCallingUid(); 903e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingPid = Binder.getCallingPid(); 904182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski long identity = Binder.clearCallingIdentity(); 905182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski try { 906e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock mNotificationDelegate.onNotificationClear(callingUid, callingPid, pkg, tag, id, userId); 907182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } finally { 908182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski Binder.restoreCallingIdentity(identity); 909182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } 9100f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler } 9110f0b11c8719495ce559b93366fe9cd79782d791cDaniel Sandler 912182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski @Override 91392b389da2a60ac51e804031494fea177fc1c47beChristoph Studer public void onNotificationVisibilityChanged( 914d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren NotificationVisibility[] newlyVisibleKeys, NotificationVisibility[] noLongerVisibleKeys) 915d1dbc92d67af4cb72bb2faff9011d36b6833bbfdChris Wren throws RemoteException { 91692b389da2a60ac51e804031494fea177fc1c47beChristoph Studer enforceStatusBarService(); 91792b389da2a60ac51e804031494fea177fc1c47beChristoph Studer long identity = Binder.clearCallingIdentity(); 91892b389da2a60ac51e804031494fea177fc1c47beChristoph Studer try { 91992b389da2a60ac51e804031494fea177fc1c47beChristoph Studer mNotificationDelegate.onNotificationVisibilityChanged( 92092b389da2a60ac51e804031494fea177fc1c47beChristoph Studer newlyVisibleKeys, noLongerVisibleKeys); 92192b389da2a60ac51e804031494fea177fc1c47beChristoph Studer } finally { 92292b389da2a60ac51e804031494fea177fc1c47beChristoph Studer Binder.restoreCallingIdentity(identity); 92392b389da2a60ac51e804031494fea177fc1c47beChristoph Studer } 92492b389da2a60ac51e804031494fea177fc1c47beChristoph Studer } 92592b389da2a60ac51e804031494fea177fc1c47beChristoph Studer 92692b389da2a60ac51e804031494fea177fc1c47beChristoph Studer @Override 92778403d79739605511ea88b653564d81d7bf4bbbaChris Wren public void onNotificationExpansionChanged(String key, boolean userAction, 92878403d79739605511ea88b653564d81d7bf4bbbaChris Wren boolean expanded) throws RemoteException { 92978403d79739605511ea88b653564d81d7bf4bbbaChris Wren enforceStatusBarService(); 93078403d79739605511ea88b653564d81d7bf4bbbaChris Wren long identity = Binder.clearCallingIdentity(); 93178403d79739605511ea88b653564d81d7bf4bbbaChris Wren try { 93278403d79739605511ea88b653564d81d7bf4bbbaChris Wren mNotificationDelegate.onNotificationExpansionChanged( 93378403d79739605511ea88b653564d81d7bf4bbbaChris Wren key, userAction, expanded); 93478403d79739605511ea88b653564d81d7bf4bbbaChris Wren } finally { 93578403d79739605511ea88b653564d81d7bf4bbbaChris Wren Binder.restoreCallingIdentity(identity); 93678403d79739605511ea88b653564d81d7bf4bbbaChris Wren } 93778403d79739605511ea88b653564d81d7bf4bbbaChris Wren } 93878403d79739605511ea88b653564d81d7bf4bbbaChris Wren 93978403d79739605511ea88b653564d81d7bf4bbbaChris Wren @Override 9403a7c4a5669420ae9b01eda88d1d60114e99d70ffKenny Guy public void onClearAllNotifications(int userId) { 9418bc6c5141974dbc36a6fe416853f558921be9f24Joe Onorato enforceStatusBarService(); 942e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingUid = Binder.getCallingUid(); 943e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock final int callingPid = Binder.getCallingPid(); 944182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski long identity = Binder.clearCallingIdentity(); 945182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski try { 946e6a7d93420406cdbdf1b88b9635344dea52b4650John Spurlock mNotificationDelegate.onClearAll(callingUid, callingPid, userId); 947182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski } finally { 948182f73fc4da13a6417e5086ec9ecce80eb8423caAdam Lesinski Binder.restoreCallingIdentity(identity); 94918e69dfc7235f8a4bfe257f9d1c43539049a22ceJoe Onorato } 9500cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato } 9512314aab5064ce09f09270e52fa12a38d07464278Joe Onorato 9527e53f20c835ae2614c92717a6fc222b345c75036Jason Monk @Override 9537e53f20c835ae2614c92717a6fc222b345c75036Jason Monk public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, 954354736e196ff79962b3ddb52619a674044d773e2Dianne Hackborn String[] args, ShellCallback callback, ResultReceiver resultReceiver) { 9557e53f20c835ae2614c92717a6fc222b345c75036Jason Monk (new StatusBarShellCommand(this)).exec( 956354736e196ff79962b3ddb52619a674044d773e2Dianne Hackborn this, in, out, err, args, callback, resultReceiver); 9577e53f20c835ae2614c92717a6fc222b345c75036Jason Monk } 9587e53f20c835ae2614c92717a6fc222b345c75036Jason Monk 959f8c2f7bd7baf0d001a707af48b3152f26fbaeda2Jason Monk public String[] getStatusBarIcons() { 960f8c2f7bd7baf0d001a707af48b3152f26fbaeda2Jason Monk return mContext.getResources().getStringArray(R.array.config_statusBarIcons); 961f8c2f7bd7baf0d001a707af48b3152f26fbaeda2Jason Monk } 962f8c2f7bd7baf0d001a707af48b3152f26fbaeda2Jason Monk 9630cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 9640cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // Can be called from any thread 9650cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato // ================================================================================ 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 968cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz void manageDisableListLocked(int userId, int what, IBinder token, String pkg, int which) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (SPEW) { 97013451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock Slog.d(TAG, "manageDisableList userId=" + userId 97113451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock + " what=0x" + Integer.toHexString(what) + " pkg=" + pkg); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update the list 9747bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato final int N = mDisableRecords.size(); 9757bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato DisableRecord tok = null; 9767bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato int i; 9777bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato for (i=0; i<N; i++) { 9787bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato DisableRecord t = mDisableRecords.get(i); 9794e6922d89e72e79a8ab31ae2cb8a19d85bee91f8John Spurlock if (t.token == token && t.userId == userId) { 9807bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok = t; 9817bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato break; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9837bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 9847bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (what == 0 || !token.isBinderAlive()) { 9857bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (tok != null) { 9867bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mDisableRecords.remove(i); 9877bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.token.unlinkToDeath(tok, 0); 9887bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } 9897bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato } else { 9907bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato if (tok == null) { 9917bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok = new DisableRecord(); 99213451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock tok.userId = userId; 9937bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato try { 9947bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato token.linkToDeath(tok, 0); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9967bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato catch (RemoteException ex) { 9977bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato return; // give up 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9997bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato mDisableRecords.add(tok); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1001cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz if (which == 1) { 1002cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz tok.what1 = what; 1003cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz } else { 1004cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz tok.what2 = what; 1005cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz } 10067bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.token = token; 10077bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato tok.pkg = pkg; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock on mDisableRecords 1012cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz int gatherDisableActionsLocked(int userId, int which) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // gather the new net flags 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int net = 0; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 101713451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock final DisableRecord rec = mDisableRecords.get(i); 101813451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock if (rec.userId == userId) { 1019cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz net |= (which == 1) ? rec.what1 : rec.what2; 102013451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return net; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Always called from UI thread 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ================================================================================ 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 1030fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkey if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; 10310cbda99f8721ad9b03ada04d2637fb75a2a0fecaJoe Onorato 10327bb8eeb90cf55f409a282c1f36ca08aa48c10543Joe Onorato synchronized (mLock) { 1033cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz pw.println(" mDisabled1=0x" + Integer.toHexString(mDisabled1)); 1034cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz pw.println(" mDisabled2=0x" + Integer.toHexString(mDisabled2)); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mDisableRecords.size(); 103613451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock pw.println(" mDisableRecords.size=" + N); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisableRecord tok = mDisableRecords.get(i); 103913451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock pw.println(" [" + i + "] userId=" + tok.userId 1040cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz + " what1=0x" + Integer.toHexString(tok.what1) 1041cde0a2a9ea00d6e4acfe6ce7a7c9061343df7fa3Benjamin Franz + " what2=0x" + Integer.toHexString(tok.what2) 104213451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock + " pkg=" + tok.pkg 104313451a25fff12c1429f9ecdc24b2aa7696359f7dJohn Spurlock + " token=" + tok.token); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10452a6291069187756a1c45786215716db3f37097f7Adrian Roos pw.println(" mCurrentUserId=" + mCurrentUserId); 1046f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.println(" mIcons="); 1047f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler for (String slot : mIcons.keySet()) { 1048f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.println(" "); 1049f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print(slot); 1050f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print(" -> "); 1051f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler final StatusBarIcon icon = mIcons.get(slot); 1052f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print(icon); 1053f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler if (!TextUtils.isEmpty(icon.contentDescription)) { 1054f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print(" \""); 1055f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print(icon.contentDescription); 1056f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.print("\""); 1057f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler } 1058f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler pw.println(); 1059f3a1f2c7b0f684438bb5a34dad4600a07a1e0413Dan Sandler } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10626cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright 10636cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright private static final Context getUiContext() { 10646cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright return ActivityThread.currentActivityThread().getSystemUiContext(); 10656cd1026807e427895b7dcfb8bbf010eaa005730cMichael Wright } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1067