1 /*
2  * Copyright (C) 2018 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.hardware.fingerprint.FingerprintManager;
21 
22 import androidx.annotation.Nullable;
23 import androidx.lifecycle.Lifecycle;
24 import androidx.lifecycle.LifecycleObserver;
25 import androidx.lifecycle.OnLifecycleEvent;
26 import androidx.preference.Preference;
27 import androidx.preference.PreferenceScreen;
28 
29 import com.android.internal.annotations.VisibleForTesting;
30 import com.android.settings.Utils;
31 import com.android.settings.biometrics.BiometricStatusPreferenceController;
32 import com.android.settingslib.RestrictedLockUtils;
33 import com.android.settingslib.RestrictedPreference;
34 
35 public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController
36         implements LifecycleObserver {
37 
38     public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
39 
40     protected final FingerprintManager mFingerprintManager;
41     @VisibleForTesting
42     RestrictedPreference mPreference;
43     protected final FingerprintStatusUtils mFingerprintStatusUtils;
44     private PreferenceScreen mPreferenceScreen;
45 
FingerprintStatusPreferenceController(Context context)46     public FingerprintStatusPreferenceController(Context context) {
47         this(context, KEY_FINGERPRINT_SETTINGS);
48     }
49 
FingerprintStatusPreferenceController(Context context, String key)50     public FingerprintStatusPreferenceController(Context context, String key) {
51         this(context, key, null /* lifecycle */);
52     }
53 
FingerprintStatusPreferenceController(Context context, Lifecycle lifecycle)54     public FingerprintStatusPreferenceController(Context context, Lifecycle lifecycle) {
55         this(context, KEY_FINGERPRINT_SETTINGS, lifecycle);
56     }
57 
FingerprintStatusPreferenceController(Context context, String key, Lifecycle lifecycle)58     public FingerprintStatusPreferenceController(Context context, String key, Lifecycle lifecycle) {
59         super(context, key);
60         mFingerprintManager = Utils.getFingerprintManagerOrNull(context);
61         mFingerprintStatusUtils =
62                 new FingerprintStatusUtils(context, mFingerprintManager, getUserId());
63 
64         if (lifecycle != null) {
65             lifecycle.addObserver(this);
66         }
67     }
68 
69     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
onResume()70     public void onResume() {
71         updateStateInternal();
72         if (mPreferenceScreen != null) {
73             displayPreference(mPreferenceScreen);
74         }
75     }
76 
77     @Override
displayPreference(PreferenceScreen screen)78     public void displayPreference(PreferenceScreen screen) {
79         super.displayPreference(screen);
80         mPreferenceScreen = screen;
81         mPreference = screen.findPreference(mPreferenceKey);
82     }
83 
84     @Override
isDeviceSupported()85     protected boolean isDeviceSupported() {
86         return mFingerprintStatusUtils.isAvailable();
87     }
88 
89     @Override
isHardwareSupported()90     protected boolean isHardwareSupported() {
91         return Utils.hasFingerprintHardware(mContext);
92     }
93 
94     @Override
updateState(Preference preference)95     public void updateState(Preference preference) {
96         super.updateState(preference);
97         updateStateInternal();
98     }
99 
updateStateInternal()100     private void updateStateInternal() {
101         updateStateInternal(mFingerprintStatusUtils.getDisablingAdmin());
102     }
103 
104     @Override
getSummaryText()105     protected String getSummaryText() {
106         return mFingerprintStatusUtils.getSummary();
107     }
108 
109     @Override
getSettingsClassName()110     protected String getSettingsClassName() {
111         return mFingerprintStatusUtils.getSettingsClassName();
112     }
113 
114     @VisibleForTesting
updateStateInternal(@ullable RestrictedLockUtils.EnforcedAdmin enforcedAdmin)115     void updateStateInternal(@Nullable RestrictedLockUtils.EnforcedAdmin enforcedAdmin) {
116         if (mPreference != null) {
117             mPreference.setDisabledByAdmin(enforcedAdmin);
118         }
119     }
120 
setPreferenceScreen(PreferenceScreen preferenceScreen)121     public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
122         mPreferenceScreen = preferenceScreen;
123     }
124 }
125