mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00

A bug was introduced because it was unclear that button state creation and listener registration were not an atomic operation. This happens because the `LaunchedEffect` which starts the listen-to-Player-Events coroutine can be pre-empted with other side effects, including the ones that change something in the Player. `remember*State` functions create some button state object and initialise it with the correct fresh values pulled out of the Player. The subscription to Player events with a registration of a Listener(via `*ButtonState.observe()`) is not immediate. It *returns* immediately, but is instead scheduled to happen *later*, although within the same Handler message. Other LaunchedEffects could have been scheduled earlier and could take place between the button state creation and listener subscription. This is not a problem if no changes to the player happen, but if we miss the *relevant* player events, we might end up with a UI that is out of sync with reality (e.g. button enabled/disabled when it should be flipped, icons toggled the wrong way). The way to fix this is to pull the latest values out of the Player on demand upon starting to listen to Player events. PiperOrigin-RevId: 750183793
UI module written using Jetpack Compose
Provides UI-related functionality such as Composable functions and Compose State classes. For example, the Surface for rendering media playback, UI state classes for widgets, buttons, and other interactive components.
Getting the module
The easiest way to use the module is to add it as a gradle dependency:
implementation 'androidx.media3:media3-ui-compose:1.X.X'
where 1.X.X
is the version, which must match the version of the other media
modules being used.
Alternatively, you can clone this GitHub project and depend on the module locally. Instructions for doing this can be found in the top level README.