Merge "Rename unfold background executor to add single thread assumption" into tm-qpr-dev am: 60a0560be6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20919272 Change-Id: Ie7620b74e5a4ea03dd66ba866b063f2eade8aff1 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
@@ -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
|
||||
@@ -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 =
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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>) {
|
||||
|
||||
Reference in New Issue
Block a user