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.unfold.config.ResourceUnfoldTransitionConfig
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.updates.FoldProvider
import com.android.systemui.unfold.util.CurrentActivityTypeProvider
@@ -56,6 +56,6 @@ abstract class SystemUnfoldSharedModule {
abstract fun mainHandler(@Main handler: Handler): Handler
@Binds
@UnfoldBackground
@UnfoldSingleThreadBg
abstract fun backgroundExecutor(@UiBackground executor: Executor): Executor
}

View File

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

View File

@@ -16,9 +16,7 @@
package com.android.systemui.unfold
import android.hardware.SensorManager
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.PhysicsBasedUnfoldTransitionProgressProvider
import com.android.systemui.unfold.updates.DeviceFoldStateProvider
@@ -34,54 +32,17 @@ import com.android.systemui.unfold.util.UnfoldKeyguardVisibilityProvider
import dagger.Module
import dagger.Provides
import java.util.Optional
import java.util.concurrent.Executor
import javax.inject.Provider
import javax.inject.Singleton
@Module
@Module(includes = [UnfoldSharedInternalModule::class])
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
@Singleton
fun provideFoldStateProvider(
deviceFoldStateProvider: DeviceFoldStateProvider
): FoldStateProvider = deviceFoldStateProvider
@Provides
fun hingeAngleProvider(
config: UnfoldTransitionConfig,
sensorManager: SensorManager,
@UnfoldBackground executor: Executor
): HingeAngleProvider =
if (config.isHingeAngleEnabled) {
HingeSensorAngleProvider(sensorManager, executor)
} else {
EmptyHingeAngleProvider
}
@Provides
@Singleton
fun unfoldKeyguardVisibilityProvider(
@@ -94,3 +55,51 @@ class UnfoldSharedModule {
impl: UnfoldKeyguardVisibilityManagerImpl
): 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.
*/
fun createUnfoldSharedComponent(
context: Context,
config: UnfoldTransitionConfig,
screenStatusProvider: ScreenStatusProvider,
foldProvider: FoldProvider,
activityTypeProvider: CurrentActivityTypeProvider,
sensorManager: SensorManager,
mainHandler: Handler,
mainExecutor: Executor,
backgroundExecutor: Executor,
tracingTagPrefix: String,
windowManager: IWindowManager,
context: Context,
config: UnfoldTransitionConfig,
screenStatusProvider: ScreenStatusProvider,
foldProvider: FoldProvider,
activityTypeProvider: CurrentActivityTypeProvider,
sensorManager: SensorManager,
mainHandler: Handler,
mainExecutor: Executor,
singleThreadBgExecutor: Executor,
tracingTagPrefix: String,
windowManager: IWindowManager,
): UnfoldSharedComponent =
DaggerUnfoldSharedComponent.factory()
.create(
context,
config,
screenStatusProvider,
foldProvider,
activityTypeProvider,
sensorManager,
mainHandler,
mainExecutor,
backgroundExecutor,
tracingTagPrefix,
windowManager,
)
DaggerUnfoldSharedComponent.factory()
.create(
context,
config,
screenStatusProvider,
foldProvider,
activityTypeProvider,
sensorManager,
mainHandler,
mainExecutor,
singleThreadBgExecutor,
tracingTagPrefix,
windowManager,
)

View File

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

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.FoldStateProvider
import com.android.systemui.unfold.updates.FoldStateProvider.FoldUpdate
import javax.inject.Inject
/** Emits animation progress with fixed timing after unfolding */
internal class FixedTimingTransitionProgressProvider(
private val foldStateProvider: FoldStateProvider
) : UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener {
internal class FixedTimingTransitionProgressProvider
@Inject
constructor(private val foldStateProvider: FoldStateProvider) :
UnfoldTransitionProgressProvider, FoldStateProvider.FoldUpdatesListener {
private val animatorListener = AnimatorListener()
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.FoldUpdatesListener
import com.android.systemui.unfold.updates.name
import javax.inject.Inject
/** Maps fold updates to unfold transition progress using DynamicAnimation. */
class PhysicsBasedUnfoldTransitionProgressProvider(
class PhysicsBasedUnfoldTransitionProgressProvider @Inject constructor(
private val foldStateProvider: FoldStateProvider
) : UnfoldTransitionProgressProvider, FoldUpdatesListener, DynamicAnimation.OnAnimationEndListener {

View File

@@ -20,35 +20,43 @@ import android.hardware.SensorEventListener
import android.hardware.SensorManager
import android.os.Trace
import androidx.core.util.Consumer
import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
import java.util.concurrent.Executor
import javax.inject.Inject
internal class HingeSensorAngleProvider(
internal class HingeSensorAngleProvider
@Inject
constructor(
private val sensorManager: SensorManager,
private val executor: Executor
) :
HingeAngleProvider {
@UnfoldSingleThreadBg private val singleThreadBgExecutor: Executor
) : HingeAngleProvider {
private val sensorListener = HingeAngleSensorListener()
private val listeners: MutableList<Consumer<Float>> = arrayListOf()
var started = false
override fun start() = executor.execute {
if (started) return@execute
Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener(
sensorListener,
sensor,
SensorManager.SENSOR_DELAY_FASTEST
)
Trace.endSection()
started = true
override fun start() {
singleThreadBgExecutor.execute {
if (started) return@execute
Trace.beginSection("HingeSensorAngleProvider#start")
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE)
sensorManager.registerListener(
sensorListener,
sensor,
SensorManager.SENSOR_DELAY_FASTEST
)
Trace.endSection()
started = true
}
}
override fun stop() = executor.execute {
if (!started) return@execute
sensorManager.unregisterListener(sensorListener)
started = false
override fun stop() {
singleThreadBgExecutor.execute {
if (!started) return@execute
sensorManager.unregisterListener(sensorListener)
started = false
}
}
override fun removeCallback(listener: Consumer<Float>) {