Status Update
Comments
ti...@google.com <ti...@google.com> #2
It's relatively trivial to support duration scale change in compose. :) However, the wiring-up from those system settings to compose is tricky - The duration scale values have historically been inaccessible to apps, in order to prevent animations designed around duration scale (, which defeats the purpose of having the duration scales). It was good intention, but incidentally made it very hard for compose to conform to duration scale setting.
For the time being, we are providing debugging support (including changing playback rate) for transition composables in android studio. In the long run, our options are:
- Wire up an existing duration scale setting to compose animation. This would support more devices, but it requires reflection into the framework (which may not be possible)
- Create a new duration scale setting for compose animation along side the existing ones in dev options. This would bring more clarity, but the setting wouldn't be present on pre-S devices.
al...@gmail.com <al...@gmail.com> #3
An S+ only developer option would be better than nothing IMO!
ta...@mercury.com <ta...@mercury.com> #4
Android 12 has a "Remove animations" accessibility preference which Compose doesn't appear to honor. Would this issue be related?
kl...@google.com <kl...@google.com> #5
For a start, could we at least introduce an animation scale composition local at least to allow apps to change their own compose animations? Then if we want to integrate with system settings in the future, we already have the hook we need into compose's animation system. Some other platforms let you adjust the animation speed at the OS level as well, so Android might not be the only platform on which we need to support this feature.
ti...@google.com <ti...@google.com> #6
Re #5:
It's a good point that the durataion scale could be useful for other platforms. Though I'm not sure about making it a composition local, as that would open doors to unexpected behaviors where at different levels of the tree the animation is playing at different rate.
The good news is, it seems like we are able to read the Settings.Global.TRANSITION_ANIMATION_SCALE
without requiring any permission. We should be able to wire that up with the internal duration scale that we are using and be backward compatible.
Re #4:
Yes. Accesibility does seem to be modifying the same settings as the duration scale in developer options:
ap...@google.com <ap...@google.com> #7
Branch: androidx-main
commit f253fe11ef6d1deda386a0b48cbceca01e1d5e38
Author: Doris Liu <tianliu@google.com>
Date: Fri Feb 11 11:42:29 2022
Wire up animation scale in Dev Options with Compose animation
This CL introduced a MotionDurationScale CoroutineContext.Element. This
allows the duration scale to be put in the coroutine context used
by Recomposer. At the same time, user code can define their own
duration scale and add it to a coroutine context. It will impact
all the animations in that coroutine context.
Fixes: 161675988
Test: Included. Also added a benchmark.
RelNote: "Horray! Compose animation now supports
'Animator duration scale' setting from Developer Options."
Change-Id: I31c2425ff560949f24ef873559057e14f6916a39
A compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt
M compose/animation/animation-core/build.gradle
M compose/ui/ui/api/restricted_current.txt
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
M compose/ui/ui/api/current.txt
A compose/animation/animation-core/src/test/java/androidx/compose/animation/core/DurationScaleTest.kt
A compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
M compose/ui/ui/api/public_plus_experimental_current.txt
ae...@google.com <ae...@google.com> #8
ap...@google.com <ap...@google.com> #9
Branch: androidx-main
commit 23d09b5d5044d10cff93db84f5b59209f56d7e72
Author: Doris Liu <tianliu@google.com>
Date: Fri Feb 11 11:42:29 2022
Animation scale from settings expressed as a SateFlow
This CL introduced a MotionDurationScale CoroutineContext.Element. This
allows the duration scale to be put in the coroutine context used
by Recomposer. At the same time, user code can define their own
duration scale and add it to a coroutine context. It will impact
all the animations in that coroutine context.
Animation duration scale is now expressed as a global StateFlow per
application, with one ContentObserver that emits new values as
the settings change.
Fixes: 161675988
Test: Included. Also added a benchmark.
RelNote: "Horray! Compose animation now supports
'Animator duration scale' setting from Developer Options."
Change-Id: I5a4fc779a3fbfbcb2926ac1624cd679bb9b912ce
A compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/MotionDurationScale.kt
M compose/animation/animation-core/build.gradle
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/InfiniteTransition.kt
M compose/ui/ui/api/restricted_current.txt
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/SuspendAnimation.kt
A compose/animation/animation-core/src/test/java/androidx/compose/animation/core/DurationScaleTest.kt
M compose/ui/ui/api/current.txt
A compose/ui/ui/benchmark/src/androidTest/java/androidx/compose/ui/benchmark/LifecycleAwareWindowRecomposerBenchmark.kt
M compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/WindowRecomposer.android.kt
M compose/animation/animation-core/src/commonMain/kotlin/androidx/compose/animation/core/Transition.kt
M compose/ui/ui/api/public_plus_experimental_current.txt
Description
- Window animation scale
- Transition animation scale
- Animator duration scale
in Developer options has no effect on transitions right now.
Not sure if there's a public API for them but they're important for debugging.