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.jank.InteractionJankMonitor;
import com.android.internal.logging.InstanceId; import com.android.internal.logging.InstanceId;
import com.android.settingslib.widget.AdaptiveIcon; import com.android.settingslib.widget.AdaptiveIcon;
import com.android.systemui.ActivityIntentHelper;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.ActivityLaunchAnimator;
import com.android.systemui.animation.GhostedViewLaunchAnimatorController; 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.ActivityStarter;
import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.shared.system.SysUiStatsLog; 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.animation.TransitionLayout;
import com.android.systemui.util.time.SystemClock; import com.android.systemui.util.time.SystemClock;
@@ -161,6 +164,10 @@ public class MediaControlPanel {
private int mArtworkBoundId = 0; private int mArtworkBoundId = 0;
private int mArtworkNextBindRequestId = 0; private int mArtworkNextBindRequestId = 0;
private final KeyguardStateController mKeyguardStateController;
private final ActivityIntentHelper mActivityIntentHelper;
private final NotificationLockscreenUserManager mLockscreenUserManager;
// Used for logging. // Used for logging.
protected boolean mIsImpressed = false; protected boolean mIsImpressed = false;
private SystemClock mSystemClock; private SystemClock mSystemClock;
@@ -196,7 +203,10 @@ public class MediaControlPanel {
MediaCarouselController mediaCarouselController, MediaCarouselController mediaCarouselController,
FalsingManager falsingManager, FalsingManager falsingManager,
SystemClock systemClock, SystemClock systemClock,
MediaUiEventLogger logger) { MediaUiEventLogger logger,
KeyguardStateController keyguardStateController,
ActivityIntentHelper activityIntentHelper,
NotificationLockscreenUserManager lockscreenUserManager) {
mContext = context; mContext = context;
mBackgroundExecutor = backgroundExecutor; mBackgroundExecutor = backgroundExecutor;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
@@ -210,6 +220,9 @@ public class MediaControlPanel {
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mSystemClock = systemClock; mSystemClock = systemClock;
mLogger = logger; mLogger = logger;
mKeyguardStateController = keyguardStateController;
mActivityIntentHelper = activityIntentHelper;
mLockscreenUserManager = lockscreenUserManager;
mSeekBarViewModel.setLogSeek(() -> { mSeekBarViewModel.setLogSeek(() -> {
if (mPackageName != null && mInstanceId != null) { if (mPackageName != null && mInstanceId != null) {
@@ -416,8 +429,21 @@ public class MediaControlPanel {
if (mMediaViewController.isGutsVisible()) return; if (mMediaViewController.isGutsVisible()) return;
mLogger.logTapContentView(mUid, mPackageName, mInstanceId); mLogger.logTapContentView(mUid, mPackageName, mInstanceId);
logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); 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.lifecycle.LiveData
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.logging.InstanceId import com.android.internal.logging.InstanceId
import com.android.systemui.ActivityIntentHelper
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.media.dialog.MediaOutputDialogFactory import com.android.systemui.media.dialog.MediaOutputDialogFactory
import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.plugins.FalsingManager 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.animation.TransitionLayout
import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.KotlinArgumentCaptor import com.android.systemui.util.mockito.KotlinArgumentCaptor
import com.android.systemui.util.mockito.argumentCaptor 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.eq
import com.android.systemui.util.mockito.nullable
import com.android.systemui.util.mockito.withArgCaptor import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -76,7 +81,6 @@ import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.anyLong import org.mockito.ArgumentMatchers.anyLong
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.any
import org.mockito.Mockito.anyString import org.mockito.Mockito.anyString
import org.mockito.Mockito.mock import org.mockito.Mockito.mock
import org.mockito.Mockito.never import org.mockito.Mockito.never
@@ -160,6 +164,9 @@ public class MediaControlPanelTest : SysuiTestCase() {
@Mock private lateinit var instanceId: InstanceId @Mock private lateinit var instanceId: InstanceId
@Mock private lateinit var packageManager: PackageManager @Mock private lateinit var packageManager: PackageManager
@Mock private lateinit var applicationInfo: ApplicationInfo @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 recommendationViewHolder: RecommendationViewHolder
@Mock private lateinit var smartspaceAction: SmartspaceAction @Mock private lateinit var smartspaceAction: SmartspaceAction
@@ -199,7 +206,10 @@ public class MediaControlPanelTest : SysuiTestCase() {
mediaCarouselController, mediaCarouselController,
falsingManager, falsingManager,
clock, clock,
logger) { logger,
keyguardStateController,
activityIntentHelper,
lockscreenUserManager) {
override fun loadAnimator( override fun loadAnimator(
animId: Int, animId: Int,
otionInterpolator: Interpolator, otionInterpolator: Interpolator,
@@ -1118,6 +1128,47 @@ public class MediaControlPanelTest : SysuiTestCase() {
verify(logger).logSeek(anyInt(), eq(PACKAGE), eq(instanceId)) 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 @Test
fun recommendation_gutsClosed_longPressOpens() { fun recommendation_gutsClosed_longPressOpens() {
player.attachRecommendation(recommendationViewHolder) player.attachRecommendation(recommendationViewHolder)