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 17ebbf205bc6e8292f74d8fc4652c70274a445f907Jim Millerpackage android.hardware.fingerprint; 1808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 19ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerimport android.annotation.NonNull; 20ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerimport android.annotation.Nullable; 21f501b58de8f467a80fef49c704555781bc61ea6fJim Millerimport android.annotation.RequiresPermission; 22d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.annotation.SystemService; 23dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shankaimport android.app.ActivityManager; 2408fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.content.Context; 25a7596147b43940cad3f76c53ed154ef088b9269bJim Millerimport android.os.Binder; 269f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerimport android.os.CancellationSignal; 27ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Millerimport android.os.CancellationSignal.OnCancelListener; 2808fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.Handler; 2908fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.IBinder; 3057e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggiimport android.os.IRemoteCallback; 31f501b58de8f467a80fef49c704555781bc61ea6fJim Millerimport android.os.Looper; 325e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggiimport android.os.PowerManager; 3308fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.RemoteException; 3408fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.os.UserHandle; 35dcdaf87ed0aa99073638bcfe645949f130f0c7adAlex Klyubinimport android.security.keystore.AndroidKeyStoreProvider; 3608fa40c5cb5229b7969b2a5146855a337870f45aJim Millerimport android.util.Log; 37a7596147b43940cad3f76c53ed154ef088b9269bJim Millerimport android.util.Slog; 3808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 399f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerimport java.security.Signature; 40ba67aee02cf864793129976cd8a8a46e60c60577Jim Millerimport java.util.List; 41ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 429f0753f5a378fc80da86305b33244acc6fc53f01Jim Millerimport javax.crypto.Cipher; 43b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Millerimport javax.crypto.Mac; 449f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 4533fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarriimport static android.Manifest.permission.INTERACT_ACROSS_USERS; 46f501b58de8f467a80fef49c704555781bc61ea6fJim Millerimport static android.Manifest.permission.MANAGE_FINGERPRINT; 47d717808bd0883cea7723a8e0b794e156b140a7daKevin Chynimport static android.Manifest.permission.USE_FINGERPRINT; 48f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 4908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller/** 5008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller * A class that coordinates access to the fingerprint hardware. 5108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 52d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SystemService(Context.FINGERPRINT_SERVICE) 5308fa40c5cb5229b7969b2a5146855a337870f45aJim Millerpublic class FingerprintManager { 5408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private static final String TAG = "FingerprintManager"; 55d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller private static final boolean DEBUG = true; 5608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private static final int MSG_ENROLL_RESULT = 100; 57a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private static final int MSG_ACQUIRED = 101; 58f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private static final int MSG_AUTHENTICATION_SUCCEEDED = 102; 59f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private static final int MSG_AUTHENTICATION_FAILED = 103; 60f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private static final int MSG_ERROR = 104; 61f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private static final int MSG_REMOVED = 105; 6240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private static final int MSG_ENUMERATED = 106; 6308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 64ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // 65ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Error messages from fingerprint hardware during initilization, enrollment, authentication or 66ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // removal. Must agree with the list in fingerprint.h 67ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // 6808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 69ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 70ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The hardware is unavailable. Try again later. 71ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 7208fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_HW_UNAVAILABLE = 1; 73ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 74ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 75ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Error state returned when the sensor was unable to process the current image. 76ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 77a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ERROR_UNABLE_TO_PROCESS = 2; 78ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 79ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 80ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Error state returned when the current request has been running too long. This is intended to 81ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * prevent programs from waiting for the fingerprint sensor indefinitely. The timeout is 82ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * platform and sensor-specific, but is generally on the order of 30 seconds. 83ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 8408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_TIMEOUT = 3; 85ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 86ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 87ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Error state returned for operations like enrollment; the operation cannot be completed 88ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * because there's not enough storage remaining to complete the operation. 89ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 9008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller public static final int FINGERPRINT_ERROR_NO_SPACE = 4; 91ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 92ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 93ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The operation was canceled because the fingerprint sensor is unavailable. For example, 94ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * this may happen when the user is switched, the device is locked or another pending operation 95ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * prevents or disables it. 96ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 979f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ERROR_CANCELED = 5; 98ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 99ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 100ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * The {@link FingerprintManager#remove} call failed. Typically this will happen when the 101ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * provided fingerprint id was incorrect. 102ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 103ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 104ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 105ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public static final int FINGERPRINT_ERROR_UNABLE_TO_REMOVE = 6; 106ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 107fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller /** 108fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller * The operation was canceled because the API is locked out due to too many attempts. 109fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller */ 110fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller public static final int FINGERPRINT_ERROR_LOCKOUT = 7; 111fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller 112ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 113ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Hardware vendors may extend this list if there are conditions that do not fall under one of 114ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * the above categories. Vendors are responsible for providing error strings for these errors. 115f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @hide 116ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 11740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public static final int FINGERPRINT_ERROR_VENDOR = 8; 118df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn 119df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn /** 120df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn * The operation was canceled because FINGERPRINT_ERROR_LOCKOUT occurred too many times. 121df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn * Fingerprint authentication is disabled until the user unlocks with strong authentication 122df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn * (PIN/Pattern/Password) 123df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn * @hide 124df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn */ 125df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn public static final int FINGERPRINT_ERROR_LOCKOUT_PERMANENT = 9; 126df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn 12740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 12840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @hide 12940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 1309f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ERROR_VENDOR_BASE = 1000; 13108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 132ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // 133ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Image acquisition messages. Must agree with those in fingerprint.h 134ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // 135ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 136ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 137ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The image acquired was good. 138ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 139a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_GOOD = 0; 140ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 141ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 142ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Only a partial fingerprint image was detected. During enrollment, the user should be 143ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * informed on what needs to happen to resolve this problem, e.g. "press firmly on sensor." 144ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 145a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_PARTIAL = 1; 146ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 147ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 148ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The fingerprint image was too noisy to process due to a detected condition (i.e. dry skin) or 149ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * a possibly dirty sensor (See {@link #FINGERPRINT_ACQUIRED_IMAGER_DIRTY}). 150ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 151a7596147b43940cad3f76c53ed154ef088b9269bJim Miller public static final int FINGERPRINT_ACQUIRED_INSUFFICIENT = 2; 152ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 153ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 154ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The fingerprint image was too noisy due to suspected or detected dirt on the sensor. 155ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * For example, it's reasonable return this after multiple 156ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * {@link #FINGERPRINT_ACQUIRED_INSUFFICIENT} or actual detection of dirt on the sensor 157ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * (stuck pixels, swaths, etc.). The user is expected to take action to clean the sensor 158ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * when this is returned. 159ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 1609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ACQUIRED_IMAGER_DIRTY = 3; 161ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 162ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 163ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The fingerprint image was unreadable due to lack of motion. This is most appropriate for 164ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * linear array sensors that require a swipe motion. 165ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 1669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ACQUIRED_TOO_SLOW = 4; 167ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 168ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 169ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The fingerprint image was incomplete due to quick motion. While mostly appropriate for 170ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * linear array sensors, this could also happen if the finger was moved during acquisition. 171ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * The user should be asked to move the finger slower (linear) or leave the finger on the sensor 172ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * longer. 173ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 1749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ACQUIRED_TOO_FAST = 5; 175ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 176ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 177ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Hardware vendors may extend this list if there are conditions that do not fall under one of 178ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * the above categories. Vendors are responsible for providing error strings for these errors. 179f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @hide 180ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 18140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public static final int FINGERPRINT_ACQUIRED_VENDOR = 6; 18240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 18340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @hide 18440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 1859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static final int FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000; 186a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 18708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller private IFingerprintService mService; 188d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller private Context mContext; 189a7596147b43940cad3f76c53ed154ef088b9269bJim Miller private IBinder mToken = new Binder(); 1909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private AuthenticationCallback mAuthenticationCallback; 1919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private EnrollmentCallback mEnrollmentCallback; 1929f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private RemovalCallback mRemovalCallback; 19340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private EnumerateCallback mEnumerateCallback; 1949f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private CryptoObject mCryptoObject; 1959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private Fingerprint mRemovalFingerprint; 196f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private Handler mHandler; 197ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 198ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller private class OnEnrollCancelListener implements OnCancelListener { 199ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller @Override 200ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onCancel() { 201fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller cancelEnrollment(); 202ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 203ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 204ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 205ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller private class OnAuthenticationCancelListener implements OnCancelListener { 206ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller private CryptoObject mCrypto; 207ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 208ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public OnAuthenticationCancelListener(CryptoObject crypto) { 209ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mCrypto = crypto; 210ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 211ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 212ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller @Override 213ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onCancel() { 214ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller cancelAuthentication(mCrypto); 215ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 216ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 21708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 2189f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 219ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * A wrapper class for the crypto objects supported by FingerprintManager. Currently the 220b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. 2219f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 222f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public static final class CryptoObject { 223ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 224b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller public CryptoObject(@NonNull Signature signature) { 225f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mCrypto = signature; 226ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 227ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 228b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller public CryptoObject(@NonNull Cipher cipher) { 229f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mCrypto = cipher; 230b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller } 231b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller 232b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller public CryptoObject(@NonNull Mac mac) { 233f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mCrypto = mac; 234ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 235ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 236ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 237ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Get {@link Signature} object. 238ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @return {@link Signature} object or null if this doesn't contain one. 239ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 240f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public Signature getSignature() { 241f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mCrypto instanceof Signature ? (Signature) mCrypto : null; 242f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 243ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 244ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 245ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Get {@link Cipher} object. 246ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @return {@link Cipher} object or null if this doesn't contain one. 247ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 248f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public Cipher getCipher() { 249f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mCrypto instanceof Cipher ? (Cipher) mCrypto : null; 250f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 251ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 252ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 253b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller * Get {@link Mac} object. 254b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller * @return {@link Mac} object or null if this doesn't contain one. 255b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller */ 256f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public Mac getMac() { 257f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mCrypto instanceof Mac ? (Mac) mCrypto : null; 258f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 259b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller 260b62dc82b0c7208f106077b46fc7118da6baa6e13Jim Miller /** 261ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 262ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @return the opId associated with this object or 0 if none 263ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 264ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public long getOpId() { 265f501b58de8f467a80fef49c704555781bc61ea6fJim Miller return mCrypto != null ? 266f501b58de8f467a80fef49c704555781bc61ea6fJim Miller AndroidKeyStoreProvider.getKeyStoreOperationHandle(mCrypto) : 0; 267ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 268ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 269f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private final Object mCrypto; 27008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller }; 27108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 2729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 2739f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Container for callback data from {@link FingerprintManager#authenticate(CryptoObject, 274f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * CancellationSignal, int, AuthenticationCallback, Handler)}. 2759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 276748bc36f2eebfdc67520c5025b48fefdfd8d7c01Jim Miller public static class AuthenticationResult { 2779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private Fingerprint mFingerprint; 2789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private CryptoObject mCryptoObject; 279837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller private int mUserId; 2809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 281f501b58de8f467a80fef49c704555781bc61ea6fJim Miller /** 282f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * Authentication result 283f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * 284f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param crypto the crypto object 285f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param fingerprint the recognized fingerprint data, if allowed. 286f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @hide 287f501b58de8f467a80fef49c704555781bc61ea6fJim Miller */ 288837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint, int userId) { 2899f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mCryptoObject = crypto; 2909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mFingerprint = fingerprint; 291837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller mUserId = userId; 292ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 2939f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 2949f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 2959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Obtain the crypto object associated with this transaction 2969f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @return crypto object provided to {@link FingerprintManager#authenticate(CryptoObject, 297f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * CancellationSignal, int, AuthenticationCallback, Handler)}. 2989f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 2999f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public CryptoObject getCryptoObject() { return mCryptoObject; } 3009f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 3019f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 302ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Obtain the Fingerprint associated with this operation. Applications are strongly 303ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * discouraged from associating specific fingers with specific applications or operations. 304ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 3059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @hide 3069f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 3079f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public Fingerprint getFingerprint() { return mFingerprint; } 308837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller 309837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller /** 310837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller * Obtain the userId for which this fingerprint was authenticated. 311837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller * @hide 312837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller */ 313837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller public int getUserId() { return mUserId; } 3149f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller }; 315ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 31606e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller /** 3179f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Callback structure provided to {@link FingerprintManager#authenticate(CryptoObject, 318f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * CancellationSignal, int, AuthenticationCallback, Handler)}. Users of {@link 319ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * FingerprintManager#authenticate(CryptoObject, CancellationSignal, 320f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to 321ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * fingerprint events. 32206e658f324a937bec1c5ddbe9c3100c3d2fec371Jim Miller */ 3239f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static abstract class AuthenticationCallback { 3249f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 3259f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called when an unrecoverable error has been encountered and the operation is complete. 3269f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * No further callbacks will be made on this object. 327f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param errorCode An integer identifying the error message 328ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param errString A human-readable error string that can be shown in UI 3299f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 330f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public void onAuthenticationError(int errorCode, CharSequence errString) { } 33108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3329f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 333ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Called when a recoverable error has been encountered during authentication. The help 3349f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * string is provided to give the user guidance for what went wrong, such as 3359f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * "Sensor dirty, please clean it." 336f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param helpCode An integer identifying the error message 337ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param helpString A human-readable string that can be shown in UI 3389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 339f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public void onAuthenticationHelp(int helpCode, CharSequence helpString) { } 34008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3419f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 3429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called when a fingerprint is recognized. 343ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param result An object containing authentication-related data 3449f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 345ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onAuthenticationSucceeded(AuthenticationResult result) { } 346ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 347ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 348ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Called when a fingerprint is valid but not recognized. 349ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 350ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onAuthenticationFailed() { } 3514cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi 3524cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi /** 3534cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi * Called when a fingerprint image has been acquired, but wasn't processed yet. 3544cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi * 3554cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi * @param acquireInfo one of FINGERPRINT_ACQUIRED_* constants 3564cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi * @hide 3574cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi */ 3584cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi public void onAuthenticationAcquired(int acquireInfo) {} 3599f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller }; 36008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3619f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 3629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Callback structure provided to {@link FingerprintManager#enroll(long, EnrollmentCallback, 3639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * CancellationSignal, int). Users of {@link #FingerprintManager()} 3649f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * must provide an implementation of this to {@link FingerprintManager#enroll(long, 365f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * CancellationSignal, int, EnrollmentCallback) for listening to fingerprint events. 366ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 367ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 3689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 3699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static abstract class EnrollmentCallback { 3709f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 3719f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called when an unrecoverable error has been encountered and the operation is complete. 3729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * No further callbacks will be made on this object. 373ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param errMsgId An integer identifying the error message 374ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param errString A human-readable error string that can be shown in UI 3759f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 376ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onEnrollmentError(int errMsgId, CharSequence errString) { } 377a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 3789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 379ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Called when a recoverable error has been encountered during enrollment. The help 3809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * string is provided to give the user guidance for what went wrong, such as 3819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * "Sensor dirty, please clean it" or what they need to do next, such as 3829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * "Touch sensor again." 383ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param helpMsgId An integer identifying the error message 384ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param helpString A human-readable string that can be shown in UI 3859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 386ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) { } 38708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3889f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 3899f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called as each enrollment step progresses. Enrollment is considered complete when 390ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * remaining reaches 0. This function will not be called if enrollment fails. See 3919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * {@link EnrollmentCallback#onEnrollmentError(int, CharSequence)} 392ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param remaining The number of remaining steps 3939f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 394ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onEnrollmentProgress(int remaining) { } 3959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller }; 39608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 3979f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 398ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * Callback structure provided to {@link #remove}. Users of {@link FingerprintManager} may 399ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * optionally provide an implementation of this to 400ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * {@link #remove(Fingerprint, int, RemovalCallback)} for listening to fingerprint template 401ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * removal events. 402ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 403ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 4049f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 4059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public static abstract class RemovalCallback { 4069f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 4079f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called when the given fingerprint can't be removed. 408ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param fp The fingerprint that the call attempted to remove 409ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param errMsgId An associated error message id 410ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param errString An error message indicating why the fingerprint id can't be removed 4119f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 412ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) { } 4139f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 4149f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 4159f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Called when a given fingerprint is successfully removed. 416ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * @param fp The fingerprint template that was removed. 417ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * @param remaining The number of fingerprints yet to be removed in this operation. If 418ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * {@link #remove} is called on one fingerprint, this should be 0. If 419ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * {@link #remove} is called on a group, this should be the number of remaining 420ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He * fingerprints in the group, and 0 after the last fingerprint is removed. 4219f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 422ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He public void onRemovalSucceeded(Fingerprint fp, int remaining) { } 42308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller }; 42408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 42508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 42640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * Callback structure provided to {@link FingerprintManager#enumerate(int). Users of 42740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * {@link #FingerprintManager()} may optionally provide an implementation of this to 42840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * {@link FingerprintManager#enumerate(int, int, EnumerateCallback)} for listening to 42940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * fingerprint template removal events. 43040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * 43140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @hide 43240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 43340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public static abstract class EnumerateCallback { 43440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 43540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * Called when the given fingerprint can't be removed. 43640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @param errMsgId An associated error message id 43740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @param errString An error message indicating why the fingerprint id can't be removed 43840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 43940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onEnumerateError(int errMsgId, CharSequence errString) { } 44040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller 44140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 44240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * Called when a given fingerprint is successfully removed. 44340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @param fingerprint the fingerprint template that was removed. 44440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 44540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onEnumerate(Fingerprint fingerprint) { } 44640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller }; 44740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller 44840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 4493a464785088e7fd206666f640912729533948ce8Jorim Jaggi * @hide 4503a464785088e7fd206666f640912729533948ce8Jorim Jaggi */ 4513a464785088e7fd206666f640912729533948ce8Jorim Jaggi public static abstract class LockoutResetCallback { 4523a464785088e7fd206666f640912729533948ce8Jorim Jaggi 4533a464785088e7fd206666f640912729533948ce8Jorim Jaggi /** 4543a464785088e7fd206666f640912729533948ce8Jorim Jaggi * Called when lockout period expired and clients are allowed to listen for fingerprint 4553a464785088e7fd206666f640912729533948ce8Jorim Jaggi * again. 4563a464785088e7fd206666f640912729533948ce8Jorim Jaggi */ 4573a464785088e7fd206666f640912729533948ce8Jorim Jaggi public void onLockoutReset() { } 4583a464785088e7fd206666f640912729533948ce8Jorim Jaggi }; 4593a464785088e7fd206666f640912729533948ce8Jorim Jaggi 4603a464785088e7fd206666f640912729533948ce8Jorim Jaggi /** 461ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Request authentication of a crypto object. This call warms up the fingerprint hardware 462ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * and starts scanning for a fingerprint. It terminates when 4639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * {@link AuthenticationCallback#onAuthenticationError(int, CharSequence)} or 4645f69ca3be3005fd127c82f503d0692f807729688Jim Miller * {@link AuthenticationCallback#onAuthenticationSucceeded(AuthenticationResult)} is called, at 4659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * which point the object is no longer valid. The operation can be canceled by using the 4669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * provided cancel object. 467d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller * 4689f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param crypto object associated with the call or null if none required. 4699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param cancel an object that can be used to cancel authentication 470ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @param flags optional flags; should be 0 471f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param callback an object to receive authentication events 472f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param handler an optional handler to handle callback events 473e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller * 474e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller * @throws IllegalArgumentException if the crypto operation is not supported or is not backed 475e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller * by <a href="{@docRoot}training/articles/keystore.html">Android Keystore 476e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller * facility</a>. 477e4c58e46419bdc1cbe94516bdded71f017534d9cJim Miller * @throws IllegalStateException if the crypto primitive is not initialized. 478d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller */ 479f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 480ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, 481f501b58de8f467a80fef49c704555781bc61ea6fJim Miller int flags, @NonNull AuthenticationCallback callback, @Nullable Handler handler) { 482f501b58de8f467a80fef49c704555781bc61ea6fJim Miller authenticate(crypto, cancel, flags, callback, handler, UserHandle.myUserId()); 483ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi } 484ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi 485ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi /** 486f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * Use the provided handler thread for events. 487f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param handler 488f501b58de8f467a80fef49c704555781bc61ea6fJim Miller */ 489f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private void useHandler(Handler handler) { 490f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (handler != null) { 491f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mHandler = new MyHandler(handler.getLooper()); 492f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } else if (mHandler.getLooper() != mContext.getMainLooper()){ 493f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mHandler = new MyHandler(mContext.getMainLooper()); 494f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 495f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 496f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 497f501b58de8f467a80fef49c704555781bc61ea6fJim Miller /** 498f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * Per-user version 499ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi * @hide 500ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi */ 501f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 502ccdfa93f609d3f306a35902df323939e266a7ab3Jorim Jaggi public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, 503f501b58de8f467a80fef49c704555781bc61ea6fJim Miller int flags, @NonNull AuthenticationCallback callback, Handler handler, int userId) { 5049f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (callback == null) { 5059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller throw new IllegalArgumentException("Must supply an authentication callback"); 5069f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 5079f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 508ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (cancel != null) { 509ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (cancel.isCanceled()) { 510ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Log.w(TAG, "authentication already canceled"); 511ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return; 512ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 513ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller cancel.setOnCancelListener(new OnAuthenticationCancelListener(crypto)); 514ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 515ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 5169f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 5179f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mService != null) try { 518f501b58de8f467a80fef49c704555781bc61ea6fJim Miller useHandler(handler); 5199f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mAuthenticationCallback = callback; 5209f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mCryptoObject = crypto; 521ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller long sessionId = crypto != null ? crypto.getOpId() : 0; 5224af76a51d5082c740609563e07cf35f30bc2224eSvetoslav mService.authenticate(mToken, sessionId, userId, mServiceReceiver, flags, 5234af76a51d5082c740609563e07cf35f30bc2224eSvetoslav mContext.getOpPackageName()); 5249f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } catch (RemoteException e) { 525ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Log.w(TAG, "Remote exception while authenticating: ", e); 526ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (callback != null) { 527ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Though this may not be a hardware issue, it will cause apps to give up or try 528ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // again later. 529ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller callback.onAuthenticationError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 53040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */)); 531ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 5329f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 533d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller } 534d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller 535d08c2aceb238b02d8348518a2c87693054c6ce37Jim Miller /** 5369f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Request fingerprint enrollment. This call warms up the fingerprint hardware 5379f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * and starts scanning for fingerprints. Progress will be indicated by callbacks to the 5389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * {@link EnrollmentCallback} object. It terminates when 5399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * {@link EnrollmentCallback#onEnrollmentError(int, CharSequence)} or 5409f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * {@link EnrollmentCallback#onEnrollmentProgress(int) is called with remaining == 0, at 5419f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * which point the object is no longer valid. The operation can be canceled by using the 5429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * provided cancel object. 543fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller * @param token a unique token provided by a recent creation or verification of device 544fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller * credentials (e.g. pin, pattern or password). 5459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param cancel an object that can be used to cancel enrollment 5469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param flags optional flags 547a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri * @param userId the user to whom this fingerprint will belong to 548f501b58de8f467a80fef49c704555781bc61ea6fJim Miller * @param callback an object to receive enrollment events 549ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 55008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 551f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(MANAGE_FINGERPRINT) 552f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public void enroll(byte [] token, CancellationSignal cancel, int flags, 553a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri int userId, EnrollmentCallback callback) { 554d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri if (userId == UserHandle.USER_CURRENT) { 555d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri userId = getCurrentUserId(); 556d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri } 5579f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (callback == null) { 5589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller throw new IllegalArgumentException("Must supply an enrollment callback"); 55908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 5609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 561ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (cancel != null) { 562ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (cancel.isCanceled()) { 563ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Log.w(TAG, "enrollment already canceled"); 564ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return; 565ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } else { 566fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller cancel.setOnCancelListener(new OnEnrollCancelListener()); 567ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 568ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 5699f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 57008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) try { 5719f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mEnrollmentCallback = callback; 572cb2ce6f1f0deef80943ece093ae40bacc1f57c44Jim Miller mService.enroll(mToken, token, userId, mServiceReceiver, flags, 573cb2ce6f1f0deef80943ece093ae40bacc1f57c44Jim Miller mContext.getOpPackageName()); 574ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } catch (RemoteException e) { 575ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Log.w(TAG, "Remote exception in enroll: ", e); 576ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (callback != null) { 577ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // Though this may not be a hardware issue, it will cause apps to give up or try 578ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller // again later. 579ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller callback.onEnrollmentError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 58040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */)); 581ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 582ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 583ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 584ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 585ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller /** 586ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * Requests a pre-enrollment auth token to tie enrollment to the confirmation of 587ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * existing device credentials (e.g. pin/pattern/password). 588ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 589ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller */ 590f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(MANAGE_FINGERPRINT) 591ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller public long preEnroll() { 592ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller long result = 0; 593ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mService != null) try { 594ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller result = mService.preEnroll(mToken); 59508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 596c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 59708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 598ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return result; 59908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 60008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 60108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 602e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy * Finishes enrollment and cancels the current auth token. 603e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy * @hide 604e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy */ 605e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy @RequiresPermission(MANAGE_FINGERPRINT) 606e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy public int postEnroll() { 607e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy int result = 0; 608e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy if (mService != null) try { 609e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy result = mService.postEnroll(mToken); 610e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy } catch (RemoteException e) { 611c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 612e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy } 613e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy return result; 614e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy } 615e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy 616e0943cf5665b3d7b0870debda771032f77db094cSasha Levitskiy /** 617d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri * Sets the active user. This is meant to be used to select the current profile for enrollment 618d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri * to allow separate enrolled fingers for a work profile 619d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri * @param userId 620d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri * @hide 621d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri */ 622d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri @RequiresPermission(MANAGE_FINGERPRINT) 623d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri public void setActiveUser(int userId) { 624d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri if (mService != null) try { 625d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri mService.setActiveUser(userId); 626d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri } catch (RemoteException e) { 627c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 628d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri } 629d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri } 630d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri 631d1f722d906f66ef05cd329feb9edbed178314d46Clara Bayarri /** 6329f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Remove given fingerprint template from fingerprint hardware and/or protected storage. 6339f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param fp the fingerprint item to remove 634a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri * @param userId the user who this fingerprint belongs to 6359f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param callback an optional callback to verify that fingerprint templates have been 636ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * successfully removed. May be null of no callback is required. 637ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 6389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @hide 63908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 640f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(MANAGE_FINGERPRINT) 641a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri public void remove(Fingerprint fp, int userId, RemovalCallback callback) { 6429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mService != null) try { 6439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mRemovalCallback = callback; 6449f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mRemovalFingerprint = fp; 6458f2aca0ee4ff0eff6226df05d1531d2f2fa2f3c1Jim Miller mService.remove(mToken, fp.getFingerId(), fp.getGroupId(), userId, mServiceReceiver); 6469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } catch (RemoteException e) { 647ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller Log.w(TAG, "Remote exception in remove: ", e); 648ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (callback != null) { 649ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller callback.onRemovalError(fp, FINGERPRINT_ERROR_HW_UNAVAILABLE, 65040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */)); 65140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 65240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 65340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 65440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller 65540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller /** 65640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * Enumerate all fingerprint templates stored in hardware and/or protected storage. 65740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @param userId the user who this fingerprint belongs to 65840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @param callback an optional callback to verify that fingerprint templates have been 65940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * successfully removed. May be null of no callback is required. 66040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * 66140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller * @hide 66240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller */ 66340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller @RequiresPermission(MANAGE_FINGERPRINT) 66440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void enumerate(int userId, @NonNull EnumerateCallback callback) { 66540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller if (mService != null) try { 66640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mEnumerateCallback = callback; 66740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mService.enumerate(mToken, userId, mServiceReceiver); 66840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } catch (RemoteException e) { 66940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller Log.w(TAG, "Remote exception in enumerate: ", e); 67040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller if (callback != null) { 67140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller callback.onEnumerateError(FINGERPRINT_ERROR_HW_UNAVAILABLE, 67240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(FINGERPRINT_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */)); 673ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 67408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 67508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 67608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 67708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 6789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Renames the given fingerprint template 6799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param fpId the fingerprint id 680a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri * @param userId the user who this fingerprint belongs to 6819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @param newName the new name 682ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 6839f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @hide 68408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 685f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(MANAGE_FINGERPRINT) 686a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri public void rename(int fpId, int userId, String newName) { 6879f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller // Renames the given fpId 68808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) { 68908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller try { 690a5c1a77fad0ea3e2cbdf1dec773800cd77d6562eClara Bayarri mService.rename(fpId, userId, newName); 69108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 692c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 69308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 694a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } else { 6959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Log.w(TAG, "rename(): Service not connected!"); 69608fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 69708fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 69808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 6999f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller /** 7009f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * Obtain the list of enrolled fingerprints templates. 7019f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @return list of current fingerprint items 702ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 703ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * @hide 7049f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller */ 705f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 7062aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi public List<Fingerprint> getEnrolledFingerprints(int userId) { 7079f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mService != null) try { 7084af76a51d5082c740609563e07cf35f30bc2224eSvetoslav return mService.getEnrolledFingerprints(userId, mContext.getOpPackageName()); 70908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 710c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 71108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 7129f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return null; 71308fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 71408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller 71508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller /** 7162aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * Obtain the list of enrolled fingerprints templates. 7172aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * @return list of current fingerprint items 718ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller * 7199f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller * @hide 72008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller */ 721f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 7222aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi public List<Fingerprint> getEnrolledFingerprints() { 7232aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi return getEnrolledFingerprints(UserHandle.myUserId()); 7242aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } 7252aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi 7262aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi /** 7272aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * Determine if there is at least one fingerprint enrolled. 7282aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * 7292aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * @return true if at least one fingerprint is enrolled, false otherwise 7302aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi */ 731f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 7322aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi public boolean hasEnrolledFingerprints() { 7332aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi if (mService != null) try { 73433fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri return mService.hasEnrolledFingerprints( 73533fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri UserHandle.myUserId(), mContext.getOpPackageName()); 73633fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri } catch (RemoteException e) { 737c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 73833fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri } 73933fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri return false; 74033fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri } 74133fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri 74233fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri /** 74333fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri * @hide 74433fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri */ 74533fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri @RequiresPermission(allOf = { 74633fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri USE_FINGERPRINT, 74733fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri INTERACT_ACROSS_USERS}) 74833fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri public boolean hasEnrolledFingerprints(int userId) { 74933fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri if (mService != null) try { 75033fd3cf2d90ca877b139e7f47824683b774f122aClara Bayarri return mService.hasEnrolledFingerprints(userId, mContext.getOpPackageName()); 7512aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } catch (RemoteException e) { 752c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 7532aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } 7542aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi return false; 7552aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi } 7562aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi 7572aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi /** 7582aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * Determine if fingerprint hardware is present and functional. 7592aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * 7602aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi * @return true if hardware is present and functional, false otherwise. 7612aad7ee245857a46aae305fefc4e3c1bcdd4a586Jorim Jaggi */ 762f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @RequiresPermission(USE_FINGERPRINT) 7639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public boolean isHardwareDetected() { 76408fa40c5cb5229b7969b2a5146855a337870f45aJim Miller if (mService != null) { 76508fa40c5cb5229b7969b2a5146855a337870f45aJim Miller try { 7669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller long deviceId = 0; /* TODO: plumb hardware id to FPMS */ 7674af76a51d5082c740609563e07cf35f30bc2224eSvetoslav return mService.isHardwareDetected(deviceId, mContext.getOpPackageName()); 76808fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } catch (RemoteException e) { 769c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 77008fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 77108fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } else { 7729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Log.w(TAG, "isFingerprintHardwareDetected(): Service not connected!"); 773a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 7749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller return false; 775a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 776a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 7774d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales /** 7784d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales * Retrieves the authenticator token for binding keys to the lifecycle 779da88f0e6b8bde99b1d65c73f20c9704b06cf5f5aCharles He * of the calling user's fingerprints. Used only by internal clients. 7804d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales * 7814d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales * @hide 7824d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales */ 7834d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales public long getAuthenticatorId() { 7844d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales if (mService != null) { 7854d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales try { 7864af76a51d5082c740609563e07cf35f30bc2224eSvetoslav return mService.getAuthenticatorId(mContext.getOpPackageName()); 7874d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales } catch (RemoteException e) { 788c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 7894d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales } 7904d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales } else { 7914d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales Log.w(TAG, "getAuthenticatorId(): Service not connected!"); 7924d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales } 7934d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales return 0; 7944d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales } 7954d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales 796e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller /** 797e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller * Reset the lockout timer when asked to do so by keyguard. 798e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller * 799e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller * @param token an opaque token returned by password confirmation. 800e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller * 801e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller * @hide 802e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller */ 803e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller public void resetTimeout(byte[] token) { 804e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller if (mService != null) { 805e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller try { 806e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller mService.resetTimeout(token); 807e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller } catch (RemoteException e) { 808c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 809e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller } 810e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller } else { 8113a464785088e7fd206666f640912729533948ce8Jorim Jaggi Log.w(TAG, "resetTimeout(): Service not connected!"); 8123a464785088e7fd206666f640912729533948ce8Jorim Jaggi } 8133a464785088e7fd206666f640912729533948ce8Jorim Jaggi } 8143a464785088e7fd206666f640912729533948ce8Jorim Jaggi 8153a464785088e7fd206666f640912729533948ce8Jorim Jaggi /** 8163a464785088e7fd206666f640912729533948ce8Jorim Jaggi * @hide 8173a464785088e7fd206666f640912729533948ce8Jorim Jaggi */ 8183a464785088e7fd206666f640912729533948ce8Jorim Jaggi public void addLockoutResetCallback(final LockoutResetCallback callback) { 8193a464785088e7fd206666f640912729533948ce8Jorim Jaggi if (mService != null) { 8203a464785088e7fd206666f640912729533948ce8Jorim Jaggi try { 8215e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi final PowerManager powerManager = mContext.getSystemService(PowerManager.class); 8223a464785088e7fd206666f640912729533948ce8Jorim Jaggi mService.addLockoutResetCallback( 8233a464785088e7fd206666f640912729533948ce8Jorim Jaggi new IFingerprintServiceLockoutResetCallback.Stub() { 8243a464785088e7fd206666f640912729533948ce8Jorim Jaggi 8253a464785088e7fd206666f640912729533948ce8Jorim Jaggi @Override 82657e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi public void onLockoutReset(long deviceId, IRemoteCallback serverCallback) 82757e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi throws RemoteException { 82857e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi try { 82957e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi final PowerManager.WakeLock wakeLock = powerManager.newWakeLock( 83057e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi PowerManager.PARTIAL_WAKE_LOCK, "lockoutResetCallback"); 83157e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi wakeLock.acquire(); 83257e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi mHandler.post(() -> { 8335e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi try { 8345e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi callback.onLockoutReset(); 8355e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi } finally { 8365e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi wakeLock.release(); 8375e354223d817477efac9a6a2e3ce3d9161e046a4Jorim Jaggi } 83857e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi }); 83957e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi } finally { 84057e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi serverCallback.sendResult(null /* data */); 84157e2f4db3535fb059ac278499018951deddc4c82Jorim Jaggi } 8423a464785088e7fd206666f640912729533948ce8Jorim Jaggi } 8433a464785088e7fd206666f640912729533948ce8Jorim Jaggi }); 8443a464785088e7fd206666f640912729533948ce8Jorim Jaggi } catch (RemoteException e) { 845c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 8463a464785088e7fd206666f640912729533948ce8Jorim Jaggi } 8473a464785088e7fd206666f640912729533948ce8Jorim Jaggi } else { 8483a464785088e7fd206666f640912729533948ce8Jorim Jaggi Log.w(TAG, "addLockoutResetCallback(): Service not connected!"); 849e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller } 850e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller } 851e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller 85224e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin private class MyHandler extends Handler { 85324e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin private MyHandler(Context context) { 85424e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin super(context.getMainLooper()); 85524e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin } 85624e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin 857f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private MyHandler(Looper looper) { 858f501b58de8f467a80fef49c704555781bc61ea6fJim Miller super(looper); 859f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 860f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 861e0507bbbf95ae6d958c900f32122baf078d47d71Jim Miller @Override 8629f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public void handleMessage(android.os.Message msg) { 8639f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller switch(msg.what) { 8649f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller case MSG_ENROLL_RESULT: 8659f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller sendEnrollResult((Fingerprint) msg.obj, msg.arg1 /* remaining */); 8669f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller break; 8679f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller case MSG_ACQUIRED: 86840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */, 86940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller msg.arg2 /* vendorCode */); 8709f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller break; 871f501b58de8f467a80fef49c704555781bc61ea6fJim Miller case MSG_AUTHENTICATION_SUCCEEDED: 872837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller sendAuthenticatedSucceeded((Fingerprint) msg.obj, msg.arg1 /* userId */); 873f501b58de8f467a80fef49c704555781bc61ea6fJim Miller break; 874f501b58de8f467a80fef49c704555781bc61ea6fJim Miller case MSG_AUTHENTICATION_FAILED: 875f501b58de8f467a80fef49c704555781bc61ea6fJim Miller sendAuthenticatedFailed(); 8769f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller break; 8779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller case MSG_ERROR: 87840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller sendErrorResult((Long) msg.obj /* deviceId */, msg.arg1 /* errMsgId */, 87940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller msg.arg2 /* vendorCode */); 8809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller break; 8819f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller case MSG_REMOVED: 882ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He sendRemovedResult((Fingerprint) msg.obj, msg.arg1 /* remaining */); 883e64399649a32bc8845610b5b0564e7eab69cc6f3Kevin Chyn break; 88440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller case MSG_ENUMERATED: 88540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller sendEnumeratedResult((Long) msg.obj /* deviceId */, msg.arg1 /* fingerId */, 88640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller msg.arg2 /* groupId */); 887e64399649a32bc8845610b5b0564e7eab69cc6f3Kevin Chyn break; 8889f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 88908fa40c5cb5229b7969b2a5146855a337870f45aJim Miller } 8909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 891ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He private void sendRemovedResult(Fingerprint fingerprint, int remaining) { 892ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He if (mRemovalCallback == null) { 893ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He return; 894ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He } 895ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He if (fingerprint == null) { 896ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He Log.e(TAG, "Received MSG_REMOVED, but fingerprint is null"); 897ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He return; 898a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 899ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He 900ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He int fingerId = fingerprint.getFingerId(); 901ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He int reqFingerId = mRemovalFingerprint.getFingerId(); 902ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He if (reqFingerId != 0 && fingerId != 0 && fingerId != reqFingerId) { 903ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He Log.w(TAG, "Finger id didn't match: " + fingerId + " != " + reqFingerId); 904ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He return; 905ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He } 906ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He int groupId = fingerprint.getGroupId(); 907ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He int reqGroupId = mRemovalFingerprint.getGroupId(); 908ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He if (groupId != reqGroupId) { 909ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He Log.w(TAG, "Group id didn't match: " + groupId + " != " + reqGroupId); 910ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He return; 911ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He } 912ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He 913ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He mRemovalCallback.onRemovalSucceeded(fingerprint, remaining); 914a7596147b43940cad3f76c53ed154ef088b9269bJim Miller } 915a7596147b43940cad3f76c53ed154ef088b9269bJim Miller 91640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private void sendEnumeratedResult(long deviceId, int fingerId, int groupId) { 91740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller if (mEnumerateCallback != null) { 91840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mEnumerateCallback.onEnumerate(new Fingerprint(null, groupId, fingerId, deviceId)); 91940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 92040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 92140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller 92240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private void sendErrorResult(long deviceId, int errMsgId, int vendorCode) { 92340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller // emulate HAL 2.1 behavior and send real errMsgId 92440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller final int clientErrMsgId = errMsgId == FINGERPRINT_ERROR_VENDOR 92540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller ? (vendorCode + FINGERPRINT_ERROR_VENDOR_BASE) : errMsgId; 9269f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mEnrollmentCallback != null) { 92740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mEnrollmentCallback.onEnrollmentError(clientErrMsgId, 92840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(errMsgId, vendorCode)); 9299f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } else if (mAuthenticationCallback != null) { 93040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mAuthenticationCallback.onAuthenticationError(clientErrMsgId, 93140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(errMsgId, vendorCode)); 9329f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } else if (mRemovalCallback != null) { 93340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId, 93440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(errMsgId, vendorCode)); 93540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } else if (mEnumerateCallback != null) { 93640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mEnumerateCallback.onEnumerateError(clientErrMsgId, 93740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller getErrorString(errMsgId, vendorCode)); 9389f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9399f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9409f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 9419f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private void sendEnrollResult(Fingerprint fp, int remaining) { 9429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mEnrollmentCallback != null) { 9439f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mEnrollmentCallback.onEnrollmentProgress(remaining); 9449f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9459f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9469f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 947837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller private void sendAuthenticatedSucceeded(Fingerprint fp, int userId) { 9489f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mAuthenticationCallback != null) { 949837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller final AuthenticationResult result = 950837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller new AuthenticationResult(mCryptoObject, fp, userId); 951f501b58de8f467a80fef49c704555781bc61ea6fJim Miller mAuthenticationCallback.onAuthenticationSucceeded(result); 952f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 953f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 954f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 955f501b58de8f467a80fef49c704555781bc61ea6fJim Miller private void sendAuthenticatedFailed() { 956f501b58de8f467a80fef49c704555781bc61ea6fJim Miller if (mAuthenticationCallback != null) { 957d717808bd0883cea7723a8e0b794e156b140a7daKevin Chyn mAuthenticationCallback.onAuthenticationFailed(); 9589f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9599f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9609f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 96140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private void sendAcquiredResult(long deviceId, int acquireInfo, int vendorCode) { 9624cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi if (mAuthenticationCallback != null) { 9634cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi mAuthenticationCallback.onAuthenticationAcquired(acquireInfo); 9644cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi } 96540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller final String msg = getAcquiredString(acquireInfo, vendorCode); 9664cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi if (msg == null) { 9674cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi return; 9684cfdcf5b0551e5656ea379c428e78b812c2e5cbeJorim Jaggi } 96940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller // emulate HAL 2.1 behavior and send real acquiredInfo 97040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller final int clientInfo = acquireInfo == FINGERPRINT_ACQUIRED_VENDOR 97140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller ? (vendorCode + FINGERPRINT_ACQUIRED_VENDOR_BASE) : acquireInfo; 9729f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mEnrollmentCallback != null) { 97340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mEnrollmentCallback.onEnrollmentHelp(clientInfo, msg); 9749f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } else if (mAuthenticationCallback != null) { 97540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mAuthenticationCallback.onAuthenticationHelp(clientInfo, msg); 9769f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9779f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller }; 979ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 980ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller /** 981ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller * @hide 982ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller */ 9839f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public FingerprintManager(Context context, IFingerprintService service) { 9849f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mContext = context; 9859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mService = service; 9869f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller if (mService == null) { 9879f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller Slog.v(TAG, "FingerprintManagerService was null"); 9889f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 98924e9e966a85c416a94482fcd10dbdd10ceeb9e6cAlex Klyubin mHandler = new MyHandler(context); 9909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 9919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 9929f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private int getCurrentUserId() { 9939f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller try { 994dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka return ActivityManager.getService().getCurrentUser().id; 9959f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } catch (RemoteException e) { 996c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 997ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 998ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 999ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller 1000fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller private void cancelEnrollment() { 1001ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mService != null) try { 1002ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller mService.cancelEnrollment(mToken); 1003ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } catch (RemoteException e) { 1004c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1005ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 1006ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 1007ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 1008ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller private void cancelAuthentication(CryptoObject cryptoObject) { 1009ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller if (mService != null) try { 10104af76a51d5082c740609563e07cf35f30bc2224eSvetoslav mService.cancelAuthentication(mToken, mContext.getOpPackageName()); 1011ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } catch (RemoteException e) { 1012c53962d4ede82a03b62f0c8bb86bd0da090a15ebJeff Sharkey throw e.rethrowFromSystemServer(); 1013ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 1014ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 1015ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller 101640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private String getErrorString(int errMsg, int vendorCode) { 1017ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller switch (errMsg) { 1018ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ERROR_UNABLE_TO_PROCESS: 1019ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1020ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_error_unable_to_process); 1021ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ERROR_HW_UNAVAILABLE: 1022ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1023ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_error_hw_not_available); 1024ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ERROR_NO_SPACE: 1025ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1026ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_error_no_space); 1027ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ERROR_TIMEOUT: 1028fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller return mContext.getString(com.android.internal.R.string.fingerprint_error_timeout); 1029fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller case FINGERPRINT_ERROR_CANCELED: 1030fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller return mContext.getString(com.android.internal.R.string.fingerprint_error_canceled); 1031fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller case FINGERPRINT_ERROR_LOCKOUT: 1032fe6439f02db3a541d77a7afb27e3bca1ae7493edJim Miller return mContext.getString(com.android.internal.R.string.fingerprint_error_lockout); 1033df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn case FINGERPRINT_ERROR_LOCKOUT_PERMANENT: 1034df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn return mContext.getString( 1035df9d33e9039d8567ea82f67a76d95a7ae7ab8df8Kevin Chyn com.android.internal.R.string.fingerprint_error_lockout_permanent); 103640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller case FINGERPRINT_ERROR_VENDOR: { 1037ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String[] msgArray = mContext.getResources().getStringArray( 1038ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.array.fingerprint_error_vendor); 103940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller if (vendorCode < msgArray.length) { 104040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller return msgArray[vendorCode]; 1041ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 10429f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 1043ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 104440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller Slog.w(TAG, "Invalid error message: " + errMsg + ", " + vendorCode); 104540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller return null; 1046ba67aee02cf864793129976cd8a8a46e60c60577Jim Miller } 104799d6019bead4705b7e126e65b856d538417d4934Jim Miller 104840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller private String getAcquiredString(int acquireInfo, int vendorCode) { 1049ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller switch (acquireInfo) { 1050ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_GOOD: 1051ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return null; 1052ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_PARTIAL: 1053ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1054ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_acquired_partial); 1055ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_INSUFFICIENT: 1056ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1057ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_acquired_insufficient); 1058ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_IMAGER_DIRTY: 1059ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1060ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_acquired_imager_dirty); 1061ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_TOO_SLOW: 1062ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1063ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_acquired_too_slow); 1064ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller case FINGERPRINT_ACQUIRED_TOO_FAST: 1065ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller return mContext.getString( 1066ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.string.fingerprint_acquired_too_fast); 106740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller case FINGERPRINT_ACQUIRED_VENDOR: { 1068ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller String[] msgArray = mContext.getResources().getStringArray( 1069ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller com.android.internal.R.array.fingerprint_acquired_vendor); 107040e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller if (vendorCode < msgArray.length) { 107140e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller return msgArray[vendorCode]; 1072ce7eb6daf06a88129da365eb2112537ce0bb1b75Jim Miller } 10739f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 107499d6019bead4705b7e126e65b856d538417d4934Jim Miller } 107540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller Slog.w(TAG, "Invalid acquired message: " + acquireInfo + ", " + vendorCode); 107640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller return null; 107799d6019bead4705b7e126e65b856d538417d4934Jim Miller } 10789f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 10799f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller private IFingerprintServiceReceiver mServiceReceiver = new IFingerprintServiceReceiver.Stub() { 10809f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1081f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 10829f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller public void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining) { 10839f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller mHandler.obtainMessage(MSG_ENROLL_RESULT, remaining, 0, 10849f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller new Fingerprint(null, groupId, fingerId, deviceId)).sendToTarget(); 10859f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 10869f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1087f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 108840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onAcquired(long deviceId, int acquireInfo, int vendorCode) { 108940e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mHandler.obtainMessage(MSG_ACQUIRED, acquireInfo, vendorCode, deviceId).sendToTarget(); 10909f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 10919f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1092f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 1093837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller public void onAuthenticationSucceeded(long deviceId, Fingerprint fp, int userId) { 1094837fa7e56dc4e91feaf104bd09ef5e03065b1b86Jim Miller mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp).sendToTarget(); 1095f501b58de8f467a80fef49c704555781bc61ea6fJim Miller } 1096f501b58de8f467a80fef49c704555781bc61ea6fJim Miller 1097f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 1098f501b58de8f467a80fef49c704555781bc61ea6fJim Miller public void onAuthenticationFailed(long deviceId) { 1099436ab6a91d64ef6036c67bb361d807e398fb2c4cFelipe Leme mHandler.obtainMessage(MSG_AUTHENTICATION_FAILED).sendToTarget(); 11009f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 11019f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1102f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 110340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onError(long deviceId, int error, int vendorCode) { 110440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mHandler.obtainMessage(MSG_ERROR, error, vendorCode, deviceId).sendToTarget(); 11059f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 11069f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 1107f501b58de8f467a80fef49c704555781bc61ea6fJim Miller @Override // binder call 110840e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onRemoved(long deviceId, int fingerId, int groupId, int remaining) { 1109ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He mHandler.obtainMessage(MSG_REMOVED, remaining, 0, 1110ee17d352d641cdcfc955f0e37b0ca042427f2879Charles He new Fingerprint(null, groupId, fingerId, deviceId)).sendToTarget(); 11119f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller } 111240e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller 111340e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller @Override // binder call 111440e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller public void onEnumerated(long deviceId, int fingerId, int groupId, int remaining) { 111540e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller // TODO: propagate remaining 111640e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller mHandler.obtainMessage(MSG_ENUMERATED, fingerId, groupId, deviceId).sendToTarget(); 111740e4645e6e564b962bb73c85c5325ec54ad34cc1Jim Miller } 11189f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller }; 11199f0753f5a378fc80da86305b33244acc6fc53f01Jim Miller 11204d41a203a08c55b3f3190519535ccee6557ea4feAndres Morales} 1121