• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 android.provider.Settings.ACTION_BIOMETRIC_ENROLL;
20 
21 import static androidx.test.espresso.intent.Intents.intended;
22 import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
23 import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra;
24 
25 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS;
26 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE;
27 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
28 
29 import static com.google.common.truth.Truth.assertThat;
30 
31 import static org.junit.Assume.assumeTrue;
32 
33 import android.content.Context;
34 import android.content.Intent;
35 import android.content.pm.PackageManager;
36 import android.os.UserHandle;
37 
38 import androidx.test.core.app.ActivityScenario;
39 import androidx.test.core.app.ApplicationProvider;
40 import androidx.test.espresso.intent.Intents;
41 import androidx.test.ext.junit.runners.AndroidJUnit4;
42 import androidx.test.filters.MediumTest;
43 
44 import com.android.internal.widget.LockPatternChecker;
45 import com.android.internal.widget.LockPatternUtils;
46 import com.android.internal.widget.LockscreenCredential;
47 import com.android.settings.biometrics.face.FaceEnrollIntroduction;
48 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
49 import com.android.settings.password.ChooseLockGeneric;
50 import com.android.settings.password.ChooseLockSettingsHelper;
51 import com.android.settings.password.ConfirmLockPassword;
52 import com.android.settings.testutils.AdbUtils;
53 
54 import org.junit.After;
55 import org.junit.Before;
56 import org.junit.Test;
57 import org.junit.runner.RunWith;
58 
59 @RunWith(AndroidJUnit4.class)
60 @MediumTest
61 public class BiometricEnrollActivityTest {
62 
63     private static final String TAG = "BiometricEnrollActivityTest";
64     private static final int ADB_TIMEOUT_MS = 5000;
65     private static final String TEST_PIN = "1234";
66 
67     private final Context  mContext = ApplicationProvider.getApplicationContext();
68     private boolean mHasFace;
69     private boolean mHasFingerprint;
70 
71     @Before
setup()72     public void setup() {
73         Intents.init();
74         final PackageManager pm = mContext.getPackageManager();
75         mHasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
76         mHasFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
77     }
78 
79     @After
teardown()80     public void teardown() throws Exception {
81         Intents.release();
82         AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings clear --old " + TEST_PIN,
83                 "", "", ADB_TIMEOUT_MS);
84     }
85 
86     @Test
launchWithoutPin_setsPin()87     public void launchWithoutPin_setsPin() {
88         try (ActivityScenario<BiometricEnrollActivity> scenario =
89                      ActivityScenario.launch(getIntent())) {
90             intended(hasComponent(ChooseLockGeneric.class.getName()));
91             if (mHasFace && mHasFingerprint) {
92                 intended(hasExtra(EXTRA_KEY_FOR_BIOMETRICS, true));
93             } else if (mHasFace) {
94                 intended(hasExtra(EXTRA_KEY_FOR_FACE, true));
95             } else if (mHasFingerprint) {
96                 intended(hasExtra(EXTRA_KEY_FOR_FINGERPRINT, true));
97             }
98         }
99     }
100 
101     @Test
launchWithPin_confirmsPin()102     public void launchWithPin_confirmsPin() throws Exception  {
103         setPin();
104         try (ActivityScenario<BiometricEnrollActivity> scenario =
105                      ActivityScenario.launch(getIntent())) {
106             intended(hasComponent(ConfirmLockPassword.InternalActivity.class.getName()));
107         }
108     }
109 
110     @Test
launchWithPinAndPwHandle_confirmsPin()111     public void launchWithPinAndPwHandle_confirmsPin() throws Exception {
112         assumeTrue(mHasFace || mHasFingerprint);
113 
114         setPin();
115         final Intent intent = getIntent(true /* useInternal */);
116         LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
117                 LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
118                 LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
119                     assertThat(response.containsGatekeeperPasswordHandle()).isTrue();
120                     intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
121                             response.getGatekeeperPasswordHandle());
122                 }).get();
123 
124         try (ActivityScenario<BiometricEnrollActivity> scenario =
125                      ActivityScenario.launch(intent)) {
126             intended(hasComponent(mHasFace && !mHasFingerprint
127                     ? FaceEnrollIntroduction.class.getName()
128                     : FingerprintEnrollIntroduction.class.getName()));
129         }
130     }
131 
getIntent()132     private Intent getIntent() {
133         return getIntent(false /* useInternal */);
134     }
135 
getIntent(boolean useInternal)136     private Intent getIntent(boolean useInternal) {
137         final Intent intent = new Intent(mContext, useInternal
138                 ? BiometricEnrollActivity.InternalActivity.class : BiometricEnrollActivity.class);
139         intent.setAction(ACTION_BIOMETRIC_ENROLL);
140         return intent;
141     }
142 
setPin()143     private static void setPin() throws Exception  {
144         assertThat(AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings set-pin " + TEST_PIN,
145                 "Pin set to ", "'" + TEST_PIN + "'", ADB_TIMEOUT_MS)).isTrue();
146     }
147 }
148