blob: 98d4112db69b4bdd6a3e7beffadb93abb0adb7ee [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
Jorim Jaggi380ecb82014-03-14 17:25:20 +010019import android.app.Service;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010020import android.content.Intent;
21import android.os.Binder;
22import android.os.Bundle;
23import android.os.Debug;
24import android.os.IBinder;
Jim Miller96afb6f2014-11-14 17:56:27 -080025import android.os.Process;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010026import android.util.Log;
27import android.view.MotionEvent;
Jorim Jaggicff0acb2014-03-31 16:35:15 +020028
29import com.android.internal.policy.IKeyguardExitCallback;
30import com.android.internal.policy.IKeyguardService;
31import com.android.internal.policy.IKeyguardServiceConstants;
32import com.android.internal.policy.IKeyguardShowCallback;
33import com.android.systemui.SystemUIApplication;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010034
35import static android.content.pm.PackageManager.PERMISSION_GRANTED;
36
37public class KeyguardService extends Service {
38 static final String TAG = "KeyguardService";
39 static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
40
Jorim Jaggi5cf17872014-03-26 18:31:48 +010041 private KeyguardViewMediator mKeyguardViewMediator;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010042
43 @Override
44 public void onCreate() {
Jorim Jaggi3beffdf2014-04-03 17:37:37 +020045 ((SystemUIApplication) getApplication()).startServicesIfNeeded();
Jorim Jaggicff0acb2014-03-31 16:35:15 +020046 mKeyguardViewMediator =
47 ((SystemUIApplication) getApplication()).getComponent(KeyguardViewMediator.class);
Jorim Jaggi380ecb82014-03-14 17:25:20 +010048 }
49
50 @Override
51 public IBinder onBind(Intent intent) {
Jorim Jaggicff0acb2014-03-31 16:35:15 +020052 return mBinder;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010053 }
54
55 void checkPermission() {
Jim Miller96afb6f2014-11-14 17:56:27 -080056 // Avoid deadlock by avoiding calling back into the system process.
57 if (Binder.getCallingUid() == Process.SYSTEM_UID) return;
58
59 // Otherwise,explicitly check for caller permission ...
Jorim Jaggi380ecb82014-03-14 17:25:20 +010060 if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
61 Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
62 throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
63 + ", must have permission " + PERMISSION);
64 }
65 }
66
Jorim Jaggi380ecb82014-03-14 17:25:20 +010067 private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
68
Jorim Jaggi5cf17872014-03-26 18:31:48 +010069 private boolean mIsOccluded;
Jorim Jaggi380ecb82014-03-14 17:25:20 +010070
71 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010072 public boolean isShowing() {
73 return mKeyguardViewMediator.isShowing();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010074 }
75
76 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010077 public boolean isSecure() {
78 return mKeyguardViewMediator.isSecure();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010079 }
80
81 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010082 public boolean isShowingAndNotOccluded() {
83 return mKeyguardViewMediator.isShowingAndNotOccluded();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010084 }
85
86 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010087 public boolean isInputRestricted() {
88 return mKeyguardViewMediator.isInputRestricted();
Jorim Jaggi380ecb82014-03-14 17:25:20 +010089 }
90
91 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010092 public void verifyUnlock(IKeyguardExitCallback callback) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +010093 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +010094 mKeyguardViewMediator.verifyUnlock(callback);
Jorim Jaggi380ecb82014-03-14 17:25:20 +010095 }
96
97 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +010098 public void keyguardDone(boolean authenticated, boolean wakeup) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +010099 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100100 mKeyguardViewMediator.keyguardDone(authenticated, wakeup);
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100101 }
102
103 @Override
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100104 public int setOccluded(boolean isOccluded) {
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100105 checkPermission();
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100106 synchronized (this) {
107 int result;
108 if (isOccluded && mKeyguardViewMediator.isShowing()
109 && !mIsOccluded) {
110 result = IKeyguardServiceConstants
111 .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_UNSET_FLAGS;
112 } else if (!isOccluded && mKeyguardViewMediator.isShowing()
113 && mIsOccluded) {
114 result = IKeyguardServiceConstants
115 .KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_SET_FLAGS;
116 } else {
117 result = IKeyguardServiceConstants.KEYGUARD_SERVICE_SET_OCCLUDED_RESULT_NONE;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100118 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100119 if (mIsOccluded != isOccluded) {
120 mKeyguardViewMediator.setOccluded(isOccluded);
121
122 // Cache the value so we always have a fresh view in whether Keyguard is occluded.
123 // If we would just call mKeyguardViewMediator.isOccluded(), this might be stale
124 // because that value gets updated in another thread.
125 mIsOccluded = isOccluded;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100126 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100127 return result;
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100128 }
129 }
Jorim Jaggi5cf17872014-03-26 18:31:48 +0100130
131 @Override
132 public void dismiss() {
133 checkPermission();
134 mKeyguardViewMediator.dismiss();
135 }
136
137 @Override
138 public void onDreamingStarted() {
139 checkPermission();
140 mKeyguardViewMediator.onDreamingStarted();
141 }
142
143 @Override
144 public void onDreamingStopped() {
145 checkPermission();
146 mKeyguardViewMediator.onDreamingStopped();
147 }
148
149 @Override
150 public void onScreenTurnedOff(int reason) {
151 checkPermission();
152 mKeyguardViewMediator.onScreenTurnedOff(reason);
153 }
154
155 @Override
156 public void onScreenTurnedOn(IKeyguardShowCallback callback) {
157 checkPermission();
158 mKeyguardViewMediator.onScreenTurnedOn(callback);
159 }
160
161 @Override
162 public void setKeyguardEnabled(boolean enabled) {
163 checkPermission();
164 mKeyguardViewMediator.setKeyguardEnabled(enabled);
165 }
166
167 @Override
168 public boolean isDismissable() {
169 return mKeyguardViewMediator.isDismissable();
170 }
171
172 @Override
173 public void onSystemReady() {
174 checkPermission();
175 mKeyguardViewMediator.onSystemReady();
176 }
177
178 @Override
179 public void doKeyguardTimeout(Bundle options) {
180 checkPermission();
181 mKeyguardViewMediator.doKeyguardTimeout(options);
182 }
183
184 @Override
185 public void setCurrentUser(int userId) {
186 checkPermission();
187 mKeyguardViewMediator.setCurrentUser(userId);
188 }
189
190 @Override
191 public void showAssistant() {
192 checkPermission();
193 }
194
195 @Override
196 public void dispatch(MotionEvent event) {
197 checkPermission();
198 }
199
200 @Override
201 public void launchCamera() {
202 checkPermission();
203 }
204
205 @Override
206 public void onBootCompleted() {
207 checkPermission();
208 mKeyguardViewMediator.onBootCompleted();
209 }
Jorim Jaggi0d674622014-05-21 01:34:15 +0200210
211 @Override
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200212 public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
Jorim Jaggi0d674622014-05-21 01:34:15 +0200213 checkPermission();
Jorim Jaggie29b2db2014-05-30 23:17:03 +0200214 mKeyguardViewMediator.startKeyguardExitAnimation(startTime, fadeoutDuration);
Jorim Jaggi0d674622014-05-21 01:34:15 +0200215 }
Jorim Jaggi8de4311c2014-08-11 22:36:20 +0200216
217 @Override
218 public void onActivityDrawn() {
219 checkPermission();
220 mKeyguardViewMediator.onActivityDrawn();
221 }
Jorim Jaggi380ecb82014-03-14 17:25:20 +0100222 };
223}
224