Register hinge angle sensor listener in a background thread

This was taking ~13ms on the ui thread.

I had to move up the sysui background executor as it was only provided inside sysui dagger component, but those classes are also used in WM component.

Bug: 221394115
Test: Folding device and check animation
Change-Id: I766d879d68f555214f9c1d2434cfab732937cd32
This commit is contained in:
Nicolo' Mazzucato
2022-02-25 12:37:45 +01:00
parent 01eeccd8fe
commit 89e5aa5900
7 changed files with 37 additions and 20 deletions

View File

@@ -22,6 +22,7 @@ import android.hardware.SensorManager
import android.hardware.devicestate.DeviceStateManager
import android.os.Handler
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
import com.android.systemui.unfold.util.UnfoldTransitionATracePrefix
@@ -53,6 +54,7 @@ internal interface UnfoldSharedComponent {
@BindsInstance sensorManager: SensorManager,
@BindsInstance @Main handler: Handler,
@BindsInstance @Main executor: Executor,
@BindsInstance @UiBackground backgroundExecutor: Executor,
@BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
@BindsInstance contentResolver: ContentResolver = context.contentResolver
): UnfoldSharedComponent

View File

@@ -17,6 +17,7 @@
package com.android.systemui.unfold
import android.hardware.SensorManager
import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider
import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider
@@ -30,6 +31,7 @@ import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider
import dagger.Module
import dagger.Provides
import java.util.Optional
import java.util.concurrent.Executor
import javax.inject.Singleton
@Module
@@ -67,10 +69,11 @@ class UnfoldSharedModule {
@Provides
fun hingeAngleProvider(
config: UnfoldTransitionConfig,
sensorManager: SensorManager
sensorManager: SensorManager,
@UiBackground executor: Executor
): HingeAngleProvider =
if (config.isHingeAngleEnabled) {
HingeSensorAngleProvider(sensorManager)
HingeSensorAngleProvider(sensorManager, executor)
} else {
EmptyHingeAngleProvider
}

View File

@@ -42,6 +42,7 @@ fun createUnfoldTransitionProgressProvider(
sensorManager: SensorManager,
mainHandler: Handler,
mainExecutor: Executor,
backgroundExecutor: Executor,
tracingTagPrefix: String
): UnfoldTransitionProgressProvider =
DaggerUnfoldSharedComponent.factory()
@@ -53,6 +54,7 @@ fun createUnfoldTransitionProgressProvider(
sensorManager,
mainHandler,
mainExecutor,
backgroundExecutor,
tracingTagPrefix)
.unfoldTransitionProvider
.orElse(null)

View File

@@ -6,21 +6,29 @@ import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Trace
import androidx.core.util.Consumer
import java.util.concurrent.Executor
internal class HingeSensorAngleProvider(private val sensorManager: SensorManager) :
internal class HingeSensorAngleProvider(
private val sensorManager: SensorManager,
private val executor: Executor
) :
HingeAngleProvider {
private val sensorListener = HingeAngleSensorListener()
private val listeners: MutableList<Consumer<Float>> = arrayListOf()
override fun start() {
override fun start() = executor.execute {
Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener(sensorListener, sensor, SensorManager.SENSOR_DELAY_FASTEST)
sensorManager.registerListener(
sensorListener,
sensor,
SensorManager.SENSOR_DELAY_FASTEST
)
Trace.endSection()
}
override fun stop() {
override fun stop() = executor.execute {
sensorManager.unregisterListener(sensorListener)
}

View File

@@ -23,10 +23,14 @@ import android.util.DisplayMetrics;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.systemui.dagger.qualifiers.TestHarness;
import com.android.systemui.dagger.qualifiers.UiBackground;
import com.android.systemui.plugins.PluginsModule;
import com.android.systemui.unfold.UnfoldTransitionModule;
import com.android.systemui.util.concurrency.GlobalConcurrencyModule;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import javax.inject.Singleton;
import dagger.Module;
@@ -75,4 +79,16 @@ public class GlobalModule {
static boolean provideIsTestHarness() {
return ActivityManager.isRunningInUserTestHarness();
}
/**
* Provide an Executor specifically for running UI operations on a separate thread.
*
* Keep submitted runnables short and to the point, just as with any other UI code.
*/
@Provides
@Singleton
@UiBackground
public static Executor provideUiBackgroundExecutor() {
return Executors.newSingleThreadExecutor();
}
}

View File

@@ -25,10 +25,8 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.LongRunning;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.UiBackground;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import dagger.Module;
import dagger.Provides;
@@ -149,18 +147,6 @@ public abstract class SysUIConcurrencyModule {
return new RepeatableExecutorImpl(exec);
}
/**
* Provide an Executor specifically for running UI operations on a separate thread.
*
* Keep submitted runnables short and to the point, just as with any other UI code.
*/
@Provides
@SysUISingleton
@UiBackground
public static Executor provideUiBackgroundExecutor() {
return Executors.newSingleThreadExecutor();
}
/** */
@Provides
@Main