Merge "Don't bring up keyguard when activity can show over lockscreen" into tm-dev

This commit is contained in:
Beth Thibodeau
2022-04-14 15:11:03 +00:00
committed by Android (Google) Code Review
2 changed files with 82 additions and 5 deletions

View File

@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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) {
@@ -416,8 +429,21 @@ public class MediaControlPanel {
if (mMediaViewController.isGutsVisible()) return;
mLogger.logTapContentView(mUid, mPackageName, mInstanceId);
logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT);
mActivityStarter.postStartActivityDismissingKeyguard(clickIntent,
buildLaunchAnimatorController(mMediaViewHolder.getPlayer()));
// 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()));
}
});
}

View File

@@ -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
@@ -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
@@ -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
@@ -199,7 +206,10 @@ public class MediaControlPanelTest : SysuiTestCase() {
mediaCarouselController,
falsingManager,
clock,
logger) {
logger,
keyguardStateController,
activityIntentHelper,
lockscreenUserManager) {
override fun loadAnimator(
animId: Int,
otionInterpolator: Interpolator,
@@ -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)