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