Merge "Disable hinge sensor while the screen is off" into tm-qpr-dev am: c912c03106

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19457214

Change-Id: I12a26e98c2b0bdcbd52998f619f0e81cc219ba8c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Nicolò Mazzucato
2022-08-10 09:45:46 +00:00
committed by Automerger Merge Worker
7 changed files with 154 additions and 22 deletions

View File

@@ -100,4 +100,14 @@ oneway interface IOverviewProxy {
* Sent when the desired dark intensity of the nav buttons has changed * Sent when the desired dark intensity of the nav buttons has changed
*/ */
void onNavButtonsDarkIntensityChanged(float darkIntensity) = 22; void onNavButtonsDarkIntensityChanged(float darkIntensity) = 22;
/**
* Sent when screen started turning on.
*/
void onScreenTurningOn() = 23;
/**
* Sent when screen started turning off.
*/
void onScreenTurningOff() = 24;
} }

View File

@@ -41,4 +41,12 @@ class LifecycleScreenStatusProvider @Inject constructor(screenLifecycle: ScreenL
override fun onScreenTurnedOn() { override fun onScreenTurnedOn() {
listeners.forEach(ScreenListener::onScreenTurnedOn) listeners.forEach(ScreenListener::onScreenTurnedOn)
} }
override fun onScreenTurningOff() {
listeners.forEach(ScreenListener::onScreenTurningOff)
}
override fun onScreenTurningOn(ignored: Runnable) {
listeners.forEach(ScreenListener::onScreenTurningOn)
}
} }

View File

@@ -638,12 +638,7 @@ public class OverviewProxyService extends CurrentUserTracker implements
// Listen for user setup // Listen for user setup
startTracking(); startTracking();
screenLifecycle.addObserver(new ScreenLifecycle.Observer() { screenLifecycle.addObserver(mLifecycleObserver);
@Override
public void onScreenTurnedOn() {
notifyScreenTurnedOn();
}
});
// Connect to the service // Connect to the service
updateEnabledState(); updateEnabledState();
@@ -951,20 +946,55 @@ public class OverviewProxyService extends CurrentUserTracker implements
} }
} }
/** private final ScreenLifecycle.Observer mLifecycleObserver = new ScreenLifecycle.Observer() {
* Notifies the Launcher that screen turned on and ready to use /**
*/ * Notifies the Launcher that screen turned on and ready to use
public void notifyScreenTurnedOn() { */
try { @Override
if (mOverviewProxy != null) { public void onScreenTurnedOn() {
mOverviewProxy.onScreenTurnedOn(); try {
} else { if (mOverviewProxy != null) {
Log.e(TAG_OPS, "Failed to get overview proxy for screen turned on event."); 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() { void notifyToggleRecentApps() {
for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {

View File

@@ -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.unfold.updates.screen.ScreenStatusProvider.ScreenListener
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import java.util.concurrent.Executor
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock import org.mockito.Mock
import org.mockito.MockitoAnnotations
import java.util.concurrent.Executor
import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever
import org.mockito.MockitoAnnotations
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
@SmallTest @SmallTest
@@ -331,6 +331,47 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
assertThat(foldUpdates).containsExactly(FOLD_UPDATE_START_CLOSING) 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?) { private fun setupForegroundActivityType(isHomeActivity: Boolean?) {
whenever(activityTypeProvider.isHomeActivity).thenReturn(isHomeActivity) whenever(activityTypeProvider.isHomeActivity).thenReturn(isHomeActivity)
} }
@@ -391,6 +432,14 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
fun notifyScreenTurnedOn() { fun notifyScreenTurnedOn() {
callbacks.forEach { it.onScreenTurnedOn() } callbacks.forEach { it.onScreenTurnedOn() }
} }
fun notifyScreenTurningOn() {
callbacks.forEach { it.onScreenTurningOn() }
}
fun notifyScreenTurningOff() {
callbacks.forEach { it.onScreenTurningOff() }
}
} }
private class TestHingeAngleProvider : HingeAngleProvider { private class TestHingeAngleProvider : HingeAngleProvider {
@@ -398,11 +447,11 @@ class DeviceFoldStateProviderTest : SysuiTestCase() {
var isStarted: Boolean = false var isStarted: Boolean = false
override fun start() { override fun start() {
isStarted = true; isStarted = true
} }
override fun stop() { override fun stop() {
isStarted = false; isStarted = false
} }
override fun addCallback(listener: Consumer<Float>) { override fun addCallback(listener: Consumer<Float>) {

View File

@@ -65,6 +65,7 @@ constructor(
private val halfOpenedTimeoutMillis: Int = config.halfFoldedTimeoutMillis private val halfOpenedTimeoutMillis: Int = config.halfFoldedTimeoutMillis
private var isFolded = false private var isFolded = false
private var isScreenOn = false
private var isUnfoldHandled = true private var isUnfoldHandled = true
override fun start() { override fun start() {
@@ -198,6 +199,25 @@ constructor(
isUnfoldHandled = true 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> { private inner class HingeAngleListener : Consumer<Float> {

View File

@@ -30,8 +30,10 @@ internal class HingeSensorAngleProvider(
private val sensorListener = HingeAngleSensorListener() private val sensorListener = HingeAngleSensorListener()
private val listeners: MutableList<Consumer<Float>> = arrayListOf() private val listeners: MutableList<Consumer<Float>> = arrayListOf()
var started = false
override fun start() = executor.execute { override fun start() = executor.execute {
if (started) return@execute
Trace.beginSection("HingeSensorAngleProvider#start") Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE) val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener( sensorManager.registerListener(
@@ -40,10 +42,13 @@ internal class HingeSensorAngleProvider(
SensorManager.SENSOR_DELAY_FASTEST SensorManager.SENSOR_DELAY_FASTEST
) )
Trace.endSection() Trace.endSection()
started = true
} }
override fun stop() = executor.execute { override fun stop() = executor.execute {
if (!started) return@execute
sensorManager.unregisterListener(sensorListener) sensorManager.unregisterListener(sensorListener)
started = false
} }
override fun removeCallback(listener: Consumer<Float>) { override fun removeCallback(listener: Consumer<Float>) {

View File

@@ -25,5 +25,15 @@ interface ScreenStatusProvider : CallbackController<ScreenListener> {
* Called when the screen is on and ready (windows are drawn and screen blocker is removed) * Called when the screen is on and ready (windows are drawn and screen blocker is removed)
*/ */
fun onScreenTurnedOn() 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()
} }
} }