summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl10
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/LifecycleScreenStatusProvider.kt8
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java66
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt57
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt20
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt5
-rw-r--r--packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/screen/ScreenStatusProvider.kt10
7 files changed, 154 insertions, 22 deletions
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
index 01497516e0b1..4613e8b1060f 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/IOverviewProxy.aidl
@@ -100,4 +100,14 @@ oneway interface IOverviewProxy {
* Sent when the desired dark intensity of the nav buttons has changed
*/
void onNavButtonsDarkIntensityChanged(float darkIntensity) = 22;
+
+ /**
+ * Sent when screen started turning on.
+ */
+ void onScreenTurningOn() = 23;
+
+ /**
+ * Sent when screen started turning off.
+ */
+ void onScreenTurningOff() = 24;
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/LifecycleScreenStatusProvider.kt b/packages/SystemUI/src/com/android/systemui/keyguard/LifecycleScreenStatusProvider.kt
index 044a57ced3fc..0a55294dfe8a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/LifecycleScreenStatusProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/LifecycleScreenStatusProvider.kt
@@ -41,4 +41,12 @@ class LifecycleScreenStatusProvider @Inject constructor(screenLifecycle: ScreenL
override fun onScreenTurnedOn() {
listeners.forEach(ScreenListener::onScreenTurnedOn)
}
+
+ override fun onScreenTurningOff() {
+ listeners.forEach(ScreenListener::onScreenTurningOff)
+ }
+
+ override fun onScreenTurningOn(ignored: Runnable) {
+ listeners.forEach(ScreenListener::onScreenTurningOn)
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 438236d6a63d..30862b78c93f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -638,12 +638,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
// Listen for user setup
startTracking();
- screenLifecycle.addObserver(new ScreenLifecycle.Observer() {
- @Override
- public void onScreenTurnedOn() {
- notifyScreenTurnedOn();
- }
- });
+ screenLifecycle.addObserver(mLifecycleObserver);
// Connect to the service
updateEnabledState();
@@ -951,20 +946,55 @@ public class OverviewProxyService extends CurrentUserTracker implements
}
}
- /**
- * Notifies the Launcher that screen turned on and ready to use
- */
- public void notifyScreenTurnedOn() {
- try {
- if (mOverviewProxy != null) {
- mOverviewProxy.onScreenTurnedOn();
- } else {
- Log.e(TAG_OPS, "Failed to get overview proxy for screen turned on event.");
+ private final ScreenLifecycle.Observer mLifecycleObserver = new ScreenLifecycle.Observer() {
+ /**
+ * Notifies the Launcher that screen turned on and ready to use
+ */
+ @Override
+ public void onScreenTurnedOn() {
+ try {
+ if (mOverviewProxy != null) {
+ mOverviewProxy.onScreenTurnedOn();
+ } else {
+ Log.e(TAG_OPS, "Failed to get overview proxy for screen turned on event.");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG_OPS, "Failed to call onScreenTurnedOn()", e);
}
- } catch (RemoteException e) {
- Log.e(TAG_OPS, "Failed to call notifyScreenTurnedOn()", e);
}
- }
+
+ /**
+ * Notifies the Launcher that screen is starting to turn on.
+ */
+ @Override
+ public void onScreenTurningOff() {
+ try {
+ if (mOverviewProxy != null) {
+ mOverviewProxy.onScreenTurningOff();
+ } else {
+ Log.e(TAG_OPS, "Failed to get overview proxy for screen turning off event.");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG_OPS, "Failed to call onScreenTurningOff()", e);
+ }
+ }
+
+ /**
+ * Notifies the Launcher that screen is starting to turn on.
+ */
+ @Override
+ public void onScreenTurningOn(@NonNull Runnable ignored) {
+ try {
+ if (mOverviewProxy != null) {
+ mOverviewProxy.onScreenTurningOn();
+ } else {
+ Log.e(TAG_OPS, "Failed to get overview proxy for screen turning on event.");
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG_OPS, "Failed to call onScreenTurningOn()", e);
+ }
+ }
+ };
void notifyToggleRecentApps() {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt
index 87fca1f23f1a..7e0704007700 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/unfold/updates/DeviceFoldStateProviderTest.kt
@@ -30,13 +30,13 @@ import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
import com.android.systemui.unfold.updates.screen.ScreenStatusProvider.ScreenListener
import com.android.systemui.util.mockito.any
import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Executor
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
-import org.mockito.MockitoAnnotations
-import java.util.concurrent.Executor
import org.mockito.Mockito.`when` as whenever
+import org.mockito.MockitoAnnotations
@RunWith(AndroidTestingRunner::class)
@SmallTest
@@ -331,6 +331,47 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING)
}
+ @Test
+ fun screenOff_whileFolded_hingeAngleProviderRemainsOff() {
+ setFoldState(folded = true)
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+
+ screenOnStatusProvider.notifyScreenTurningOff()
+
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+ }
+
+ @Test
+ fun screenOff_whileUnfolded_hingeAngleProviderStops() {
+ setFoldState(folded = false)
+ assertThat(testHingeAngleProvider.isStarted).isTrue()
+
+ screenOnStatusProvider.notifyScreenTurningOff()
+
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+ }
+
+ @Test
+ fun screenOn_whileUnfoldedAndScreenOff_hingeAngleProviderStarted() {
+ setFoldState(folded = false)
+ screenOnStatusProvider.notifyScreenTurningOff()
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+
+ screenOnStatusProvider.notifyScreenTurningOn()
+
+ assertThat(testHingeAngleProvider.isStarted).isTrue()
+ }
+
+ @Test
+ fun screenOn_whileFolded_hingeAngleRemainsOff() {
+ setFoldState(folded = true)
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+
+ screenOnStatusProvider.notifyScreenTurningOn()
+
+ assertThat(testHingeAngleProvider.isStarted).isFalse()
+ }
+
private fun setupForegroundActivityType(isHomeActivity: Boolean?) {
whenever(activityTypeProvider.isHomeActivity).thenReturn(isHomeActivity)
}
@@ -391,6 +432,14 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
fun notifyScreenTurnedOn() {
callbacks.forEach { it.onScreenTurnedOn() }
}
+
+ fun notifyScreenTurningOn() {
+ callbacks.forEach { it.onScreenTurningOn() }
+ }
+
+ fun notifyScreenTurningOff() {
+ callbacks.forEach { it.onScreenTurningOff() }
+ }
}
private class TestHingeAngleProvider : HingeAngleProvider {
@@ -398,11 +447,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
var isStarted: Boolean = false
override fun start() {
- isStarted = true;
+ isStarted = true
}
override fun stop() {
- isStarted = false;
+ isStarted = false
}
override fun addCallback(listener: Consumer<Float>) {
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt
index e8038fd7dfa6..19cfc805d17b 100644
--- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/DeviceFoldStateProvider.kt
@@ -65,6 +65,7 @@ constructor(
private val halfOpenedTimeoutMillis: Int = config.halfFoldedTimeoutMillis
private var isFolded = false
+ private var isScreenOn = false
private var isUnfoldHandled = true
override fun start() {
@@ -198,6 +199,25 @@ constructor(
isUnfoldHandled = true
}
}
+
+ override fun onScreenTurningOn() {
+ isScreenOn = true
+ updateHingeAngleProviderState()
+ }
+
+ override fun onScreenTurningOff() {
+ isScreenOn = false
+ updateHingeAngleProviderState()
+ }
+ }
+
+ /** While the screen is off or the device is folded, hinge angle updates are not needed. */
+ private fun updateHingeAngleProviderState() {
+ if (isScreenOn && !isFolded) {
+ hingeAngleProvider.start()
+ } else {
+ hingeAngleProvider.stop()
+ }
}
private inner class HingeAngleListener : Consumer<Float> {
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
index 3fc5d610dc2d..577137ca12f3 100644
--- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt
@@ -30,8 +30,10 @@ internal class HingeSensorAngleProvider(
private val sensorListener = HingeAngleSensorListener()
private val listeners: MutableList<Consumer<Float>> = arrayListOf()
+ var started = false
override fun start() = executor.execute {
+ if (started) return@execute
Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener(
@@ -40,10 +42,13 @@ internal class HingeSensorAngleProvider(
SensorManager.SENSOR_DELAY_FASTEST
)
Trace.endSection()
+ started = true
}
override fun stop() = executor.execute {
+ if (!started) return@execute
sensorManager.unregisterListener(sensorListener)
+ started = false
}
override fun removeCallback(listener: Consumer<Float>) {
diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/screen/ScreenStatusProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/screen/ScreenStatusProvider.kt
index d95e050474de..f09b53dc8436 100644
--- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/screen/ScreenStatusProvider.kt
+++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/screen/ScreenStatusProvider.kt
@@ -25,5 +25,15 @@ interface ScreenStatusProvider : CallbackController<ScreenListener> {
* Called when the screen is on and ready (windows are drawn and screen blocker is removed)
*/
fun onScreenTurnedOn()
+
+ /**
+ * Called when the screen is starting to be turned off.
+ */
+ fun onScreenTurningOff()
+
+ /**
+ * Called when the screen is starting to be turned on.
+ */
+ fun onScreenTurningOn()
}
}