From 89e5aa59001cc728b940796f7a4b51ad85fb4ae5 Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Fri, 25 Feb 2022 12:37:45 +0100 Subject: [PATCH] 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 --- .../systemui/dagger/qualifiers/UiBackground.java | 0 .../systemui/unfold/UnfoldSharedComponent.kt | 2 ++ .../systemui/unfold/UnfoldSharedModule.kt | 7 +++++-- .../systemui/unfold/UnfoldTransitionFactory.kt | 2 ++ .../updates/hinge/HingeSensorAngleProvider.kt | 16 ++++++++++++---- .../android/systemui/dagger/GlobalModule.java | 16 ++++++++++++++++ .../util/concurrency/SysUIConcurrencyModule.java | 14 -------------- 7 files changed, 37 insertions(+), 20 deletions(-) rename packages/SystemUI/{ => shared}/src/com/android/systemui/dagger/qualifiers/UiBackground.java (100%) diff --git a/packages/SystemUI/src/com/android/systemui/dagger/qualifiers/UiBackground.java b/packages/SystemUI/shared/src/com/android/systemui/dagger/qualifiers/UiBackground.java similarity index 100% rename from packages/SystemUI/src/com/android/systemui/dagger/qualifiers/UiBackground.java rename to packages/SystemUI/shared/src/com/android/systemui/dagger/qualifiers/UiBackground.java diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedComponent.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedComponent.kt index ac62cf9f9d5bb..15593ea5f0e4b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedComponent.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedComponent.kt @@ -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 diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedModule.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedModule.kt index 23e4c97fc2713..c612995241ef2 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedModule.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldSharedModule.kt @@ -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 } diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt index d5d636208747c..8e4ff9bc91331 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/UnfoldTransitionFactory.kt @@ -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) diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt index a50d852e9b36a..c93412b538177 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/updates/hinge/HingeSensorAngleProvider.kt @@ -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> = 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) } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java index 18f85196aa0b5..620feec8fbb85 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/GlobalModule.java @@ -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(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.java index e8a9bc702352c..8f61abcca4dce 100644 --- a/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.java +++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/SysUIConcurrencyModule.java @@ -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