androidx / androidx/media

Idiomatic kotlin API for Player Events (media3-common-ktx)

Open
#2,027 2 comments 0 reactions 1 assignee View on GitHub

@oceanjules is already working on this.

Since Jan 8, 2025.

enhancement
Dominant language
Java
Stars
3k
Forks
955
Avg merge
12d 14h
Merged PRs (30d)
2

Description

Use case description

Please provide a idiomatic kotlin API for player events using Flow in androidx.media3:media3-common-ktx

Proposed solution

Current API is a suspend API with a callback. suspend API is typically meant for a one-time async request. For a stream of player events, please provide a Flow<Player.Events> using callbackFlow.

suspend fun Player.listen(onEvents: Player.(Player.Events) -> Unit): Nothing {
  if (Looper.myLooper() == applicationLooper) {
    listenImpl(onEvents)
  } else
    withContext(HandlerCompat.createAsync(applicationLooper).asCoroutineDispatcher()) {
      listenImpl(onEvents)
    }
}
Alternatives considered
// use callbackFlow to convert callback into Flow

val Player.eventsFlow: Flow<Player.Events> get() = callbackFlow {
  val listener = object: Player.Listener {
    override fun onEvents(player: Player, events: Player.Events) {
      trySend(events)
    }
  }

  addListener(listener)

  awaitClose {
    removeListener(listener)
  }
}

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.