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

@@ -37,29 +37,29 @@ import java.util.concurrent.Executor
* This should **never** be called from sysui, as the object is already provided in that process. * This should **never** be called from sysui, as the object is already provided in that process.
*/ */
fun createUnfoldSharedComponent( fun createUnfoldSharedComponent(
context: Context, context: Context,
config: UnfoldTransitionConfig, config: UnfoldTransitionConfig,
screenStatusProvider: ScreenStatusProvider, screenStatusProvider: ScreenStatusProvider,
foldProvider: FoldProvider, foldProvider: FoldProvider,
activityTypeProvider: CurrentActivityTypeProvider, activityTypeProvider: CurrentActivityTypeProvider,
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 =
DaggerUnfoldSharedComponent.factory() DaggerUnfoldSharedComponent.factory()
.create( .create(
context, context,
config, config,
screenStatusProvider, screenStatusProvider,
foldProvider, foldProvider,
activityTypeProvider, activityTypeProvider,
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,35 +20,43 @@ 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() {
if (started) return@execute singleThreadBgExecutor.execute {
Trace.beginSection("HingeSensorAngleProvider#start") if (started) return@execute
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE) Trace.beginSection("HingeSensorAngleProvider#start")
sensorManager.registerListener( val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorListener, sensorManager.registerListener(
sensor, sensorListener,
SensorManager.SENSOR_DELAY_FASTEST sensor,
) SensorManager.SENSOR_DELAY_FASTEST
Trace.endSection() )
started = true Trace.endSection()
started = true
}
} }
override fun stop() = executor.execute { override fun stop() {
if (!started) return@execute singleThreadBgExecutor.execute {
sensorManager.unregisterListener(sensorListener) if (!started) return@execute
started = false sensorManager.unregisterListener(sensorListener)
started = false
}
} }
override fun removeCallback(listener: Consumer<Float>) { override fun removeCallback(listener: Consumer<Float>) {