KeyguardService.java revision 380ecb81db52a9d0197ca969951d07b91c20d2b9
1380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi/*
2380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi *
4380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * you may not use this file except in compliance with the License.
6380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * You may obtain a copy of the License at
7380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi *
8380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi *
10380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
11380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * See the License for the specific language governing permissions and
14380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi * limitations under the License
15380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi */
16380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
17380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggipackage com.android.systemui.keyguard;
18380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
19380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport com.android.internal.policy.IKeyguardExitCallback;
20380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport com.android.internal.policy.IKeyguardService;
21380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport com.android.internal.policy.IKeyguardServiceConstants;
22380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport com.android.internal.policy.IKeyguardShowCallback;
23380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport com.android.systemui.statusbar.CommandQueue;
24380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
25380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.app.ActivityManagerNative;
26380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.app.Service;
27380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.app.StatusBarManager;
28380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.content.Context;
29380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.content.Intent;
30380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Binder;
31380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Bundle;
32380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Debug;
33380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.IBinder;
34380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.RemoteException;
35380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.util.Log;
36380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.view.MotionEvent;
37380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
38380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport static android.content.pm.PackageManager.PERMISSION_GRANTED;
39380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
40380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggipublic class KeyguardService extends Service {
41380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    static final String TAG = "KeyguardService";
42380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
43380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
44380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    public static final String ACTION_STATUS_BAR_BIND = "action.status_bar_bind";
45380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
46380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    private CommandQueue mCommandQueue;
47380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    private StatusBarManager mStatusBarManager;
48380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
49380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    @Override
50380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    public void onCreate() {
51380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    }
52380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
53380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    @Override
54380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    public IBinder onBind(Intent intent) {
55380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        if (ACTION_STATUS_BAR_BIND.equals(intent.getAction())) {
56380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return mKeyguardStatusBarBinder;
57380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        } else {
58380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return mBinder;
59380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
60380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    }
61380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
62380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    void checkPermission() {
63380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
64380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
65380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
66380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    + ", must have permission " + PERMISSION);
67380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
68380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    }
69380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
70380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    private final KeyguardStatusBarBinder mKeyguardStatusBarBinder =
71380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            new KeyguardStatusBarBinder() {
72380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
73380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
74380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public void register(CommandQueue commandQueue) {
75380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mCommandQueue = commandQueue;
76380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
77380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
78380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
79380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public void dismissKeyguard() {
80380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            try {
81380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mBinder.dismiss();
82380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            } catch (RemoteException e) {
83380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                Log.e(TAG, "Could not dismiss keyguard", e);
84380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
85380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
86380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    };
87380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
88380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
89380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
90380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        /** Whether the Keyguard is visible. */
91380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        private boolean mShowing;
92380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
93380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        /**
94380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi         * Whether the Keyguard is hidden by a window with
95380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi         * {@link android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED}. So mShowing might
96380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi         * be true, but also mHidden. So in the end, the Keyguard would not be visible.
97380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi         */
98380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        private boolean mHidden;
99380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        private boolean mShowingDream;
100380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
101380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
102380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized boolean isShowing() {
103380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return mShowing;
104380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
105380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
106380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
107380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized boolean isSecure() {
108380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return true;
109380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
110380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
111380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
112380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized boolean isShowingAndNotHidden() {
113380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return mShowing && !mHidden;
114380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
115380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
116380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
117380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized boolean isInputRestricted() {
118380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return false;
119380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
120380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
121380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
122380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void verifyUnlock(IKeyguardExitCallback callback) {
123380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
124380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
125380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
126380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void keyguardDone(boolean authenticated, boolean wakeup) {
127380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
128380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mShowing = false;
129380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            adjustStatusBarLocked();
130380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mCommandQueue != null) {
131380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mCommandQueue.setKeyguardShown(false, null, true);
132380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
133380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
134380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
135380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
136380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized int setHidden(boolean isHidden) {
137380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
138380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mHidden == isHidden) {
139380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                return IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_NONE;
140380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
141380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mHidden = isHidden;
142380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            try {
143380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mHidden
144380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                        || mShowingDream);
145380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            } catch (RemoteException e) {
146380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                Log.e(TAG, "Could not update activity manager lock screen state", e);
147380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
148380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            adjustStatusBarLocked();
149380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mCommandQueue != null) {
150380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mCommandQueue.setKeyguardShown(!isHidden, null, false);
151380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
152380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return isShowingAndNotHidden()
153380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    ? IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_SET_FLAGS
154380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    : IKeyguardServiceConstants.KEYGUARD_SERVICE_HIDE_RESULT_UNSET_FLAGS;
155380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
156380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
157380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
158380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void dismiss() {
159380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
160380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mShowing = false;
161380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            adjustStatusBarLocked();
162380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mCommandQueue != null) {
163380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mCommandQueue.setKeyguardShown(false, null, true);
164380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
165380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
166380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
167380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
168380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onDreamingStarted() {
169380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
170380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mShowingDream = true;
171380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
172380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
173380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
174380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onDreamingStopped() {
175380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
176380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mShowingDream = false;
177380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
178380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
179380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
180380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onScreenTurnedOff(int reason) {
181380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
182380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
183380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
184380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
185380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onScreenTurnedOn(IKeyguardShowCallback callback) {
186380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
187380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            mShowing = true;
188380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            adjustStatusBarLocked();
189380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mCommandQueue != null) {
190380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mCommandQueue.setKeyguardShown(isShowingAndNotHidden(), callback, true);
191380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
192380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
193380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
194380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
195380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void setKeyguardEnabled(boolean enabled) {
196380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
197380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
198380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
199380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
200380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized boolean isDismissable() {
201380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            return !isSecure();
202380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
203380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
204380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
205380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onSystemReady() {
206380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
207380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
208380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
209380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
210380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void doKeyguardTimeout(Bundle options) {
211380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
212380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
213380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
214380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
215380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void setCurrentUser(int userId) {
216380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
217380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
218380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
219380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
220380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void showAssistant() {
221380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
222380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
223380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
224380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
225380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void dispatch(MotionEvent event) {
226380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
227380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
228380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
229380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
230380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void launchCamera() {
231380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
232380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
233380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
234380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
235380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        public synchronized void onBootCompleted() {
236380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
237380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            onScreenTurnedOn(null);
238380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
239380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
240380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        private void adjustStatusBarLocked() {
241380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mStatusBarManager == null) {
242380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mStatusBarManager = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
243380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
244380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            if (mStatusBarManager == null) {
245380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                Log.w(TAG, "Could not get status bar manager");
246380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            } else {
247380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                // Disable aspects of the system/status/navigation bars that must not be re-enabled by
248380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                // windows that appear on top, ever
249380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                int flags = StatusBarManager.DISABLE_NONE;
250380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                if (isShowing()) {
251380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    // Permanently disable components not available when keyguard is enabled
252380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    // (like recents). Temporary enable/disable (e.g. the "back" button) are
253380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    // done in KeyguardHostView.
254380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    flags |= StatusBarManager.DISABLE_RECENT;
255380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    if (isSecure()) {
256380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                        // showing secure lockscreen; disable ticker and switch private notifications
257380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                        // to show their public versions, if available.
258380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                        flags |= StatusBarManager.DISABLE_PRIVATE_NOTIFICATIONS;
259380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    }
260380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    if (false) {
261380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                        flags |= StatusBarManager.DISABLE_SEARCH;
262380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    }
263380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                }
264380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                if (isShowingAndNotHidden()) {
265380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                    flags |= StatusBarManager.DISABLE_HOME;
266380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                }
267380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi                mStatusBarManager.disable(flags);
268380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            }
269380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
270380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    };
271380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi}
272380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
273