Merge "Rename unfold background executor to add single thread assumption" into tm-qpr-dev

This commit is contained in:
TreeHugger Robot
2023-01-16 12:12:18 +00:00
committed by Android (Google) Code Review
8 changed files with 115 additions and 96 deletions

View File

@@ -19,7 +19,7 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.dagger.qualifiers.UiBackground import com.android.systemui.dagger.qualifiers.UiBackground
import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig
import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldBackground import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.util.CurrentActivityTypeProvider import com.android.systemui.unfold.util.CurrentActivityTypeProvider
@@ -56,6 +56,6 @@ abstract class SystemUnfoldSharedModule {
abstract fun mainHandler(@Main handler: Handler): Handler abstract fun mainHandler(@Main handler: Handler): Handler
@Binds @Binds
@UnfoldBackground @UnfoldSingleThreadBg
abstract fun backgroundExecutor(@UiBackground executor: Executor): Executor abstract fun backgroundExecutor(@UiBackground executor: Executor): Executor
} }

View File

@@ -22,8 +22,8 @@ import android.hardware.SensorManager
import android.os.Handler import android.os.Handler
import android.view.IWindowManager import android.view.IWindowManager
import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldBackground
import com.android.systemui.unfold.dagger.UnfoldMain import com.android.systemui.unfold.dagger.UnfoldMain
import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
import com.android.systemui.unfold.updates.FoldProvider import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.updates.RotationChangeProvider import com.android.systemui.unfold.updates.RotationChangeProvider
import com.android.systemui.unfold.updates.screen.ScreenStatusProvider import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
@@ -58,7 +58,7 @@ interface UnfoldSharedComponent {
@BindsInstance sensorManager: SensorManager, @BindsInstance sensorManager: SensorManager,
@BindsInstance @UnfoldMain handler: Handler, @BindsInstance @UnfoldMain handler: Handler,
@BindsInstance @UnfoldMain executor: Executor, @BindsInstance @UnfoldMain executor: Executor,
@BindsInstance @UnfoldBackground backgroundExecutor: Executor, @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
@BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String, @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
@BindsInstance windowManager: IWindowManager, @BindsInstance windowManager: IWindowManager,
@BindsInstance contentResolver: ContentResolver = context.contentResolver @BindsInstance contentResolver: ContentResolver = context.contentResolver

View File

@@ -16,9 +16,7 @@
package com.android.systemui.unfold package com.android.systemui.unfold
import android.hardware.SensorManager
import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.dagger.UnfoldBackground
import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider
import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider
import com.android.systemui.unfold.updates.DeviceFoldStateProvider import com.android.systemui.unfold.updates.DeviceFoldStateProvider
@@ -34,54 +32,17 @@ import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityProvider
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import java.util.Optional import java.util.Optional
import java.util.concurrent.Executor import javax.inject.Provider
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module(includes = [UnfoldSharedInternalModule::class])
class UnfoldSharedModule { class UnfoldSharedModule {
@Provides
@Singleton
fun unfoldTransitionProgressProvider(
config: UnfoldTransitionConfig,
scaleAwareProviderFactory: ScaleAwareTransitionProgressProvider.Factory,
tracingListener: ATraceLoggerTransitionProgressListener,
foldStateProvider: FoldStateProvider
): Optional<UnfoldTransitionProgressProvider> =
if (!config.isEnabled) {
Optional.empty()
} else {
val baseProgressProvider =
if (config.isHingeAngleEnabled) {
PhysicsBasedUnfoldTransitionProgressProvider(foldStateProvider)
} else {
FixedTimingTransitionProgressProvider(foldStateProvider)
}
Optional.of(
scaleAwareProviderFactory.wrap(baseProgressProvider).apply {
// Always present callback that logs animation beginning and end.
addCallback(tracingListener)
}
)
}
@Provides @Provides
@Singleton @Singleton
fun provideFoldStateProvider( fun provideFoldStateProvider(
deviceFoldStateProvider: DeviceFoldStateProvider deviceFoldStateProvider: DeviceFoldStateProvider
): FoldStateProvider = deviceFoldStateProvider ): FoldStateProvider = deviceFoldStateProvider
@Provides
fun hingeAngleProvider(
config: UnfoldTransitionConfig,
sensorManager: SensorManager,
@UnfoldBackground executor: Executor
): HingeAngleProvider =
if (config.isHingeAngleEnabled) {
HingeSensorAngleProvider(sensorManager, executor)
} else {
EmptyHingeAngleProvider
}
@Provides @Provides
@Singleton @Singleton
fun unfoldKeyguardVisibilityProvider( fun unfoldKeyguardVisibilityProvider(
@@ -94,3 +55,51 @@ class UnfoldSharedModule {
impl: UnfoldKeyguardVisibilityManagerImpl impl: UnfoldKeyguardVisibilityManagerImpl
): UnfoldKeyguardVisibilityManager = impl ): UnfoldKeyguardVisibilityManager = impl
} }
/**
* Needed as methods inside must be public, but their parameters can be internal (and, a public
* method can't have internal parameters). Making the module internal and included in a public one
* fixes the issue.
*/
@Module
internal class UnfoldSharedInternalModule {
@Provides
@Singleton
fun unfoldTransitionProgressProvider(
config: UnfoldTransitionConfig,
scaleAwareProviderFactory: ScaleAwareTransitionProgressProvider.Factory,
tracingListener: ATraceLoggerTransitionProgressListener,
physicsBasedUnfoldTransitionProgressProvider:
Provider<PhysicsBasedUnfoldTransitionProgressProvider>,
fixedTimingTransitionProgressProvider: Provider<FixedTimingTransitionProgressProvider>,
): Optional<UnfoldTransitionProgressProvider> {
if (!config.isEnabled) {
return Optional.empty()
}
val baseProgressProvider =
if (config.isHingeAngleEnabled) {
physicsBasedUnfoldTransitionProgressProvider.get()
} else {
fixedTimingTransitionProgressProvider.get()
}
return Optional.of(
scaleAwareProviderFactory.wrap(baseProgressProvider).apply {
// Always present callback that logs animation beginning and end.
addCallback(tracingListener)
}
)
}
@Provides
fun hingeAngleProvider(
config: UnfoldTransitionConfig,
hingeAngleSensorProvider: Provider<HingeSensorAngleProvider>
): HingeAngleProvider {
return if (config.isHingeAngleEnabled) {
hingeAngleSensorProvider.get()
} else {
EmptyHingeAngleProvider
}
}
}

View File

@@ -45,7 +45,7 @@ fun createUnfoldSharedComponent(
sensorManager: SensorManager, sensorManager: SensorManager,
mainHandler: Handler, mainHandler: Handler,
mainExecutor: Executor, mainExecutor: Executor,
backgroundExecutor: Executor, singleThreadBgExecutor: Executor,
tracingTagPrefix: String, tracingTagPrefix: String,
windowManager: IWindowManager, windowManager: IWindowManager,
): UnfoldSharedComponent = ): UnfoldSharedComponent =
@@ -59,7 +59,7 @@ fun createUnfoldSharedComponent(
sensorManager, sensorManager,
mainHandler, mainHandler,
mainExecutor, mainExecutor,
backgroundExecutor, singleThreadBgExecutor,
tracingTagPrefix, tracingTagPrefix,
windowManager, windowManager,
) )

View File

@@ -18,8 +18,7 @@ import javax.inject.Qualifier
/** /**
* Alternative to [UiBackground] qualifier annotation in unfold module. * Alternative to [UiBackground] qualifier annotation in unfold module.
*
* It is needed as we can't depend on SystemUI code in this module. * It is needed as we can't depend on SystemUI code in this module.
*/ */
@Qualifier @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class UnfoldSingleThreadBg
@Retention(AnnotationRetention.RUNTIME)
annotation class UnfoldBackground

View File

@@ -24,11 +24,13 @@ import com.android.systemui.unfold.updates.FOLD_UPDATE_FINISH_CLOSED
import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE import com.android.systemui.unfold.updates.FOLD_UPDATE_UNFOLDED_SCREEN_AVAILABLE
import com.android.systemui.unfold.updates.FoldStateProvider import com.android.systemui.unfold.updates.FoldStateProvider
import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate
import javax.inject.Inject
/** Emits animation progress with fixed timing after unfolding */ /** Emits animation progress with fixed timing after unfolding */
internal class FixedTimingTransitionProgressProvider( internal class FixedTimingTransitionProgressProvider
private val foldStateProvider: FoldStateProvider @Inject
) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener { constructor(private val foldStateProvider: FoldStateProvider) :
UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener {
private val animatorListener = AnimatorListener() private val animatorListener = AnimatorListener()
private val animator = private val animator =

View File

@@ -33,9 +33,10 @@ import com.android.systemui.unfold.updates.FoldStateProvider
import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate
import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdatesListener
import com.android.systemui.unfold.updates.name import com.android.systemui.unfold.updates.name
import javax.inject.Inject
/** Maps fold updates to unfold transition progress using DynamicAnimation. */ /** Maps fold updates to unfold transition progress using DynamicAnimation. */
class PhysicsBasedUnfoldTransitionProgressProvider( class PhysicsBasedUnfoldTransitionProgressProvider @Inject constructor(
private val foldStateProvider: FoldStateProvider private val foldStateProvider: FoldStateProvider
) : UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener { ) : UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener {

View File

@@ -20,19 +20,23 @@ import android.hardware.SensorEventListener
import android.hardware.SensorManager import android.hardware.SensorManager
import android.os.Trace import android.os.Trace
import androidx.core.util.Consumer import androidx.core.util.Consumer
import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
import java.util.concurrent.Executor import java.util.concurrent.Executor
import javax.inject.Inject
internal class HingeSensorAngleProvider( internal class HingeSensorAngleProvider
@Inject
constructor(
private val sensorManager: SensorManager, private val sensorManager: SensorManager,
private val executor: Executor @UnfoldSingleThreadBg private val singleThreadBgExecutor: Executor
) : ) : HingeAngleProvider {
HingeAngleProvider {
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 var started = false
override fun start() = executor.execute { override fun start() {
singleThreadBgExecutor.execute {
if (started) return@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)
@@ -42,14 +46,18 @@ internal class HingeSensorAngleProvider(
SensorManager.SENSOR_DELAY_FASTEST SensorManager.SENSOR_DELAY_FASTEST
) )
Trace.endSection() Trace.endSection()
started = true started = true
} }
}
override fun stop() = executor.execute { override fun stop() {
singleThreadBgExecutor.execute {
if (!started) return@execute if (!started) return@execute
sensorManager.unregisterListener(sensorListener) sensorManager.unregisterListener(sensorListener)
started = false started = false
} }
}
override fun removeCallback(listener: Consumer<Float>) { override fun removeCallback(listener: Consumer<Float>) {
listeners.remove(listener) listeners.remove(listener)