blob: 705a144d8c035cc6476f2c6d2898a585db41e6cd [file] [log] [blame]
Adrian Roos82142c22014-03-27 14:56:59 +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 android.app.trust;
18
19import android.os.Handler;
20import android.os.IBinder;
21import android.os.Looper;
22import android.os.Message;
23import android.os.RemoteException;
24import android.util.ArrayMap;
25import android.util.Log;
26
27/**
28 * See {@link com.android.server.trust.TrustManagerService}
29 * @hide
30 */
31public class TrustManager {
32
33 private static final int MSG_TRUST_CHANGED = 1;
Adrian Roos7861c662014-07-25 15:37:28 +020034 private static final int MSG_TRUST_MANAGED_CHANGED = 2;
Adrian Roos82142c22014-03-27 14:56:59 +010035
36 private static final String TAG = "TrustManager";
Adrian Roos3c9a3502014-08-06 19:09:45 +020037 private static final String DATA_INITIATED_BY_USER = "initiatedByUser";
Adrian Roos82142c22014-03-27 14:56:59 +010038
39 private final ITrustManager mService;
40 private final ArrayMap<TrustListener, ITrustListener> mTrustListeners;
41
42 public TrustManager(IBinder b) {
43 mService = ITrustManager.Stub.asInterface(b);
44 mTrustListeners = new ArrayMap<TrustListener, ITrustListener>();
45 }
46
47 /**
48 * Reports that user {@param userId} has tried to unlock the device.
49 *
50 * @param successful if true, the unlock attempt was successful.
51 *
52 * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission.
53 */
54 public void reportUnlockAttempt(boolean successful, int userId) {
55 try {
56 mService.reportUnlockAttempt(successful, userId);
57 } catch (RemoteException e) {
58 onError(e);
59 }
60 }
61
62 /**
63 * Reports that the list of enabled trust agents changed for user {@param userId}.
64 *
65 * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission.
66 */
67 public void reportEnabledTrustAgentsChanged(int userId) {
68 try {
69 mService.reportEnabledTrustAgentsChanged(userId);
70 } catch (RemoteException e) {
71 onError(e);
72 }
73 }
74
75 /**
Adrian Roos2c12cfa2014-06-25 23:28:53 +020076 * Reports that trust is disabled until credentials have been entered for user {@param userId}.
77 *
78 * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission.
79 *
80 * @param userId either an explicit user id or {@link android.os.UserHandle#USER_ALL}
81 */
82 public void reportRequireCredentialEntry(int userId) {
83 try {
84 mService.reportRequireCredentialEntry(userId);
85 } catch (RemoteException e) {
86 onError(e);
87 }
88 }
89
90 /**
Adrian Roos481a6df2014-11-20 19:48:56 +010091 * Reports that the visibility of the keyguard has changed.
92 *
93 * Requires the {@link android.Manifest.permission#ACCESS_KEYGUARD_SECURE_STORAGE} permission.
94 */
95 public void reportKeyguardShowingChanged() {
96 try {
97 mService.reportKeyguardShowingChanged();
98 } catch (RemoteException e) {
99 onError(e);
100 }
101 }
102
103 /**
Adrian Roos82142c22014-03-27 14:56:59 +0100104 * Registers a listener for trust events.
105 *
106 * Requires the {@link android.Manifest.permission#TRUST_LISTENER} permission.
107 */
108 public void registerTrustListener(final TrustListener trustListener) {
109 try {
110 ITrustListener.Stub iTrustListener = new ITrustListener.Stub() {
111 @Override
Adrian Roos3c9a3502014-08-06 19:09:45 +0200112 public void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser) {
113 Message m = mHandler.obtainMessage(MSG_TRUST_CHANGED, (enabled ? 1 : 0), userId,
114 trustListener);
115 if (initiatedByUser) {
116 m.getData().putBoolean(DATA_INITIATED_BY_USER, initiatedByUser);
117 }
118 m.sendToTarget();
Adrian Roos82142c22014-03-27 14:56:59 +0100119 }
Adrian Roos7861c662014-07-25 15:37:28 +0200120
121 @Override
Adrian Roos3c9a3502014-08-06 19:09:45 +0200122 public void onTrustManagedChanged(boolean managed, int userId) {
Adrian Roos7861c662014-07-25 15:37:28 +0200123 mHandler.obtainMessage(MSG_TRUST_MANAGED_CHANGED, (managed ? 1 : 0), userId,
124 trustListener).sendToTarget();
125 }
Adrian Roos82142c22014-03-27 14:56:59 +0100126 };
127 mService.registerTrustListener(iTrustListener);
128 mTrustListeners.put(trustListener, iTrustListener);
129 } catch (RemoteException e) {
130 onError(e);
131 }
132 }
133
134 /**
135 * Unregisters a listener for trust events.
136 *
137 * Requires the {@link android.Manifest.permission#TRUST_LISTENER} permission.
138 */
139 public void unregisterTrustListener(final TrustListener trustListener) {
140 ITrustListener iTrustListener = mTrustListeners.remove(trustListener);
141 if (iTrustListener != null) {
142 try {
143 mService.unregisterTrustListener(iTrustListener);
144 } catch (RemoteException e) {
145 onError(e);
146 }
147 }
148 }
149
150 private void onError(Exception e) {
151 Log.e(TAG, "Error while calling TrustManagerService", e);
152 }
153
154 private final Handler mHandler = new Handler(Looper.getMainLooper()) {
155 @Override
156 public void handleMessage(Message msg) {
157 switch(msg.what) {
158 case MSG_TRUST_CHANGED:
Adrian Roos3c9a3502014-08-06 19:09:45 +0200159 boolean initiatedByUser = msg.peekData() != null &&
160 msg.peekData().getBoolean(DATA_INITIATED_BY_USER);
161 ((TrustListener)msg.obj).onTrustChanged(
162 msg.arg1 != 0, msg.arg2, initiatedByUser);
163
Adrian Roos82142c22014-03-27 14:56:59 +0100164 break;
Adrian Roos7861c662014-07-25 15:37:28 +0200165 case MSG_TRUST_MANAGED_CHANGED:
166 ((TrustListener)msg.obj).onTrustManagedChanged(msg.arg1 != 0, msg.arg2);
Adrian Roos82142c22014-03-27 14:56:59 +0100167 }
168 }
169 };
170
171 public interface TrustListener {
172
173 /**
174 * Reports that the trust state has changed.
175 * @param enabled if true, the system believes the environment to be trusted.
176 * @param userId the user, for which the trust changed.
Adrian Roos3c9a3502014-08-06 19:09:45 +0200177 * @param initiatedByUser indicates that the user has explicitly initiated an action that
178 * proves the user is about to use the device.
Adrian Roos82142c22014-03-27 14:56:59 +0100179 */
Adrian Roos3c9a3502014-08-06 19:09:45 +0200180 void onTrustChanged(boolean enabled, int userId, boolean initiatedByUser);
Adrian Roos7861c662014-07-25 15:37:28 +0200181
182 /**
183 * Reports that whether trust is managed has changed
184 * @param enabled if true, at least one trust agent is managing trust.
185 * @param userId the user, for which the state changed.
186 */
187 void onTrustManagedChanged(boolean enabled, int userId);
Adrian Roos82142c22014-03-27 14:56:59 +0100188 }
189}