KeyguardService.java revision e9d8272e9af29232471dc2c690675362494f5b0a
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
846626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi        public void setOccluded(boolean isOccluded, boolean animate) {
851d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.beginSection("KeyguardService.mBinder#setOccluded");
86ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller            checkPermission();
876626f54e658e3da44fab8a5cd6d9d3d4852e2cd1Jorim Jaggi            mKeyguardViewMediator.setOccluded(isOccluded, animate);
881d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
89380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
90380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
91ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
92d88eb2693b6a70af0f5fbc5881ce855e28de33aaAdrian Roos        public void dismiss(boolean allowWhileOccluded) {
93380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
94d88eb2693b6a70af0f5fbc5881ce855e28de33aaAdrian Roos            mKeyguardViewMediator.dismiss(allowWhileOccluded);
95380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
96380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
97ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
985cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void onDreamingStarted() {
99380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1005cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.onDreamingStarted();
101380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
102380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
103ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
1045cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void onDreamingStopped() {
105380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1065cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.onDreamingStopped();
107380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
108380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
109ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
110d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi        public void onStartedGoingToSleep(int reason) {
111380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
112d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi            mKeyguardViewMediator.onStartedGoingToSleep(reason);
113380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
114380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
115ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
116f1cdf9558d2b7f8fe5b8cf3d309b48809f04403bJorim Jaggi        public void onFinishedGoingToSleep(int reason, boolean cameraGestureTriggered) {
117380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
118f1cdf9558d2b7f8fe5b8cf3d309b48809f04403bJorim Jaggi            mKeyguardViewMediator.onFinishedGoingToSleep(reason, cameraGestureTriggered);
119d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi        }
120d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi
121d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi        @Override // Binder interface
122740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi        public void onStartedWakingUp() {
1231d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.beginSection("KeyguardService.mBinder#onStartedWakingUp");
124d175b6cfe0b35dfe251cc9315aacb048bf6e54c5Jorim Jaggi            checkPermission();
125740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi            mKeyguardViewMediator.onStartedWakingUp();
1261d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
127740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi        }
128740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi
129740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi        @Override // Binder interface
130740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi        public void onScreenTurningOn(IKeyguardDrawnCallback callback) {
1311d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.beginSection("KeyguardService.mBinder#onScreenTurningOn");
132740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi            checkPermission();
133740452e8756cb7f51ed185c3906a5ca61b8fcdd4Jorim Jaggi            mKeyguardViewMediator.onScreenTurningOn(callback);
1341d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
135380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
136380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
137ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
1380d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        public void onScreenTurnedOn() {
139e9d8272e9af29232471dc2c690675362494f5b0aAdrian Roos            Trace.beginSection("KeyguardService.mBinder#onScreenTurnedOn");
1400d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            checkPermission();
1410d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mKeyguardViewMediator.onScreenTurnedOn();
1421d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
1430d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
1440d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
1450d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        @Override // Binder interface
1460d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        public void onScreenTurnedOff() {
1470d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            checkPermission();
1480d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi            mKeyguardViewMediator.onScreenTurnedOff();
1490d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        }
1500d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi
1510d210f6395072db4a4c53d4cb8fac4a59a3965b4Jorim Jaggi        @Override // Binder interface
1525cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void setKeyguardEnabled(boolean enabled) {
153380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1545cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.setKeyguardEnabled(enabled);
155380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
156380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
157ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
1585cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void onSystemReady() {
1591d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.beginSection("KeyguardService.mBinder#onSystemReady");
160380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1615cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.onSystemReady();
1621d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
163380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
164380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
165ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
1665cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void doKeyguardTimeout(Bundle options) {
167380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1685cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.doKeyguardTimeout(options);
169380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
170380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
171ab954546dc49e1070ed8513efbddc8954b529c23Jim Miller        @Override // Binder interface
1721839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky        public void setSwitchingUser(boolean switching) {
1731839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky            checkPermission();
1741839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky            mKeyguardViewMediator.setSwitchingUser(switching);
1751839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky        }
1761839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky
1771839645126c8e7e0909e8ed8f0686c2122ba6078Evan Rosky        @Override // Binder interface
1785cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void setCurrentUser(int userId) {
179380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1805cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.setCurrentUser(userId);
181380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
182380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
183380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        @Override
1845cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi        public void onBootCompleted() {
185380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi            checkPermission();
1865cf17879a31b7b78c09ec50b727f921840dcf783Jorim Jaggi            mKeyguardViewMediator.onBootCompleted();
187380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi        }
1880d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi
1890d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi        @Override
190e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi        public void startKeyguardExitAnimation(long startTime, long fadeoutDuration) {
1911d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.beginSection("KeyguardService.mBinder#startKeyguardExitAnimation");
1920d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi            checkPermission();
193e29b2dbc762bfa66093d76f5a65f55328d8753c9Jorim Jaggi            mKeyguardViewMediator.startKeyguardExitAnimation(startTime, fadeoutDuration);
1941d3967506e1cb3843d3bf758187ebc42d1c83485Nick Desaulniers            Trace.endSection();
1950d674623facfbd3e9c520d2be4ed98977b92a1a2Jorim Jaggi        }
196380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi    };
197380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi}
198380ecb81db52a9d0197ca969951d07b91c20d2b9Jorim Jaggi
199