| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License |
| */ |
| |
| package com.android.settings.homepage.contextualcards; |
| |
| |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.hardware.face.Face; |
| import android.hardware.face.FaceManager; |
| import android.os.Bundle; |
| import android.util.Log; |
| |
| import com.android.internal.app.AlertActivity; |
| import com.android.internal.app.AlertController; |
| import com.android.settings.R; |
| import com.android.settings.Utils; |
| import com.android.settings.homepage.contextualcards.slices.FaceSetupSlice; |
| |
| /** |
| * This class is used to show a popup dialog for {@link FaceSetupSlice}. |
| */ |
| public class FaceReEnrollDialog extends AlertActivity implements |
| DialogInterface.OnClickListener { |
| |
| private static final String TAG = "FaceReEnrollDialog"; |
| |
| private static final String BIOMETRIC_ENROLL_ACTION = "android.settings.BIOMETRIC_ENROLL"; |
| |
| private FaceManager mFaceManager; |
| /** |
| * The type of re-enrollment that has been requested, |
| * see {@link Settings.Secure#FACE_UNLOCK_RE_ENROLL} for more details. |
| */ |
| private int mReEnrollType; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| final PackageManager pm = getApplicationContext().getPackageManager(); |
| final int dialogMessageRes = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) |
| ? R.string.security_settings_face_enroll_improve_face_alert_body_fingerprint |
| : R.string.security_settings_face_enroll_improve_face_alert_body; |
| |
| final AlertController.AlertParams alertParams = mAlertParams; |
| alertParams.mTitle = getText( |
| R.string.security_settings_face_enroll_improve_face_alert_title); |
| alertParams.mMessage = getText(dialogMessageRes); |
| alertParams.mPositiveButtonText = getText(R.string.storage_menu_set_up); |
| alertParams.mNegativeButtonText = getText(R.string.cancel); |
| alertParams.mPositiveButtonListener = this; |
| |
| mFaceManager = Utils.getFaceManagerOrNull(getApplicationContext()); |
| |
| final Context context = getApplicationContext(); |
| mReEnrollType = FaceSetupSlice.getReEnrollSetting(context, getUserId()); |
| |
| Log.d(TAG, "ReEnroll Type : " + mReEnrollType); |
| if (mReEnrollType == FaceSetupSlice.FACE_RE_ENROLL_SUGGESTED) { |
| // setupAlert will actually display the popup dialog. |
| setupAlert(); |
| } else if (mReEnrollType == FaceSetupSlice.FACE_RE_ENROLL_REQUIRED) { |
| // in this case we are skipping the popup dialog and directly going to the |
| // re enrollment flow. A grey overlay will appear to indicate that we are |
| // transitioning. |
| removeFaceAndReEnroll(); |
| } else { |
| Log.d(TAG, "Error unsupported flow for : " + mReEnrollType); |
| dismiss(); |
| } |
| } |
| |
| @Override |
| public void onClick(DialogInterface dialog, int which) { |
| removeFaceAndReEnroll(); |
| } |
| |
| public void removeFaceAndReEnroll() { |
| final int userId = getUserId(); |
| if (mFaceManager == null || !mFaceManager.hasEnrolledTemplates(userId)) { |
| finish(); |
| } |
| mFaceManager.remove(new Face("", 0, 0), userId, new FaceManager.RemovalCallback() { |
| @Override |
| public void onRemovalError(Face face, int errMsgId, CharSequence errString) { |
| super.onRemovalError(face, errMsgId, errString); |
| finish(); |
| } |
| |
| @Override |
| public void onRemovalSucceeded(Face face, int remaining) { |
| super.onRemovalSucceeded(face, remaining); |
| if (remaining != 0) { |
| return; |
| } |
| // Send user to the enroll flow. |
| final Intent reEnroll = new Intent(BIOMETRIC_ENROLL_ACTION); |
| final Context context = getApplicationContext(); |
| |
| try { |
| startActivity(reEnroll); |
| } catch (Exception e) { |
| Log.e(TAG, "Failed to startActivity"); |
| } |
| |
| finish(); |
| } |
| }); |
| } |
| } |