Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java +65 −38 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.media.controls.ui.controller; import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS; import static com.android.settingslib.flags.Flags.legacyLeAudioSharing; import static com.android.systemui.Flags.communalHub; import static com.android.systemui.Flags.mediaLockscreenLaunchAnimation; import static com.android.systemui.media.controls.shared.model.SmartspaceMediaDataKt.NUM_REQUIRED_RECOMMENDATIONS; Loading Loading @@ -90,6 +91,8 @@ import com.android.systemui.animation.ActivityTransitionAnimator; import com.android.systemui.animation.GhostedViewTransitionAnimatorController; import com.android.systemui.bluetooth.BroadcastDialogController; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor; import com.android.systemui.communal.widgets.CommunalTransitionAnimatorController; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.media.controls.domain.pipeline.MediaDataManager; Loading Loading @@ -202,10 +205,12 @@ public class MediaControlPanel { ); // Time in millis for playing turbulence noise that is played after a touch ripple. @VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L; @VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L; private final SeekBarViewModel mSeekBarViewModel; private final MediaFlags mMediaFlags; private final CommunalSceneInteractor mCommunalSceneInteractor; private SeekBarObserver mSeekBarObserver; protected final Executor mBackgroundExecutor; private final DelayableExecutor mMainExecutor; Loading Loading @@ -293,7 +298,8 @@ public class MediaControlPanel { * Initialize a new control panel * * @param backgroundExecutor background executor, used for processing artwork * @param mainExecutor main thread executor, used if we receive callbacks on the background * @param mainExecutor main thread executor, used if we receive callbacks on the * background * thread that then trigger UI changes. * @param activityStarter activity starter */ Loading @@ -314,6 +320,7 @@ public class MediaControlPanel { MediaUiEventLogger logger, KeyguardStateController keyguardStateController, ActivityIntentHelper activityIntentHelper, CommunalSceneInteractor communalSceneInteractor, NotificationLockscreenUserManager lockscreenUserManager, BroadcastDialogController broadcastDialogController, GlobalSettings globalSettings, Loading @@ -337,6 +344,7 @@ public class MediaControlPanel { mLockscreenUserManager = lockscreenUserManager; mBroadcastDialogController = broadcastDialogController; mMediaFlags = mediaFlags; mCommunalSceneInteractor = communalSceneInteractor; mSeekBarViewModel.setLogSeek(() -> { if (mPackageName != null && mInstanceId != null) { Loading Loading @@ -375,6 +383,7 @@ public class MediaControlPanel { /** * Get the recommendation view holder used to display Smartspace media recs. * * @return the recommendation view holder */ @Nullable Loading Loading @@ -829,8 +838,10 @@ public class MediaControlPanel { () -> { titleText.setText(data.getSong()); artistText.setText(data.getArtist()); setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator, data.isExplicit()); // refreshState is required here to resize the text views (and prevent ellipsis) mMediaViewController.refreshState(); Loading Loading @@ -1346,6 +1357,7 @@ public class MediaControlPanel { /* shouldInverseNoiseLuminosity= */ false ); } private void clearButton(final ImageButton button) { button.setImageDrawable(null); button.setContentDescription(null); Loading Loading @@ -1421,19 +1433,33 @@ public class MediaControlPanel { // TODO(b/174236650): Make sure that the carousel indicator also fades out. // TODO(b/174236650): Instrument the animation to measure jank. return new GhostedViewTransitionAnimatorController(player, final ActivityTransitionAnimator.Controller controller = new GhostedViewTransitionAnimatorController(player, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER) { @Override protected float getCurrentTopCornerRadius() { return mContext.getResources().getDimension(R.dimen.notification_corner_radius); return mContext.getResources().getDimension( R.dimen.notification_corner_radius); } @Override protected float getCurrentBottomCornerRadius() { // TODO(b/184121838): Make IlluminationDrawable support top and bottom radius. // TODO(b/184121838): Make IlluminationDrawable support top and bottom // radius. return getCurrentTopCornerRadius(); } }; // When on the hub, wrap in the communal animation controller to ensure we exit the hub // at the proper stage of the animation. if (communalHub() && mMediaViewController.getCurrentEndLocation() == MediaHierarchyManager.LOCATION_COMMUNAL_HUB) { mCommunalSceneInteractor.setIsLaunchingWidget(true); return new CommunalTransitionAnimatorController(controller, mCommunalSceneInteractor); } return controller; } /** Bind this recommendation view based on the given data. */ Loading Loading @@ -1934,6 +1960,7 @@ public class MediaControlPanel { /** * Get the surface given the current end location for MediaViewController * * @return surface used for Smartspace logging */ protected int getSurfaceForSmartspaceLogging() { Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaControlPanelTest.kt +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.bluetooth.BroadcastDialogController import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.media.controls.MediaTestUtils import com.android.systemui.media.controls.domain.pipeline.EMPTY_SMARTSPACE_MEDIA_DATA import com.android.systemui.media.controls.domain.pipeline.MediaDataManager Loading Loading @@ -211,6 +212,8 @@ public class MediaControlPanelTest : SysuiTestCase() { @Mock private lateinit var activityIntentHelper: ActivityIntentHelper @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager @Mock private lateinit var communalSceneInteractor: CommunalSceneInteractor @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder @Mock private lateinit var smartspaceAction: SmartspaceAction private lateinit var smartspaceData: SmartspaceMediaData Loading Loading @@ -271,6 +274,7 @@ public class MediaControlPanelTest : SysuiTestCase() { logger, keyguardStateController, activityIntentHelper, communalSceneInteractor, lockscreenUserManager, broadcastDialogController, globalSettings, Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaControlPanel.java +65 −38 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.systemui.media.controls.ui.controller; import static android.provider.Settings.ACTION_MEDIA_CONTROLS_SETTINGS; import static com.android.settingslib.flags.Flags.legacyLeAudioSharing; import static com.android.systemui.Flags.communalHub; import static com.android.systemui.Flags.mediaLockscreenLaunchAnimation; import static com.android.systemui.media.controls.shared.model.SmartspaceMediaDataKt.NUM_REQUIRED_RECOMMENDATIONS; Loading Loading @@ -90,6 +91,8 @@ import com.android.systemui.animation.ActivityTransitionAnimator; import com.android.systemui.animation.GhostedViewTransitionAnimatorController; import com.android.systemui.bluetooth.BroadcastDialogController; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor; import com.android.systemui.communal.widgets.CommunalTransitionAnimatorController; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.media.controls.domain.pipeline.MediaDataManager; Loading Loading @@ -202,10 +205,12 @@ public class MediaControlPanel { ); // Time in millis for playing turbulence noise that is played after a touch ripple. @VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L; @VisibleForTesting static final long TURBULENCE_NOISE_PLAY_DURATION = 7500L; private final SeekBarViewModel mSeekBarViewModel; private final MediaFlags mMediaFlags; private final CommunalSceneInteractor mCommunalSceneInteractor; private SeekBarObserver mSeekBarObserver; protected final Executor mBackgroundExecutor; private final DelayableExecutor mMainExecutor; Loading Loading @@ -293,7 +298,8 @@ public class MediaControlPanel { * Initialize a new control panel * * @param backgroundExecutor background executor, used for processing artwork * @param mainExecutor main thread executor, used if we receive callbacks on the background * @param mainExecutor main thread executor, used if we receive callbacks on the * background * thread that then trigger UI changes. * @param activityStarter activity starter */ Loading @@ -314,6 +320,7 @@ public class MediaControlPanel { MediaUiEventLogger logger, KeyguardStateController keyguardStateController, ActivityIntentHelper activityIntentHelper, CommunalSceneInteractor communalSceneInteractor, NotificationLockscreenUserManager lockscreenUserManager, BroadcastDialogController broadcastDialogController, GlobalSettings globalSettings, Loading @@ -337,6 +344,7 @@ public class MediaControlPanel { mLockscreenUserManager = lockscreenUserManager; mBroadcastDialogController = broadcastDialogController; mMediaFlags = mediaFlags; mCommunalSceneInteractor = communalSceneInteractor; mSeekBarViewModel.setLogSeek(() -> { if (mPackageName != null && mInstanceId != null) { Loading Loading @@ -375,6 +383,7 @@ public class MediaControlPanel { /** * Get the recommendation view holder used to display Smartspace media recs. * * @return the recommendation view holder */ @Nullable Loading Loading @@ -829,8 +838,10 @@ public class MediaControlPanel { () -> { titleText.setText(data.getSong()); artistText.setText(data.getArtist()); setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(expandedSet, R.id.media_explicit_indicator, data.isExplicit()); setVisibleAndAlpha(collapsedSet, R.id.media_explicit_indicator, data.isExplicit()); // refreshState is required here to resize the text views (and prevent ellipsis) mMediaViewController.refreshState(); Loading Loading @@ -1346,6 +1357,7 @@ public class MediaControlPanel { /* shouldInverseNoiseLuminosity= */ false ); } private void clearButton(final ImageButton button) { button.setImageDrawable(null); button.setContentDescription(null); Loading Loading @@ -1421,19 +1433,33 @@ public class MediaControlPanel { // TODO(b/174236650): Make sure that the carousel indicator also fades out. // TODO(b/174236650): Instrument the animation to measure jank. return new GhostedViewTransitionAnimatorController(player, final ActivityTransitionAnimator.Controller controller = new GhostedViewTransitionAnimatorController(player, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER) { @Override protected float getCurrentTopCornerRadius() { return mContext.getResources().getDimension(R.dimen.notification_corner_radius); return mContext.getResources().getDimension( R.dimen.notification_corner_radius); } @Override protected float getCurrentBottomCornerRadius() { // TODO(b/184121838): Make IlluminationDrawable support top and bottom radius. // TODO(b/184121838): Make IlluminationDrawable support top and bottom // radius. return getCurrentTopCornerRadius(); } }; // When on the hub, wrap in the communal animation controller to ensure we exit the hub // at the proper stage of the animation. if (communalHub() && mMediaViewController.getCurrentEndLocation() == MediaHierarchyManager.LOCATION_COMMUNAL_HUB) { mCommunalSceneInteractor.setIsLaunchingWidget(true); return new CommunalTransitionAnimatorController(controller, mCommunalSceneInteractor); } return controller; } /** Bind this recommendation view based on the given data. */ Loading Loading @@ -1934,6 +1960,7 @@ public class MediaControlPanel { /** * Get the surface given the current end location for MediaViewController * * @return surface used for Smartspace logging */ protected int getSurfaceForSmartspaceLogging() { Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/controller/MediaControlPanelTest.kt +4 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.bluetooth.BroadcastDialogController import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.communal.domain.interactor.CommunalSceneInteractor import com.android.systemui.media.controls.MediaTestUtils import com.android.systemui.media.controls.domain.pipeline.EMPTY_SMARTSPACE_MEDIA_DATA import com.android.systemui.media.controls.domain.pipeline.MediaDataManager Loading Loading @@ -211,6 +212,8 @@ public class MediaControlPanelTest : SysuiTestCase() { @Mock private lateinit var activityIntentHelper: ActivityIntentHelper @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager @Mock private lateinit var communalSceneInteractor: CommunalSceneInteractor @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder @Mock private lateinit var smartspaceAction: SmartspaceAction private lateinit var smartspaceData: SmartspaceMediaData Loading Loading @@ -271,6 +274,7 @@ public class MediaControlPanelTest : SysuiTestCase() { logger, keyguardStateController, activityIntentHelper, communalSceneInteractor, lockscreenUserManager, broadcastDialogController, globalSettings, Loading