From c9aaa73b5108b7329d7ff4f8a24784505ba2e2da Mon Sep 17 00:00:00 2001 From: Hao Dong Date: Thu, 1 Feb 2024 02:00:14 +0000 Subject: [PATCH] Show split screen dialog on the introduction and enrolling page. Revert ag/22361082 and ag/22460413, show the split screen dialog on the introduction and enrolling page, instead of relying on the callers to show the dialog. Test: atest BiometricsSplitScreenDialogTest Test: atest FaceEnrollIntroductionTest Test: atest SetupFingerprintEnrollIntroductionTest Bug: 299573056 Change-Id: Ieb106a4a623ad5ca0e6eb1633413df75767bef52 --- .../biometrics/BiometricEnrollBase.java | 13 ++ .../BiometricEnrollIntroduction.java | 13 ++ .../biometrics/BiometricsEnrollEnrolling.java | 8 + .../BiometricsSplitScreenDialog.java | 25 +++- .../combination/BiometricsSettingsBase.java | 28 ---- .../biometrics/face/FaceEnrollEnrolling.java | 9 +- .../biometrics/face/FaceSettings.java | 25 +--- ...tingsEnrollButtonPreferenceController.java | 11 -- .../FingerprintEnrollEnrolling.java | 7 +- .../fingerprint/FingerprintSettings.java | 14 -- .../FingerprintEnrollmentV2Activity.kt | 1 + .../BiometricsSplitScreenDialogTest.java | 126 ++++++++++++++++ .../CombinedBiometricProfileSettingsTest.java | 139 ------------------ .../face/FaceEnrollIntroductionTest.java | 49 +++++- .../FingerprintSettingsFragmentTest.java | 35 ----- ...etupFingerprintEnrollIntroductionTest.java | 48 +++++- ...sEnrollButtonPreferenceControllerTest.java | 14 +- 17 files changed, 294 insertions(+), 271 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java index 292d977a274..335d0b9dd99 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollBase.java +++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java @@ -40,6 +40,7 @@ import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling; import com.android.settings.core.InstrumentedActivity; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settingslib.activityembedding.ActivityEmbeddingUtils; import com.android.systemui.unfold.compat.ScreenSizeFoldProvider; import com.android.systemui.unfold.updates.FoldProvider; @@ -173,6 +174,14 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity { mUserId = getIntent().getIntExtra(Intent.EXTRA_USER_ID, UserHandle.myUserId()); mPostureGuidanceIntent = FeatureFactory.getFeatureFactory() .getFaceFeatureProvider().getPostureGuidanceIntent(getApplicationContext()); + + // Remove the existing split screen dialog. + BiometricsSplitScreenDialog dialog = + (BiometricsSplitScreenDialog) getSupportFragmentManager() + .findFragmentByTag(BiometricsSplitScreenDialog.class.getName()); + if (dialog != null) { + getSupportFragmentManager().beginTransaction().remove(dialog).commit(); + } } @Override @@ -338,4 +347,8 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity { final ColorStateList stateList = Utils.getColorAttr(this, android.R.attr.windowBackground); return stateList != null ? stateList.getDefaultColor() : Color.TRANSPARENT; } + + protected boolean shouldShowSplitScreenDialog() { + return isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded(this); + } } diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 44b1b3b17e5..1b9a70f5d46 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -154,6 +154,12 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (shouldShowSplitScreenDialog()) { + BiometricsSplitScreenDialog + .newInstance(getModality(), !WizardManagerHelper.isAnySetupWizard(getIntent())) + .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName()); + } + if (savedInstanceState != null) { mConfirmingCredentials = savedInstanceState.getBoolean(KEY_CONFIRMING_CREDENTIALS); mHasScrolledToBottom = savedInstanceState.getBoolean(KEY_SCROLLED_TO_BOTTOM); @@ -293,6 +299,13 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase @Override protected void onNextButtonClick(View view) { + // If it's not on suw, this method shouldn't be accessed. + if (shouldShowSplitScreenDialog() && WizardManagerHelper.isAnySetupWizard(getIntent())) { + BiometricsSplitScreenDialog.newInstance(getModality(), false /*destroyActivity*/) + .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName()); + return; + } + mNextClicked = true; if (checkMaxEnrolled() == 0) { // Lock thingy is already set up, launch directly to the next page diff --git a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java index e4f25863a8b..1e1a1423dfe 100644 --- a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java @@ -97,6 +97,14 @@ public abstract class BiometricsEnrollEnrolling extends BiometricEnrollBase } public void startEnrollment() { + // If it's in multi window mode, dialog is shown, do not start enrollment. + if (shouldShowSplitScreenDialog()) { + return; + } + startEnrollmentInternal(); + } + + protected void startEnrollmentInternal() { mSidecar = (BiometricEnrollSidecar) getSupportFragmentManager() .findFragmentByTag(TAG_SIDECAR); if (mSidecar == null) { diff --git a/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java b/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java index c1ecee8a852..79feb0b570e 100644 --- a/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java +++ b/src/com/android/settings/biometrics/BiometricsSplitScreenDialog.java @@ -18,6 +18,8 @@ package com.android.settings.biometrics; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; +import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_SKIP; + import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.DialogInterface; @@ -34,23 +36,33 @@ import com.android.settings.core.instrumentation.InstrumentedDialogFragment; */ public class BiometricsSplitScreenDialog extends InstrumentedDialogFragment { private static final String KEY_BIOMETRICS_MODALITY = "biometrics_modality"; + private static final String KEU_DESTROY_ACTIVITY = "destroy_activity"; @BiometricAuthenticator.Modality private int mBiometricsModality; + private boolean mDestroyActivity; - /** Returns the new instance of the class */ + /** + * Returns the new instance of the class + * @param biometricsModality Biometric modality. + * @param destroyActivity Whether to destroy the activity + * @return the current {@link BiometricsSplitScreenDialog} + */ public static BiometricsSplitScreenDialog newInstance( - @BiometricAuthenticator.Modality int biometricsModality) { + @BiometricAuthenticator.Modality int biometricsModality, boolean destroyActivity) { final BiometricsSplitScreenDialog dialog = new BiometricsSplitScreenDialog(); final Bundle args = new Bundle(); args.putInt(KEY_BIOMETRICS_MODALITY, biometricsModality); + args.putBoolean(KEU_DESTROY_ACTIVITY, destroyActivity); dialog.setArguments(args); + dialog.setCancelable(false); return dialog; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { mBiometricsModality = getArguments().getInt(KEY_BIOMETRICS_MODALITY); + mDestroyActivity = getArguments().getBoolean(KEU_DESTROY_ACTIVITY); int titleId; int messageId; switch (mBiometricsModality) { @@ -65,9 +77,16 @@ public class BiometricsSplitScreenDialog extends InstrumentedDialogFragment { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(titleId) .setMessage(messageId) + .setCancelable(false) .setPositiveButton( R.string.biometric_settings_add_biometrics_in_split_mode_ok, - (DialogInterface.OnClickListener) (dialog, which) -> dialog.dismiss()); + (DialogInterface.OnClickListener) (dialog, which) -> { + dialog.dismiss(); + if (mDestroyActivity) { + getActivity().setResult(RESULT_SKIP); + getActivity().finish(); + } + }); return builder.create(); } diff --git a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java index d8d34844948..b17478881fe 100644 --- a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java +++ b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java @@ -16,8 +16,6 @@ package com.android.settings.biometrics.combination; import static android.app.Activity.RESULT_OK; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED; @@ -48,12 +46,10 @@ import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricStatusPreferenceController; import com.android.settings.biometrics.BiometricUtils; -import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.settingslib.activityembedding.ActivityEmbeddingUtils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.transition.SettingsTransitionHelper; @@ -167,18 +163,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { // since FingerprintSettings and FaceSettings revoke the challenge when finishing. if (getFacePreferenceKey().equals(key)) { mDoNotFinishActivity = true; - - // If it's split mode and there is no enrolled face, show the dialog. (if there is - // enrolled face, FaceSettingsEnrollButtonPreferenceController#onClick will handle - // the dialog) - if (getActivity().isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded( - getActivity()) && !mFaceManager.hasEnrolledTemplates(mUserId)) { - BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show( - getActivity().getSupportFragmentManager(), - BiometricsSplitScreenDialog.class.getName()); - return true; - } - mFaceManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> { final Activity activity = getActivity(); if (activity == null || activity.isFinishing()) { @@ -209,18 +193,6 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { return true; } else if (getFingerprintPreferenceKey().equals(key)) { mDoNotFinishActivity = true; - - // If it's split mode and there is no enrolled fingerprint, show the dialog. (if - // there is enrolled fingerprint, FingerprintSettingsFragment#onPreferenceTreeClick - // will handle the dialog) - if (getActivity().isInMultiWindowMode() && !ActivityEmbeddingUtils.isActivityEmbedded( - getActivity()) && !mFingerprintManager.hasEnrolledFingerprints(mUserId)) { - BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show( - getActivity().getSupportFragmentManager(), - BiometricsSplitScreenDialog.class.getName()); - return true; - } - mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> { final Activity activity = getActivity(); if (activity == null || activity.isFinishing()) { diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java index 472410bdcf3..e8bd0efea26 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEnrolling.java @@ -16,6 +16,8 @@ package com.android.settings.biometrics.face; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; + import android.app.settings.SettingsEnums; import android.content.Intent; import android.hardware.face.FaceManager; @@ -33,6 +35,7 @@ import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricErrorDialog; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricsEnrollEnrolling; +import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.slices.CustomSliceRegistry; import com.google.android.setupcompat.template.FooterBarMixin; @@ -88,6 +91,10 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if (shouldShowSplitScreenDialog()) { + BiometricsSplitScreenDialog.newInstance(TYPE_FACE, true /*destroyActivity*/) + .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName()); + } setContentView(R.layout.face_enroll_enrolling); setHeaderText(R.string.security_settings_face_enroll_repeat_title); mErrorText = findViewById(R.id.error_text); @@ -134,7 +141,7 @@ public class FaceEnrollEnrolling extends BiometricsEnrollEnrolling { } @Override - public void startEnrollment() { + protected void startEnrollmentInternal() { super.startEnrollment(); mPreviewFragment = (FaceEnrollPreviewFragment) getSupportFragmentManager() .findFragmentByTag(TAG_FACE_PREVIEW); diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index bebb5c70cab..197aca03e0b 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -18,7 +18,6 @@ package com.android.settings.biometrics.face; import static android.app.Activity.RESULT_OK; import static android.app.admin.DevicePolicyResources.Strings.Settings.FACE_SETTINGS_FOR_WORK_TITLE; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST; import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST; @@ -43,12 +42,10 @@ import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; -import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settingslib.activityembedding.ActivityEmbeddingUtils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.LayoutPreference; @@ -104,26 +101,8 @@ public class FaceSettings extends DashboardFragment { mEnrollButton.setVisible(true); }; - private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener = - new FaceSettingsEnrollButtonPreferenceController.Listener() { - @Override - public boolean onShowSplitScreenDialog() { - if (getActivity().isInMultiWindowMode() - && !ActivityEmbeddingUtils.isActivityEmbedded(getActivity())) { - // If it's in split mode, show the error dialog. - BiometricsSplitScreenDialog.newInstance(TYPE_FACE).show( - getActivity().getSupportFragmentManager(), - BiometricsSplitScreenDialog.class.getName()); - return true; - } - return false; - } - - @Override - public void onStartEnrolling(Intent intent) { - FaceSettings.this.startActivityForResult(intent, ENROLL_REQUEST); - } - }; + private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener = intent -> + startActivityForResult(intent, ENROLL_REQUEST); /** * @param context diff --git a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java index 50e424837ed..e5f7c4ff60f 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java @@ -75,11 +75,6 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference @Override public void onClick(View v) { - // If it's in multi window mode, do not start the introduction intent. - if (mListener != null && mListener.onShowSplitScreenDialog()) { - return; - } - mIsClicked = true; final Intent intent = new Intent(); intent.setClassName(SETTINGS_PACKAGE_NAME, FaceEnrollIntroduction.class.getName()); @@ -120,12 +115,6 @@ public class FaceSettingsEnrollButtonPreferenceController extends BasePreference * Interface for registering callbacks related to the face enroll preference button. */ public interface Listener { - /** - * Called to check whether to show dialog in split screen mode - * @return Whether split screen warning dialog shown. - */ - boolean onShowSplitScreenDialog(); - /** * Called when the user has indicated an intent to begin enrolling a new face. * @param intent The Intent that should be used to launch face enrollment. diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index c7f73cb5b32..175e8f908ba 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -16,6 +16,7 @@ package com.android.settings.biometrics.fingerprint; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; import static android.text.Layout.HYPHENATION_FREQUENCY_NONE; import android.animation.Animator; @@ -67,6 +68,7 @@ import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollSidecar; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.BiometricsEnrollEnrolling; +import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.biometrics.fingerprint.feature.SfpsEnrollmentFeature; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.flags.Flags; @@ -223,7 +225,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + if (shouldShowSplitScreenDialog()) { + BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT, true /*destroyActivity*/) + .show(getSupportFragmentManager(), BiometricsSplitScreenDialog.class.getName()); + } if (savedInstanceState != null) { restoreSavedState(savedInstanceState); } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 4d1d499d771..2aacbe4bd88 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -20,7 +20,6 @@ package com.android.settings.biometrics.fingerprint; import static android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED_EXPLANATION; import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_PROFILE_FINGERPRINT_LAST_DELETE_MESSAGE; import static android.app.admin.DevicePolicyResources.UNDEFINED; -import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME; import static com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY; @@ -68,7 +67,6 @@ import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; -import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.biometrics.GatekeeperPasswordProvider; import com.android.settings.biometrics2.ui.model.EnrollmentRequest; import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity; @@ -84,7 +82,6 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedSwitchPreference; -import com.android.settingslib.activityembedding.ActivityEmbeddingUtils; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.transition.SettingsTransitionHelper; @@ -790,17 +787,6 @@ public class FingerprintSettings extends SubSettings { public boolean onPreferenceTreeClick(Preference pref) { final String key = pref.getKey(); if (KEY_FINGERPRINT_ADD.equals(key)) { - // If it's in split mode, show the error dialog and don't need to show adding - // fingerprint intent. - final boolean isActivityEmbedded = ActivityEmbeddingUtils.isActivityEmbedded( - getActivity()); - if (getActivity().isInMultiWindowMode() && !isActivityEmbedded) { - BiometricsSplitScreenDialog.newInstance(TYPE_FINGERPRINT).show( - getActivity().getSupportFragmentManager(), - BiometricsSplitScreenDialog.class.getName()); - return true; - } - mIsEnrolling = true; Intent intent = new Intent(); if (FeatureFlagUtils.isEnabled(getContext(), diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt index de2a1eef3c1..06307a4dbad 100644 --- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt +++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt @@ -134,6 +134,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + // TODO(b/299573056): Show split screen dialog when it's in multi window mode. setContentView(R.layout.fingerprint_v2_enroll_main) setTheme(SetupWizardUtils.getTheme(applicationContext, intent)) diff --git a/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java b/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java new file mode 100644 index 00000000000..3aa281cd153 --- /dev/null +++ b/tests/robotests/src/com/android/settings/biometrics/BiometricsSplitScreenDialogTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2024 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.biometrics; + +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE; +import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.DialogInterface; +import android.hardware.biometrics.BiometricAuthenticator; +import android.os.Looper; +import android.widget.Button; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; + +import com.android.settings.R; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowAlertDialogCompat.class) +public class BiometricsSplitScreenDialogTest { + @Rule + public final MockitoRule mocks = MockitoJUnit.rule(); + private FragmentActivity mActivity; + private BiometricsSplitScreenDialog mFragment; + + @Before + public void setUp() { + ShadowAlertDialogCompat.reset(); + mActivity = Robolectric.buildActivity(FragmentActivity.class).setup().get(); + } + + @After + public void tearDown() { + ShadowAlertDialogCompat.reset(); + } + + @Test + public void testTexts_face() { + final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/); + + final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); + assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( + mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_title)); + assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( + mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_message)); + } + + @Test + public void testTexts_fingerprint() { + final AlertDialog dialog = setUpFragment(TYPE_FINGERPRINT, false /*destroyActivity*/); + + final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); + assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( + mActivity.getString( + R.string.biometric_settings_add_fingerprint_in_split_mode_title)); + assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( + mActivity.getString( + R.string.biometric_settings_add_fingerprint_in_split_mode_message)); + } + + @Test + public void testButton_destroyActivity() { + final AlertDialog dialog = setUpFragment(TYPE_FACE, true /*destroyActivity*/); + final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + + assertThat(button).isNotNull(); + button.performClick(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + + assertThat(dialog.isShowing()).isFalse(); + assertThat(mActivity.isFinishing()).isTrue(); + } + + @Test + public void testButton_notDestroyActivity() { + final AlertDialog dialog = setUpFragment(TYPE_FACE, false /*destroyActivity*/); + final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + + assertThat(button).isNotNull(); + button.performClick(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + + assertThat(dialog.isShowing()).isFalse(); + assertThat(mActivity.isFinishing()).isFalse(); + } + + private AlertDialog setUpFragment( + @BiometricAuthenticator.Modality int biometricsModality, boolean destroyActivity) { + mFragment = BiometricsSplitScreenDialog.newInstance(biometricsModality, destroyActivity); + mFragment.show(mActivity.getSupportFragmentManager(), null); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNotNull(); + return dialog; + } +} diff --git a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java index 43d2add9b25..a0ef57f3c77 100644 --- a/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/combination/CombinedBiometricProfileSettingsTest.java @@ -16,8 +16,6 @@ package com.android.settings.biometrics.combination; -import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; - import static com.android.settings.biometrics.combination.BiometricsSettingsBase.CONFIRM_REQUEST; import static com.android.settings.password.ChooseLockPattern.RESULT_FINISHED; @@ -26,7 +24,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; @@ -37,11 +34,8 @@ import static org.mockito.Mockito.verify; import android.content.Context; import android.content.Intent; -import android.hardware.biometrics.ComponentInfoInternal; -import android.hardware.biometrics.SensorProperties; import android.hardware.face.FaceManager; import android.hardware.fingerprint.FingerprintManager; -import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Bundle; import android.util.AndroidRuntimeException; import android.view.LayoutInflater; @@ -52,15 +46,12 @@ import androidx.annotation.NonNull; import androidx.annotation.XmlRes; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentTransaction; import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.biometrics.BiometricStatusPreferenceController; -import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.biometrics.face.FaceStatusPreferenceController; import com.android.settings.biometrics.fingerprint.FingerprintStatusPreferenceController; import com.android.settings.password.ChooseLockSettingsHelper; @@ -72,7 +63,6 @@ import com.android.settingslib.core.AbstractPreferenceController; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -112,8 +102,6 @@ public class CombinedBiometricProfileSettingsTest { private FaceStatusPreferenceController mFaceStatusPreferenceController; @Mock private FaceManager mFaceManager; - @Mock - private FragmentTransaction mFragmentTransaction; @Before public void setUp() { @@ -350,133 +338,6 @@ public class CombinedBiometricProfileSettingsTest { assertThat(capturedPreferences.get(0).getKey()).isEqualTo(mFragment.getFacePreferenceKey()); } - @Test - public void testClickFingerprintUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() { - testClickFingerprintUnlock(true /* isInMultiWindow */, false /* hasEnrolledFingerprint */); - verifyShowsDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey()); - } - - @Test - public void testClickFingerprintUnlock_inMultiWindow_withEnrolledFp_noDialog() { - testClickFingerprintUnlock(true /* isInMultiWindow */, true /* hasEnrolledFingerprint */); - verifyNoDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey()); - } - - @Test - public void testClickFingerprintUnlock_inFullScreen_withoutEnrolledFp_noDialog() { - testClickFingerprintUnlock(false /* isInMultiWindow */, false /* hasEnrolledFingerprint */); - verifyNoDialogAfterClickingUnlock(mFragment.getFingerprintPreferenceKey()); - } - - private void testClickFingerprintUnlock(boolean isInMultiWindow, - boolean hasEnrolledFingerprint) { - final ArrayList props = new ArrayList<>(); - props.add(new FingerprintSensorPropertiesInternal( - 0 /* sensorId */, - SensorProperties.STRENGTH_STRONG, - 1 /* maxEnrollmentsPerUser */, - new ArrayList(), - TYPE_UDFPS_OPTICAL, - true /* resetLockoutRequiresHardwareAuthToken */)); - doReturn(props).when(mFingerprintManager).getSensorPropertiesInternal(); - - doAnswer(invocation -> { - final FingerprintManager.GenerateChallengeCallback callback = - invocation.getArgument(1); - callback.onChallengeGenerated(0, 0, 1L); - return null; - }).when(mFingerprintManager).generateChallenge(anyInt(), any()); - doReturn(new byte[]{1}).when(mFragment).requestGatekeeperHat(any(), anyLong(), anyInt(), - anyLong()); - FragmentManager fragmentManager = mock(FragmentManager.class); - doReturn(fragmentManager).when(mActivity).getSupportFragmentManager(); - doReturn(mFragmentTransaction).when(fragmentManager).beginTransaction(); - doReturn(isInMultiWindow).when(mActivity).isInMultiWindowMode(); - doReturn(hasEnrolledFingerprint).when(mFingerprintManager).hasEnrolledFingerprints( - anyInt()); - - // Start fragment - mFragment.onAttach(mContext); - mFragment.onCreate(null); - mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); - mFragment.onResume(); - - // User clicks on "Fingerprint Unlock" - final Preference preference = new Preference(mContext); - preference.setKey(mFragment.getFingerprintPreferenceKey()); - mFragment.onPreferenceTreeClick(preference); - } - - @Test - @Ignore("b/295325503") - public void testClickFaceUnlock_inMultiWindow_withoutEnrolledFp_showsDialog() { - testClickFaceUnlock(true /* isInMultiWindow */, false /*hasEnrolledFace*/); - verifyShowsDialogAfterClickingUnlock(mFragment.getFacePreferenceKey()); - } - - @Test - public void testClickFaceUnlock_inMultiWindow_withEnrolledFp_noDialog() { - testClickFaceUnlock(true /* isInMultiWindow */, true /* hasEnrolledFace */); - verifyNoDialogAfterClickingUnlock(mFragment.getFacePreferenceKey()); - } - - @Test - public void testClickFaceUnlock_inFullScreen_withoutEnrolledFp_noDialog() { - testClickFaceUnlock(false /* isInMultiWindow */ , false /* hasEnrolledFace */); - verifyNoDialogAfterClickingUnlock(mFragment.getFacePreferenceKey()); - } - - private void testClickFaceUnlock(boolean isInMultiWindow, boolean hasEnrolledFace) { - doAnswer(invocation -> { - final FaceManager.GenerateChallengeCallback callback = - invocation.getArgument(1); - callback.onGenerateChallengeResult(0, 0, 1L); - return null; - }).when(mFaceManager).generateChallenge(anyInt(), any()); - doReturn(new byte[] { 1 }).when(mFragment).requestGatekeeperHat(any(), anyLong(), anyInt(), - anyLong()); - FragmentManager fragmentManager = mock(FragmentManager.class); - doReturn(fragmentManager).when(mActivity).getSupportFragmentManager(); - doReturn(mFragmentTransaction).when(fragmentManager).beginTransaction(); - doReturn(isInMultiWindow).when(mActivity).isInMultiWindowMode(); - doReturn(hasEnrolledFace).when(mFaceManager).hasEnrolledTemplates( - anyInt()); - - // Start fragment - mFragment.onAttach(mContext); - mFragment.onCreate(null); - mFragment.onCreateView(LayoutInflater.from(mContext), mock(ViewGroup.class), Bundle.EMPTY); - mFragment.onResume(); - - // User clicks on "Face Unlock" - final Preference preference = new Preference(mContext); - preference.setKey(mFragment.getFacePreferenceKey()); - mFragment.onPreferenceTreeClick(preference); - } - - private void verifyNoDialogAfterClickingUnlock(String preferenceKey) { - final BiometricStatusPreferenceController controller = - preferenceKey.equals(mFragment.getFacePreferenceKey()) - ? mFaceStatusPreferenceController - : mFingerprintStatusPreferenceController; - verify(controller).handlePreferenceTreeClick(mPreferenceCaptor.capture()); - List capturedPreferences = mPreferenceCaptor.getAllValues(); - assertThat(capturedPreferences).hasSize(1); - assertThat(capturedPreferences.get(0).getKey()).isEqualTo(preferenceKey); - verify(mFragmentTransaction, never()).add(any(), - eq(BiometricsSplitScreenDialog.class.getName())); - } - - private void verifyShowsDialogAfterClickingUnlock(String preferenceKey) { - final BiometricStatusPreferenceController controller = - preferenceKey.equals(mFragment.getFacePreferenceKey()) - ? mFaceStatusPreferenceController - : mFingerprintStatusPreferenceController; - verify(controller, never()).handlePreferenceTreeClick(any()); - verify(mFragmentTransaction).add(any(), - eq(BiometricsSplitScreenDialog.class.getName())); - } - @Test public void testNoCrashIfDetachActivityDuringGeneratingChallengeThroughFaceManager() { doAnswer(invocation -> { diff --git a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java index 459e377635b..beb7a9f4f11 100644 --- a/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/face/FaceEnrollIntroductionTest.java @@ -38,6 +38,7 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; @@ -46,12 +47,15 @@ import android.hardware.face.FaceManager; import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; import android.hardware.face.IFaceAuthenticatorsRegisteredCallback; +import android.os.Looper; import android.os.UserHandle; import android.view.View; +import android.widget.Button; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; import androidx.test.core.app.ApplicationProvider; import com.android.internal.widget.LockPatternUtils; @@ -62,6 +66,7 @@ import com.android.settings.biometrics.BiometricUtils; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowDevicePolicyManager; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowSensorPrivacyManager; @@ -101,7 +106,8 @@ import java.util.List; ShadowUtils.class, ShadowDevicePolicyManager.class, ShadowSensorPrivacyManager.class, - SettingsShadowResources.class + SettingsShadowResources.class, + ShadowAlertDialogCompat.class }) public class FaceEnrollIntroductionTest { @@ -123,8 +129,8 @@ public class FaceEnrollIntroductionTest { enum GateKeeperAction {CALL_SUPER, RETURN_BYTE_ARRAY, THROW_CREDENTIAL_NOT_MATCH} public static class TestFaceEnrollIntroduction extends FaceEnrollIntroduction { - private int mRecreateCount = 0; + public boolean mIsMultiWindowMode; public int getRecreateCount() { return mRecreateCount; @@ -161,6 +167,11 @@ public class FaceEnrollIntroductionTest { protected boolean launchPostureGuidance() { return super.launchPostureGuidance(); } + + @Override + public boolean isInMultiWindowMode() { + return mIsMultiWindowMode; + } } @Before @@ -178,6 +189,7 @@ public class FaceEnrollIntroductionTest { public void tearDown() { ShadowUtils.reset(); ShadowLockPatternUtils.reset(); + ShadowAlertDialogCompat.reset(); } private void setupActivity() { @@ -596,4 +608,37 @@ public class FaceEnrollIntroductionTest { assertThat(result).isEqualTo(0); } + @Test + public void multiWindow_showsDialog() { + mController = Robolectric.buildActivity(TestFaceEnrollIntroduction.class); + mActivity = (TestFaceEnrollIntroduction) mController.get(); + mActivity.mIsMultiWindowMode = true; + mController.setup().get(); + + Shadows.shadowOf(Looper.getMainLooper()).idle(); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNotNull(); + + final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); + assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( + mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_title)); + assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( + mActivity.getString(R.string.biometric_settings_add_face_in_split_mode_message)); + + final Button button = dialog.getButton(DialogInterface.BUTTON_POSITIVE); + assertThat(button).isNotNull(); + button.performClick(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + assertThat(dialog.isShowing()).isFalse(); + assertThat(mActivity.isFinishing()).isTrue(); + } + + @Test + public void singleWindow_noDialog() { + Robolectric.buildActivity(TestFaceEnrollIntroduction.class).setup().get(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNull(); + } } diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java index 45ff2471516..58e7e2d4003 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintSettingsFragmentTest.java @@ -20,9 +20,7 @@ import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWE import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment; -import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.ADD_FINGERPRINT_REQUEST; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.CHOOSE_LOCK_GENERIC_REQUEST; -import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_FINGERPRINT_ADD; import static com.android.settings.biometrics.fingerprint.FingerprintSettings.FingerprintSettingsFragment.KEY_REQUIRE_SCREEN_ON_TO_AUTH; import static com.google.common.truth.Truth.assertThat; @@ -34,9 +32,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.Context; @@ -57,10 +53,8 @@ import android.view.ViewGroup; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; -import androidx.preference.Preference; import androidx.test.core.app.ApplicationProvider; -import com.android.settings.biometrics.BiometricsSplitScreenDialog; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowFragment; @@ -132,35 +126,6 @@ public class FingerprintSettingsFragmentTest { ShadowUtils.reset(); } - @Test - public void testAddFingerprint_inFullScreen_noDialog() { - setUpFragment(false); - // Click "Add Fingerprint" - final Preference preference = new Preference(mContext); - preference.setKey(KEY_FINGERPRINT_ADD); - mFragment.onPreferenceTreeClick(preference); - - verify(mFragment).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); - verify(mFragmentTransaction, never()).add(any(), - eq(BiometricsSplitScreenDialog.class.getName())); - - } - - @Test - public void testAddFingerprint_inMultiWindow_showsDialog() { - setUpFragment(false); - - doReturn(true).when(mActivity).isInMultiWindowMode(); - - // Click "Add Fingerprint" - final Preference preference = new Preference(mContext); - preference.setKey(KEY_FINGERPRINT_ADD); - mFragment.onPreferenceTreeClick(preference); - - verify(mFragment, times(0)).startActivityForResult(any(), eq(ADD_FINGERPRINT_REQUEST)); - verify(mFragmentTransaction).add(any(), eq(BiometricsSplitScreenDialog.class.getName())); - } - @Test public void testChooseLockKeyForFingerprint() { setUpFragment(true); diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java index 493436c0c38..6b6773463fb 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroductionTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.robolectric.RuntimeEnvironment.application; +import android.app.Activity; import android.app.KeyguardManager; import android.content.Intent; import android.content.pm.PackageManager; @@ -28,14 +29,18 @@ import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.SensorProperties; import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; +import android.os.Looper; import android.view.View; import android.widget.Button; +import androidx.appcompat.app.AlertDialog; + import com.android.settings.R; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricEnrollIntroduction; import com.android.settings.password.SetupSkipDialog; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowFingerprintManager; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; import com.android.settings.testutils.shadow.ShadowStorageManager; @@ -66,12 +71,23 @@ import java.util.List; ShadowFingerprintManager.class, ShadowLockPatternUtils.class, ShadowStorageManager.class, - ShadowUserManager.class + ShadowUserManager.class, + ShadowAlertDialogCompat.class }) public class SetupFingerprintEnrollIntroductionTest { private ActivityController mController; + public static class TestSetupFingerprintEnrollIntroductionInMultiWindowMode + extends SetupFingerprintEnrollIntroduction { + public boolean mIsMultiWindowMode = true; + + @Override + public boolean isInMultiWindowMode() { + return mIsMultiWindowMode; + } + } + @Before public void setUp() { Shadows.shadowOf(application.getPackageManager()) @@ -105,6 +121,36 @@ public class SetupFingerprintEnrollIntroductionTest { @After public void tearDown() { ShadowStorageManager.reset(); + ShadowAlertDialogCompat.reset(); + } + + @Test + public void multiWindow_showsDialog() { + Activity activity = Robolectric.buildActivity( + TestSetupFingerprintEnrollIntroductionInMultiWindowMode.class).setup().get(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNotNull(); + + final ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(dialog); + assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo( + activity.getString( + R.string.biometric_settings_add_fingerprint_in_split_mode_title)); + assertThat(shadowAlertDialog.getMessage().toString()).isEqualTo( + activity.getString( + R.string.biometric_settings_add_fingerprint_in_split_mode_message)); + + // TODO(b/299573056): Make WizardManagerHelper.isAnySetupWizard(getIntent()) correct and + // test button click not finishing the activity. + } + + @Test + public void singleWindow_noDialog() { + Robolectric.buildActivity(SetupFingerprintEnrollIntroduction.class).setup().get(); + Shadows.shadowOf(Looper.getMainLooper()).idle(); + + final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(dialog).isNull(); } @Test diff --git a/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java index 0738a3c4227..4d21364f5ca 100644 --- a/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceControllerTest.java @@ -19,9 +19,7 @@ package com.android.settings.biometrics.face; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.content.Context; import android.widget.Button; @@ -61,20 +59,10 @@ public class FaceSettingsEnrollButtonPreferenceControllerTest { } @Test - public void testOnClick_inFullScreen() { - when(mListener.onShowSplitScreenDialog()).thenReturn(false); + public void testOnClick() { mController.onClick(mButton); assertThat(mController.isClicked()).isTrue(); verify(mListener).onStartEnrolling(any()); } - - @Test - public void testOnClick_inMultiWindow() { - when(mListener.onShowSplitScreenDialog()).thenReturn(true); - mController.onClick(mButton); - - assertThat(mController.isClicked()).isFalse(); - verify(mListener, never()).onStartEnrolling(any()); - } }