Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1de09eb authored by Andreas Miko's avatar Andreas Miko
Browse files

Refactor DozeParameters and BiometricsUnlockController out of Repository

Inverts the direction of dependency from legacy code to Repository. This
is in preparation of additional refactors of KeyguardUpdateMonitor, that
would otherwise create dependency cycles.

Test: Refactored tests
Bug: b/303808405
Bug: b/297839820
Flag: b/305984787 - REFACTOR_GETCURRENTUSER (added in ag/25089323)
Change-Id: Iaa03621ab5a93fa27a1a8475bcf2f6be0b1c9305
parent 498a18e2
Loading
Loading
Loading
Loading
+13 −61
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@ import com.android.systemui.doze.DozeMachine
import com.android.systemui.doze.DozeTransitionCallback
import com.android.systemui.doze.DozeTransitionListener
import com.android.systemui.dreams.DreamOverlayCallbackController
import com.android.systemui.keyguard.ScreenLifecycle
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
import com.android.systemui.keyguard.shared.model.BiometricUnlockSource
import com.android.systemui.keyguard.shared.model.DismissAction
@@ -41,9 +40,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardDone
import com.android.systemui.keyguard.shared.model.KeyguardRootViewVisibilityState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.statusbar.phone.BiometricUnlockController
import com.android.systemui.statusbar.phone.BiometricUnlockController.WakeAndUnlockMode
import com.android.systemui.statusbar.phone.DozeParameters
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
@@ -111,6 +107,8 @@ interface KeyguardRepository {
    /** Is the always-on display available to be used? */
    val isAodAvailable: Flow<Boolean>

    fun setAodAvailable(value: Boolean)

    /**
     * Observable for whether we are in doze state.
     *
@@ -160,6 +158,8 @@ interface KeyguardRepository {
    /** Observable for biometric unlock modes */
    val biometricUnlockState: Flow<BiometricUnlockModel>

    fun setBiometricUnlockState(value: BiometricUnlockModel)

    /** Approximate location on the screen of the fingerprint sensor. */
    val fingerprintSensorLocation: Flow<Point?>

@@ -240,12 +240,9 @@ class KeyguardRepositoryImpl
@Inject
constructor(
    statusBarStateController: StatusBarStateController,
    screenLifecycle: ScreenLifecycle,
    biometricUnlockController: BiometricUnlockController,
    private val keyguardStateController: KeyguardStateController,
    private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
    private val dozeTransitionListener: DozeTransitionListener,
    private val dozeParameters: DozeParameters,
    private val authController: AuthController,
    private val dreamOverlayCallbackController: DreamOverlayCallbackController,
    @Main private val mainDispatcher: CoroutineDispatcher,
@@ -303,24 +300,12 @@ constructor(
            }
            .distinctUntilChanged()

    override val isAodAvailable: Flow<Boolean> =
        conflatedCallbackFlow {
                val callback =
                    DozeParameters.Callback {
                        trySendWithFailureLogging(
                            dozeParameters.alwaysOn,
                            TAG,
                            "updated isAodAvailable"
                        )
                    }

                dozeParameters.addCallback(callback)
                // Adding the callback does not send an initial update.
                trySendWithFailureLogging(dozeParameters.alwaysOn, TAG, "initial isAodAvailable")
    private val _isAodAvailable = MutableStateFlow(false)
    override val isAodAvailable: Flow<Boolean> = _isAodAvailable.asStateFlow()

                awaitClose { dozeParameters.removeCallback(callback) }
    override fun setAodAvailable(value: Boolean) {
        _isAodAvailable.value = value
    }
            .distinctUntilChanged()

    override val isKeyguardOccluded: Flow<Boolean> =
        conflatedCallbackFlow {
@@ -506,30 +491,11 @@ constructor(
                statusBarStateIntToObject(statusBarStateController.state)
            )

    override val biometricUnlockState: Flow<BiometricUnlockModel> = conflatedCallbackFlow {
        fun dispatchUpdate() {
            trySendWithFailureLogging(
                biometricModeIntToObject(biometricUnlockController.mode),
                TAG,
                "biometric mode"
            )
        }

        val callback =
            object : BiometricUnlockController.BiometricUnlockEventsListener {
                override fun onModeChanged(@WakeAndUnlockMode mode: Int) {
                    dispatchUpdate()
                }
    private val _biometricUnlockState = MutableStateFlow(BiometricUnlockModel.NONE)
    override val biometricUnlockState = _biometricUnlockState.asStateFlow()

                override fun onResetMode() {
                    dispatchUpdate()
                }
            }

        biometricUnlockController.addListener(callback)
        dispatchUpdate()

        awaitClose { biometricUnlockController.removeListener(callback) }
    override fun setBiometricUnlockState(value: BiometricUnlockModel) {
        _biometricUnlockState.value = value
    }

    override val fingerprintSensorLocation: Flow<Point?> = conflatedCallbackFlow {
@@ -662,20 +628,6 @@ constructor(
        }
    }

    private fun biometricModeIntToObject(@WakeAndUnlockMode value: Int): BiometricUnlockModel {
        return when (value) {
            0 -> BiometricUnlockModel.NONE
            1 -> BiometricUnlockModel.WAKE_AND_UNLOCK
            2 -> BiometricUnlockModel.WAKE_AND_UNLOCK_PULSING
            3 -> BiometricUnlockModel.SHOW_BOUNCER
            4 -> BiometricUnlockModel.ONLY_WAKE
            5 -> BiometricUnlockModel.UNLOCK_COLLAPSING
            6 -> BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
            7 -> BiometricUnlockModel.DISMISS_BOUNCER
            else -> throw IllegalArgumentException("Invalid BiometricUnlockModel value: $value")
        }
    }

    private fun dozeMachineStateToModel(state: DozeMachine.State): DozeStateModel {
        return when (state) {
            DozeMachine.State.UNINITIALIZED -> DozeStateModel.UNINITIALIZED
+42 −0
Original line number Diff line number Diff line
package com.android.systemui.keyguard.domain.interactor

import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.data.repository.KeyguardRepository
import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_DISMISS_BOUNCER
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_NONE
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_ONLY_WAKE
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_SHOW_BOUNCER
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_UNLOCK_COLLAPSING
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_FROM_DREAM
import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING
import com.android.systemui.statusbar.phone.BiometricUnlockController.WakeAndUnlockMode
import javax.inject.Inject

@SysUISingleton
class BiometricUnlockInteractor
@Inject
constructor(
    private val keyguardRepository: KeyguardRepository,
) {

    fun setBiometricUnlockState(@WakeAndUnlockMode unlockStateInt: Int) {
        val state = biometricModeIntToObject(unlockStateInt)
        keyguardRepository.setBiometricUnlockState(state)
    }

    private fun biometricModeIntToObject(@WakeAndUnlockMode value: Int): BiometricUnlockModel {
        return when (value) {
            MODE_NONE -> BiometricUnlockModel.NONE
            MODE_WAKE_AND_UNLOCK -> BiometricUnlockModel.WAKE_AND_UNLOCK
            MODE_WAKE_AND_UNLOCK_PULSING -> BiometricUnlockModel.WAKE_AND_UNLOCK_PULSING
            MODE_SHOW_BOUNCER -> BiometricUnlockModel.SHOW_BOUNCER
            MODE_ONLY_WAKE -> BiometricUnlockModel.ONLY_WAKE
            MODE_UNLOCK_COLLAPSING -> BiometricUnlockModel.UNLOCK_COLLAPSING
            MODE_WAKE_AND_UNLOCK_FROM_DREAM -> BiometricUnlockModel.WAKE_AND_UNLOCK_FROM_DREAM
            MODE_DISMISS_BOUNCER -> BiometricUnlockModel.DISMISS_BOUNCER
            else -> throw IllegalArgumentException("Invalid BiometricUnlockModel value: $value")
        }
    }
}
+4 −0
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@ constructor(
    private val keyguardRepository: KeyguardRepository,
) {

    fun setAodAvailable(value: Boolean) {
        keyguardRepository.setAodAvailable(value)
    }

    fun setIsDozing(isDozing: Boolean) {
        keyguardRepository.setIsDozing(isDozing)
    }
+7 −1
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.keyguard.domain.interactor.BiometricUnlockInteractor;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.res.R;
@@ -175,6 +176,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
    private final WakefulnessLifecycle mWakefulnessLifecycle;
    private final LatencyTracker mLatencyTracker;
    private final VibratorHelper mVibratorHelper;
    private final BiometricUnlockInteractor mBiometricUnlockInteractor;
    private final BiometricUnlockLogger mLogger;
    private final SystemClock mSystemClock;
    private final boolean mOrderUnlockAndWake;
@@ -291,7 +293,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
            SystemClock systemClock,
            FeatureFlags featureFlags,
            DeviceEntryHapticsInteractor hapticsInteractor,
            Lazy<SelectedUserInteractor> selectedUserInteractor
            Lazy<SelectedUserInteractor> selectedUserInteractor,
            BiometricUnlockInteractor biometricUnlockInteractor
    ) {
        mPowerManager = powerManager;
        mUpdateMonitor = keyguardUpdateMonitor;
@@ -300,6 +303,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
        mLatencyTracker = latencyTracker;
        mWakefulnessLifecycle = wakefulnessLifecycle;
        mWakefulnessLifecycle.addObserver(mWakefulnessObserver);
        mBiometricUnlockInteractor = biometricUnlockInteractor;

        mNotificationShadeWindowController = notificationShadeWindowController;
        mDozeScrimController = dozeScrimController;
@@ -531,6 +535,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
        for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
            listener.onModeChanged(mode);
        }
        mBiometricUnlockInteractor.setBiometricUnlockState(mode);
    }

    private void onBiometricUnlockedWithKeyguardDismissal(BiometricSourceType biometricSourceType) {
@@ -788,6 +793,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
        for (BiometricUnlockEventsListener listener : mBiometricUnlockEventsListeners) {
            listener.onResetMode();
        }
        mBiometricUnlockInteractor.setBiometricUnlockState(MODE_NONE);
        mNumConsecutiveFpFailures = 0;
        mLastFpFailureUptimeMillis = 0;
    }
+8 −31
Original line number Diff line number Diff line
@@ -37,14 +37,15 @@ import androidx.annotation.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.Dumpable;
import com.android.systemui.res.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.doze.AlwaysOnDisplayPolicy;
import com.android.systemui.doze.DozeScreenState;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.res.R;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
@@ -55,9 +56,7 @@ import com.android.systemui.unfold.FoldAodAnimationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;

import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

import javax.inject.Inject;

@@ -83,12 +82,11 @@ public class DozeParameters implements
    private final Resources mResources;
    private final BatteryController mBatteryController;
    private final ScreenOffAnimationController mScreenOffAnimationController;
    private final DozeInteractor mDozeInteractor;
    private final FoldAodAnimationController mFoldAodAnimationController;
    private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
    private final UserTracker mUserTracker;

    private final Set<Callback> mCallbacks = new HashSet<>();

    private boolean mDozeAlwaysOn;
    private boolean mControlScreenOffAnimation;
    private boolean mIsQuickPickupEnabled;
@@ -131,7 +129,8 @@ public class DozeParameters implements
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            ConfigurationController configurationController,
            StatusBarStateController statusBarStateController,
            UserTracker userTracker) {
            UserTracker userTracker,
            DozeInteractor dozeInteractor) {
        mResources = resources;
        mAmbientDisplayConfiguration = ambientDisplayConfiguration;
        mAlwaysOnPolicy = alwaysOnDisplayPolicy;
@@ -144,6 +143,7 @@ public class DozeParameters implements
        mScreenOffAnimationController = screenOffAnimationController;
        mUnlockedScreenOffAnimationController = unlockedScreenOffAnimationController;
        mUserTracker = userTracker;
        mDozeInteractor = dozeInteractor;

        keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
        tunerService.addTunable(
@@ -406,20 +406,6 @@ public class DozeParameters implements
        return mResources.getStringArray(R.array.doze_brightness_sensor_name_posture_mapping);
    }

    /**
     * Callback to listen for DozeParameter changes.
     */
    public void addCallback(Callback callback) {
        mCallbacks.add(callback);
    }

    /**
     * Remove callback that listens for DozeParameter changes.
     */
    public void removeCallback(Callback callback) {
        mCallbacks.remove(callback);
    }

    @Override
    public void onTuningChanged(String key, String newValue) {
        mDozeAlwaysOn = mAmbientDisplayConfiguration.alwaysOnEnabled(mUserTracker.getUserId());
@@ -465,10 +451,9 @@ public class DozeParameters implements
    }

    private void dispatchAlwaysOnEvent() {
        for (Callback callback : mCallbacks) {
            callback.onAlwaysOnChange();
        }
        mScreenOffAnimationController.onAlwaysOnChanged(getAlwaysOn());
        mDozeInteractor.setAodAvailable(getAlwaysOn());

    }

    private boolean getPostureSpecificBool(
@@ -485,14 +470,6 @@ public class DozeParameters implements
        return bool;
    }

    /** Callbacks for doze parameter related information */
    public interface Callback {
        /**
         * Invoked when the value of getAlwaysOn may have changed.
         */
        void onAlwaysOnChange();
    }

    private final class SettingsObserver extends ContentObserver {
        private final Uri mQuickPickupGesture =
                Settings.Secure.getUriFor(Settings.Secure.DOZE_QUICK_PICKUP_GESTURE);
Loading