Loading Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,8 @@ android_library { "telephony_flags_core_java_lib", "setupdesign-lottie-loading-layout", "device_policy_aconfig_flags_lib", "kotlinx-coroutines-core", "kotlinx-coroutines-android", ], plugins: ["androidx.room_room-compiler-plugin"], Loading src/com/android/settings/SettingsApplication.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import android.provider.Settings; import android.util.FeatureFlagUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.biometrics.fingerprint2.BiometricsEnvironment; import com.android.settings.core.instrumentation.ElapsedTimeUtils; import com.android.settings.development.DeveloperOptionsActivityLifecycle; import com.android.settings.fuelgauge.BatterySettingsStorage; Loading @@ -47,6 +49,7 @@ import java.lang.ref.WeakReference; public class SettingsApplication extends Application { private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null); private BiometricsEnvironment mBiometricsEnvironment; @Override protected void attachBaseContext(Context base) { Loading @@ -70,6 +73,7 @@ public class SettingsApplication extends Application { // Set Spa environment. setSpaEnvironment(); mBiometricsEnvironment = new BiometricsEnvironment(this); if (ActivityEmbeddingUtils.isSettingsSplitEnabled(this) && FeatureFlagUtils.isEnabled(this, Loading Loading @@ -111,6 +115,11 @@ public class SettingsApplication extends Application { return mHomeActivity.get(); } @Nullable public BiometricsEnvironment getBiometricEnvironment() { return mBiometricsEnvironment; } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); Loading src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -184,7 +184,6 @@ public class UdfpsEnrollHelper extends InstrumentedFragment { */ public void onAcquired(boolean isAcquiredGood) { if (mListener != null) { Log.e("JRM", "OnaCquired " + isAcquiredGood + " lastStepIsGood" + animateIfLastStep()); mListener.onAcquired(isAcquiredGood && animateIfLastStep()); } } Loading src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt 0 → 100644 +144 −0 Original line number Diff line number Diff line /* * 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.fingerprint2 import android.hardware.fingerprint.FingerprintManager import android.view.MotionEvent import android.view.accessibility.AccessibilityManager import androidx.fragment.app.FragmentActivity import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewModelStoreOwner import com.android.internal.widget.LockPatternUtils import com.android.settings.SettingsApplication import com.android.settings.biometrics.GatekeeperPasswordProvider import com.android.settings.biometrics.fingerprint2.data.repository.DebuggingRepository import com.android.settings.biometrics.fingerprint2.data.repository.DebuggingRepositoryImpl import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl import com.android.settings.biometrics.fingerprint2.debug.data.repository.UdfpsEnrollDebugRepositoryImpl import com.android.settings.biometrics.fingerprint2.debug.domain.interactor.DebugTouchEventInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.DebuggingInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.DebuggingInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.DisplayDensityInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.DisplayDensityInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.EnrollStageInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.EnrollStageInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintEnrollInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintEnrollInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintSensorInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintSensorInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.TouchEventInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractorImpl import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor import com.android.settings.biometrics.fingerprint2.lib.model.Settings import java.util.concurrent.Executors import kotlinx.coroutines.MainScope import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf /** * This class should handle all repo & interactor creation needed by the ViewModels for the * biometrics code. * * This code is instantiated within the [SettingsApplication], all repos should be private & * immutable and all interactors should public and immutable */ class BiometricsEnvironment(context: SettingsApplication) : ViewModelStoreOwner { private val executorService = Executors.newSingleThreadExecutor() private val backgroundDispatcher = executorService.asCoroutineDispatcher() private val applicationScope = MainScope() private val gateKeeperPasswordProvider = GatekeeperPasswordProvider(LockPatternUtils(context)) private val fingerprintManager = context.getSystemService(FragmentActivity.FINGERPRINT_SERVICE) as FingerprintManager? private val fingerprintSensorRepository: FingerprintSensorRepository = FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, applicationScope) private val debuggingRepository: DebuggingRepository = DebuggingRepositoryImpl() private val udfpsDebugRepo = UdfpsEnrollDebugRepositoryImpl() /** For now, interactors are public to those with access to the [BiometricsEnvironment] class */ val fingerprintEnrollInteractor: FingerprintEnrollInteractor by lazy { FingerprintEnrollInteractorImpl(context, fingerprintManager, Settings) } /** [FingerprintManagerInteractor] to be used to construct view models */ val fingerprintManagerInteractor: FingerprintManagerInteractor by lazy { FingerprintManagerInteractorImpl( context, backgroundDispatcher, fingerprintManager, fingerprintSensorRepository, gateKeeperPasswordProvider, fingerprintEnrollInteractor, ) } val accessibilityInteractor: AccessibilityInteractor by lazy { AccessibilityInteractorImpl( context.getSystemService(AccessibilityManager::class.java)!!, applicationScope, ) } val foldStateInteractor: FoldStateInteractor by lazy { FoldStateInteractorImpl(context) } val orientationInteractor: OrientationInteractor by lazy { OrientationInteractorImpl(context) } val vibrationInteractor: VibrationInteractor by lazy { VibrationInteractorImpl(context) } val displayDensityInteractor: DisplayDensityInteractor by lazy { DisplayDensityInteractorImpl(context, applicationScope) } val debuggingInteractor: DebuggingInteractor by lazy { DebuggingInteractorImpl(debuggingRepository) } val enrollStageInteractor: EnrollStageInteractor by lazy { EnrollStageInteractorImpl() } val udfpsEnrollInteractor: UdfpsEnrollInteractor by lazy { UdfpsEnrollInteractorImpl(context, accessibilityInteractor) } val sensorInteractor: FingerprintSensorInteractor by lazy { FingerprintSensorInteractorImpl(fingerprintSensorRepository) } val touchEventInteractor: TouchEventInteractor by lazy { if (debuggingRepository.isDebuggingEnabled()) { DebugTouchEventInteractorImpl(udfpsDebugRepo) } else { object : TouchEventInteractor { override val touchEvent: Flow<MotionEvent> = flowOf() } } } override val viewModelStore: ViewModelStore = ViewModelStore() } src/com/android/settings/biometrics/fingerprint2/data/repository/DebuggingRepository.kt +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ interface DebuggingRepository { /** A function that will return if a build is debuggable */ fun isDebuggingEnabled(): Boolean /** A function that will return if udfps enrollment should be swapped with debug repos */ fun isUdfpsEnrollmentDebuggingEnabled(): Boolean } Loading Loading
Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -108,6 +108,8 @@ android_library { "telephony_flags_core_java_lib", "setupdesign-lottie-loading-layout", "device_policy_aconfig_flags_lib", "kotlinx-coroutines-core", "kotlinx-coroutines-android", ], plugins: ["androidx.room_room-compiler-plugin"], Loading
src/com/android/settings/SettingsApplication.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,9 +24,11 @@ import android.provider.Settings; import android.util.FeatureFlagUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.settings.activityembedding.ActivityEmbeddingRulesController; import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.biometrics.fingerprint2.BiometricsEnvironment; import com.android.settings.core.instrumentation.ElapsedTimeUtils; import com.android.settings.development.DeveloperOptionsActivityLifecycle; import com.android.settings.fuelgauge.BatterySettingsStorage; Loading @@ -47,6 +49,7 @@ import java.lang.ref.WeakReference; public class SettingsApplication extends Application { private WeakReference<SettingsHomepageActivity> mHomeActivity = new WeakReference<>(null); private BiometricsEnvironment mBiometricsEnvironment; @Override protected void attachBaseContext(Context base) { Loading @@ -70,6 +73,7 @@ public class SettingsApplication extends Application { // Set Spa environment. setSpaEnvironment(); mBiometricsEnvironment = new BiometricsEnvironment(this); if (ActivityEmbeddingUtils.isSettingsSplitEnabled(this) && FeatureFlagUtils.isEnabled(this, Loading Loading @@ -111,6 +115,11 @@ public class SettingsApplication extends Application { return mHomeActivity.get(); } @Nullable public BiometricsEnvironment getBiometricEnvironment() { return mBiometricsEnvironment; } @Override public void onTrimMemory(int level) { super.onTrimMemory(level); Loading
src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java +0 −1 Original line number Diff line number Diff line Loading @@ -184,7 +184,6 @@ public class UdfpsEnrollHelper extends InstrumentedFragment { */ public void onAcquired(boolean isAcquiredGood) { if (mListener != null) { Log.e("JRM", "OnaCquired " + isAcquiredGood + " lastStepIsGood" + animateIfLastStep()); mListener.onAcquired(isAcquiredGood && animateIfLastStep()); } } Loading
src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt 0 → 100644 +144 −0 Original line number Diff line number Diff line /* * 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.fingerprint2 import android.hardware.fingerprint.FingerprintManager import android.view.MotionEvent import android.view.accessibility.AccessibilityManager import androidx.fragment.app.FragmentActivity import androidx.lifecycle.ViewModelStore import androidx.lifecycle.ViewModelStoreOwner import com.android.internal.widget.LockPatternUtils import com.android.settings.SettingsApplication import com.android.settings.biometrics.GatekeeperPasswordProvider import com.android.settings.biometrics.fingerprint2.data.repository.DebuggingRepository import com.android.settings.biometrics.fingerprint2.data.repository.DebuggingRepositoryImpl import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl import com.android.settings.biometrics.fingerprint2.debug.data.repository.UdfpsEnrollDebugRepositoryImpl import com.android.settings.biometrics.fingerprint2.debug.domain.interactor.DebugTouchEventInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.DebuggingInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.DebuggingInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.DisplayDensityInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.DisplayDensityInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.EnrollStageInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.EnrollStageInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintEnrollInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintEnrollInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintSensorInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintSensorInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.TouchEventInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractor import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractorImpl import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor import com.android.settings.biometrics.fingerprint2.lib.model.Settings import java.util.concurrent.Executors import kotlinx.coroutines.MainScope import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf /** * This class should handle all repo & interactor creation needed by the ViewModels for the * biometrics code. * * This code is instantiated within the [SettingsApplication], all repos should be private & * immutable and all interactors should public and immutable */ class BiometricsEnvironment(context: SettingsApplication) : ViewModelStoreOwner { private val executorService = Executors.newSingleThreadExecutor() private val backgroundDispatcher = executorService.asCoroutineDispatcher() private val applicationScope = MainScope() private val gateKeeperPasswordProvider = GatekeeperPasswordProvider(LockPatternUtils(context)) private val fingerprintManager = context.getSystemService(FragmentActivity.FINGERPRINT_SERVICE) as FingerprintManager? private val fingerprintSensorRepository: FingerprintSensorRepository = FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, applicationScope) private val debuggingRepository: DebuggingRepository = DebuggingRepositoryImpl() private val udfpsDebugRepo = UdfpsEnrollDebugRepositoryImpl() /** For now, interactors are public to those with access to the [BiometricsEnvironment] class */ val fingerprintEnrollInteractor: FingerprintEnrollInteractor by lazy { FingerprintEnrollInteractorImpl(context, fingerprintManager, Settings) } /** [FingerprintManagerInteractor] to be used to construct view models */ val fingerprintManagerInteractor: FingerprintManagerInteractor by lazy { FingerprintManagerInteractorImpl( context, backgroundDispatcher, fingerprintManager, fingerprintSensorRepository, gateKeeperPasswordProvider, fingerprintEnrollInteractor, ) } val accessibilityInteractor: AccessibilityInteractor by lazy { AccessibilityInteractorImpl( context.getSystemService(AccessibilityManager::class.java)!!, applicationScope, ) } val foldStateInteractor: FoldStateInteractor by lazy { FoldStateInteractorImpl(context) } val orientationInteractor: OrientationInteractor by lazy { OrientationInteractorImpl(context) } val vibrationInteractor: VibrationInteractor by lazy { VibrationInteractorImpl(context) } val displayDensityInteractor: DisplayDensityInteractor by lazy { DisplayDensityInteractorImpl(context, applicationScope) } val debuggingInteractor: DebuggingInteractor by lazy { DebuggingInteractorImpl(debuggingRepository) } val enrollStageInteractor: EnrollStageInteractor by lazy { EnrollStageInteractorImpl() } val udfpsEnrollInteractor: UdfpsEnrollInteractor by lazy { UdfpsEnrollInteractorImpl(context, accessibilityInteractor) } val sensorInteractor: FingerprintSensorInteractor by lazy { FingerprintSensorInteractorImpl(fingerprintSensorRepository) } val touchEventInteractor: TouchEventInteractor by lazy { if (debuggingRepository.isDebuggingEnabled()) { DebugTouchEventInteractorImpl(udfpsDebugRepo) } else { object : TouchEventInteractor { override val touchEvent: Flow<MotionEvent> = flowOf() } } } override val viewModelStore: ViewModelStore = ViewModelStore() }
src/com/android/settings/biometrics/fingerprint2/data/repository/DebuggingRepository.kt +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ interface DebuggingRepository { /** A function that will return if a build is debuggable */ fun isDebuggingEnabled(): Boolean /** A function that will return if udfps enrollment should be swapped with debug repos */ fun isUdfpsEnrollmentDebuggingEnabled(): Boolean } Loading