diff options
8 files changed, 109 insertions, 18 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index e9caaaf54422..4c6aa7b4cad9 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -148,6 +148,32 @@ class MediaCarouselController @Inject constructor( } } } + + companion object { + private const val SQUISHINESS_SCALE_START = 0.5 + private const val SQUISHINESS_SCALE_FACTOR = 0.5 + private fun getSquishinessScale(squishinessFraction: Float): Double { + return SQUISHINESS_SCALE_START + SQUISHINESS_SCALE_FACTOR * squishinessFraction + } + } + + var squishinessFraction: Float = 1f + set(value) { + if (field == value) { + return + } + field = value + + val scale = getSquishinessScale(field) + for (mediaPlayer in MediaPlayerData.players()) { + mediaPlayer.mediaViewHolder?.let { + it.player.bottom = it.player.top + (scale * it.player.measuredHeight).toInt() + } ?: mediaPlayer.recommendationViewHolder?.let { + it.recommendations.bottom = it.recommendations.top + + (scale * it.recommendations.measuredHeight).toInt() + } + } + } private val configListener = object : ConfigurationController.ConfigurationListener { override fun onDensityOrFontScaleChanged() { // System font changes should only happen when UMO is offscreen or a flicker may occur @@ -1076,4 +1102,4 @@ internal object MediaPlayerData { } fun isSsReactivated(key: String): Boolean = mediaData.get(key)?.isSsReactivated ?: false -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 8f8590516faa..59b871cc41bb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -28,6 +28,7 @@ import android.view.View; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaCarouselController; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.media.MediaHostState; @@ -87,13 +88,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QS_PANEL) MediaHost mediaHost, QSTileRevealController.Factory qsTileRevealControllerFactory, - DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, + DumpManager dumpManager, MediaCarouselController mediaCarouselController, + MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSliderController.Factory brightnessSliderFactory, FalsingManager falsingManager, StatusBarKeyguardViewManager statusBarKeyguardViewManager) { super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, - metricsLogger, uiEventLogger, qsLogger, dumpManager); + metricsLogger, uiEventLogger, qsLogger, dumpManager, mediaCarouselController); mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; mQsTileRevealControllerFactory = qsTileRevealControllerFactory; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index 6d5f844667e7..57bea67b7678 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -31,6 +31,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.systemui.Dumpable; import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaCarouselController; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; @@ -68,6 +69,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr private final UiEventLogger mUiEventLogger; private final QSLogger mQSLogger; private final DumpManager mDumpManager; + private final MediaCarouselController mMediaCarouselController; protected final ArrayList<TileRecord> mRecords = new ArrayList<>(); protected boolean mShouldUseSplitNotificationShade; @@ -122,7 +124,8 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, - DumpManager dumpManager + DumpManager dumpManager, + MediaCarouselController mediaCarouselController ) { super(view); mHost = host; @@ -135,6 +138,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mDumpManager = dumpManager; mShouldUseSplitNotificationShade = LargeScreenUtils.shouldUseSplitNotificationShade(getResources()); + mMediaCarouselController = mediaCarouselController; } @Override @@ -152,6 +156,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr public void setSquishinessFraction(float squishinessFraction) { mView.setSquishinessFraction(squishinessFraction); + mMediaCarouselController.setSquishinessFraction(squishinessFraction); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index be4420234c29..c86e6e855c3d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -26,6 +26,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaCarouselController; import com.android.systemui.media.MediaHierarchyManager; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTile; @@ -63,10 +64,10 @@ public class QuickQSPanelController extends QSPanelControllerBase<QuickQSPanel> @Named(QS_USING_COLLAPSED_LANDSCAPE_MEDIA) Provider<Boolean> usingCollapsedLandscapeMediaProvider, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, - DumpManager dumpManager + DumpManager dumpManager, MediaCarouselController mediaCarouselController ) { super(view, qsTileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, - uiEventLogger, qsLogger, dumpManager); + uiEventLogger, qsLogger, dumpManager, mediaCarouselController); mUsingCollapsedLandscapeMediaProvider = usingCollapsedLandscapeMediaProvider; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt index 219b3c8561b2..1bc197232da6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt @@ -28,9 +28,11 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.util.animation.TransitionLayout import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock +import javax.inject.Provider import junit.framework.Assert.assertEquals import junit.framework.Assert.assertTrue import org.junit.Before @@ -38,8 +40,9 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations -import javax.inject.Provider private val DATA = MediaTestUtils.emptyMediaData @@ -64,6 +67,10 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var dumpManager: DumpManager @Mock lateinit var logger: MediaUiEventLogger @Mock lateinit var debugLogger: MediaCarouselControllerLogger + @Mock lateinit var mediaViewHolder: MediaViewHolder + @Mock lateinit var player: TransitionLayout + @Mock lateinit var recommendationViewHolder: RecommendationViewHolder + @Mock lateinit var recommendations: TransitionLayout private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController @@ -258,4 +265,44 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(logger).logRecommendationRemoved(eq(packageName), eq(instanceId!!)) } -}
\ No newline at end of file + + @Test + fun testSetSquishinessFractionForMedia_setPlayerBottom() { + whenever(panel.mediaViewHolder).thenReturn(mediaViewHolder) + whenever(mediaViewHolder.player).thenReturn(player) + whenever(player.measuredHeight).thenReturn(100) + + val playingLocal = Triple("playing local", + DATA.copy(active = true, isPlaying = true, + playbackLocation = MediaData.PLAYBACK_LOCAL, resumption = false), + 4500L) + MediaPlayerData.addMediaPlayer(playingLocal.first, playingLocal.second, panel, clock, + false, debugLogger) + + mediaCarouselController.squishinessFraction = 0.0f + verify(player).bottom = 50 + verifyNoMoreInteractions(recommendationViewHolder) + + mediaCarouselController.squishinessFraction = 0.5f + verify(player).bottom = 75 + verifyNoMoreInteractions(recommendationViewHolder) + } + + @Test + fun testSetSquishinessFractionForRecommendation_setPlayerBottom() { + whenever(panel.recommendationViewHolder).thenReturn(recommendationViewHolder) + whenever(recommendationViewHolder.recommendations).thenReturn(recommendations) + whenever(recommendations.measuredHeight).thenReturn(100) + + MediaPlayerData.addMediaRecommendation(SMARTSPACE_KEY, EMPTY_SMARTSPACE_MEDIA_DATA, panel, + false, clock) + + mediaCarouselController.squishinessFraction = 0.0f + verifyNoMoreInteractions(mediaViewHolder) + verify(recommendationViewHolder.recommendations).bottom = 50 + + mediaCarouselController.squishinessFraction = 0.5f + verifyNoMoreInteractions(mediaViewHolder) + verify(recommendationViewHolder.recommendations).bottom = 75 + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index c127a6b87da7..ecc845720717 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -44,6 +44,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; +import com.android.systemui.media.MediaCarouselController; import com.android.systemui.media.MediaHost; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; @@ -86,6 +87,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { @Mock private QSLogger mQSLogger; private DumpManager mDumpManager = new DumpManager(); + private MediaCarouselController mMediaCarouselController; @Mock QSTileImpl mQSTile; @Mock @@ -108,9 +110,9 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, QSCustomizerController qsCustomizerController, MediaHost mediaHost, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, QSLogger qsLogger, - DumpManager dumpManager) { + DumpManager dumpManager, MediaCarouselController mediaCarouselController) { super(view, host, qsCustomizerController, true, mediaHost, metricsLogger, uiEventLogger, - qsLogger, dumpManager); + qsLogger, dumpManager, mediaCarouselController); } @Override @@ -144,7 +146,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, - mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); + mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mMediaCarouselController); mController.init(); reset(mQSTileRevealController); @@ -156,7 +158,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { QSPanelControllerBase<QSPanel> controller = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, - mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager) { + mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mMediaCarouselController) { @Override protected QSTileRevealController createTileRevealController() { return mQSTileRevealController; @@ -249,7 +251,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mQSPanel.getDumpableTag()).thenReturn("QSPanelLandscape"); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, - mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); + mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mMediaCarouselController); mController.init(); assertThat(mController.shouldUseHorizontalLayout()).isTrue(); @@ -258,7 +260,7 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mQSPanel.getDumpableTag()).thenReturn("QSPanelPortrait"); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, mQSCustomizerController, mMediaHost, - mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager); + mMetricsLogger, mUiEventLogger, mQSLogger, mDumpManager, mMediaCarouselController); mController.init(); assertThat(mController.shouldUseHorizontalLayout()).isFalse(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt index c0944efcffca..98d499a70fa7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.kt @@ -6,6 +6,7 @@ import com.android.internal.logging.MetricsLogger import com.android.internal.logging.UiEventLogger import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.media.MediaCarouselController import com.android.systemui.media.MediaHost import com.android.systemui.media.MediaHostState import com.android.systemui.plugins.FalsingManager @@ -27,8 +28,8 @@ import org.mockito.Mockito import org.mockito.Mockito.any import org.mockito.Mockito.reset import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidTestingRunner::class) @@ -40,6 +41,7 @@ class QSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var qsCustomizerController: QSCustomizerController @Mock private lateinit var qsTileRevealControllerFactory: QSTileRevealController.Factory @Mock private lateinit var dumpManager: DumpManager + @Mock private lateinit var mediaCarouselController: MediaCarouselController @Mock private lateinit var metricsLogger: MetricsLogger @Mock private lateinit var uiEventLogger: UiEventLogger @Mock private lateinit var qsLogger: QSLogger @@ -76,6 +78,7 @@ class QSPanelControllerTest : SysuiTestCase() { mediaHost, qsTileRevealControllerFactory, dumpManager, + mediaCarouselController, metricsLogger, uiEventLogger, qsLogger, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt index e4f47fd16be7..39f27d43ed12 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickQSPanelControllerTest.kt @@ -23,6 +23,7 @@ import com.android.internal.logging.MetricsLogger import com.android.internal.logging.testing.UiEventLoggerFake import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager +import com.android.systemui.media.MediaCarouselController import com.android.systemui.media.MediaHost import com.android.systemui.media.MediaHostState import com.android.systemui.plugins.qs.QSTile @@ -59,6 +60,7 @@ class QuickQSPanelControllerTest : SysuiTestCase() { @Mock private lateinit var tileLayout: TileLayout @Mock private lateinit var tileView: QSTileView @Captor private lateinit var captor: ArgumentCaptor<QSPanel.OnConfigurationChangedListener> + @Mock private lateinit var mediaCarouselController: MediaCarouselController private val uiEventLogger = UiEventLoggerFake() private val dumpManager = DumpManager() @@ -88,7 +90,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() { metricsLogger, uiEventLogger, qsLogger, - dumpManager) + dumpManager, + mediaCarouselController) controller.init() } @@ -157,7 +160,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() { metricsLogger: MetricsLogger, uiEventLogger: UiEventLoggerFake, qsLogger: QSLogger, - dumpManager: DumpManager + dumpManager: DumpManager, + mediaCarouselController: MediaCarouselController ) : QuickQSPanelController( view, @@ -169,7 +173,8 @@ class QuickQSPanelControllerTest : SysuiTestCase() { metricsLogger, uiEventLogger, qsLogger, - dumpManager) { + dumpManager, + mediaCarouselController) { private var rotation = RotationUtils.ROTATION_NONE |