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;
18 
19 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
20 import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY;
21 
22 import android.content.Context;
23 import android.content.Intent;
24 import android.os.UserHandle;
25 import android.os.UserManager;
26 import android.text.TextUtils;
27 
28 import androidx.preference.Preference;
29 
30 import com.android.internal.widget.LockPatternUtils;
31 import com.android.settings.Utils;
32 import com.android.settings.core.BasePreferenceController;
33 import com.android.settings.overlay.FeatureFactory;
34 
35 public abstract class BiometricStatusPreferenceController extends BasePreferenceController {
36 
37     protected final UserManager mUm;
38     protected final LockPatternUtils mLockPatternUtils;
39 
40     private final int mUserId = UserHandle.myUserId();
41     protected final int mProfileChallengeUserId;
42 
43     /**
44      * @return true if the manager is not null and the hardware is detected.
45      */
isDeviceSupported()46     protected abstract boolean isDeviceSupported();
47 
48     /**
49      * @return true if the user has enrolled biometrics of the subclassed type.
50      */
hasEnrolledBiometrics()51     protected abstract boolean hasEnrolledBiometrics();
52 
53     /**
54      * @return the summary text if biometrics are enrolled.
55      */
getSummaryTextEnrolled()56     protected abstract String getSummaryTextEnrolled();
57 
58     /**
59      * @return the summary text if no biometrics are enrolled.
60      */
getSummaryTextNoneEnrolled()61     protected abstract String getSummaryTextNoneEnrolled();
62 
63     /**
64      * @return the class name for the settings page.
65      */
getSettingsClassName()66     protected abstract String getSettingsClassName();
67 
68     /**
69      * @return the class name for entry to enrollment.
70      */
getEnrollClassName()71     protected abstract String getEnrollClassName();
72 
BiometricStatusPreferenceController(Context context, String key)73     public BiometricStatusPreferenceController(Context context, String key) {
74         super(context, key);
75         mUm = (UserManager) context.getSystemService(Context.USER_SERVICE);
76         mLockPatternUtils = FeatureFactory.getFactory(context)
77                 .getSecurityFeatureProvider()
78                 .getLockPatternUtils(context);
79         mProfileChallengeUserId = Utils.getManagedProfileId(mUm, mUserId);
80     }
81 
82     @Override
getAvailabilityStatus()83     public int getAvailabilityStatus() {
84         if (!isDeviceSupported()) {
85             return UNSUPPORTED_ON_DEVICE;
86         }
87         if (isUserSupported()) {
88             return AVAILABLE;
89         } else {
90             return DISABLED_FOR_USER;
91         }
92     }
93 
94     @Override
updateState(Preference preference)95     public void updateState(Preference preference) {
96         if (!isAvailable()) {
97             if (preference != null) {
98                 preference.setVisible(false);
99             }
100             return;
101         } else {
102             preference.setVisible(true);
103         }
104         preference.setSummary(hasEnrolledBiometrics() ? getSummaryTextEnrolled()
105                 : getSummaryTextNoneEnrolled());
106     }
107 
108     @Override
handlePreferenceTreeClick(Preference preference)109     public boolean handlePreferenceTreeClick(Preference preference) {
110         if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) {
111             return super.handlePreferenceTreeClick(preference);
112         }
113 
114         final Context context = preference.getContext();
115         final UserManager userManager = UserManager.get(context);
116         final int userId = getUserId();
117         if (Utils.startQuietModeDialogIfNecessary(context, userManager, userId)) {
118             return false;
119         }
120 
121         final Intent intent = new Intent();
122         final String clazz = hasEnrolledBiometrics() ? getSettingsClassName()
123                 : getEnrollClassName();
124         intent.setClassName(SETTINGS_PACKAGE_NAME, clazz);
125         intent.putExtra(Intent.EXTRA_USER_ID, userId);
126         intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true);
127         context.startActivity(intent);
128         return true;
129     }
130 
getUserId()131     protected int getUserId() {
132         return mUserId;
133     }
134 
isUserSupported()135     protected boolean isUserSupported() {
136         return true;
137     }
138 }
139