108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller/** 208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Copyright (C) 2014 The Android Open Source Project 308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * 408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * you may not use this file except in compliance with the License. 608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * You may obtain a copy of the License at 708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * 808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * http://www.apache.org/licenses/LICENSE-2.0 908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * 1008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Unless required by applicable law or agreed to in writing, software 1108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * distributed under the License is distributed on an "AS IS" BASIS, 1208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * See the License for the specific language governing permissions and 1408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * limitations under the License. 1508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 1608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 1708fa40c5cb5229b7969b2a5146855a337870f45aJim Millerpackage android.service.fingerprint; 1808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 1908fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.app.ActivityManagerNative; 2008fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.content.ComponentName; 21d08c2aceb238b02d8348518a2c87693054c6ce37Jim Millerimport android.content.ContentResolver; 2208fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.content.Context; 2308fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.content.Intent; 2408fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.content.ServiceConnection; 25a7596147b43940cad3f76c53ed154ef088b9269bJim Millerimport android.os.Binder; 2608fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.Handler; 2708fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.IBinder; 2808fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.RemoteException; 2908fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.UserHandle; 30d08c2aceb238b02d8348518a2c87693054c6ce37Jim Millerimport android.provider.Settings; 3108fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.util.Log; 32a7596147b43940cad3f76c53ed154ef088b9269bJim Millerimport android.util.Slog; 3308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller/** 3508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * A class that coordinates access to the fingerprint hardware. 36777f5b2f47840357e95f3354b83cf500ba82f0eeJim Miller * @hide 3708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 3808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3908fa40c5cb5229b7969b2a5146855a337870f45aJim Millerpublic class FingerprintManager { 4008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private static final String TAG = "FingerprintManager"; 41d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller private static final boolean DEBUG = true; 4208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private static final int MSG_ENROLL_RESULT = 100; 43a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private static final int MSG_ACQUIRED = 101; 44a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private static final int MSG_PROCESSED = 102; 45a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private static final int MSG_ERROR = 103; 46a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private static final int MSG_REMOVED = 104; 4708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 48a7596147b43940cad3f76c53ed154ef088b9269bJim Miller // Errors generated by layers above HAL 4908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_NO_RECEIVER = -10; 5008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 51a7596147b43940cad3f76c53ed154ef088b9269bJim Miller // Message types. Must agree with HAL (fingerprint.h) 52a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ERROR = -1; 53a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED = 1; 54a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_PROCESSED = 2; 55a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_TEMPLATE_ENROLLING = 3; 5608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_TEMPLATE_REMOVED = 4; 5708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 58a7596147b43940cad3f76c53ed154ef088b9269bJim Miller // Error messages. Must agree with HAL (fingerprint.h) 5908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; 60a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; 6108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_TIMEOUT = 3; 6208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_NO_SPACE = 4; 6308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 64a7596147b43940cad3f76c53ed154ef088b9269bJim Miller // FINGERPRINT_ACQUIRED messages. Must agree with HAL (fingerprint.h) 65a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_GOOD = 0; 66a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; 67a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; 68a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 4; 69a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 8; 70a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 16; 71a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 7208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private IFingerprintService mService; 7308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private FingerprintManagerReceiver mClientReceiver; 74d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller private Context mContext; 75a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private IBinder mToken = new Binder(); 7608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 7708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private Handler mHandler = new Handler() { 7808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void handleMessage(android.os.Message msg) { 7908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mClientReceiver != null) { 8008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller switch(msg.what) { 8108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller case MSG_ENROLL_RESULT: 8208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mClientReceiver.onEnrollResult(msg.arg1, msg.arg2); 8308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller break; 84a7596147b43940cad3f76c53ed154ef088b9269bJim Miller case MSG_ACQUIRED: 85a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mClientReceiver.onAcquired(msg.arg1); 86a7596147b43940cad3f76c53ed154ef088b9269bJim Miller break; 87a7596147b43940cad3f76c53ed154ef088b9269bJim Miller case MSG_PROCESSED: 88a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mClientReceiver.onProcessed(msg.arg1); 8908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller break; 9008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller case MSG_ERROR: 9108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mClientReceiver.onError(msg.arg1); 9208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller break; 9308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller case MSG_REMOVED: 9408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mClientReceiver.onRemoved(msg.arg1); 9508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 9608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 9708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 9808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller }; 9908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 10006e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller /** 10106e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller * @hide 10206e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller */ 103a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public FingerprintManager(Context context, IFingerprintService service) { 104d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller mContext = context; 105a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService = service; 106a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (mService == null) { 107a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Slog.v(TAG, "FingerprintManagerService was null"); 10808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 10908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 11008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 11108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private IFingerprintServiceReceiver mServiceReceiver = new IFingerprintServiceReceiver.Stub() { 11208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 11308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void onEnrollResult(int fingerprintId, int remaining) { 11408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mHandler.obtainMessage(MSG_ENROLL_RESULT, fingerprintId, remaining).sendToTarget(); 11508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 11608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 117a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public void onAcquired(int acquireInfo) { 118a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, 0).sendToTarget(); 119a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 120a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 121a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public void onProcessed(int fingerprintId) { 122a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mHandler.obtainMessage(MSG_PROCESSED, fingerprintId, 0).sendToTarget(); 12308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 12408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 12508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void onError(int error) { 12608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mHandler.obtainMessage(MSG_ERROR, error, 0).sendToTarget(); 12708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 12808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 12908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void onRemoved(int fingerprintId) { 13008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mHandler.obtainMessage(MSG_REMOVED, fingerprintId, 0).sendToTarget(); 13108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 13208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller }; 13308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 13408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 135d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller * Determine whether the user has at least one fingerprint enrolled and enabled. 136d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller * 137d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller * @return true if at least one is enrolled and enabled 138d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller */ 139d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller public boolean enrolledAndEnabled() { 140d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller ContentResolver res = mContext.getContentResolver(); 141d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller return Settings.Secure.getInt(res, "fingerprint_enabled", 0) != 0 142d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller && FingerprintUtils.getFingerprintIdsForUser(res, getCurrentUserId()).length > 0; 143d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller } 144d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller 145d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller /** 14608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Start the enrollment process. Timeout dictates how long to wait for the user to 14708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * enroll a fingerprint. 14808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * 14908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * @param timeout 15008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 15108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void enroll(long timeout) { 15208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mServiceReceiver == null) { 153a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_NO_RECEIVER, 0, 0); 154a7596147b43940cad3f76c53ed154ef088b9269bJim Miller return; 15508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 15608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) try { 157a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService.enroll(mToken, timeout, getCurrentUserId()); 15808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 15908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller Log.v(TAG, "Remote exception while enrolling: ", e); 160a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0, 0); 16108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 16208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 16308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 16408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 16508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Remove the given fingerprintId from the system. FingerprintId of 0 has special meaning 16608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * which is to delete all fingerprint data for the current user. Use with caution. 16708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * @param fingerprintId 16808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 16908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void remove(int fingerprintId) { 170a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (mServiceReceiver == null) { 171a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_NO_RECEIVER, 0, 0); 172a7596147b43940cad3f76c53ed154ef088b9269bJim Miller return; 173a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 174a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (mService != null) { 175a7596147b43940cad3f76c53ed154ef088b9269bJim Miller try { 176a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService.remove(mToken, fingerprintId, getCurrentUserId()); 177a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } catch (RemoteException e) { 178a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Log.v(TAG, "Remote exception during remove of fingerprintId: " + fingerprintId, e); 179a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 180a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } else { 181a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Log.w(TAG, "remove(): Service not connected!"); 182a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0, 0); 18308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 18408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 18508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 18608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 18708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Starts listening for fingerprint events. When a finger is scanned or recognized, the 18808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * client will be notified via the callback. 18908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 19008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void startListening(FingerprintManagerReceiver receiver) { 19108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller mClientReceiver = receiver; 19208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) { 19308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller try { 194a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService.startListening(mToken, mServiceReceiver, getCurrentUserId()); 19508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 19608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller Log.v(TAG, "Remote exception in startListening(): ", e); 19708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 198a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } else { 199a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Log.w(TAG, "startListening(): Service not connected!"); 200a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0, 0); 20108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 20208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 20308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 20408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private int getCurrentUserId() { 20508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller try { 20608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller return ActivityManagerNative.getDefault().getCurrentUser().id; 20708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 20808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller Log.w(TAG, "Failed to get current user id\n"); 20908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller return UserHandle.USER_NULL; 21008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 21108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 21208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 21308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 21408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * Stops the client from listening to fingerprint events. 21508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 21608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public void stopListening() { 21708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) { 21808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller try { 219a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService.stopListening(mToken, getCurrentUserId()); 220a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mClientReceiver = null; 22108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 22208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller Log.v(TAG, "Remote exception in stopListening(): ", e); 22308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 22408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } else { 22508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller Log.w(TAG, "stopListening(): Service not connected!"); 226a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0, 0); 227a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 228a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 229a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 230a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public void enrollCancel() { 231a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (mServiceReceiver == null) { 232a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_NO_RECEIVER, 0, 0); 233a7596147b43940cad3f76c53ed154ef088b9269bJim Miller return; 23408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 235a7596147b43940cad3f76c53ed154ef088b9269bJim Miller if (mService != null) { 236a7596147b43940cad3f76c53ed154ef088b9269bJim Miller try { 237a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mService.enrollCancel(mToken, getCurrentUserId()); 238a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mClientReceiver = null; 239a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } catch (RemoteException e) { 240a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Log.v(TAG, "Remote exception in enrollCancel(): ", e); 241a7596147b43940cad3f76c53ed154ef088b9269bJim Miller sendError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0, 0); 242a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 243a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } else { 244a7596147b43940cad3f76c53ed154ef088b9269bJim Miller Log.w(TAG, "enrollCancel(): Service not connected!"); 245a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 246a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 247a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 248a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private void sendError(int msg, int arg1, int arg2) { 249a7596147b43940cad3f76c53ed154ef088b9269bJim Miller mHandler.obtainMessage(msg, arg1, arg2); 25008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 25108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller}