Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 94e64e39 authored by Jakub Rotkiewicz's avatar Jakub Rotkiewicz
Browse files

PTS-Bot: Use ...Compat classes for MediaPlayer

AVRCP required shuffle/repeat API usage.
This API is accessible from Compat classes.

Test: atest pts-bot:AVRCP
Bug: 259590659
Change-Id: Id07471b10779509242a7c54f2efcbaa05f9d2481
parent 2f52f46a
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ java_library_static {
    ],

    static_libs: [
        "androidx.media_media",
        "androidx.test.core",
        "androidx.test.runner",
        "androidx.test.uiautomator_uiautomator",
+68 −66
Original line number Diff line number Diff line
@@ -17,23 +17,28 @@
package com.android.pandora

import android.content.Intent
import android.media.*
import android.media.browse.MediaBrowser.MediaItem
import android.media.session.*
import android.os.Bundle
import android.service.media.MediaBrowserService
import android.service.media.MediaBrowserService.BrowserRoot
import android.support.v4.media.*
import android.support.v4.media.MediaBrowserCompat.MediaItem
import android.support.v4.media.session.*
import android.support.v4.media.MediaMetadataCompat
import android.support.v4.media.session.MediaControllerCompat
import android.support.v4.media.session.MediaSessionCompat
import android.support.v4.media.session.PlaybackStateCompat
import android.util.Log

import androidx.media.MediaBrowserServiceCompat
import androidx.media.MediaBrowserServiceCompat.BrowserRoot

/* MediaBrowserService to handle MediaButton and Browsing */
class MediaPlayerBrowserService : MediaBrowserService() {
class MediaPlayerBrowserService : MediaBrowserServiceCompat() {
  private val TAG = "PandoraMediaPlayerBrowserService"

  private lateinit var mediaSession: MediaSession
  private lateinit var playbackStateBuilder: PlaybackState.Builder
  private lateinit var mediaSession: MediaSessionCompat
  private lateinit var playbackStateBuilder: PlaybackStateCompat.Builder
  private val mediaIdToChildren = mutableMapOf<String, MutableList<MediaItem>>()
  private var metadataItems = mutableMapOf<String, MediaMetadata>()
  private var queue = mutableListOf<MediaSession.QueueItem>()
  private var metadataItems = mutableMapOf<String, MediaMetadataCompat>()
  private var queue = mutableListOf<MediaSessionCompat.QueueItem>()
  private var currentTrack = -1

  override fun onCreate() {
@@ -44,34 +49,31 @@ class MediaPlayerBrowserService : MediaBrowserService() {
  }

  private fun setupMediaSession() {
    mediaSession = MediaSession(this, "MediaSession")

    mediaSession.setFlags(
      MediaSession.FLAG_HANDLES_MEDIA_BUTTONS or MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS
    )
    mediaSession = MediaSessionCompat(this, "MediaSession")
    mediaSession.setCallback(mSessionCallback)
    initQueue()
    mediaSession.setQueue(queue)
    playbackStateBuilder =
      PlaybackState.Builder()
        .setState(PlaybackState.STATE_NONE, 0, 1.0f)
      PlaybackStateCompat.Builder()
        .setState(PlaybackStateCompat.STATE_NONE, 0, 1.0f)
        .setActions(getAvailableActions())
        .setActiveQueueItemId(QUEUE_START_INDEX.toLong())
    mediaSession.setPlaybackState(playbackStateBuilder.build())
    mediaSession.setMetadata(null)
    mediaSession.setQueueTitle(NOW_PLAYING_PREFIX)
    mediaSession.isActive = true
    sessionToken = mediaSession.sessionToken
    mediaSession.setActive(true)
    setSessionToken(mediaSession.getSessionToken())
  }

  private fun getAvailableActions(): Long =
    PlaybackState.ACTION_SKIP_TO_PREVIOUS or
      PlaybackState.ACTION_SKIP_TO_NEXT or
      PlaybackState.ACTION_FAST_FORWARD or
      PlaybackState.ACTION_REWIND or
      PlaybackState.ACTION_PLAY or
      PlaybackState.ACTION_STOP or
      PlaybackState.ACTION_PAUSE
    PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or
      PlaybackStateCompat.ACTION_SKIP_TO_NEXT or
      PlaybackStateCompat.ACTION_FAST_FORWARD or
      PlaybackStateCompat.ACTION_REWIND or
      PlaybackStateCompat.ACTION_PLAY or
      PlaybackStateCompat.ACTION_STOP or
      PlaybackStateCompat.ACTION_PAUSE or
      PlaybackStateCompat.ACTION_SET_SHUFFLE_MODE

  private fun setPlaybackState(state: Int) {
    playbackStateBuilder.setState(state, 0, 1.0f).setActiveQueueItemId(currentTrack.toLong())
@@ -81,66 +83,66 @@ class MediaPlayerBrowserService : MediaBrowserService() {
  fun play() {
    if (currentTrack == -1 || currentTrack == QUEUE_SIZE) currentTrack = QUEUE_START_INDEX
    else currentTrack += 1
    setPlaybackState(PlaybackState.STATE_PLAYING)
    setPlaybackState(PlaybackStateCompat.STATE_PLAYING)
    mediaSession.setMetadata(metadataItems.get("" + currentTrack))
  }

  fun stop() {
    setPlaybackState(PlaybackState.STATE_STOPPED)
    setPlaybackState(PlaybackStateCompat.STATE_STOPPED)
    mediaSession.setMetadata(null)
  }

  fun pause() {
    setPlaybackState(PlaybackState.STATE_PAUSED)
    setPlaybackState(PlaybackStateCompat.STATE_PAUSED)
  }

  fun rewind() {
    setPlaybackState(PlaybackState.STATE_REWINDING)
    setPlaybackState(PlaybackStateCompat.STATE_REWINDING)
  }

  fun fastForward() {
    setPlaybackState(PlaybackState.STATE_FAST_FORWARDING)
    setPlaybackState(PlaybackStateCompat.STATE_FAST_FORWARDING)
  }

  fun forward() {
    if (currentTrack == QUEUE_SIZE || currentTrack == -1) currentTrack = QUEUE_START_INDEX
    else currentTrack += 1
    setPlaybackState(PlaybackState.STATE_SKIPPING_TO_NEXT)
    setPlaybackState(PlaybackStateCompat.STATE_SKIPPING_TO_NEXT)
    mediaSession.setMetadata(metadataItems.get("" + currentTrack))
    setPlaybackState(PlaybackState.STATE_PLAYING)
    setPlaybackState(PlaybackStateCompat.STATE_PLAYING)
  }

  fun backward() {
    if (currentTrack == QUEUE_START_INDEX || currentTrack == -1) currentTrack = QUEUE_SIZE
    else currentTrack -= 1
    setPlaybackState(PlaybackState.STATE_SKIPPING_TO_PREVIOUS)
    setPlaybackState(PlaybackStateCompat.STATE_SKIPPING_TO_PREVIOUS)
    mediaSession.setMetadata(metadataItems.get("" + currentTrack))
    setPlaybackState(PlaybackState.STATE_PLAYING)
    setPlaybackState(PlaybackStateCompat.STATE_PLAYING)
  }

  fun setLargeMetadata() {
    currentTrack = QUEUE_SIZE
    mediaSession.setMetadata(metadataItems.get("" + currentTrack))
    setPlaybackState(PlaybackState.STATE_PLAYING)
    setPlaybackState(PlaybackStateCompat.STATE_PLAYING)
  }

  fun updateQueue() {
    val metaData: MediaMetadata =
      MediaMetadata.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadata.METADATA_KEY_TITLE, "Title" + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadata.METADATA_KEY_ARTIST, "Artist" + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadata.METADATA_KEY_ALBUM, "Album" + NEW_QUEUE_ITEM_INDEX)
        .putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER, NEW_QUEUE_ITEM_INDEX.toLong())
        .putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS, NEW_QUEUE_ITEM_INDEX.toLong())
    val metaData: MediaMetadataCompat =
      MediaMetadataCompat.Builder()
        .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadataCompat.METADATA_KEY_TITLE, "Title" + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadataCompat.METADATA_KEY_ARTIST, "Artist" + NEW_QUEUE_ITEM_INDEX)
        .putString(MediaMetadataCompat.METADATA_KEY_ALBUM, "Album" + NEW_QUEUE_ITEM_INDEX)
        .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, NEW_QUEUE_ITEM_INDEX.toLong())
        .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, NEW_QUEUE_ITEM_INDEX.toLong())
        .build()
    val mediaItem = MediaItem(metaData.description, MediaItem.FLAG_PLAYABLE)
    queue.add(MediaSession.QueueItem(mediaItem.description, NEW_QUEUE_ITEM_INDEX.toLong()))
    queue.add(MediaSessionCompat.QueueItem(mediaItem.description, NEW_QUEUE_ITEM_INDEX.toLong()))
    mediaSession.setQueue(queue)
  }

  private val mSessionCallback: MediaSession.Callback =
    object : MediaSession.Callback() {
  private val mSessionCallback: MediaSessionCompat.Callback =
    object : MediaSessionCompat.Callback() {
      override fun onPlay() {
        Log.i(TAG, "onPlay")
        play()
@@ -189,20 +191,20 @@ class MediaPlayerBrowserService : MediaBrowserService() {
  private fun initMediaItems() {
    var mediaItems = mutableListOf<MediaItem>()
    for (item in QUEUE_START_INDEX..QUEUE_SIZE) {
      val metaData: MediaMetadata =
        MediaMetadata.Builder()
          .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX + item)
          .putString(MediaMetadata.METADATA_KEY_TITLE, "Title$item")
      val metaData: MediaMetadataCompat =
        MediaMetadataCompat.Builder()
          .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX + item)
          .putString(MediaMetadataCompat.METADATA_KEY_TITLE, "Title$item")
          .putString(
            MediaMetadata.METADATA_KEY_ARTIST,
            MediaMetadataCompat.METADATA_KEY_ARTIST,
            if (item != QUEUE_SIZE) "Artist$item" else generateAlphanumericString(512)
          )
          .putString(
            MediaMetadata.METADATA_KEY_ALBUM,
            MediaMetadataCompat.METADATA_KEY_ALBUM,
            if (item != QUEUE_SIZE) "Album$item" else generateAlphanumericString(512)
          )
          .putLong(MediaMetadata.METADATA_KEY_TRACK_NUMBER, item.toLong())
          .putLong(MediaMetadata.METADATA_KEY_NUM_TRACKS, QUEUE_SIZE.toLong())
          .putLong(MediaMetadataCompat.METADATA_KEY_TRACK_NUMBER, item.toLong())
          .putLong(MediaMetadataCompat.METADATA_KEY_NUM_TRACKS, QUEUE_SIZE.toLong())
          .build()
      val mediaItem = MediaItem(metaData.description, MediaItem.FLAG_PLAYABLE)
      mediaItems.add(mediaItem)
@@ -214,7 +216,7 @@ class MediaPlayerBrowserService : MediaBrowserService() {
  private fun initQueue() {
    for ((key, value) in metadataItems.entries) {
      val mediaItem = MediaItem(value.description, MediaItem.FLAG_PLAYABLE)
      queue.add(MediaSession.QueueItem(mediaItem.description, key.toLong()))
      queue.add(MediaSessionCompat.QueueItem(mediaItem.description, key.toLong()))
    }
  }

@@ -222,24 +224,24 @@ class MediaPlayerBrowserService : MediaBrowserService() {
    var rootList = mediaIdToChildren[ROOT] ?: mutableListOf()

    val emptyFolderMetaData =
      MediaMetadata.Builder()
        .putString(MediaMetadata.METADATA_KEY_MEDIA_ID, EMPTY_FOLDER)
        .putString(MediaMetadata.METADATA_KEY_TITLE, EMPTY_FOLDER)
      MediaMetadataCompat.Builder()
        .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, EMPTY_FOLDER)
        .putString(MediaMetadataCompat.METADATA_KEY_TITLE, EMPTY_FOLDER)
        .putLong(
          MediaMetadata.METADATA_KEY_BT_FOLDER_TYPE,
          MediaDescription.BT_FOLDER_TYPE_PLAYLISTS
          MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE,
          MediaDescriptionCompat.BT_FOLDER_TYPE_PLAYLISTS
        )
        .build()
    val emptyFolderMediaItem = MediaItem(emptyFolderMetaData.description, MediaItem.FLAG_BROWSABLE)

    val playlistMetaData =
      MediaMetadata.Builder()
      MediaMetadataCompat.Builder()
        .apply {
          putString(MediaMetadata.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX)
          putString(MediaMetadata.METADATA_KEY_TITLE, NOW_PLAYING_PREFIX)
          putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, NOW_PLAYING_PREFIX)
          putString(MediaMetadataCompat.METADATA_KEY_TITLE, NOW_PLAYING_PREFIX)
          putLong(
            MediaMetadata.METADATA_KEY_BT_FOLDER_TYPE,
            MediaDescription.BT_FOLDER_TYPE_PLAYLISTS
            MediaMetadataCompat.METADATA_KEY_BT_FOLDER_TYPE,
            MediaDescriptionCompat.BT_FOLDER_TYPE_PLAYLISTS
          )
        }
        .build()