• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.biometrics.fingerprint;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.hardware.fingerprint.Fingerprint;
22 import android.hardware.fingerprint.FingerprintEnrollOptions;
23 import android.hardware.fingerprint.FingerprintManager;
24 import android.os.CancellationSignal;
25 
26 import androidx.annotation.Nullable;
27 
28 import com.android.settings.Utils;
29 import com.android.settings.biometrics.BiometricUtils;
30 import com.android.settings.flags.Flags;
31 import com.android.settings.safetycenter.BiometricsSafetySource;
32 import com.android.settings.safetycenter.FingerprintSafetySource;
33 
34 /**
35  * Responsible for making {@link FingerprintManager#enroll} and {@link FingerprintManager#remove}
36  * calls and thus updating the fingerprint setting.
37  */
38 public class FingerprintUpdater {
39 
40     private final Context mContext;
41     private final FingerprintManager mFingerprintManager;
42 
FingerprintUpdater(Context context)43     public FingerprintUpdater(Context context) {
44         mContext = context;
45         mFingerprintManager = Utils.getFingerprintManagerOrNull(context);
46     }
47 
FingerprintUpdater(Context context, FingerprintManager fingerprintManager)48     public FingerprintUpdater(Context context, FingerprintManager fingerprintManager) {
49         mContext = context;
50         mFingerprintManager = fingerprintManager;
51     }
52 
53     /** Wrapper around the {@link FingerprintManager#enroll} method. */
enroll( byte[] hardwareAuthToken, CancellationSignal cancel, int userId, FingerprintManager.EnrollmentCallback callback, @FingerprintManager.EnrollReason int enrollReason, Intent intent)54     public void enroll(
55             byte[] hardwareAuthToken,
56             CancellationSignal cancel,
57             int userId,
58             FingerprintManager.EnrollmentCallback callback,
59             @FingerprintManager.EnrollReason int enrollReason,
60             Intent intent) {
61         mFingerprintManager.enroll(
62                 hardwareAuthToken,
63                 cancel,
64                 userId,
65                 new NotifyingEnrollmentCallback(mContext, callback),
66                 enrollReason,
67                 toFingerprintEnrollOptions(intent));
68     }
69 
70     /** Wrapper around the {@link FingerprintManager#remove} method. */
remove(Fingerprint fp, int userId, FingerprintManager.RemovalCallback callback)71     public void remove(Fingerprint fp, int userId, FingerprintManager.RemovalCallback callback) {
72         mFingerprintManager.remove(fp, userId, new NotifyingRemovalCallback(mContext, callback));
73     }
74 
75     /**
76      * Decorator of the {@link FingerprintManager.EnrollmentCallback} class that notifies other
77      * interested parties that a fingerprint setting has changed.
78      */
79     private static class NotifyingEnrollmentCallback extends FingerprintManager.EnrollmentCallback {
80 
81         private final Context mContext;
82         private final FingerprintManager.EnrollmentCallback mCallback;
83 
NotifyingEnrollmentCallback( Context context, FingerprintManager.EnrollmentCallback callback)84         NotifyingEnrollmentCallback(
85                 Context context, FingerprintManager.EnrollmentCallback callback) {
86             mContext = context;
87             mCallback = callback;
88         }
89 
90         @Override
onEnrollmentError(int errMsgId, CharSequence errString)91         public void onEnrollmentError(int errMsgId, CharSequence errString) {
92             mCallback.onEnrollmentError(errMsgId, errString);
93         }
94 
95         @Override
onEnrollmentHelp(int helpMsgId, CharSequence helpString)96         public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
97             mCallback.onEnrollmentHelp(helpMsgId, helpString);
98         }
99 
100         @Override
onEnrollmentProgress(int remaining)101         public void onEnrollmentProgress(int remaining) {
102             mCallback.onEnrollmentProgress(remaining);
103             if (remaining == 0) {
104                 if (Flags.biometricsOnboardingEducation()) {
105                     FingerprintSafetySource.onBiometricsChanged(mContext);
106                 } else {
107                     BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
108                 }
109             }
110         }
111 
112         @Override
onAcquired(boolean isAcquiredGood)113         public void onAcquired(boolean isAcquiredGood) {
114             mCallback.onAcquired(isAcquiredGood);
115         }
116 
117         @Override
onUdfpsPointerDown(int sensorId)118         public void onUdfpsPointerDown(int sensorId) {
119             mCallback.onUdfpsPointerDown(sensorId);
120         }
121 
122         @Override
onUdfpsPointerUp(int sensorId)123         public void onUdfpsPointerUp(int sensorId) {
124             mCallback.onUdfpsPointerUp(sensorId);
125         }
126 
127         @Override
onUdfpsOverlayShown()128         public void onUdfpsOverlayShown() {
129             mCallback.onUdfpsOverlayShown();
130         }
131     }
132 
133     /**
134      * Decorator of the {@link FingerprintManager.RemovalCallback} class that notifies other
135      * interested parties that a fingerprint setting has changed.
136      */
137     private static class NotifyingRemovalCallback extends FingerprintManager.RemovalCallback {
138 
139         private final Context mContext;
140         private final FingerprintManager.RemovalCallback mCallback;
141 
NotifyingRemovalCallback(Context context, FingerprintManager.RemovalCallback callback)142         NotifyingRemovalCallback(Context context, FingerprintManager.RemovalCallback callback) {
143             mContext = context;
144             mCallback = callback;
145         }
146 
147         @Override
onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString)148         public void onRemovalError(Fingerprint fp, int errMsgId, CharSequence errString) {
149             mCallback.onRemovalError(fp, errMsgId, errString);
150         }
151 
152         @Override
onRemovalSucceeded(@ullable Fingerprint fp, int remaining)153         public void onRemovalSucceeded(@Nullable Fingerprint fp, int remaining) {
154             mCallback.onRemovalSucceeded(fp, remaining);
155             if (Flags.biometricsOnboardingEducation()) {
156                 FingerprintSafetySource.onBiometricsChanged(mContext);
157             } else {
158                 BiometricsSafetySource.onBiometricsChanged(mContext); // biometrics data changed
159             }
160         }
161     }
162 
toFingerprintEnrollOptions(Intent intent)163     private FingerprintEnrollOptions toFingerprintEnrollOptions(Intent intent) {
164         final int reason = intent.getIntExtra(BiometricUtils.EXTRA_ENROLL_REASON, -1);
165         final FingerprintEnrollOptions.Builder builder = new FingerprintEnrollOptions.Builder();
166         builder.setEnrollReason(FingerprintEnrollOptions.ENROLL_REASON_UNKNOWN);
167         if (reason != -1) {
168             builder.setEnrollReason(reason);
169         }
170         return builder.build();
171     }
172 }
173