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

Commit 7a298821 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "OCCLUDED->LOCKSCREEN transition"

parents 8a3d7231 a5b6dbe8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1289,6 +1289,9 @@
    <!-- DREAMING -> LOCKSCREEN transition: Amount to shift lockscreen content on entering -->
    <dimen name="dreaming_to_lockscreen_transition_lockscreen_translation_y">40dp</dimen>

    <!-- OCCLUDED -> LOCKSCREEN transition: Amount to shift lockscreen content on entering -->
    <dimen name="occluded_to_lockscreen_transition_lockscreen_translation_y">40dp</dimen>

    <!-- The amount of vertical offset for the keyguard during the full shade transition. -->
    <dimen name="lockscreen_shade_keyguard_transition_vertical_offset">0dp</dimen>

+2 −2
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ constructor(
                                name,
                                KeyguardState.OCCLUDED,
                                KeyguardState.LOCKSCREEN,
                                getAnimator(),
                                getAnimator(TO_LOCKSCREEN_DURATION),
                            )
                        )
                    }
@@ -97,6 +97,6 @@ constructor(

    companion object {
        private val DEFAULT_DURATION = 500.milliseconds
        val TO_LOCKSCREEN_DURATION = 1183.milliseconds
        val TO_LOCKSCREEN_DURATION = 933.milliseconds
    }
}
+14 −1
Original line number Diff line number Diff line
@@ -24,7 +24,9 @@ import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.KeyguardState.AOD
import com.android.systemui.keyguard.shared.model.KeyguardState.DREAMING
import com.android.systemui.keyguard.shared.model.KeyguardState.LOCKSCREEN
import com.android.systemui.keyguard.shared.model.KeyguardState.OCCLUDED
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
import com.android.systemui.keyguard.shared.model.TransitionStep
import javax.inject.Inject
import kotlin.time.Duration
@@ -50,6 +52,10 @@ constructor(
    val dreamingToLockscreenTransition: Flow<TransitionStep> =
        repository.transition(DREAMING, LOCKSCREEN)

    /** OCCLUDED->LOCKSCREEN transition information. */
    val occludedToLockscreenTransition: Flow<TransitionStep> =
        repository.transition(OCCLUDED, LOCKSCREEN)

    /** (any)->AOD transition information */
    val anyStateToAodTransition: Flow<TransitionStep> =
        repository.transitions.filter { step -> step.to == KeyguardState.AOD }
@@ -93,7 +99,14 @@ constructor(
        val start = (params.startTime / totalDuration).toFloat()
        val chunks = (totalDuration / params.duration).toFloat()
        return flow
            .map { step -> (step.value - start) * chunks }
            // When starting, emit a value of 0f to give animations a chance to set initial state
            .map { step ->
                if (step.transitionState == STARTED) {
                    0f
                } else {
                    (step.value - start) * chunks
                }
            }
            .filter { value -> value >= 0f && value <= 1f }
    }
}
+63 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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 com.android.systemui.animation.Interpolators.EMPHASIZED_DECELERATE
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.domain.interactor.FromOccludedTransitionInteractor.Companion.TO_LOCKSCREEN_DURATION
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.AnimationParams
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

/**
 * Breaks down OCCLUDED->LOCKSCREEN transition into discrete steps for corresponding views to
 * consume.
 */
@SysUISingleton
class OccludedToLockscreenTransitionViewModel
@Inject
constructor(
    private val interactor: KeyguardTransitionInteractor,
) {
    /** Lockscreen views y-translation */
    fun lockscreenTranslationY(translatePx: Int): Flow<Float> {
        return flowForAnimation(LOCKSCREEN_TRANSLATION_Y).map { value ->
            -translatePx + (EMPHASIZED_DECELERATE.getInterpolation(value) * translatePx)
        }
    }

    /** Lockscreen views alpha */
    val lockscreenAlpha: Flow<Float> = flowForAnimation(LOCKSCREEN_ALPHA)

    private fun flowForAnimation(params: AnimationParams): Flow<Float> {
        return interactor.transitionStepAnimation(
            interactor.occludedToLockscreenTransition,
            params,
            totalDuration = TO_LOCKSCREEN_DURATION
        )
    }

    companion object {
        @JvmField val LOCKSCREEN_ANIMATION_DURATION_MS = TO_LOCKSCREEN_DURATION.inWholeMilliseconds
        val LOCKSCREEN_TRANSLATION_Y = AnimationParams(duration = TO_LOCKSCREEN_DURATION)
        val LOCKSCREEN_ALPHA =
            AnimationParams(startTime = 233.milliseconds, duration = 250.milliseconds)
    }
}
+43 −13
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ import com.android.systemui.keyguard.shared.model.TransitionState;
import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.keyguard.ui.viewmodel.DreamingToLockscreenTransitionViewModel;
import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel;
import com.android.systemui.keyguard.ui.viewmodel.OccludedToLockscreenTransitionViewModel;
import com.android.systemui.media.controls.pipeline.MediaDataManager;
import com.android.systemui.media.controls.ui.KeyguardMediaController;
import com.android.systemui.media.controls.ui.MediaHierarchyManager;
@@ -239,6 +240,8 @@ import java.util.function.Consumer;
import javax.inject.Inject;
import javax.inject.Provider;

import kotlinx.coroutines.CoroutineDispatcher;

@CentralSurfacesComponent.CentralSurfacesScope
public final class NotificationPanelViewController implements Dumpable {

@@ -685,10 +688,13 @@ public final class NotificationPanelViewController implements Dumpable {
    private boolean mIgnoreXTouchSlop;
    private boolean mExpandLatencyTracking;
    private DreamingToLockscreenTransitionViewModel mDreamingToLockscreenTransitionViewModel;
    private OccludedToLockscreenTransitionViewModel mOccludedToLockscreenTransitionViewModel;

    private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
    private boolean mIsDreamToLockscreenTransitionRunning = false;
    private CoroutineDispatcher mMainDispatcher;
    private boolean mIsToLockscreenTransitionRunning = false;
    private int mDreamingToLockscreenTransitionTranslationY;
    private int mOccludedToLockscreenTransitionTranslationY;
    private boolean mUnocclusionTransitionFlagEnabled = false;

    private final Runnable mFlingCollapseRunnable = () -> fling(0, false /* expand */,
@@ -707,7 +713,13 @@ public final class NotificationPanelViewController implements Dumpable {

    private final Consumer<TransitionStep> mDreamingToLockscreenTransition =
            (TransitionStep step) -> {
                mIsDreamToLockscreenTransitionRunning =
                mIsToLockscreenTransitionRunning =
                    step.getTransitionState() == TransitionState.RUNNING;
            };

    private final Consumer<TransitionStep> mOccludedToLockscreenTransition =
            (TransitionStep step) -> {
                mIsToLockscreenTransitionRunning =
                    step.getTransitionState() == TransitionState.RUNNING;
            };

@@ -781,6 +793,8 @@ public final class NotificationPanelViewController implements Dumpable {
            KeyguardBottomAreaInteractor keyguardBottomAreaInteractor,
            AlternateBouncerInteractor alternateBouncerInteractor,
            DreamingToLockscreenTransitionViewModel dreamingToLockscreenTransitionViewModel,
            OccludedToLockscreenTransitionViewModel occludedToLockscreenTransitionViewModel,
            @Main CoroutineDispatcher mainDispatcher,
            KeyguardTransitionInteractor keyguardTransitionInteractor,
            DumpManager dumpManager) {
        keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@@ -798,6 +812,7 @@ public final class NotificationPanelViewController implements Dumpable {
        mShadeHeightLogger = shadeHeightLogger;
        mGutsManager = gutsManager;
        mDreamingToLockscreenTransitionViewModel = dreamingToLockscreenTransitionViewModel;
        mOccludedToLockscreenTransitionViewModel = occludedToLockscreenTransitionViewModel;
        mKeyguardTransitionInteractor = keyguardTransitionInteractor;
        mView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
@@ -876,6 +891,7 @@ public final class NotificationPanelViewController implements Dumpable {
        mFalsingCollector = falsingCollector;
        mPowerManager = powerManager;
        mWakeUpCoordinator = coordinator;
        mMainDispatcher = mainDispatcher;
        mAccessibilityManager = accessibilityManager;
        mView.setAccessibilityPaneTitle(determineAccessibilityPaneTitle());
        setPanelAlpha(255, false /* animate */);
@@ -1101,15 +1117,27 @@ public final class NotificationPanelViewController implements Dumpable {
                controller.setup(mNotificationContainerParent));

        if (mUnocclusionTransitionFlagEnabled) {
            // Dreaming->Lockscreen
            collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(),
                    mDreamingToLockscreenTransition, mMainDispatcher);
            collectFlow(mView, mDreamingToLockscreenTransitionViewModel.getLockscreenAlpha(),
                    dreamingToLockscreenTransitionAlpha(mNotificationStackScrollLayoutController));

                    toLockscreenTransitionAlpha(mNotificationStackScrollLayoutController),
                    mMainDispatcher);
            collectFlow(mView, mDreamingToLockscreenTransitionViewModel.lockscreenTranslationY(
                    mDreamingToLockscreenTransitionTranslationY),
                    dreamingToLockscreenTransitionY(mNotificationStackScrollLayoutController));
                    toLockscreenTransitionY(mNotificationStackScrollLayoutController),
                    mMainDispatcher);

            collectFlow(mView, mKeyguardTransitionInteractor.getDreamingToLockscreenTransition(),
                    mDreamingToLockscreenTransition);
            // Occluded->Lockscreen
            collectFlow(mView, mKeyguardTransitionInteractor.getOccludedToLockscreenTransition(),
                    mOccludedToLockscreenTransition, mMainDispatcher);
            collectFlow(mView, mOccludedToLockscreenTransitionViewModel.getLockscreenAlpha(),
                    toLockscreenTransitionAlpha(mNotificationStackScrollLayoutController),
                    mMainDispatcher);
            collectFlow(mView, mOccludedToLockscreenTransitionViewModel.lockscreenTranslationY(
                    mOccludedToLockscreenTransitionTranslationY),
                    toLockscreenTransitionY(mNotificationStackScrollLayoutController),
                    mMainDispatcher);
        }
    }

@@ -1147,6 +1175,8 @@ public final class NotificationPanelViewController implements Dumpable {
                R.dimen.split_shade_scrim_transition_distance);
        mDreamingToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize(
                R.dimen.dreaming_to_lockscreen_transition_lockscreen_translation_y);
        mOccludedToLockscreenTransitionTranslationY = mResources.getDimensionPixelSize(
                R.dimen.occluded_to_lockscreen_transition_lockscreen_translation_y);
    }

    private void updateViewControllers(KeyguardStatusView keyguardStatusView,
@@ -1810,7 +1840,7 @@ public final class NotificationPanelViewController implements Dumpable {
    }

    private void updateClock() {
        if (mIsDreamToLockscreenTransitionRunning) {
        if (mIsToLockscreenTransitionRunning) {
            return;
        }
        float alpha = mClockPositionResult.clockAlpha * mKeyguardOnlyContentAlpha;
@@ -2701,7 +2731,7 @@ public final class NotificationPanelViewController implements Dumpable {
        } else if (statusBarState == KEYGUARD
                || statusBarState == StatusBarState.SHADE_LOCKED) {
            mKeyguardBottomArea.setVisibility(View.VISIBLE);
            if (!mIsDreamToLockscreenTransitionRunning) {
            if (!mIsToLockscreenTransitionRunning) {
                mKeyguardBottomArea.setAlpha(1f);
            }
        } else {
@@ -3570,7 +3600,7 @@ public final class NotificationPanelViewController implements Dumpable {
    }

    private void updateNotificationTranslucency() {
        if (mIsDreamToLockscreenTransitionRunning) {
        if (mIsToLockscreenTransitionRunning) {
            return;
        }
        float alpha = 1f;
@@ -3628,7 +3658,7 @@ public final class NotificationPanelViewController implements Dumpable {
    }

    private void updateKeyguardBottomAreaAlpha() {
        if (mIsDreamToLockscreenTransitionRunning) {
        if (mIsToLockscreenTransitionRunning) {
            return;
        }
        // There are two possible panel expansion behaviors:
@@ -5860,7 +5890,7 @@ public final class NotificationPanelViewController implements Dumpable {
        mCurrentPanelState = state;
    }

    private Consumer<Float> dreamingToLockscreenTransitionAlpha(
    private Consumer<Float> toLockscreenTransitionAlpha(
            NotificationStackScrollLayoutController stackScroller) {
        return (Float alpha) -> {
            mKeyguardStatusViewController.setAlpha(alpha);
@@ -5878,7 +5908,7 @@ public final class NotificationPanelViewController implements Dumpable {
        };
    }

    private Consumer<Float> dreamingToLockscreenTransitionY(
    private Consumer<Float> toLockscreenTransitionY(
                NotificationStackScrollLayoutController stackScroller) {
        return (Float translationY) -> {
            mKeyguardStatusViewController.setTranslationY(translationY,  /* excludeMedia= */false);
Loading