Send an end signal from UMO to finish turbulence noise.

Bug: 237282226
Test: MediaControlPanelTest
Change-Id: Iae61fe96e907ae2f9638703e46483e177a9c7f6a
This commit is contained in:
Yein Jo
2022-12-28 22:37:50 +00:00
parent 1887b97669
commit 0c81ba52ee
3 changed files with 40 additions and 10 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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())