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

Commit 9f978356 authored by Matt Pietal's avatar Matt Pietal Committed by Android (Google) Code Review
Browse files

Merge "Invoke dismiss callback from alternate bouncer" into main

parents bc288caf 80b7f6ea
Loading
Loading
Loading
Loading
+125 −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.systemui.keyguard.ui.viewmodel

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.coroutines.collectValues
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
import com.android.systemui.keyguard.shared.model.TransitionStep
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@ExperimentalCoroutinesApi
@SmallTest
@RunWith(AndroidJUnit4::class)
class AlternateBouncerToLockscreenTransitionViewModelTest : SysuiTestCase() {
    val kosmos = testKosmos()
    val testScope = kosmos.testScope

    val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository

    val underTest = kosmos.alternateBouncerToLockscreenTransitionViewModel

    @Test
    fun lockscreenAlpha_zeroInitialAlpha() =
        testScope.runTest {
            // ViewState starts at 0 alpha.
            val viewState = ViewStateAccessor(alpha = { 0f })
            val alpha by collectValues(underTest.lockscreenAlpha(viewState))

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.ALTERNATE_BOUNCER,
                to = KeyguardState.LOCKSCREEN,
                testScope
            )

            assertThat(alpha[0]).isEqualTo(0f)
            // alpha duration is 250ms of the 300ms total, so 0.5f of the total is 0.6
            assertThat(alpha[1]).isEqualTo(0.6f)
            assertThat(alpha[2]).isEqualTo(1f)
        }

    @Test
    fun deviceEntryParentViewAlpha() =
        testScope.runTest {
            val deviceEntryParentViewAlpha by collectLastValue(underTest.deviceEntryParentViewAlpha)

            // immediately 1f
            keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
            assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(0.4f))
            assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(.85f))
            assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(1f))
            assertThat(deviceEntryParentViewAlpha).isEqualTo(1f)
        }

    @Test
    fun deviceEntryBackgroundViewAlpha_udfpsEnrolled_show() =
        testScope.runTest {
            fingerprintPropertyRepository.supportsUdfps()
            val bgViewAlpha by collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
            runCurrent()

            // immediately 1f
            keyguardTransitionRepository.sendTransitionStep(step(0f, TransitionState.STARTED))
            assertThat(bgViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(0.1f))
            assertThat(bgViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(.3f))
            assertThat(bgViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(.5f))
            assertThat(bgViewAlpha).isEqualTo(1f)

            keyguardTransitionRepository.sendTransitionStep(step(1f, TransitionState.FINISHED))
            assertThat(bgViewAlpha).isEqualTo(1f)
        }

    private fun step(
        value: Float,
        state: TransitionState = TransitionState.RUNNING
    ): TransitionStep {
        return TransitionStep(
            from = KeyguardState.ALTERNATE_BOUNCER,
            to = KeyguardState.LOCKSCREEN,
            value = value,
            transitionState = state,
            ownerName = "AlternateBouncerToLockscreenTransitionViewModelTest"
        )
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.keyguard;

import android.util.Log;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.UiBackground;
@@ -33,6 +34,7 @@ public class DismissCallbackRegistry {

    private final ArrayList<DismissCallbackWrapper> mDismissCallbacks = new ArrayList<>();
    private final Executor mUiBgExecutor;
    private final static String TAG = "DismissCallbackRegistry";

    @Inject
    public DismissCallbackRegistry(@UiBackground Executor uiBgExecutor) {
@@ -40,10 +42,12 @@ public class DismissCallbackRegistry {
    }

    public void addCallback(IKeyguardDismissCallback callback) {
        Log.d(TAG, "Adding callback: " + callback);
        mDismissCallbacks.add(new DismissCallbackWrapper(callback));
    }

    public void notifyDismissCancelled() {
        Log.d(TAG, "notifyDismissCancelled(" + mDismissCallbacks.size() + ")");
        for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) {
            DismissCallbackWrapper callback = mDismissCallbacks.get(i);
            mUiBgExecutor.execute(callback::notifyDismissCancelled);
@@ -52,6 +56,7 @@ public class DismissCallbackRegistry {
    }

    public void notifyDismissSucceeded() {
        Log.d(TAG, "notifyDismissSucceeded(" + mDismissCallbacks.size() + ")");
        for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) {
            DismissCallbackWrapper callback = mDismissCallbacks.get(i);
            mUiBgExecutor.execute(callback::notifyDismissSucceeded);
+8 −2
Original line number Diff line number Diff line
@@ -198,7 +198,12 @@ constructor(
            interpolator = Interpolators.LINEAR
            duration =
                when (toState) {
                    KeyguardState.AOD -> TO_AOD_DURATION
                    KeyguardState.DOZING -> TO_DOZING_DURATION
                    KeyguardState.GONE -> TO_GONE_DURATION
                    KeyguardState.LOCKSCREEN -> TO_LOCKSCREEN_DURATION
                    KeyguardState.OCCLUDED -> TO_OCCLUDED_DURATION
                    KeyguardState.PRIMARY_BOUNCER -> TO_PRIMARY_BOUNCER_DURATION
                    else -> TRANSITION_DURATION_MS
                }.inWholeMilliseconds
        }
@@ -211,10 +216,11 @@ constructor(
    companion object {
        const val TAG = "FromAlternateBouncerTransitionInteractor"
        val TRANSITION_DURATION_MS = 300.milliseconds
        val TO_GONE_DURATION = 500.milliseconds
        val TO_AOD_DURATION = TRANSITION_DURATION_MS
        val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS
        val TO_DOZING_DURATION = TRANSITION_DURATION_MS
        val TO_GONE_DURATION = 500.milliseconds
        val TO_LOCKSCREEN_DURATION = 300.milliseconds
        val TO_OCCLUDED_DURATION = TRANSITION_DURATION_MS
        val TO_PRIMARY_BOUNCER_DURATION = TRANSITION_DURATION_MS
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
import com.android.systemui.deviceentry.ui.binder.UdfpsAccessibilityOverlayBinder
import com.android.systemui.deviceentry.ui.view.UdfpsAccessibilityOverlay
import com.android.systemui.deviceentry.ui.viewmodel.AlternateBouncerUdfpsAccessibilityOverlayViewModel
import com.android.systemui.keyguard.DismissCallbackRegistry
import com.android.systemui.keyguard.ui.view.DeviceEntryIconView
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerDependencies
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerUdfpsIconViewModel
@@ -66,6 +67,7 @@ constructor(
    private val alternateBouncerDependencies: Lazy<AlternateBouncerDependencies>,
    private val windowManager: Lazy<WindowManager>,
    private val layoutInflater: Lazy<LayoutInflater>,
    private val dismissCallbackRegistry: DismissCallbackRegistry,
) : CoreStartable {
    private val layoutParams: WindowManager.LayoutParams
        get() =
@@ -162,6 +164,7 @@ constructor(

            fun onBackRequested() {
                alternateBouncerDependencies.get().viewModel.hideAlternateBouncer()
                dismissCallbackRegistry.notifyDismissCancelled()
            }
        }

+7 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.keyguard.ui.transitions
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToAodTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToDozingTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToGoneTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToLockscreenTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToOccludedTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AlternateBouncerToPrimaryBouncerTransitionViewModel
import com.android.systemui.keyguard.ui.viewmodel.AodToGoneTransitionViewModel
@@ -78,6 +79,12 @@ abstract class DeviceEntryIconTransitionModule {
        impl: AlternateBouncerToGoneTransitionViewModel
    ): DeviceEntryIconTransition

    @Binds
    @IntoSet
    abstract fun alternateBouncerToLockscreen(
        impl: AlternateBouncerToLockscreenTransitionViewModel
    ): DeviceEntryIconTransition

    @Binds
    @IntoSet
    abstract fun alternateBouncerToOccluded(
Loading