1 /* 2 * Copyright (C) 2024 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.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; 20 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; 21 22 import static com.google.common.truth.Truth.assertThat; 23 24 import android.content.DialogInterface; 25 import android.hardware.biometrics.BiometricAuthenticator; 26 import android.os.Looper; 27 import android.widget.Button; 28 29 import androidx.appcompat.app.AlertDialog; 30 import androidx.fragment.app.FragmentActivity; 31 32 import com.android.settings.R; 33 import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; 34 35 import org.junit.After; 36 import org.junit.Before; 37 import org.junit.Rule; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.junit.MockitoJUnit; 41 import org.mockito.junit.MockitoRule; 42 import org.robolectric.Robolectric; 43 import org.robolectric.RobolectricTestRunner; 44 import org.robolectric.Shadows; 45 import org.robolectric.annotation.Config; 46 47 @RunWith(RobolectricTestRunner.class) 48 @Config(shadows = ShadowAlertDialogCompat.class) 49 public class BiometricsSplitScreenDialogTest { 50 @Rule 51 public final MockitoRule mocks = MockitoJUnit.rule(); 52 private FragmentActivity mActivity; 53 private BiometricsSplitScreenDialog mFragment; 54 55 @Before setUp()56 public void setUp() { 57 ShadowAlertDialogCompat.reset(); 58 mActivity = Robolectric.buildActivity(FragmentActivity.class).setup().get(); 59 } 60 61 @After tearDown()62 public void tearDown() { 63 ShadowAlertDialogCompat.reset(); 64 } 65 66 @Test testTexts_face()67 public void testTexts_face() { 68 final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/); 69 70 final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); 71 assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( 72 mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_title)); 73 assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( 74 mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_message)); 75 } 76 77 @Test testTexts_fingerprint()78 public void testTexts_fingerprint() { 79 final AlertDialog dialog = setUpFragment(TYPE_FINGERPRINT, false /*destroyActivity*/); 80 81 final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); 82 assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( 83 mActivity.getString( 84 R.string.biometric_settings_add_fingerprint_in_split_mode_title)); 85 assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( 86 mActivity.getString( 87 R.string.biometric_settings_add_fingerprint_in_split_mode_message)); 88 } 89 90 @Test testButton_destroyActivity()91 public void testButton_destroyActivity() { 92 final AlertDialog dialog = setUpFragment(TYPE_FACE, true /*destroyActivity*/); 93 final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 94 95 assertThat(button).isNotNull(); 96 button.performClick(); 97 Shadows.shadowOf(Looper.getMainLooper()).idle(); 98 99 assertThat(dialog.isShowing()).isFalse(); 100 assertThat(mActivity.isFinishing()).isTrue(); 101 } 102 103 @Test testButton_notDestroyActivity()104 public void testButton_notDestroyActivity() { 105 final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/); 106 final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 107 108 assertThat(button).isNotNull(); 109 button.performClick(); 110 Shadows.shadowOf(Looper.getMainLooper()).idle(); 111 112 assertThat(dialog.isShowing()).isFalse(); 113 assertThat(mActivity.isFinishing()).isFalse(); 114 } 115 setUpFragment( @iometricAuthenticator.Modality int biometricsModality, boolean destroyActivity)116 private AlertDialog setUpFragment( 117 @BiometricAuthenticator.Modality int biometricsModality, boolean destroyActivity) { 118 mFragment = BiometricsSplitScreenDialog.newInstance(biometricsModality, destroyActivity); 119 mFragment.show(mActivity.getSupportFragmentManager(), null); 120 Shadows.shadowOf(Looper.getMainLooper()).idle(); 121 122 final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); 123 assertThat(dialog).isNotNull(); 124 return dialog; 125 } 126 } 127