• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 package com.android.systemui.keyguard;
18 
19 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
20 
21 import android.app.Service;
22 import android.content.Intent;
23 import android.os.Binder;
24 import android.os.Bundle;
25 import android.os.Debug;
26 import android.os.IBinder;
27 import android.os.Process;
28 import android.os.Trace;
29 import android.util.Log;
30 
31 import com.android.internal.policy.IKeyguardDismissCallback;
32 import com.android.internal.policy.IKeyguardDrawnCallback;
33 import com.android.internal.policy.IKeyguardExitCallback;
34 import com.android.internal.policy.IKeyguardService;
35 import com.android.internal.policy.IKeyguardStateCallback;
36 import com.android.systemui.SystemUIApplication;
37 
38 import javax.inject.Inject;
39 
40 public class KeyguardService extends Service {
41     static final String TAG = "KeyguardService";
42     static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD;
43 
44     private final KeyguardViewMediator mKeyguardViewMediator;
45     private final KeyguardLifecyclesDispatcher mKeyguardLifecyclesDispatcher;
46 
47     @Inject
KeyguardService(KeyguardViewMediator keyguardViewMediator, KeyguardLifecyclesDispatcher keyguardLifecyclesDispatcher)48     public KeyguardService(KeyguardViewMediator keyguardViewMediator,
49                            KeyguardLifecyclesDispatcher keyguardLifecyclesDispatcher) {
50         super();
51         mKeyguardViewMediator = keyguardViewMediator;
52         mKeyguardLifecyclesDispatcher = keyguardLifecyclesDispatcher;
53     }
54 
55     @Override
onCreate()56     public void onCreate() {
57         ((SystemUIApplication) getApplication()).startServicesIfNeeded();
58     }
59 
60     @Override
onBind(Intent intent)61     public IBinder onBind(Intent intent) {
62         return mBinder;
63     }
64 
checkPermission()65     void checkPermission() {
66         // Avoid deadlock by avoiding calling back into the system process.
67         if (Binder.getCallingUid() == Process.SYSTEM_UID) return;
68 
69         // Otherwise,explicitly check for caller permission ...
70         if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) {
71             Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller());
72             throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
73                     + ", must have permission " + PERMISSION);
74         }
75     }
76 
77     private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() {
78 
79         @Override // Binder interface
80         public void addStateMonitorCallback(IKeyguardStateCallback callback) {
81             checkPermission();
82             mKeyguardViewMediator.addStateMonitorCallback(callback);
83         }
84 
85         @Override // Binder interface
86         public void verifyUnlock(IKeyguardExitCallback callback) {
87             Trace.beginSection("KeyguardService.mBinder#verifyUnlock");
88             checkPermission();
89             mKeyguardViewMediator.verifyUnlock(callback);
90             Trace.endSection();
91         }
92 
93         @Override // Binder interface
94         public void setOccluded(boolean isOccluded, boolean animate) {
95             Trace.beginSection("KeyguardService.mBinder#setOccluded");
96             checkPermission();
97             mKeyguardViewMediator.setOccluded(isOccluded, animate);
98             Trace.endSection();
99         }
100 
101         @Override // Binder interface
102         public void dismiss(IKeyguardDismissCallback callback, CharSequence message) {
103             checkPermission();
104             mKeyguardViewMediator.dismiss(callback, message);
105         }
106 
107         @Override // Binder interface
108         public void onDreamingStarted() {
109             checkPermission();
110             mKeyguardViewMediator.onDreamingStarted();
111         }
112 
113         @Override // Binder interface
114         public void onDreamingStopped() {
115             checkPermission();
116             mKeyguardViewMediator.onDreamingStopped();
117         }
118 
119         @Override // Binder interface
120         public void onStartedGoingToSleep(int reason) {
121             checkPermission();
122             mKeyguardViewMediator.onStartedGoingToSleep(reason);
123             mKeyguardLifecyclesDispatcher.dispatch(
124                     KeyguardLifecyclesDispatcher.STARTED_GOING_TO_SLEEP);
125         }
126 
127         @Override // Binder interface
128         public void onFinishedGoingToSleep(int reason, boolean cameraGestureTriggered) {
129             checkPermission();
130             mKeyguardViewMediator.onFinishedGoingToSleep(reason, cameraGestureTriggered);
131             mKeyguardLifecyclesDispatcher.dispatch(
132                     KeyguardLifecyclesDispatcher.FINISHED_GOING_TO_SLEEP);
133         }
134 
135         @Override // Binder interface
136         public void onStartedWakingUp() {
137             Trace.beginSection("KeyguardService.mBinder#onStartedWakingUp");
138             checkPermission();
139             mKeyguardViewMediator.onStartedWakingUp();
140             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.STARTED_WAKING_UP);
141             Trace.endSection();
142         }
143 
144         @Override // Binder interface
145         public void onFinishedWakingUp() {
146             Trace.beginSection("KeyguardService.mBinder#onFinishedWakingUp");
147             checkPermission();
148             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.FINISHED_WAKING_UP);
149             Trace.endSection();
150         }
151 
152         @Override // Binder interface
153         public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
154             Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn");
155             checkPermission();
156             mKeyguardViewMediator.onScreenTurningOn(callback);
157             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_ON);
158             Trace.endSection();
159         }
160 
161         @Override // Binder interface
162         public void onScreenTurnedOn() {
163             Trace.beginSection("KeyguardService.mBinder#onScreenTurnedOn");
164             checkPermission();
165             mKeyguardViewMediator.onScreenTurnedOn();
166             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_ON);
167             Trace.endSection();
168         }
169 
170         @Override // Binder interface
171         public void onScreenTurningOff() {
172             checkPermission();
173             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNING_OFF);
174         }
175 
176         @Override // Binder interface
177         public void onScreenTurnedOff() {
178             checkPermission();
179             mKeyguardViewMediator.onScreenTurnedOff();
180             mKeyguardLifecyclesDispatcher.dispatch(KeyguardLifecyclesDispatcher.SCREEN_TURNED_OFF);
181         }
182 
183         @Override // Binder interface
184         public void setKeyguardEnabled(boolean enabled) {
185             checkPermission();
186             mKeyguardViewMediator.setKeyguardEnabled(enabled);
187         }
188 
189         @Override // Binder interface
190         public void onSystemReady() {
191             Trace.beginSection("KeyguardService.mBinder#onSystemReady");
192             checkPermission();
193             mKeyguardViewMediator.onSystemReady();
194             Trace.endSection();
195         }
196 
197         @Override // Binder interface
198         public void doKeyguardTimeout(Bundle options) {
199             checkPermission();
200             mKeyguardViewMediator.doKeyguardTimeout(options);
201         }
202 
203         @Override // Binder interface
204         public void setSwitchingUser(boolean switching) {
205             checkPermission();
206             mKeyguardViewMediator.setSwitchingUser(switching);
207         }
208 
209         @Override // Binder interface
210         public void setCurrentUser(int userId) {
211             checkPermission();
212             mKeyguardViewMediator.setCurrentUser(userId);
213         }
214 
215         @Override
216         public void onBootCompleted() {
217             checkPermission();
218             mKeyguardViewMediator.onBootCompleted();
219         }
220 
221         @Override
222         public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
223             Trace.beginSection("KeyguardService.mBinder#startKeyguardExitAnimation");
224             checkPermission();
225             mKeyguardViewMediator.startKeyguardExitAnimation(startTime, fadeoutDuration);
226             Trace.endSection();
227         }
228 
229         @Override
230         public void onShortPowerPressedGoHome() {
231             checkPermission();
232             mKeyguardViewMediator.onShortPowerPressedGoHome();
233         }
234     };
235 }
236 
237