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