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 android.app.Service; 20380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.content.Intent; 21380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Binder; 22380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Bundle; 23380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.Debug; 24380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.os.IBinder; 2596afb6f03b87359c3bcb96c2bdb8aadc7b1c3c37Jim Millerimport android.os.Process; 261d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniersimport android.os.Trace; 27380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport android.util.Log; 28cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi 29740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggiimport com.android.internal.policy.IKeyguardDrawnCallback; 30cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggiimport com.android.internal.policy.IKeyguardExitCallback; 31cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggiimport com.android.internal.policy.IKeyguardService; 32ab954546dc49e1070ed8513efbddc8954b529c23Jim Millerimport com.android.internal.policy.IKeyguardStateCallback; 33cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggiimport com.android.systemui.SystemUIApplication; 34380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 35380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggiimport static android.content.pm.PackageManager.PERMISSION_GRANTED; 36380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 37380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggipublic class KeyguardService extends Service { 38380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi static final String TAG = "KeyguardService"; 39380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi static final String PERMISSION = android.Manifest.permission.CONTROL_KEYGUARD; 40380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 415cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi private KeyguardViewMediator mKeyguardViewMediator; 42380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 43380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi @Override 44380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi public void onCreate() { 453beffdf4a0081a97356f46d50e10541b1a213153Jorim Jaggi ((SystemUIApplication) getApplication()).startServicesIfNeeded(); 46cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi mKeyguardViewMediator = 47cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi ((SystemUIApplication) getApplication()).getComponent(KeyguardViewMediator.class); 48380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 49380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 50380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi @Override 51380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi public IBinder onBind(Intent intent) { 52cff0acb6b1eea23c3f44a078a0a5e81c11faea35Jorim Jaggi return mBinder; 53380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 54380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 55380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi void checkPermission() { 5696afb6f03b87359c3bcb96c2bdb8aadc7b1c3c37Jim Miller // Avoid deadlock by avoiding calling back into the system process. 5796afb6f03b87359c3bcb96c2bdb8aadc7b1c3c37Jim Miller if (Binder.getCallingUid() == Process.SYSTEM_UID) return; 5896afb6f03b87359c3bcb96c2bdb8aadc7b1c3c37Jim Miller 5996afb6f03b87359c3bcb96c2bdb8aadc7b1c3c37Jim Miller // Otherwise,explicitly check for caller permission ... 60380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi if (getBaseContext().checkCallingOrSelfPermission(PERMISSION) != PERMISSION_GRANTED) { 61380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi Log.w(TAG, "Caller needs permission '" + PERMISSION + "' to call " + Debug.getCaller()); 62380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi throw new SecurityException("Access denied to process: " + Binder.getCallingPid() 63380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi + ", must have permission " + PERMISSION); 64380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 65380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 66380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 67380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi private final IKeyguardService.Stub mBinder = new IKeyguardService.Stub() { 68380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 69ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 70ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller public void addStateMonitorCallback(IKeyguardStateCallback callback) { 71ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller checkPermission(); 72ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller mKeyguardViewMediator.addStateMonitorCallback(callback); 73380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 74380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 75ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 765cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void verifyUnlock(IKeyguardExitCallback callback) { 771d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#verifyUnlock"); 785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi checkPermission(); 795cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.verifyUnlock(callback); 801d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 81380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 82380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 83ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void keyguardDone(boolean authenticated, boolean wakeup) { 851d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#keyguardDone"); 86380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 8725b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi // TODO: Remove wakeup 8825b4d4b280c6aa07656328bd9dd90977781d00e1Jorim Jaggi mKeyguardViewMediator.keyguardDone(authenticated); 891d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 90380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 91380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 92ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 936626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi public void setOccluded(boolean isOccluded, boolean animate) { 941d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#setOccluded"); 95ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller checkPermission(); 966626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi mKeyguardViewMediator.setOccluded(isOccluded, animate); 971d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 98380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 99380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 100ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 101d88eb2693b6a70af0f5fbc5881ce855e28de33aaAdrian Roos public void dismiss(boolean allowWhileOccluded) { 102380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 103d88eb2693b6a70af0f5fbc5881ce855e28de33aaAdrian Roos mKeyguardViewMediator.dismiss(allowWhileOccluded); 104380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 105380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 106ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1075cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onDreamingStarted() { 108380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1095cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.onDreamingStarted(); 110380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 111380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 112ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1135cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onDreamingStopped() { 114380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1155cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.onDreamingStopped(); 116380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 117380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 118ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 119d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi public void onStartedGoingToSleep(int reason) { 120380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 121d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi mKeyguardViewMediator.onStartedGoingToSleep(reason); 122380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 123380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 124ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 125f1cdf9558d2b7f8fe5b8cf3d309b48809f04403bJorim Jaggi public void onFinishedGoingToSleep(int reason, boolean cameraGestureTriggered) { 126380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 127f1cdf9558d2b7f8fe5b8cf3d309b48809f04403bJorim Jaggi mKeyguardViewMediator.onFinishedGoingToSleep(reason, cameraGestureTriggered); 128d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi } 129d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi 130d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi @Override // Binder interface 131740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi public void onStartedWakingUp() { 1321d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#onStartedWakingUp"); 133d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi checkPermission(); 134740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi mKeyguardViewMediator.onStartedWakingUp(); 1351d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 136740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi } 137740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi 138740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi @Override // Binder interface 139740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi public void onScreenTurningOn(IKeyguardDrawnCallback callback) { 1401d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn"); 141740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi checkPermission(); 142740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi mKeyguardViewMediator.onScreenTurningOn(callback); 1431d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 144380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 145380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 146ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1470d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi public void onScreenTurnedOn() { 1481d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn"); 1490d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi checkPermission(); 1500d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi mKeyguardViewMediator.onScreenTurnedOn(); 1511d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 1520d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi } 1530d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi 1540d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi @Override // Binder interface 1550d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi public void onScreenTurnedOff() { 1560d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi checkPermission(); 1570d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi mKeyguardViewMediator.onScreenTurnedOff(); 1580d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi } 1590d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi 1600d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi @Override // Binder interface 1615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setKeyguardEnabled(boolean enabled) { 162380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1635cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.setKeyguardEnabled(enabled); 164380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 165380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 166ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1675cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onSystemReady() { 1681d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#onSystemReady"); 169380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1705cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.onSystemReady(); 1711d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 172380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 173380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 174ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1755cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void doKeyguardTimeout(Bundle options) { 176380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1775cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.doKeyguardTimeout(options); 178380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 179380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 180ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller @Override // Binder interface 1815cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void setCurrentUser(int userId) { 182380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1835cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.setCurrentUser(userId); 184380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 185380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 186380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi @Override 1875cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi public void onBootCompleted() { 188380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi checkPermission(); 1895cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi mKeyguardViewMediator.onBootCompleted(); 190380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi } 1910d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi 1920d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi @Override 193e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) { 1941d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.beginSection("KeyguardService.mBinder#startKeyguardExitAnimation"); 1950d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi checkPermission(); 196e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi mKeyguardViewMediator.startKeyguardExitAnimation(startTime, fadeoutDuration); 1971d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers Trace.endSection(); 1980d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi } 1998de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi 2008de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi @Override 2018de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi public void onActivityDrawn() { 2028de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi checkPermission(); 2038de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mKeyguardViewMediator.onActivityDrawn(); 2048de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi } 205380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi }; 206380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi} 207380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi 208