1 /* 2 * Copyright (C) 2017 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.fingerprint; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.ArgumentMatchers.any; 21 import static org.mockito.ArgumentMatchers.nullable; 22 import static org.mockito.Matchers.anyInt; 23 import static org.mockito.Mockito.verify; 24 import static org.robolectric.RuntimeEnvironment.application; 25 26 import android.content.Intent; 27 import android.hardware.fingerprint.FingerprintManager; 28 import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback; 29 import android.media.AudioAttributes; 30 import android.os.CancellationSignal; 31 import android.os.VibrationEffect; 32 import android.os.Vibrator; 33 import android.widget.TextView; 34 35 import com.android.settings.R; 36 import com.android.settings.password.ChooseLockSettingsHelper; 37 import com.android.settings.testutils.FakeFeatureFactory; 38 import com.android.settings.testutils.SettingsRobolectricTestRunner; 39 import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; 40 import com.android.settings.testutils.shadow.ShadowUtils; 41 import com.android.settings.testutils.shadow.ShadowVibrator; 42 43 import org.junit.After; 44 import org.junit.Before; 45 import org.junit.Test; 46 import org.junit.runner.RunWith; 47 import org.mockito.ArgumentCaptor; 48 import org.mockito.Mock; 49 import org.mockito.MockitoAnnotations; 50 import org.robolectric.Robolectric; 51 import org.robolectric.annotation.Config; 52 import org.robolectric.shadow.api.Shadow; 53 54 import java.util.concurrent.TimeUnit; 55 56 @RunWith(SettingsRobolectricTestRunner.class) 57 @Config(shadows = { 58 SettingsShadowResourcesImpl.class, 59 ShadowUtils.class, 60 ShadowVibrator.class}) 61 public class FingerprintEnrollEnrollingTest { 62 63 @Mock 64 private FingerprintManager mFingerprintManager; 65 66 private FingerprintEnrollEnrolling mActivity; 67 68 @Before setUp()69 public void setUp() { 70 MockitoAnnotations.initMocks(this); 71 ShadowUtils.setFingerprintManager(mFingerprintManager); 72 ShadowVibrator.addToServiceMap(); 73 74 FakeFeatureFactory.setupForTest(); 75 mActivity = Robolectric.buildActivity( 76 FingerprintEnrollEnrolling.class, 77 new Intent() 78 // Set the challenge token so the confirm screen will not be shown 79 .putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, new byte[0])) 80 .setup().get(); 81 } 82 83 @After tearDown()84 public void tearDown() { 85 ShadowUtils.reset(); 86 ShadowVibrator.reset(); 87 } 88 89 @Test fingerprintEnrollHelp_shouldShowHelpTextAndVibrate()90 public void fingerprintEnrollHelp_shouldShowHelpTextAndVibrate() { 91 EnrollmentCallback enrollmentCallback = verifyAndCaptureEnrollmentCallback(); 92 93 enrollmentCallback.onEnrollmentProgress(123); 94 enrollmentCallback.onEnrollmentHelp( 95 FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS, 96 "test enrollment help"); 97 98 TextView errorText = mActivity.findViewById(R.id.error_text); 99 assertThat(errorText.getText()).isEqualTo("test enrollment help"); 100 101 Robolectric.getForegroundThreadScheduler().advanceBy(2, TimeUnit.MILLISECONDS); 102 103 ShadowVibrator shadowVibrator = 104 Shadow.extract(application.getSystemService(Vibrator.class)); 105 verify(shadowVibrator.delegate).vibrate( 106 anyInt(), 107 nullable(String.class), 108 any(VibrationEffect.class), 109 nullable(AudioAttributes.class)); 110 } 111 verifyAndCaptureEnrollmentCallback()112 private EnrollmentCallback verifyAndCaptureEnrollmentCallback() { 113 ArgumentCaptor<EnrollmentCallback> callbackCaptor = 114 ArgumentCaptor.forClass(EnrollmentCallback.class); 115 verify(mFingerprintManager).enroll( 116 any(byte[].class), 117 any(CancellationSignal.class), 118 anyInt(), 119 anyInt(), 120 callbackCaptor.capture()); 121 122 return callbackCaptor.getValue(); 123 } 124 } 125