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

Commit b543412b authored by Matt Pietal's avatar Matt Pietal
Browse files

Add OFF->LOCKSCREEN transition

Stabilize clock transitions so they do not animate, add some basic
alpha on OFF->LOCKSCREEN, and fade the content in. Do not begin
the transition until the device is ready, as opposed to during
as CoreStartable.

Fixes: 329035000
Test: atest OffToLockscreenTransitionViewModelTest
Flag: com.android.systemui.migrate_clocks_to_blueprint
Change-Id: Ibe7140fc01a9ce7decf49de875b85aca01c810cf
parent 3f68350b
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -109,7 +109,9 @@ class CommunalSceneTransitionInteractorTest : SysuiTestCase() {
        kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
        underTest.start()
        kosmos.communalSceneRepository.setTransitionState(sceneTransitions)
        testScope.launch { keyguardTransitionRepository.emitInitialStepsFromOff(LOCKSCREEN) }
        testScope.launch {
            keyguardTransitionRepository.emitInitialStepsFromOff(LOCKSCREEN, testSetup = true)
        }
    }

    /** Transition from blank to glanceable hub. This is the default case. */
+2 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.testKosmos
import org.junit.Before
import org.junit.Test
@@ -44,6 +45,7 @@ class KeyguardBlueprintViewModelTest : SysuiTestCase() {
            KeyguardBlueprintViewModel(
                handler = kosmos.fakeExecutorHandler,
                keyguardBlueprintInteractor = keyguardBlueprintInteractor,
                keyguardTransitionInteractor = kosmos.keyguardTransitionInteractor,
            )
    }

+94 −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 android.platform.test.flag.junit.FlagsParameterization
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.andSceneContainer
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.TransitionStep
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.collect.Range
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters

@ExperimentalCoroutinesApi
@SmallTest
@RunWith(ParameterizedAndroidJunit4::class)
class OffToLockscreenTransitionViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
    val kosmos = testKosmos()
    val testScope = kosmos.testScope
    val repository = kosmos.fakeKeyguardTransitionRepository
    lateinit var underTest: OffToLockscreenTransitionViewModel

    companion object {
        @JvmStatic
        @Parameters(name = "{0}")
        fun getParams(): List<FlagsParameterization> {
            return FlagsParameterization.allCombinationsOf().andSceneContainer()
        }
    }

    init {
        mSetFlagsRule.setFlagsParameterization(flags)
    }

    @Before
    fun setup() {
        underTest = kosmos.offToLockscreenTransitionViewModel
    }

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

            repository.sendTransitionStep(step(0f, TransitionState.STARTED))
            repository.sendTransitionStep(step(0f))
            assertThat(alpha).isEqualTo(0f)

            repository.sendTransitionStep(step(0.66f))
            assertThat(alpha).isIn(Range.open(.1f, .9f))

            repository.sendTransitionStep(step(1f))
            assertThat(alpha).isEqualTo(1f)
        }

    private fun step(
        value: Float,
        state: TransitionState = TransitionState.RUNNING,
    ): TransitionStep {
        return TransitionStep(
            from = KeyguardState.OFF,
            to = KeyguardState.LOCKSCREEN,
            value = value,
            transitionState = state,
            ownerName = "OffToLockscreenTransitionViewModelTest",
        )
    }
}
+15 −0
Original line number Diff line number Diff line
@@ -147,6 +147,7 @@ import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.SystemPropertiesHelper;
import com.android.systemui.keyguard.dagger.KeyguardModule;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionBootInteractor;
import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.navigationbar.NavigationModeController;
@@ -265,6 +266,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
    private static final int NOTIFY_STARTED_GOING_TO_SLEEP = 17;
    private static final int SYSTEM_READY = 18;
    private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
    private static final int BOOT_INTERACTOR = 20;

    /** Enum for reasons behind updating wakeAndUnlock state. */
    @Retention(RetentionPolicy.SOURCE)
@@ -1390,6 +1392,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
    private final DozeParameters mDozeParameters;
    private final SelectedUserInteractor mSelectedUserInteractor;
    private final KeyguardInteractor mKeyguardInteractor;
    private final KeyguardTransitionBootInteractor mTransitionBootInteractor;
    @VisibleForTesting
    protected FoldGracePeriodProvider mFoldGracePeriodProvider =
            new FoldGracePeriodProvider();
@@ -1484,6 +1487,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            Lazy<WindowManagerLockscreenVisibilityManager> wmLockscreenVisibilityManager,
            SelectedUserInteractor selectedUserInteractor,
            KeyguardInteractor keyguardInteractor,
            KeyguardTransitionBootInteractor transitionBootInteractor,
            WindowManagerOcclusionManager wmOcclusionManager) {
        mContext = context;
        mUserTracker = userTracker;
@@ -1524,6 +1528,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        mDozeParameters = dozeParameters;
        mSelectedUserInteractor = selectedUserInteractor;
        mKeyguardInteractor = keyguardInteractor;
        mTransitionBootInteractor = transitionBootInteractor;

        mStatusBarStateController = statusBarStateController;
        statusBarStateController.addCallback(this);
@@ -1678,6 +1683,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            adjustStatusBarLocked();
            mDreamOverlayStateController.addCallback(mDreamOverlayStateCallback);

            mHandler.obtainMessage(BOOT_INTERACTOR).sendToTarget();

            final DreamViewModel dreamViewModel = mDreamViewModel.get();
            final CommunalTransitionViewModel communalViewModel =
                    mCommunalTransitionViewModel.get();
@@ -2705,11 +2712,19 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                    message = "SYSTEM_READY";
                    handleSystemReady();
                    break;
                case BOOT_INTERACTOR:
                    message = "BOOT_INTERACTOR";
                    handleBootInteractor();
                    break;
            }
            Log.d(TAG, "KeyguardViewMediator queue processing message: " + message);
        }
    };

    private void handleBootInteractor() {
        mTransitionBootInteractor.start();
    }

    private void tryKeyguardDone() {
        if (DEBUG) {
            Log.d(TAG, "tryKeyguardDone: pending - " + mKeyguardDonePending + ", animRan - "
+3 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import com.android.systemui.keyguard.data.quickaffordance.KeyguardDataQuickAffor
import com.android.systemui.keyguard.data.repository.DeviceEntryFaceAuthModule;
import com.android.systemui.keyguard.data.repository.KeyguardRepositoryModule;
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionBootInteractor;
import com.android.systemui.keyguard.domain.interactor.StartKeyguardTransitionModule;
import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLogger;
import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAffordancesMetricsLoggerImpl;
@@ -175,6 +176,7 @@ public interface KeyguardModule {
            Lazy<WindowManagerLockscreenVisibilityManager> wmLockscreenVisibilityManager,
            SelectedUserInteractor selectedUserInteractor,
            KeyguardInteractor keyguardInteractor,
            KeyguardTransitionBootInteractor transitionBootInteractor,
            WindowManagerOcclusionManager windowManagerOcclusionManager) {
        return new KeyguardViewMediator(
                context,
@@ -225,6 +227,7 @@ public interface KeyguardModule {
                wmLockscreenVisibilityManager,
                selectedUserInteractor,
                keyguardInteractor,
                transitionBootInteractor,
                windowManagerOcclusionManager);
    }

Loading