diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d988feaada7..eebef14bc16 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2816,6 +2816,9 @@ + @@ -2826,9 +2829,13 @@ + android:exported="false" + android:theme="@style/GlifTheme.Light" + android:taskAffinity="com.android.settings.root" /> + + @@ -2845,7 +2856,6 @@ - + get() = enrollActivityProvider.setup + } + + /** Inner class representing enrolling fingerprint enrollment from FingerprintSettings */ + class InternalActivity : FingerprintEnroll() { + override val nextActivityClass: Class<*> + get() = enrollActivityProvider.internal + } + + /** + * The class of the next activity to launch. This is open to allow subclasses to provide their + * own behavior. Defaults to the default activity class provided by the + * enrollActivityClassProvider. + */ + open val nextActivityClass: Class<*> + get() = enrollActivityProvider.default + + protected val enrollActivityProvider: FingerprintEnrollActivityClassProvider + get() = featureFactory.fingerprintFeatureProvider.enrollActivityClassProvider + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + /** + * Logs the next activity to be launched, creates an intent for that activity, + * adds flags to forward the result, includes any existing extras from the current intent, + * starts the new activity and then finishes the current one + */ + Log.d("FingerprintEnroll", "forward to $nextActivityClass") + val nextIntent = Intent(this, nextActivityClass) + nextIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT) + nextIntent.putExtras(intent) + startActivity(nextIntent) + finish() + } +} \ No newline at end of file diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollActivityClassProvider.kt b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollActivityClassProvider.kt new file mode 100644 index 00000000000..853a3df01b8 --- /dev/null +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollActivityClassProvider.kt @@ -0,0 +1,34 @@ +/* + * 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.fingerprint + +import android.app.Activity + +open class FingerprintEnrollActivityClassProvider { + + open val default: Class + get() = FingerprintEnrollIntroduction::class.java + open val setup: Class + get() = SetupFingerprintEnrollIntroduction::class.java + open val internal: Class + get() = FingerprintEnrollIntroductionInternal::class.java + + companion object { + @JvmStatic + val instance = FingerprintEnrollActivityClassProvider() + } +} diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java index c1e34a579a8..baa88b5655a 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintFeatureProvider.java @@ -33,7 +33,6 @@ public interface FingerprintFeatureProvider { */ SfpsEnrollmentFeature getSfpsEnrollmentFeature(); - /** * Gets calibrator for udfps pre-enroll * @param appContext application context @@ -52,4 +51,13 @@ public interface FingerprintFeatureProvider { * @return the feature implementation */ SfpsRestToUnlockFeature getSfpsRestToUnlockFeature(@NonNull Context context); + + /** + * Gets the provider for current fingerprint enrollment activity classes + * @return the provider + */ + @NonNull + default FingerprintEnrollActivityClassProvider getEnrollActivityClassProvider() { + return FingerprintEnrollActivityClassProvider.getInstance(); + } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 125691fbf1c..20d453f2ea8 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -1142,7 +1142,7 @@ public class FingerprintSettings extends SubSettings { private void addFirstFingerprint(@Nullable Long gkPwHandle) { Intent intent = new Intent(); intent.setClassName(SETTINGS_PACKAGE_NAME, - FingerprintEnrollIntroductionInternal.class.getName()); + FingerprintEnroll.InternalActivity.class.getName()); intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true); intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE); diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt index 241eaea0b28..d9289d6f107 100644 --- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt +++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt @@ -43,7 +43,7 @@ import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST import com.android.settings.biometrics.BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling -import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal +import com.android.settings.biometrics.fingerprint.FingerprintEnroll.InternalActivity import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractorImpl import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel @@ -514,7 +514,7 @@ class FingerprintSettingsV2Fragment : val intent = Intent() intent.setClassName( SETTINGS_PACKAGE_NAME, - FingerprintEnrollIntroductionInternal::class.java.name, + InternalActivity::class.java.name, ) intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true) intent.putExtra( diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt new file mode 100644 index 00000000000..07cdffb942c --- /dev/null +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollTest.kt @@ -0,0 +1,94 @@ +/* + * 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.fingerprint + +import android.app.Activity +import android.content.Intent +import com.android.settings.overlay.FeatureFactory +import com.android.settings.testutils.FakeFeatureFactory +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.`when` +import org.robolectric.Robolectric +import org.robolectric.RobolectricTestRunner +import org.robolectric.Shadows + +@RunWith(RobolectricTestRunner::class) +class FingerprintEnrollTest { + + private lateinit var featureFactory: FeatureFactory + + private companion object { + const val INTENT_KEY = "testKey" + const val INTENT_VALUE = "testValue" + val INTENT = Intent().apply { + putExtra(INTENT_KEY, INTENT_VALUE) + } + } + + private val activityProvider = FingerprintEnrollActivityClassProvider() + + @Before + fun setUp() { + featureFactory = FakeFeatureFactory.setupForTest() + `when`(featureFactory.fingerprintFeatureProvider.enrollActivityClassProvider) + .thenReturn(activityProvider) + } + + private fun setupActivity(activityClass: Class): FingerprintEnroll { + return Robolectric.buildActivity(activityClass, INTENT).create().get() + } + + @Test + fun testFinishAndLaunchDefaultActivity() { + // Run + val activity = setupActivity(FingerprintEnroll::class.java) + + // Verify + verifyLaunchNextActivity(activity, activityProvider.default) + } + + @Test + fun testFinishAndLaunchSetupActivity() { + // Run + val activity = setupActivity(FingerprintEnroll.SetupActivity::class.java) + + // Verify + verifyLaunchNextActivity(activity, activityProvider.setup) + } + + @Test + fun testFinishAndLaunchInternalActivity() { + // Run + val activity = setupActivity(FingerprintEnroll.InternalActivity::class.java) + + // Verify + verifyLaunchNextActivity(activity, activityProvider.internal) + } + + private fun verifyLaunchNextActivity( + currentActivityInstance : FingerprintEnroll, + nextActivityClass: Class + ) { + assertThat(currentActivityInstance.isFinishing).isTrue() + val nextActivityIntent = Shadows.shadowOf(currentActivityInstance).nextStartedActivity + assertThat(nextActivityIntent.component!!.className).isEqualTo(nextActivityClass.name) + assertThat(nextActivityIntent.extras!!.size()).isEqualTo(1) + assertThat(nextActivityIntent.getStringExtra(INTENT_KEY)).isEqualTo(INTENT_VALUE) + } +}