• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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.face;
18 
19 import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
20 
21 import android.app.admin.DevicePolicyManager;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.view.View;
25 import android.widget.Button;
26 
27 import androidx.annotation.NonNull;
28 import androidx.preference.Preference;
29 
30 import com.android.settings.R;
31 import com.android.settings.core.BasePreferenceController;
32 import com.android.settings.flags.Flags;
33 import com.android.settings.password.ChooseLockSettingsHelper;
34 import com.android.settingslib.RestrictedLockUtilsInternal;
35 import com.android.settingslib.widget.LayoutPreference;
36 
37 import com.google.android.setupdesign.util.ButtonStyler;
38 import com.google.android.setupdesign.util.PartnerStyleHelper;
39 
40 /**
41  * Preference controller that allows a user to enroll their face.
42  */
43 public class FaceSettingsEnrollButtonPreferenceController extends BasePreferenceController
44         implements View.OnClickListener, Preference.OnPreferenceClickListener {
45 
46     private static final String TAG = "FaceSettings/Remove";
47     static final String KEY = "security_settings_face_enroll_faces_container";
48     static final String KEY_1 = "security_settings_face_enroll";
49 
50     private final Context mContext;
51 
52     private int mUserId;
53     private byte[] mToken;
54     private Button mButton;
55     private boolean mIsClicked;
56     private Listener mListener;
57 
FaceSettingsEnrollButtonPreferenceController(Context context)58     public FaceSettingsEnrollButtonPreferenceController(Context context) {
59         this(context, Flags.biometricsOnboardingEducation() ? KEY_1 : KEY);
60     }
61 
FaceSettingsEnrollButtonPreferenceController(Context context, String preferenceKey)62     public FaceSettingsEnrollButtonPreferenceController(Context context, String preferenceKey) {
63         super(context, preferenceKey);
64         mContext = context;
65     }
66 
67     @Override
updateState(@onNull Preference preference)68     public void updateState(@NonNull Preference preference) {
69         super.updateState(preference);
70         final boolean isDeviceOwnerBlockingAuth =
71                 RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
72                         mContext, DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null;
73 
74         if (Flags.biometricsOnboardingEducation()) {
75             preference.setEnabled(!isDeviceOwnerBlockingAuth);
76         } else {
77             mButton = ((LayoutPreference) preference).findViewById(
78                     R.id.security_settings_face_settings_enroll_button);
79 
80             if (PartnerStyleHelper.shouldApplyPartnerResource(mButton)) {
81                 ButtonStyler.applyPartnerCustomizationPrimaryButtonStyle(mContext, mButton);
82             }
83 
84             mButton.setOnClickListener(this);
85             mButton.setEnabled(!isDeviceOwnerBlockingAuth);
86         }
87     }
88 
89     @Override
onClick(View v)90     public void onClick(View v) {
91         startEnrolling();
92     }
93 
94     @Override
onPreferenceClick(@onNull Preference preference)95     public boolean onPreferenceClick(@NonNull Preference preference) {
96         startEnrolling();
97         return true;
98     }
99 
startEnrolling()100     private void startEnrolling() {
101         mIsClicked = true;
102         final Intent intent = new Intent();
103         intent.setClassName(SETTINGS_PACKAGE_NAME, FaceEnroll.class.getName());
104         intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
105         intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
106         if (mListener != null) {
107             mListener.onStartEnrolling(intent);
108         } else {
109             mContext.startActivity(intent);
110         }
111     }
112 
113     @Override
getAvailabilityStatus()114     public int getAvailabilityStatus() {
115         return AVAILABLE;
116     }
117 
setUserId(int userId)118     public void setUserId(int userId) {
119         mUserId = userId;
120     }
121 
setToken(byte[] token)122     public void setToken(byte[] token) {
123         mToken = token;
124     }
125 
126     // Return the click state, then clear its state.
isClicked()127     public boolean isClicked() {
128         final boolean wasClicked = mIsClicked;
129         mIsClicked = false;
130         return wasClicked;
131     }
132 
setListener(Listener listener)133     public void setListener(Listener listener) {
134         mListener = listener;
135     }
136 
137     /**
138      * Interface for registering callbacks related to the face enroll preference button.
139      */
140     public interface Listener {
141         /**
142          * Called when the user has indicated an intent to begin enrolling a new face.
143          * @param intent The Intent that should be used to launch face enrollment.
144          */
onStartEnrolling(Intent intent)145         void onStartEnrolling(Intent intent);
146     }
147 }
148