diff options
3 files changed, 66 insertions, 1 deletions
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java index c99cb39f91bf..83658d3c1984 100644 --- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java +++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java @@ -129,6 +129,11 @@ public interface BcSmartspaceDataPlugin extends Plugin { void setDozeAmount(float amount); /** + * Set if the screen is on. + */ + default void setScreenOn(boolean screenOn) {} + + /** * Set if dozing is true or false */ default void setDozing(boolean dozing) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index 0fd05550dbe3..c29a64ed61b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -36,6 +36,7 @@ import android.util.Log import android.view.ContextThemeWrapper import android.view.View import android.view.ViewGroup +import androidx.annotation.VisibleForTesting import com.android.keyguard.KeyguardUpdateMonitor import com.android.settingslib.Utils import com.android.systemui.Dumpable @@ -45,6 +46,7 @@ import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags +import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceConfigPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin @@ -95,6 +97,7 @@ constructor( private val deviceProvisionedController: DeviceProvisionedController, private val bypassController: KeyguardBypassController, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, + private val wakefulnessLifecycle: WakefulnessLifecycle, private val dumpManager: DumpManager, private val execution: Execution, @Main private val uiExecutor: Executor, @@ -123,7 +126,7 @@ constructor( private val recentSmartspaceData: Deque<List<SmartspaceTarget>> = LinkedList() // Smartspace can be used on multiple displays, such as when the user casts their screen - private var smartspaceViews = mutableSetOf<SmartspaceView>() + @VisibleForTesting var smartspaceViews = mutableSetOf<SmartspaceView>() private var regionSamplers = mutableMapOf<SmartspaceView, RegionSampler>() @@ -272,6 +275,18 @@ constructor( } } + // TODO(b/331451011): Refactor to viewmodel and use interactor pattern. + private val wakefulnessLifecycleObserver = + object : WakefulnessLifecycle.Observer { + override fun onStartedWakingUp() { + smartspaceViews.forEach { it.setScreenOn(true) } + } + + override fun onFinishedGoingToSleep() { + smartspaceViews.forEach { it.setScreenOn(false) } + } + } + init { deviceProvisionedController.addCallback(deviceProvisionedListener) dumpManager.registerDumpable(this) @@ -451,6 +466,7 @@ constructor( configurationController.addCallback(configChangeListener) statusBarStateController.addCallback(statusBarStateListener) bypassController.registerOnBypassStateChangedListener(bypassStateChangedListener) + wakefulnessLifecycle.addObserver(wakefulnessLifecycleObserver) datePlugin?.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) } weatherPlugin?.registerSmartspaceEventNotifier { e -> session?.notifySmartspaceEvent(e) } @@ -493,6 +509,7 @@ constructor( configurationController.removeCallback(configChangeListener) statusBarStateController.removeCallback(statusBarStateListener) bypassController.unregisterOnBypassStateChangedListener(bypassStateChangedListener) + wakefulnessLifecycle.removeObserver(wakefulnessLifecycleObserver) session = null datePlugin?.registerSmartspaceEventNotifier(null) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index a5f3f57f5be6..5abad61d90ad 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -38,6 +38,7 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FeatureFlags +import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.BcSmartspaceConfigPlugin import com.android.systemui.plugins.BcSmartspaceDataPlugin @@ -180,6 +181,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { private lateinit var dateSmartspaceView: SmartspaceView private lateinit var weatherSmartspaceView: SmartspaceView private lateinit var smartspaceView: SmartspaceView + private lateinit var wakefulnessLifecycle: WakefulnessLifecycle private val clock = FakeSystemClock() private val executor = FakeExecutor(clock) @@ -225,6 +227,14 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { setAllowPrivateNotifications(userHandleSecondary, true) setShowNotifications(userHandlePrimary, true) + // Use the real wakefulness lifecycle instead of a mock + wakefulnessLifecycle = WakefulnessLifecycle( + context, + /* wallpaper= */ null, + clock, + dumpManager + ) + controller = LockscreenSmartspaceController( context, featureFlags, @@ -240,6 +250,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { deviceProvisionedController, keyguardBypassController, keyguardUpdateMonitor, + wakefulnessLifecycle, dumpManager, execution, executor, @@ -773,6 +784,38 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { verify(configurationController, never()).addCallback(any()) } + @Test + fun testWakefulnessLifecycleDispatch_wake_setsSmartspaceScreenOnTrue() { + // Connect session + connectSession() + + // Add mock views + val mockSmartspaceView = mock(SmartspaceView::class.java) + controller.smartspaceViews.add(mockSmartspaceView) + + // Initiate wakefulness change + wakefulnessLifecycle.dispatchStartedWakingUp(0) + + // Verify smartspace views receive screen on + verify(mockSmartspaceView).setScreenOn(true) + } + + @Test + fun testWakefulnessLifecycleDispatch_sleep_setsSmartspaceScreenOnFalse() { + // Connect session + connectSession() + + // Add mock views + val mockSmartspaceView = mock(SmartspaceView::class.java) + controller.smartspaceViews.add(mockSmartspaceView) + + // Initiate wakefulness change + wakefulnessLifecycle.dispatchFinishedGoingToSleep() + + // Verify smartspace views receive screen on + verify(mockSmartspaceView).setScreenOn(false) + } + private fun connectSession() { val dateView = controller.buildAndConnectDateView(fakeParent) dateSmartspaceView = dateView as SmartspaceView |