Loading packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +27 −1 Original line number Diff line number Diff line Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +6 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -135,6 +138,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mDumpManager = dumpManager; mShouldUseSplitNotificationShade = LargeScreenUtils.shouldUseSplitNotificationShade(getResources()); mMediaCarouselController = mediaCarouselController; } @Override Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +49 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -258,4 +265,44 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(logger).logRecommendationRemoved(eq(packageName), eq(instanceId!!)) } @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 } } Loading
packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +27 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +4 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading
packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +6 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading @@ -135,6 +138,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr mDumpManager = dumpManager; mShouldUseSplitNotificationShade = LargeScreenUtils.shouldUseSplitNotificationShade(getResources()); mMediaCarouselController = mediaCarouselController; } @Override Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +3 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +49 −2 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -258,4 +265,44 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(logger).logRecommendationRemoved(eq(packageName), eq(instanceId!!)) } @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 } }