Loading packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +29 −3 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.InstanceId; import com.android.settingslib.widget.AdaptiveIcon; import com.android.systemui.ActivityIntentHelper; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.GhostedViewLaunchAnimatorController; Loading @@ -73,6 +74,8 @@ import com.android.systemui.monet.ColorScheme; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.animation.TransitionLayout; import com.android.systemui.util.time.SystemClock; Loading Loading @@ -161,6 +164,10 @@ public class MediaControlPanel { private int mArtworkBoundId = 0; private int mArtworkNextBindRequestId = 0; private final KeyguardStateController mKeyguardStateController; private final ActivityIntentHelper mActivityIntentHelper; private final NotificationLockscreenUserManager mLockscreenUserManager; // Used for logging. protected boolean mIsImpressed = false; private SystemClock mSystemClock; Loading Loading @@ -196,7 +203,10 @@ public class MediaControlPanel { MediaCarouselController mediaCarouselController, FalsingManager falsingManager, SystemClock systemClock, MediaUiEventLogger logger) { MediaUiEventLogger logger, KeyguardStateController keyguardStateController, ActivityIntentHelper activityIntentHelper, NotificationLockscreenUserManager lockscreenUserManager) { mContext = context; mBackgroundExecutor = backgroundExecutor; mMainExecutor = mainExecutor; Loading @@ -210,6 +220,9 @@ public class MediaControlPanel { mFalsingManager = falsingManager; mSystemClock = systemClock; mLogger = logger; mKeyguardStateController = keyguardStateController; mActivityIntentHelper = activityIntentHelper; mLockscreenUserManager = lockscreenUserManager; mSeekBarViewModel.setLogSeek(() -> { if (mPackageName != null && mInstanceId != null) { Loading Loading @@ -416,8 +429,21 @@ public class MediaControlPanel { if (mMediaViewController.isGutsVisible()) return; mLogger.logTapContentView(mUid, mPackageName, mInstanceId); logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); // See StatusBarNotificationActivityStarter#onNotificationClicked boolean showOverLockscreen = mKeyguardStateController.isShowing() && mActivityIntentHelper.wouldShowOverLockscreen(clickIntent.getIntent(), mLockscreenUserManager.getCurrentUserId()); if (showOverLockscreen) { mActivityStarter.startActivity(clickIntent.getIntent(), /* dismissShade */ true, /* animationController */ null, /* showOverLockscreenWhenLocked */ true); } else { mActivityStarter.postStartActivityDismissingKeyguard(clickIntent, buildLaunchAnimatorController(mMediaViewHolder.getPlayer())); } }); } Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +53 −2 Original line number Diff line number Diff line Loading @@ -52,17 +52,22 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.LiveData import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.systemui.ActivityIntentHelper import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.media.dialog.MediaOutputDialogFactory import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.TransitionLayout import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.KotlinArgumentCaptor import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat Loading @@ -76,7 +81,6 @@ import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mock import org.mockito.Mockito.any import org.mockito.Mockito.anyString import org.mockito.Mockito.mock import org.mockito.Mockito.never Loading Loading @@ -160,6 +164,9 @@ public class MediaControlPanelTest : SysuiTestCase() { @Mock private lateinit var instanceId: InstanceId @Mock private lateinit var packageManager: PackageManager @Mock private lateinit var applicationInfo: ApplicationInfo @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var activityIntentHelper: ActivityIntentHelper @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder @Mock private lateinit var smartspaceAction: SmartspaceAction Loading Loading @@ -199,7 +206,10 @@ public class MediaControlPanelTest : SysuiTestCase() { mediaCarouselController, falsingManager, clock, logger) { logger, keyguardStateController, activityIntentHelper, lockscreenUserManager) { override fun loadAnimator( animId: Int, otionInterpolator: Interpolator, Loading Loading @@ -1118,6 +1128,47 @@ public class MediaControlPanelTest : SysuiTestCase() { verify(logger).logSeek(anyInt(), eq(PACKAGE), eq(instanceId)) } @Test fun tapContentView_showOverLockscreen_openActivity() { // WHEN we are on lockscreen and this activity can show over lockscreen whenever(keyguardStateController.isShowing).thenReturn(true) whenever(activityIntentHelper.wouldShowOverLockscreen(any(), any())).thenReturn(true) val clickIntent = mock(Intent::class.java) val pendingIntent = mock(PendingIntent::class.java) whenever(pendingIntent.intent).thenReturn(clickIntent) val captor = ArgumentCaptor.forClass(View.OnClickListener::class.java) val data = mediaData.copy(clickIntent = pendingIntent) player.attachPlayer(viewHolder) player.bindPlayer(data, KEY) verify(viewHolder.player).setOnClickListener(captor.capture()) // THEN it shows without dismissing keyguard first captor.value.onClick(viewHolder.player) verify(activityStarter).startActivity(eq(clickIntent), eq(true), nullable(), eq(true)) } @Test fun tapContentView_noShowOverLockscreen_dismissKeyguard() { // WHEN we are on lockscreen and the activity cannot show over lockscreen whenever(keyguardStateController.isShowing).thenReturn(true) whenever(activityIntentHelper.wouldShowOverLockscreen(any(), any())).thenReturn(false) val clickIntent = mock(Intent::class.java) val pendingIntent = mock(PendingIntent::class.java) whenever(pendingIntent.intent).thenReturn(clickIntent) val captor = ArgumentCaptor.forClass(View.OnClickListener::class.java) val data = mediaData.copy(clickIntent = pendingIntent) player.attachPlayer(viewHolder) player.bindPlayer(data, KEY) verify(viewHolder.player).setOnClickListener(captor.capture()) // THEN keyguard has to be dismissed captor.value.onClick(viewHolder.player) verify(activityStarter).postStartActivityDismissingKeyguard(eq(pendingIntent), any()) } @Test fun recommendation_gutsClosed_longPressOpens() { player.attachRecommendation(recommendationViewHolder) Loading Loading
packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +29 −3 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.InstanceId; import com.android.settingslib.widget.AdaptiveIcon; import com.android.systemui.ActivityIntentHelper; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.GhostedViewLaunchAnimatorController; Loading @@ -73,6 +74,8 @@ import com.android.systemui.monet.ColorScheme; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.shared.system.SysUiStatsLog; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.animation.TransitionLayout; import com.android.systemui.util.time.SystemClock; Loading Loading @@ -161,6 +164,10 @@ public class MediaControlPanel { private int mArtworkBoundId = 0; private int mArtworkNextBindRequestId = 0; private final KeyguardStateController mKeyguardStateController; private final ActivityIntentHelper mActivityIntentHelper; private final NotificationLockscreenUserManager mLockscreenUserManager; // Used for logging. protected boolean mIsImpressed = false; private SystemClock mSystemClock; Loading Loading @@ -196,7 +203,10 @@ public class MediaControlPanel { MediaCarouselController mediaCarouselController, FalsingManager falsingManager, SystemClock systemClock, MediaUiEventLogger logger) { MediaUiEventLogger logger, KeyguardStateController keyguardStateController, ActivityIntentHelper activityIntentHelper, NotificationLockscreenUserManager lockscreenUserManager) { mContext = context; mBackgroundExecutor = backgroundExecutor; mMainExecutor = mainExecutor; Loading @@ -210,6 +220,9 @@ public class MediaControlPanel { mFalsingManager = falsingManager; mSystemClock = systemClock; mLogger = logger; mKeyguardStateController = keyguardStateController; mActivityIntentHelper = activityIntentHelper; mLockscreenUserManager = lockscreenUserManager; mSeekBarViewModel.setLogSeek(() -> { if (mPackageName != null && mInstanceId != null) { Loading Loading @@ -416,8 +429,21 @@ public class MediaControlPanel { if (mMediaViewController.isGutsVisible()) return; mLogger.logTapContentView(mUid, mPackageName, mInstanceId); logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); // See StatusBarNotificationActivityStarter#onNotificationClicked boolean showOverLockscreen = mKeyguardStateController.isShowing() && mActivityIntentHelper.wouldShowOverLockscreen(clickIntent.getIntent(), mLockscreenUserManager.getCurrentUserId()); if (showOverLockscreen) { mActivityStarter.startActivity(clickIntent.getIntent(), /* dismissShade */ true, /* animationController */ null, /* showOverLockscreenWhenLocked */ true); } else { mActivityStarter.postStartActivityDismissingKeyguard(clickIntent, buildLaunchAnimatorController(mMediaViewHolder.getPlayer())); } }); } Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +53 −2 Original line number Diff line number Diff line Loading @@ -52,17 +52,22 @@ import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.LiveData import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.systemui.ActivityIntentHelper import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.media.dialog.MediaOutputDialogFactory import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.animation.TransitionLayout import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.KotlinArgumentCaptor import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat Loading @@ -76,7 +81,6 @@ import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mock import org.mockito.Mockito.any import org.mockito.Mockito.anyString import org.mockito.Mockito.mock import org.mockito.Mockito.never Loading Loading @@ -160,6 +164,9 @@ public class MediaControlPanelTest : SysuiTestCase() { @Mock private lateinit var instanceId: InstanceId @Mock private lateinit var packageManager: PackageManager @Mock private lateinit var applicationInfo: ApplicationInfo @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var activityIntentHelper: ActivityIntentHelper @Mock private lateinit var lockscreenUserManager: NotificationLockscreenUserManager @Mock private lateinit var recommendationViewHolder: RecommendationViewHolder @Mock private lateinit var smartspaceAction: SmartspaceAction Loading Loading @@ -199,7 +206,10 @@ public class MediaControlPanelTest : SysuiTestCase() { mediaCarouselController, falsingManager, clock, logger) { logger, keyguardStateController, activityIntentHelper, lockscreenUserManager) { override fun loadAnimator( animId: Int, otionInterpolator: Interpolator, Loading Loading @@ -1118,6 +1128,47 @@ public class MediaControlPanelTest : SysuiTestCase() { verify(logger).logSeek(anyInt(), eq(PACKAGE), eq(instanceId)) } @Test fun tapContentView_showOverLockscreen_openActivity() { // WHEN we are on lockscreen and this activity can show over lockscreen whenever(keyguardStateController.isShowing).thenReturn(true) whenever(activityIntentHelper.wouldShowOverLockscreen(any(), any())).thenReturn(true) val clickIntent = mock(Intent::class.java) val pendingIntent = mock(PendingIntent::class.java) whenever(pendingIntent.intent).thenReturn(clickIntent) val captor = ArgumentCaptor.forClass(View.OnClickListener::class.java) val data = mediaData.copy(clickIntent = pendingIntent) player.attachPlayer(viewHolder) player.bindPlayer(data, KEY) verify(viewHolder.player).setOnClickListener(captor.capture()) // THEN it shows without dismissing keyguard first captor.value.onClick(viewHolder.player) verify(activityStarter).startActivity(eq(clickIntent), eq(true), nullable(), eq(true)) } @Test fun tapContentView_noShowOverLockscreen_dismissKeyguard() { // WHEN we are on lockscreen and the activity cannot show over lockscreen whenever(keyguardStateController.isShowing).thenReturn(true) whenever(activityIntentHelper.wouldShowOverLockscreen(any(), any())).thenReturn(false) val clickIntent = mock(Intent::class.java) val pendingIntent = mock(PendingIntent::class.java) whenever(pendingIntent.intent).thenReturn(clickIntent) val captor = ArgumentCaptor.forClass(View.OnClickListener::class.java) val data = mediaData.copy(clickIntent = pendingIntent) player.attachPlayer(viewHolder) player.bindPlayer(data, KEY) verify(viewHolder.player).setOnClickListener(captor.capture()) // THEN keyguard has to be dismissed captor.value.onClick(viewHolder.player) verify(activityStarter).postStartActivityDismissingKeyguard(eq(pendingIntent), any()) } @Test fun recommendation_gutsClosed_longPressOpens() { player.attachRecommendation(recommendationViewHolder) Loading