Merge "Don't bring up keyguard when activity can show over lockscreen" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
f5a79fb799
@@ -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()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user