Loading packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/turbulencenoise/TurbulenceNoiseAnimationConfig.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +15 −7 Original line number Diff line number Diff line Loading @@ -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 dagger.Lazy; Loading Loading @@ -168,10 +169,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; Loading Loading @@ -224,10 +228,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 Loading @@ -241,7 +245,7 @@ public class MediaControlPanel { public MediaControlPanel( Context context, @Background Executor backgroundExecutor, @Main Executor mainExecutor, @Main DelayableExecutor mainExecutor, ActivityStarter activityStarter, BroadcastSender broadcastSender, MediaViewController mediaViewController, Loading Loading @@ -412,10 +416,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); } Loading Loading @@ -1063,7 +1069,7 @@ public class MediaControlPanel { ); } private TurbulenceNoiseAnimationConfig createLingeringNoiseAnimation() { private TurbulenceNoiseAnimationConfig createTurbulenceNoiseAnimation() { return new TurbulenceNoiseAnimationConfig( TurbulenceNoiseAnimationConfig.DEFAULT_NOISE_GRID_COUNT, TurbulenceNoiseAnimationConfig.DEFAULT_LUMINOSITY_MULTIPLIER, Loading @@ -1078,7 +1084,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, Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt +24 −2 Original line number Diff line number Diff line Loading @@ -82,6 +82,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 Loading Loading @@ -225,8 +226,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) Loading Loading @@ -2121,6 +2122,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()) Loading Loading
packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/turbulencenoise/TurbulenceNoiseAnimationConfig.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +15 −7 Original line number Diff line number Diff line Loading @@ -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 dagger.Lazy; Loading Loading @@ -168,10 +169,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; Loading Loading @@ -224,10 +228,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 Loading @@ -241,7 +245,7 @@ public class MediaControlPanel { public MediaControlPanel( Context context, @Background Executor backgroundExecutor, @Main Executor mainExecutor, @Main DelayableExecutor mainExecutor, ActivityStarter activityStarter, BroadcastSender broadcastSender, MediaViewController mediaViewController, Loading Loading @@ -412,10 +416,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); } Loading Loading @@ -1063,7 +1069,7 @@ public class MediaControlPanel { ); } private TurbulenceNoiseAnimationConfig createLingeringNoiseAnimation() { private TurbulenceNoiseAnimationConfig createTurbulenceNoiseAnimation() { return new TurbulenceNoiseAnimationConfig( TurbulenceNoiseAnimationConfig.DEFAULT_NOISE_GRID_COUNT, TurbulenceNoiseAnimationConfig.DEFAULT_LUMINOSITY_MULTIPLIER, Loading @@ -1078,7 +1084,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, Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt +24 −2 Original line number Diff line number Diff line Loading @@ -82,6 +82,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 Loading Loading @@ -225,8 +226,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) Loading Loading @@ -2121,6 +2122,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()) Loading