1 /*
2  * Copyright (C) 2015 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.app.Activity;
20 import android.app.KeyguardManager;
21 import android.app.settings.SettingsEnums;
22 import android.content.Intent;
23 import android.hardware.fingerprint.FingerprintManager;
24 import android.os.Bundle;
25 import android.os.UserHandle;
26 import android.view.View;
27 
28 import com.android.internal.widget.LockPatternUtils;
29 import com.android.settings.SetupWizardUtils;
30 import com.android.settings.Utils;
31 import com.android.settings.biometrics.BiometricUtils;
32 import com.android.settings.password.ChooseLockSettingsHelper;
33 import com.android.settings.password.SetupChooseLockGeneric;
34 import com.android.settings.password.SetupSkipDialog;
35 
36 public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntroduction {
37     /**
38      * Returns the number of fingerprint enrolled.
39      */
40     private static final String EXTRA_FINGERPRINT_ENROLLED_COUNT = "fingerprint_enrolled_count";
41 
42     private static final String KEY_LOCK_SCREEN_PRESENT = "wasLockScreenPresent";
43     private boolean mAlreadyHadLockScreenSetup = false;
44 
45     @Override
onCreate(Bundle savedInstanceState)46     protected void onCreate(Bundle savedInstanceState) {
47         super.onCreate(savedInstanceState);
48         if (savedInstanceState == null) {
49             mAlreadyHadLockScreenSetup = isKeyguardSecure();
50         } else {
51             mAlreadyHadLockScreenSetup = savedInstanceState.getBoolean(
52                     KEY_LOCK_SCREEN_PRESENT, false);
53         }
54     }
55 
56     @Override
onSaveInstanceState(Bundle outState)57     protected void onSaveInstanceState(Bundle outState) {
58         super.onSaveInstanceState(outState);
59         outState.putBoolean(KEY_LOCK_SCREEN_PRESENT, mAlreadyHadLockScreenSetup);
60     }
61 
62     @Override
getEnrollingIntent()63     protected Intent getEnrollingIntent() {
64         final Intent intent = new Intent(this, SetupFingerprintEnrollFindSensor.class);
65         if (BiometricUtils.containsGatekeeperPasswordHandle(getIntent())) {
66             intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
67                     BiometricUtils.getGatekeeperPasswordHandle(getIntent()));
68         }
69         SetupWizardUtils.copySetupExtras(getIntent(), intent);
70         return intent;
71     }
72 
73     @Override
onActivityResult(int requestCode, int resultCode, Intent data)74     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
75         if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST && isKeyguardSecure()) {
76             // if lock was already present, do not return intent data since it must have been
77             // reported in previous attempts
78             if (!mAlreadyHadLockScreenSetup) {
79                 data = getMetricIntent(data);
80             }
81 
82             // Report fingerprint count if user adding a new fingerprint
83             if (resultCode == RESULT_FINISHED) {
84                 data = setFingerprintCount(data);
85             }
86         }
87         super.onActivityResult(requestCode, resultCode, data);
88     }
89 
getMetricIntent(Intent data)90     private Intent getMetricIntent(Intent data) {
91         if (data == null) {
92             data = new Intent();
93         }
94         LockPatternUtils lockPatternUtils = new LockPatternUtils(this);
95         data.putExtra(SetupChooseLockGeneric.
96                 SetupChooseLockGenericFragment.EXTRA_PASSWORD_QUALITY,
97                 lockPatternUtils.getKeyguardStoredPasswordQuality(UserHandle.myUserId()));
98 
99         return data;
100     }
101 
setFingerprintCount(Intent data)102     private Intent setFingerprintCount(Intent data) {
103         if (data == null) {
104             data = new Intent();
105         }
106         final FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
107         if (fpm != null) {
108             int enrolled = fpm.getEnrolledFingerprints(mUserId).size();
109             data.putExtra(EXTRA_FINGERPRINT_ENROLLED_COUNT, enrolled);
110         }
111         return data;
112     }
113 
114     @Override
onCancelButtonClick(View view)115     protected void onCancelButtonClick(View view) {
116         final int resultCode;
117         Intent data;
118         if (isKeyguardSecure()) {
119             // If the keyguard is already set up securely (maybe the user added a backup screen
120             // lock and skipped fingerprint), return RESULT_SKIP directly.
121             resultCode = RESULT_SKIP;
122             data = mAlreadyHadLockScreenSetup ? null : getMetricIntent(null);
123         } else {
124             resultCode = SetupSkipDialog.RESULT_SKIP;
125             data = null;
126         }
127 
128         // User has explicitly canceled enroll. Don't restart it automatically.
129         data = setSkipPendingEnroll(data);
130 
131         setResult(resultCode, data);
132         finish();
133     }
134 
135     /**
136      * Propagate lock screen metrics if the user goes back from the fingerprint setup screen
137      * after having added lock screen to his device.
138      */
139     @Override
onBackPressed()140     public void onBackPressed() {
141         if (!mAlreadyHadLockScreenSetup && isKeyguardSecure()) {
142             setResult(Activity.RESULT_CANCELED, getMetricIntent(null));
143         }
144         super.onBackPressed();
145     }
146 
isKeyguardSecure()147     private boolean isKeyguardSecure() {
148         return getSystemService(KeyguardManager.class).isKeyguardSecure();
149     }
150 
151     @Override
getMetricsCategory()152     public int getMetricsCategory() {
153         return SettingsEnums.FINGERPRINT_ENROLL_INTRO_SETUP;
154     }
155 }
156