Merge "Send an end signal from UMO to finish turbulence noise." into tm-qpr-dev
This commit is contained in:
@@ -57,7 +57,7 @@ data class TurbulenceNoiseAnimationConfig(
|
|||||||
val onAnimationEnd: Runnable? = null
|
val onAnimationEnd: Runnable? = null
|
||||||
) {
|
) {
|
||||||
companion object {
|
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_EASING_DURATION_IN_MILLIS = 750f
|
||||||
const val DEFAULT_LUMINOSITY_MULTIPLIER = 1f
|
const val DEFAULT_LUMINOSITY_MULTIPLIER = 1f
|
||||||
const val DEFAULT_NOISE_GRID_COUNT = 1.2f
|
const val DEFAULT_NOISE_GRID_COUNT = 1.2f
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseAnimat
|
|||||||
import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseController;
|
import com.android.systemui.surfaceeffects.turbulencenoise.TurbulenceNoiseController;
|
||||||
import com.android.systemui.util.ColorUtilKt;
|
import com.android.systemui.util.ColorUtilKt;
|
||||||
import com.android.systemui.util.animation.TransitionLayout;
|
import com.android.systemui.util.animation.TransitionLayout;
|
||||||
|
import com.android.systemui.util.concurrency.DelayableExecutor;
|
||||||
import com.android.systemui.util.time.SystemClock;
|
import com.android.systemui.util.time.SystemClock;
|
||||||
|
|
||||||
import dagger.Lazy;
|
import dagger.Lazy;
|
||||||
@@ -168,10 +169,13 @@ public class MediaControlPanel {
|
|||||||
R.id.action1
|
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 final SeekBarViewModel mSeekBarViewModel;
|
||||||
private SeekBarObserver mSeekBarObserver;
|
private SeekBarObserver mSeekBarObserver;
|
||||||
protected final Executor mBackgroundExecutor;
|
protected final Executor mBackgroundExecutor;
|
||||||
private final Executor mMainExecutor;
|
private final DelayableExecutor mMainExecutor;
|
||||||
private final ActivityStarter mActivityStarter;
|
private final ActivityStarter mActivityStarter;
|
||||||
private final BroadcastSender mBroadcastSender;
|
private final BroadcastSender mBroadcastSender;
|
||||||
|
|
||||||
@@ -224,10 +228,10 @@ public class MediaControlPanel {
|
|||||||
private String mSwitchBroadcastApp;
|
private String mSwitchBroadcastApp;
|
||||||
private MultiRippleController mMultiRippleController;
|
private MultiRippleController mMultiRippleController;
|
||||||
private TurbulenceNoiseController mTurbulenceNoiseController;
|
private TurbulenceNoiseController mTurbulenceNoiseController;
|
||||||
private FeatureFlags mFeatureFlags;
|
private final FeatureFlags mFeatureFlags;
|
||||||
private TurbulenceNoiseAnimationConfig mTurbulenceNoiseAnimationConfig = null;
|
private TurbulenceNoiseAnimationConfig mTurbulenceNoiseAnimationConfig;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
MultiRippleController.Companion.RipplesFinishedListener mRipplesFinishedListener = null;
|
MultiRippleController.Companion.RipplesFinishedListener mRipplesFinishedListener;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize a new control panel
|
* Initialize a new control panel
|
||||||
@@ -241,7 +245,7 @@ public class MediaControlPanel {
|
|||||||
public MediaControlPanel(
|
public MediaControlPanel(
|
||||||
Context context,
|
Context context,
|
||||||
@Background Executor backgroundExecutor,
|
@Background Executor backgroundExecutor,
|
||||||
@Main Executor mainExecutor,
|
@Main DelayableExecutor mainExecutor,
|
||||||
ActivityStarter activityStarter,
|
ActivityStarter activityStarter,
|
||||||
BroadcastSender broadcastSender,
|
BroadcastSender broadcastSender,
|
||||||
MediaViewController mediaViewController,
|
MediaViewController mediaViewController,
|
||||||
@@ -412,10 +416,12 @@ public class MediaControlPanel {
|
|||||||
if (mFeatureFlags.isEnabled(Flags.UMO_TURBULENCE_NOISE)) {
|
if (mFeatureFlags.isEnabled(Flags.UMO_TURBULENCE_NOISE)) {
|
||||||
mRipplesFinishedListener = () -> {
|
mRipplesFinishedListener = () -> {
|
||||||
if (mTurbulenceNoiseAnimationConfig == null) {
|
if (mTurbulenceNoiseAnimationConfig == null) {
|
||||||
mTurbulenceNoiseAnimationConfig = createLingeringNoiseAnimation();
|
mTurbulenceNoiseAnimationConfig = createTurbulenceNoiseAnimation();
|
||||||
}
|
}
|
||||||
// Color will be correctly updated in ColorSchemeTransition.
|
// Color will be correctly updated in ColorSchemeTransition.
|
||||||
mTurbulenceNoiseController.play(mTurbulenceNoiseAnimationConfig);
|
mTurbulenceNoiseController.play(mTurbulenceNoiseAnimationConfig);
|
||||||
|
mMainExecutor.executeDelayed(
|
||||||
|
mTurbulenceNoiseController::finish, TURBULENCE_NOISE_PLAY_DURATION);
|
||||||
};
|
};
|
||||||
mMultiRippleController.addRipplesFinishedListener(mRipplesFinishedListener);
|
mMultiRippleController.addRipplesFinishedListener(mRipplesFinishedListener);
|
||||||
}
|
}
|
||||||
@@ -1063,7 +1069,7 @@ public class MediaControlPanel {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TurbulenceNoiseAnimationConfig createLingeringNoiseAnimation() {
|
private TurbulenceNoiseAnimationConfig createTurbulenceNoiseAnimation() {
|
||||||
return new TurbulenceNoiseAnimationConfig(
|
return new TurbulenceNoiseAnimationConfig(
|
||||||
TurbulenceNoiseAnimationConfig.DEFAULT_NOISE_GRID_COUNT,
|
TurbulenceNoiseAnimationConfig.DEFAULT_NOISE_GRID_COUNT,
|
||||||
TurbulenceNoiseAnimationConfig.DEFAULT_LUMINOSITY_MULTIPLIER,
|
TurbulenceNoiseAnimationConfig.DEFAULT_LUMINOSITY_MULTIPLIER,
|
||||||
@@ -1078,7 +1084,9 @@ public class MediaControlPanel {
|
|||||||
/* width= */ mMediaViewHolder.getMultiRippleView().getWidth(),
|
/* width= */ mMediaViewHolder.getMultiRippleView().getWidth(),
|
||||||
/* height= */ mMediaViewHolder.getMultiRippleView().getHeight(),
|
/* height= */ mMediaViewHolder.getMultiRippleView().getHeight(),
|
||||||
TurbulenceNoiseAnimationConfig.DEFAULT_MAX_DURATION_IN_MILLIS,
|
TurbulenceNoiseAnimationConfig.DEFAULT_MAX_DURATION_IN_MILLIS,
|
||||||
|
/* easeInDuration= */
|
||||||
TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
|
TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
|
||||||
|
/* easeOutDuration= */
|
||||||
TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
|
TurbulenceNoiseAnimationConfig.DEFAULT_EASING_DURATION_IN_MILLIS,
|
||||||
this.getContext().getResources().getDisplayMetrics().density,
|
this.getContext().getResources().getDisplayMetrics().density,
|
||||||
BlendMode.PLUS,
|
BlendMode.PLUS,
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ import com.android.systemui.plugins.FalsingManager
|
|||||||
import com.android.systemui.statusbar.NotificationLockscreenUserManager
|
import com.android.systemui.statusbar.NotificationLockscreenUserManager
|
||||||
import com.android.systemui.statusbar.policy.KeyguardStateController
|
import com.android.systemui.statusbar.policy.KeyguardStateController
|
||||||
import com.android.systemui.surfaceeffects.ripple.MultiRippleView
|
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.surfaceeffects.turbulencenoise.TurbulenceNoiseView
|
||||||
import com.android.systemui.util.animation.TransitionLayout
|
import com.android.systemui.util.animation.TransitionLayout
|
||||||
import com.android.systemui.util.concurrency.FakeExecutor
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
@@ -225,8 +226,8 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
fun setUp() {
|
fun setUp() {
|
||||||
bgExecutor = FakeExecutor(FakeSystemClock())
|
bgExecutor = FakeExecutor(clock)
|
||||||
mainExecutor = FakeExecutor(FakeSystemClock())
|
mainExecutor = FakeExecutor(clock)
|
||||||
whenever(mediaViewController.expandedLayout).thenReturn(expandedSet)
|
whenever(mediaViewController.expandedLayout).thenReturn(expandedSet)
|
||||||
whenever(mediaViewController.collapsedLayout).thenReturn(collapsedSet)
|
whenever(mediaViewController.collapsedLayout).thenReturn(collapsedSet)
|
||||||
|
|
||||||
@@ -2121,6 +2122,27 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
|||||||
assertThat(player.mRipplesFinishedListener).isNull()
|
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 =
|
private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener =
|
||||||
withArgCaptor {
|
withArgCaptor {
|
||||||
verify(seekBarViewModel).setScrubbingChangeListener(capture())
|
verify(seekBarViewModel).setScrubbingChangeListener(capture())
|
||||||
|
|||||||
Reference in New Issue
Block a user