blob: c7d29f0285f63d7dc4132ba27a09a502abcd77f9 [file] [log] [blame]
Jorim Jaggi380ecb82014-03-14 17:25:20 +01001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.keyguard;
18
19import com.android.internal.policy.IKeyguardExitCallback;
20import com.android.internal.policy.IKeyguardService;
21import com.android.internal.policy.IKeyguardServiceConstants;
22import com.android.internal.policy.IKeyguardShowCallback;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010023import com.android.internal.widget.LockPatternUtils;
24import com.android.systemui.statusbar.phone.PhoneStatusBar;
25import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
26import com.android.systemui.statusbar.phone.StatusBarWindowManager;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010027
Jorim Jaggi380ecb82014-03-14 17:25:20 +010028import android.app.Service;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010029import android.content.Intent;
30import android.os.Binder;
31import android.os.Bundle;
32import android.os.Debug;
33import android.os.IBinder;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010034import android.util.Log;
35import android.view.MotionEvent;
Jorim Jaggi5cf17872014-03-26 18:31:48 +010036import android.view.ViewGroup;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010037
38import static android.content.pm.PackageManager.PERMISSION_GRANTED;
39
40public class KeyguardService extends Service {
41 static final String TAG = "KeyguardService";
42 static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
43
44 public static final String ACTION_STATUS_BAR_BIND = "action.status_bar_bind";
45
Jorim Jaggi5cf17872014-03-26 18:31:48 +010046 private KeyguardViewMediator mKeyguardViewMediator;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010047
48 @Override
49 public void onCreate() {
Jorim Jaggi5cf17872014-03-26 18:31:48 +010050 LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
51 mKeyguardViewMediator = new KeyguardViewMediator(this, lockPatternUtils);
Jorim Jaggi380ecb82014-03-14 17:25:20 +010052 }
53
54 @Override
55 public IBinder onBind(Intent intent) {
56 if (ACTION_STATUS_BAR_BIND.equals(intent.getAction())) {
57 return mKeyguardStatusBarBinder;
58 } else {
59 return mBinder;
60 }
61 }
62
63 void checkPermission() {
64 if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
65 Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
66 throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
67 + ", must have permission " + PERMISSION);
68 }
69 }
70
Jorim Jaggi5cf17872014-03-26 18:31:48 +010071 private final KeyguardStatusBarBinder mKeyguardStatusBarBinder = new KeyguardStatusBarBinder() {
Jorim Jaggi380ecb82014-03-14 17:25:20 +010072
73 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010074 public void registerStatusBar(PhoneStatusBar phoneStatusBar, ViewGroup container,
75 StatusBarWindowManager statusBarWindowManager) {
76 mKeyguardViewMediator.registerStatusBar(phoneStatusBar, container,
77 statusBarWindowManager);
Jorim Jaggi380ecb82014-03-14 17:25:20 +010078 }
79 };
80
81 private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
82
Jorim Jaggi5cf17872014-03-26 18:31:48 +010083 private boolean mIsOccluded;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010084
85 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010086 public boolean isShowing() {
87 return mKeyguardViewMediator.isShowing();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010088 }
89
90 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010091 public boolean isSecure() {
92 return mKeyguardViewMediator.isSecure();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010093 }
94
95 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010096 public boolean isShowingAndNotOccluded() {
97 return mKeyguardViewMediator.isShowingAndNotOccluded();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010098 }
99
100 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100101 public boolean isInputRestricted() {
102 return mKeyguardViewMediator.isInputRestricted();
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100103 }
104
105 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100106 public void verifyUnlock(IKeyguardExitCallback callback) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100107 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100108 mKeyguardViewMediator.verifyUnlock(callback);
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100109 }
110
111 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100112 public void keyguardDone(boolean authenticated, boolean wakeup) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100113 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100114 mKeyguardViewMediator.keyguardDone(authenticated, wakeup);
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100115 }
116
117 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100118 public int setOccluded(boolean isOccluded) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100119 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100120 synchronized (this) {
121 int result;
122 if (isOccluded && mKeyguardViewMediator.isShowing()
123 && !mIsOccluded) {
124 result = IKeyguardServiceConstants
125 .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS;
126 } else if (!isOccluded && mKeyguardViewMediator.isShowing()
127 && mIsOccluded) {
128 result = IKeyguardServiceConstants
129 .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS;
130 } else {
131 result = IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100132 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100133 if (mIsOccluded != isOccluded) {
134 mKeyguardViewMediator.setOccluded(isOccluded);
135
136 // Cache the value so we always have a fresh view in whether Keyguard is occluded.
137 // If we would just call mKeyguardViewMediator.isOccluded(), this might be stale
138 // because that value gets updated in another thread.
139 mIsOccluded = isOccluded;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100140 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100141 return result;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100142 }
143 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100144
145 @Override
146 public void dismiss() {
147 checkPermission();
148 mKeyguardViewMediator.dismiss();
149 }
150
151 @Override
152 public void onDreamingStarted() {
153 checkPermission();
154 mKeyguardViewMediator.onDreamingStarted();
155 }
156
157 @Override
158 public void onDreamingStopped() {
159 checkPermission();
160 mKeyguardViewMediator.onDreamingStopped();
161 }
162
163 @Override
164 public void onScreenTurnedOff(int reason) {
165 checkPermission();
166 mKeyguardViewMediator.onScreenTurnedOff(reason);
167 }
168
169 @Override
170 public void onScreenTurnedOn(IKeyguardShowCallback callback) {
171 checkPermission();
172 mKeyguardViewMediator.onScreenTurnedOn(callback);
173 }
174
175 @Override
176 public void setKeyguardEnabled(boolean enabled) {
177 checkPermission();
178 mKeyguardViewMediator.setKeyguardEnabled(enabled);
179 }
180
181 @Override
182 public boolean isDismissable() {
183 return mKeyguardViewMediator.isDismissable();
184 }
185
186 @Override
187 public void onSystemReady() {
188 checkPermission();
189 mKeyguardViewMediator.onSystemReady();
190 }
191
192 @Override
193 public void doKeyguardTimeout(Bundle options) {
194 checkPermission();
195 mKeyguardViewMediator.doKeyguardTimeout(options);
196 }
197
198 @Override
199 public void setCurrentUser(int userId) {
200 checkPermission();
201 mKeyguardViewMediator.setCurrentUser(userId);
202 }
203
204 @Override
205 public void showAssistant() {
206 checkPermission();
207 }
208
209 @Override
210 public void dispatch(MotionEvent event) {
211 checkPermission();
212 }
213
214 @Override
215 public void launchCamera() {
216 checkPermission();
217 }
218
219 @Override
220 public void onBootCompleted() {
221 checkPermission();
222 mKeyguardViewMediator.onBootCompleted();
223 }
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100224 };
225}
226