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

Commit 0c81ba52 authored by Yein Jo's avatar Yein Jo
Browse files

Send an end signal from UMO to finish turbulence noise.

Bug: 237282226
Test: MediaControlPanelTest
Change-Id: Iae61fe96e907ae2f9638703e46483e177a9c7f6a
parent 1887b976
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ data class TurbulenceNoiseAnimationConfig(
    val onAnimationEnd: Runnable? = null
) {
    companion object {
        const val DEFAULT_MAX_DURATION_IN_MILLIS = 7500f
        const val DEFAULT_MAX_DURATION_IN_MILLIS = 30_000f // Max 30 sec
        const val DEFAULT_EASING_DURATION_IN_MILLIS = 750f
        const val DEFAULT_LUMINOSITY_MULTIPLIER = 1f
        const val DEFAULT_NOISE_GRID_COUNT = 1.2f
+15 −7
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseAnimat
import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseController;
import com.android.systemui.util.ColorUtilKt;
import com.android.systemui.util.animation.TransitionLayout;
import com.android.systemui.util.concurrency.DelayableExecutor;
import com.android.systemui.util.time.SystemClock;

import java.net.URISyntaxException;
@@ -166,10 +167,13 @@ public class MediaControlPanel {
            R.id.action1
    );

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

    private final SeekBarViewModel mSeekBarViewModel;
    private SeekBarObserver mSeekBarObserver;
    protected final Executor mBackgroundExecutor;
    private final Executor mMainExecutor;
    private final DelayableExecutor mMainExecutor;
    private final ActivityStarter mActivityStarter;
    private final BroadcastSender mBroadcastSender;

@@ -222,10 +226,10 @@ public class MediaControlPanel {
    private String mSwitchBroadcastApp;
    private MultiRippleController mMultiRippleController;
    private TurbulenceNoiseController mTurbulenceNoiseController;
    private FeatureFlags mFeatureFlags;
    private TurbulenceNoiseAnimationConfig mTurbulenceNoiseAnimationConfig = null;
    private final FeatureFlags mFeatureFlags;
    private TurbulenceNoiseAnimationConfig mTurbulenceNoiseAnimationConfig;
    @VisibleForTesting
    MultiRippleController.Companion.RipplesFinishedListener mRipplesFinishedListener = null;
    MultiRippleController.Companion.RipplesFinishedListener mRipplesFinishedListener;

    /**
     * Initialize a new control panel
@@ -239,7 +243,7 @@ public class MediaControlPanel {
    public MediaControlPanel(
            Context context,
            @Background Executor backgroundExecutor,
            @Main Executor mainExecutor,
            @Main DelayableExecutor mainExecutor,
            ActivityStarter activityStarter,
            BroadcastSender broadcastSender,
            MediaViewController mediaViewController,
@@ -409,10 +413,12 @@ public class MediaControlPanel {
        if (mFeatureFlags.isEnabled(Flags.UMO_TURBULENCE_NOISE)) {
            mRipplesFinishedListener = () -> {
                if (mTurbulenceNoiseAnimationConfig == null) {
                    mTurbulenceNoiseAnimationConfig = createLingeringNoiseAnimation();
                    mTurbulenceNoiseAnimationConfig = createTurbulenceNoiseAnimation();
                }
                // Color will be correctly updated in ColorSchemeTransition.
                mTurbulenceNoiseController.play(mTurbulenceNoiseAnimationConfig);
                mMainExecutor.executeDelayed(
                        mTurbulenceNoiseController::finish, TURBULENCE_NOISE_PLAY_DURATION);
            };
            mMultiRippleController.addRipplesFinishedListener(mRipplesFinishedListener);
        }
@@ -1056,7 +1062,7 @@ public class MediaControlPanel {
        );
    }

    private TurbulenceNoiseAnimationConfig createLingeringNoiseAnimation() {
    private TurbulenceNoiseAnimationConfig createTurbulenceNoiseAnimation() {
        return new TurbulenceNoiseAnimationConfig(
                TurbulenceNoiseAnimationConfig.DEFAULT_NOISE_GRID_COUNT,
                TurbulenceNoiseAnimationConfig.DEFAULT_LUMINOSITY_MULTIPLIER,
@@ -1071,7 +1077,9 @@ public class MediaControlPanel {
                /* width= */ mMediaViewHolder.getMultiRippleView().getWidth(),
                /* height= */ mMediaViewHolder.getMultiRippleView().getHeight(),
                TurbulenceNoiseAnimationConfig.DEFAULT_MAX_DURATION_IN_MILLIS,
                /* easeInDuration= */
                TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
                /* easeOutDuration= */
                TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
                this.getContext().getResources().getDisplayMetrics().density,
                BlendMode.PLUS,
+24 −2
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ import com.android.systemui.plugins.FalsingManager
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.surfaceeffects.ripple.MultiRippleView
import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseAnimationConfig
import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseView
import com.android.systemui.util.animation.TransitionLayout
import com.android.systemui.util.concurrency.FakeExecutor
@@ -222,8 +223,8 @@ public class MediaControlPanelTest : SysuiTestCase() {

    @Before
    fun setUp() {
        bgExecutor = FakeExecutor(FakeSystemClock())
        mainExecutor = FakeExecutor(FakeSystemClock())
        bgExecutor = FakeExecutor(clock)
        mainExecutor = FakeExecutor(clock)
        whenever(mediaViewController.expandedLayout).thenReturn(expandedSet)
        whenever(mediaViewController.collapsedLayout).thenReturn(collapsedSet)

@@ -2083,6 +2084,27 @@ public class MediaControlPanelTest : SysuiTestCase() {
        assertThat(player.mRipplesFinishedListener).isNull()
    }

    @Test
    fun playTurbulenceNoise_finishesAfterDuration() {
        fakeFeatureFlag.set(Flags.UMO_SURFACE_RIPPLE, true)
        fakeFeatureFlag.set(Flags.UMO_TURBULENCE_NOISE, true)

        player.attachPlayer(viewHolder)

        mainExecutor.execute {
            player.mRipplesFinishedListener.onRipplesFinish()

            assertThat(turbulenceNoiseView.visibility).isEqualTo(View.VISIBLE)

            clock.advanceTime(
                MediaControlPanel.TURBULENCE_NOISE_PLAY_DURATION +
                    TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS.toLong()
            )

            assertThat(turbulenceNoiseView.visibility).isEqualTo(View.INVISIBLE)
        }
    }

    private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener =
        withArgCaptor {
            verify(seekBarViewModel).setScrubbingChangeListener(capture())