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

Commit bc6143d1 authored by Lucas Silva's avatar Lucas Silva
Browse files

Use CommunalTransitionAnimatorController for UMO

When tapping on the UMO on the communal hub, we now wrap the animation
controller in CommunalTransitionAnimatorController in order to properly
set the communal state and hide the hub at the end of the animation.

Otherwise there is a flash at the end of the animation.

Bug: 346865769
Test: verified with UMO on hub, both over lockscreen and requiring
unlock
Flag: com.android.systemui.communal_hub

Change-Id: Ie564699846346f2e3b969afe50e81a15957f3ec4
parent 0d4eb64a
Loading
Loading
Loading
Loading
+65 −38
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.media.controls.ui.controller;
import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS;

import static com.android.settingslib.flags.Flags.legacyLeAudioSharing;
import static com.android.systemui.Flags.communalHub;
import static com.android.systemui.Flags.mediaLockscreenLaunchAnimation;
import static com.android.systemui.media.controls.shared.model.SmartspaceMediaDataKt.NUM_REQUIRED_RECOMMENDATIONS;

@@ -90,6 +91,8 @@ import com.android.systemui.animation.ActivityTransitionAnimator;
import com.android.systemui.animation.GhostedViewTransitionAnimatorController;
import com.android.systemui.bluetooth.BroadcastDialogController;
import com.android.systemui.broadcast.BroadcastSender;
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor;
import com.android.systemui.communal.widgets.CommunalTransitionAnimatorController;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager;
@@ -202,10 +205,12 @@ public class MediaControlPanel {
    );

    // Time in millis for playing turbulence noise that is played after a touch ripple.
    @VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L;
    @VisibleForTesting
    static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L;

    private final SeekBarViewModel mSeekBarViewModel;
    private final MediaFlags mMediaFlags;
    private final CommunalSceneInteractor mCommunalSceneInteractor;
    private SeekBarObserver mSeekBarObserver;
    protected final Executor mBackgroundExecutor;
    private final DelayableExecutor mMainExecutor;
@@ -293,7 +298,8 @@ public class MediaControlPanel {
     * Initialize a new control panel
     *
     * @param backgroundExecutor background executor, used for processing artwork
     * @param mainExecutor main thread executor, used if we receive callbacks on the background
     * @param mainExecutor       main thread executor, used if we receive callbacks on the
     *                           background
     *                           thread that then trigger UI changes.
     * @param activityStarter    activity starter
     */
@@ -314,6 +320,7 @@ public class MediaControlPanel {
            MediaUiEventLogger logger,
            KeyguardStateController keyguardStateController,
            ActivityIntentHelper activityIntentHelper,
            CommunalSceneInteractor communalSceneInteractor,
            NotificationLockscreenUserManager lockscreenUserManager,
            BroadcastDialogController broadcastDialogController,
            GlobalSettings globalSettings,
@@ -337,6 +344,7 @@ public class MediaControlPanel {
        mLockscreenUserManager = lockscreenUserManager;
        mBroadcastDialogController = broadcastDialogController;
        mMediaFlags = mediaFlags;
        mCommunalSceneInteractor = communalSceneInteractor;

        mSeekBarViewModel.setLogSeek(() -> {
            if (mPackageName != null && mInstanceId != null) {
@@ -375,6 +383,7 @@ public class MediaControlPanel {

    /**
     * Get the recommendation view holder used to display Smartspace media recs.
     *
     * @return the recommendation view holder
     */
    @Nullable
@@ -829,8 +838,10 @@ public class MediaControlPanel {
                () -> {
                    titleText.setText(data.getSong());
                    artistText.setText(data.getArtist());
                setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator, data.isExplicit());
                setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator, data.isExplicit());
                    setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator,
                            data.isExplicit());
                    setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator,
                            data.isExplicit());

                    // refreshState is required here to resize the text views (and prevent ellipsis)
                    mMediaViewController.refreshState();
@@ -1346,6 +1357,7 @@ public class MediaControlPanel {
                /* shouldInverseNoiseLuminosity= */ false
        );
    }

    private void clearButton(final ImageButton button) {
        button.setImageDrawable(null);
        button.setContentDescription(null);
@@ -1421,19 +1433,33 @@ public class MediaControlPanel {

        // TODO(b/174236650): Make sure that the carousel indicator also fades out.
        // TODO(b/174236650): Instrument the animation to measure jank.
        return new GhostedViewTransitionAnimatorController(player,
        final ActivityTransitionAnimator.Controller controller =
                new GhostedViewTransitionAnimatorController(player,
                        InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER) {
                    @Override
                    protected float getCurrentTopCornerRadius() {
                return mContext.getResources().getDimension(R.dimen.notification_corner_radius);
                        return mContext.getResources().getDimension(
                                R.dimen.notification_corner_radius);
                    }

                    @Override
                    protected float getCurrentBottomCornerRadius() {
                // TODO(b/184121838): Make IlluminationDrawable support top and bottom radius.
                        // TODO(b/184121838): Make IlluminationDrawable support top and bottom
                        //  radius.
                        return getCurrentTopCornerRadius();
                    }
                };

        // When on the hub, wrap in the communal animation controller to ensure we exit the hub
        // at the proper stage of the animation.
        if (communalHub()
                && mMediaViewController.getCurrentEndLocation()
                == MediaHierarchyManager.LOCATION_COMMUNAL_HUB) {
            mCommunalSceneInteractor.setIsLaunchingWidget(true);
            return new CommunalTransitionAnimatorController(controller,
                    mCommunalSceneInteractor);
        }
        return controller;
    }

    /** Bind this recommendation view based on the given data. */
@@ -1934,6 +1960,7 @@ public class MediaControlPanel {

    /**
     * Get the surface given the current end location for MediaViewController
     *
     * @return surface used for Smartspace logging
     */
    protected int getSurfaceForSmartspaceLogging() {
+4 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.bluetooth.BroadcastDialogController
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor
import com.android.systemui.media.controls.MediaTestUtils
import com.android.systemui.media.controls.domain.pipeline.EMPTY_SMARTSPACE_MEDIA_DATA
import com.android.systemui.media.controls.domain.pipeline.MediaDataManager
@@ -211,6 +212,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
    @Mock private lateinit var activityIntentHelper: ActivityIntentHelper
    @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager

    @Mock private lateinit var communalSceneInteractor: CommunalSceneInteractor

    @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder
    @Mock private lateinit var smartspaceAction: SmartspaceAction
    private lateinit var smartspaceData: SmartspaceMediaData
@@ -271,6 +274,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
                    logger,
                    keyguardStateController,
                    activityIntentHelper,
                    communalSceneInteractor,
                    lockscreenUserManager,
                    broadcastDialogController,
                    globalSettings,