[CS] Move CS#wakeUpForFullScreenIntent to PowerInteractor.
Bug: 277764509 Bug: 277762009 Test: manual: verified via logging that PowerInteractor#wakeUpForFullScreenIntent is called when an FSI notification comes in while dozing Test: atest PowerInteractorTest StatusBarNotificationActivityStarterTest Change-Id: I7641db4e63390a909431ccd4b200da33eedaf5c7
This commit is contained in:
@@ -20,6 +20,7 @@ package com.android.systemui.power.domain.interactor
|
||||
import android.os.PowerManager
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.keyguard.data.repository.KeyguardRepository
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.power.data.repository.PowerRepository
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
|
||||
@@ -32,6 +33,7 @@ class PowerInteractor
|
||||
@Inject
|
||||
constructor(
|
||||
private val repository: PowerRepository,
|
||||
private val keyguardRepository: KeyguardRepository,
|
||||
private val falsingCollector: FalsingCollector,
|
||||
private val screenOffAnimationController: ScreenOffAnimationController,
|
||||
private val statusBarStateController: StatusBarStateController,
|
||||
@@ -54,4 +56,21 @@ constructor(
|
||||
falsingCollector.onScreenOnFromTouch()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wakes up the device if the device was dozing or going to sleep in order to display a
|
||||
* full-screen intent.
|
||||
*/
|
||||
fun wakeUpForFullScreenIntent() {
|
||||
if (
|
||||
keyguardRepository.wakefulness.value.isStartingToSleep() ||
|
||||
statusBarStateController.isDozing
|
||||
) {
|
||||
repository.wakeUp(why = FSI_WAKE_WHY, wakeReason = PowerManager.WAKE_REASON_APPLICATION)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val FSI_WAKE_WHY = "full_screen_intent"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,8 +362,6 @@ public interface CentralSurfaces extends Dumpable, LifecycleOwner {
|
||||
@VisibleForTesting
|
||||
void setBarStateForTest(int state);
|
||||
|
||||
void wakeUpForFullScreenIntent();
|
||||
|
||||
void showTransientUnchecked();
|
||||
|
||||
void clearTransient();
|
||||
|
||||
@@ -1773,7 +1773,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
||||
try {
|
||||
EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_ESCALATION,
|
||||
sbn.getKey());
|
||||
wakeUpForFullScreenIntent();
|
||||
mPowerInteractor.wakeUpForFullScreenIntent();
|
||||
ActivityOptions opts = ActivityOptions.makeBasic();
|
||||
opts.setPendingIntentBackgroundActivityStartMode(
|
||||
ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED);
|
||||
@@ -1786,16 +1786,6 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
||||
mHeadsUpManager.releaseAllImmediately();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void wakeUpForFullScreenIntent() {
|
||||
if (isGoingToSleep() || mDozing) {
|
||||
mPowerManager.wakeUp(
|
||||
SystemClock.uptimeMillis(),
|
||||
PowerManager.WAKE_REASON_APPLICATION,
|
||||
"com.android.systemui:full_screen_intent");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when another window is about to transfer it's input focus.
|
||||
*/
|
||||
|
||||
@@ -56,6 +56,7 @@ import com.android.systemui.animation.ActivityLaunchAnimator;
|
||||
import com.android.systemui.assist.AssistManager;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.power.domain.interactor.PowerInteractor;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.shade.ShadeController;
|
||||
import com.android.systemui.shade.ShadeViewController;
|
||||
@@ -126,6 +127,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
|
||||
private final NotificationShadeWindowController mNotificationShadeWindowController;
|
||||
private final ActivityLaunchAnimator mActivityLaunchAnimator;
|
||||
private final NotificationLaunchAnimatorControllerProvider mNotificationAnimationProvider;
|
||||
private final PowerInteractor mPowerInteractor;
|
||||
private final UserTracker mUserTracker;
|
||||
private final OnUserInteractionCallback mOnUserInteractionCallback;
|
||||
|
||||
@@ -163,6 +165,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
|
||||
ActivityLaunchAnimator activityLaunchAnimator,
|
||||
NotificationLaunchAnimatorControllerProvider notificationAnimationProvider,
|
||||
LaunchFullScreenIntentProvider launchFullScreenIntentProvider,
|
||||
PowerInteractor powerInteractor,
|
||||
FeatureFlags featureFlags,
|
||||
UserTracker userTracker) {
|
||||
mContext = context;
|
||||
@@ -196,6 +199,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
|
||||
mShadeViewController = shadeViewController;
|
||||
mActivityLaunchAnimator = activityLaunchAnimator;
|
||||
mNotificationAnimationProvider = notificationAnimationProvider;
|
||||
mPowerInteractor = powerInteractor;
|
||||
mUserTracker = userTracker;
|
||||
|
||||
launchFullScreenIntentProvider.registerListener(entry -> launchFullScreenIntent(entry));
|
||||
@@ -592,7 +596,7 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte
|
||||
try {
|
||||
EventLog.writeEvent(EventLogTags.SYSUI_FULLSCREEN_NOTIFICATION,
|
||||
entry.getKey());
|
||||
mCentralSurfaces.wakeUpForFullScreenIntent();
|
||||
mPowerInteractor.wakeUpForFullScreenIntent();
|
||||
|
||||
ActivityOptions options = ActivityOptions.makeBasic();
|
||||
options.setPendingIntentBackgroundActivityStartMode(
|
||||
|
||||
@@ -21,6 +21,10 @@ import android.os.PowerManager
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
|
||||
import com.android.systemui.keyguard.shared.model.WakeSleepReason
|
||||
import com.android.systemui.keyguard.shared.model.WakefulnessModel
|
||||
import com.android.systemui.keyguard.shared.model.WakefulnessState
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.power.data.repository.FakePowerRepository
|
||||
import com.android.systemui.statusbar.phone.ScreenOffAnimationController
|
||||
@@ -44,6 +48,7 @@ class PowerInteractorTest : SysuiTestCase() {
|
||||
|
||||
private lateinit var underTest: PowerInteractor
|
||||
private lateinit var repository: FakePowerRepository
|
||||
private val keyguardRepository = FakeKeyguardRepository()
|
||||
@Mock private lateinit var falsingCollector: FalsingCollector
|
||||
@Mock private lateinit var screenOffAnimationController: ScreenOffAnimationController
|
||||
@Mock private lateinit var statusBarStateController: StatusBarStateController
|
||||
@@ -59,6 +64,7 @@ class PowerInteractorTest : SysuiTestCase() {
|
||||
underTest =
|
||||
PowerInteractor(
|
||||
repository,
|
||||
keyguardRepository,
|
||||
falsingCollector,
|
||||
screenOffAnimationController,
|
||||
statusBarStateController,
|
||||
@@ -125,6 +131,57 @@ class PowerInteractorTest : SysuiTestCase() {
|
||||
verify(falsingCollector).onScreenOnFromTouch()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun wakeUpForFullScreenIntent_notGoingToSleepAndNotDozing_notWoken() {
|
||||
keyguardRepository.setWakefulnessModel(
|
||||
WakefulnessModel(
|
||||
state = WakefulnessState.AWAKE,
|
||||
lastWakeReason = WakeSleepReason.OTHER,
|
||||
lastSleepReason = WakeSleepReason.OTHER,
|
||||
)
|
||||
)
|
||||
whenever(statusBarStateController.isDozing).thenReturn(false)
|
||||
|
||||
underTest.wakeUpForFullScreenIntent()
|
||||
|
||||
assertThat(repository.lastWakeWhy).isNull()
|
||||
assertThat(repository.lastWakeReason).isNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun wakeUpForFullScreenIntent_startingToSleep_woken() {
|
||||
keyguardRepository.setWakefulnessModel(
|
||||
WakefulnessModel(
|
||||
state = WakefulnessState.STARTING_TO_SLEEP,
|
||||
lastWakeReason = WakeSleepReason.OTHER,
|
||||
lastSleepReason = WakeSleepReason.OTHER,
|
||||
)
|
||||
)
|
||||
whenever(statusBarStateController.isDozing).thenReturn(false)
|
||||
|
||||
underTest.wakeUpForFullScreenIntent()
|
||||
|
||||
assertThat(repository.lastWakeWhy).isNotNull()
|
||||
assertThat(repository.lastWakeReason).isEqualTo(PowerManager.WAKE_REASON_APPLICATION)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun wakeUpForFullScreenIntent_dozing_woken() {
|
||||
whenever(statusBarStateController.isDozing).thenReturn(true)
|
||||
keyguardRepository.setWakefulnessModel(
|
||||
WakefulnessModel(
|
||||
state = WakefulnessState.AWAKE,
|
||||
lastWakeReason = WakeSleepReason.OTHER,
|
||||
lastSleepReason = WakeSleepReason.OTHER,
|
||||
)
|
||||
)
|
||||
|
||||
underTest.wakeUpForFullScreenIntent()
|
||||
|
||||
assertThat(repository.lastWakeWhy).isNotNull()
|
||||
assertThat(repository.lastWakeReason).isEqualTo(PowerManager.WAKE_REASON_APPLICATION)
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val IMMEDIATE = Dispatchers.Main.immediate
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.android.systemui.SysuiTestCase
|
||||
import com.android.systemui.classifier.FalsingCollector
|
||||
import com.android.systemui.dock.DockManager
|
||||
import com.android.systemui.dump.DumpManager
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository
|
||||
import com.android.systemui.plugins.FalsingManager
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||
import com.android.systemui.power.data.repository.FakePowerRepository
|
||||
@@ -89,6 +90,7 @@ class PulsingGestureListenerTest : SysuiTestCase() {
|
||||
dockManager,
|
||||
PowerInteractor(
|
||||
powerRepository,
|
||||
FakeKeyguardRepository(),
|
||||
falsingCollector,
|
||||
screenOffAnimationController,
|
||||
statusBarStateController,
|
||||
|
||||
@@ -101,16 +101,18 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() {
|
||||
@Mock lateinit var activityStarter: ActivityStarter
|
||||
@Mock lateinit var transitionControllerCallback: LockscreenShadeTransitionController.Callback
|
||||
private val disableFlagsRepository = FakeDisableFlagsRepository()
|
||||
private val keyguardRepository = FakeKeyguardRepository()
|
||||
private val shadeInteractor = ShadeInteractor(
|
||||
testScope.backgroundScope,
|
||||
disableFlagsRepository,
|
||||
keyguardRepository = FakeKeyguardRepository(),
|
||||
keyguardRepository,
|
||||
userSetupRepository = FakeUserSetupRepository(),
|
||||
deviceProvisionedController = mock(),
|
||||
userInteractor = mock(),
|
||||
)
|
||||
private val powerInteractor = PowerInteractor(
|
||||
FakePowerRepository(),
|
||||
keyguardRepository,
|
||||
FalsingCollectorFake(),
|
||||
screenOffAnimationController = mock(),
|
||||
statusBarStateController = mock(),
|
||||
|
||||
@@ -58,6 +58,7 @@ class NotificationShelfInteractorTest : SysuiTestCase() {
|
||||
private val powerInteractor =
|
||||
PowerInteractor(
|
||||
powerRepository,
|
||||
keyguardRepository,
|
||||
FalsingCollectorFake(),
|
||||
screenOffAnimationController,
|
||||
statusBarStateController,
|
||||
|
||||
@@ -69,6 +69,7 @@ class NotificationShelfViewModelTest : SysuiTestCase() {
|
||||
private val powerInteractor by lazy {
|
||||
PowerInteractor(
|
||||
powerRepository,
|
||||
keyguardRepository,
|
||||
FalsingCollectorFake(),
|
||||
screenOffAnimationController,
|
||||
statusBarStateController,
|
||||
|
||||
@@ -21,6 +21,8 @@ import static android.service.notification.NotificationListenerService.REASON_CL
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
|
||||
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.AdditionalAnswers.answerVoid;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
@@ -61,10 +63,14 @@ import com.android.systemui.ActivityIntentHelper;
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator;
|
||||
import com.android.systemui.assist.AssistManager;
|
||||
import com.android.systemui.classifier.FalsingCollectorFake;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.plugins.ActivityStarter.OnDismissAction;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.power.data.repository.FakePowerRepository;
|
||||
import com.android.systemui.power.domain.interactor.PowerInteractor;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.shade.NotificationShadeWindowViewController;
|
||||
import com.android.systemui.shade.ShadeControllerImpl;
|
||||
@@ -118,6 +124,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
|
||||
private NotificationClickNotifier mClickNotifier;
|
||||
@Mock
|
||||
private StatusBarStateController mStatusBarStateController;
|
||||
@Mock private ScreenOffAnimationController mScreenOffAnimationController;
|
||||
@Mock
|
||||
private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
|
||||
@Mock
|
||||
@@ -150,6 +157,8 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
|
||||
private ActivityLaunchAnimator mActivityLaunchAnimator;
|
||||
@Mock
|
||||
private InteractionJankMonitor mJankMonitor;
|
||||
private FakePowerRepository mPowerRepository;
|
||||
private PowerInteractor mPowerInteractor;
|
||||
@Mock
|
||||
private UserTracker mUserTracker;
|
||||
private final FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
|
||||
@@ -199,6 +208,14 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
|
||||
when(mUserTracker.getUserHandle()).thenReturn(
|
||||
UserHandle.of(ActivityManager.getCurrentUser()));
|
||||
|
||||
mPowerRepository = new FakePowerRepository();
|
||||
mPowerInteractor = new PowerInteractor(
|
||||
mPowerRepository,
|
||||
new FakeKeyguardRepository(),
|
||||
new FalsingCollectorFake(),
|
||||
mScreenOffAnimationController,
|
||||
mStatusBarStateController);
|
||||
|
||||
HeadsUpManagerPhone headsUpManager = mock(HeadsUpManagerPhone.class);
|
||||
NotificationLaunchAnimatorControllerProvider notificationAnimationProvider =
|
||||
new NotificationLaunchAnimatorControllerProvider(
|
||||
@@ -238,6 +255,7 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
|
||||
mActivityLaunchAnimator,
|
||||
notificationAnimationProvider,
|
||||
mock(LaunchFullScreenIntentProvider.class),
|
||||
mPowerInteractor,
|
||||
mock(FeatureFlags.class),
|
||||
mUserTracker
|
||||
);
|
||||
@@ -402,11 +420,13 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
|
||||
when(entry.getImportance()).thenReturn(NotificationManager.IMPORTANCE_HIGH);
|
||||
when(entry.getSbn()).thenReturn(sbn);
|
||||
|
||||
// WHEN
|
||||
// WHEN the intent is launched while dozing
|
||||
when(mStatusBarStateController.isDozing()).thenReturn(true);
|
||||
mNotificationActivityStarter.launchFullScreenIntent(entry);
|
||||
|
||||
// THEN display should try wake up for the full screen intent
|
||||
verify(mCentralSurfaces).wakeUpForFullScreenIntent();
|
||||
assertThat(mPowerRepository.getLastWakeReason()).isNotNull();
|
||||
assertThat(mPowerRepository.getLastWakeWhy()).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user