Commit Graph

55 Commits

Author SHA1 Message Date
RoboErik
38696ba77d Set the metadata rating correctly in RCC
We weren't setting the ratings in the new MediaMetadata from RCC.
This adds some code to set them correctly.

bug:18051829
Change-Id: I358eeb2b25b3fb9bd9a5d207eb3314bb2cdff25e
2014-10-20 09:48:13 -07:00
RoboErik
51c07bc0bf Fix regression in RCC.editMetadata(false)
Found a very simple fix. Just set the cached metadata so we have
it to copy over when editMetadata(false) is called.

bug:17796693
Change-Id: Ib27f0c3d28e7f2a3c7d9495697f36c8045e2bcf6
2014-10-03 12:45:58 -07:00
RoboErik
6c30ff976d Always set transport control flags
In case we're attaching to a pre-existing session with non-zero flags.

bug:16822064
Change-Id: Ibd5cc8e00de59f1fe30fc3d0e64741aaf9f4746f
2014-08-21 17:52:31 +00:00
RoboErik
93b4662531 Set transport control flags when a session is created
Some apps only set the transport control flags once when their service
starts. This was leading to them not getting set when a session is
created on their behalf in RCC. This sets the flags when a session
is created if needed.

bug:16822064
Change-Id: Iea1ebf7747b3059101eb3c36b143b594cc51e114
2014-08-20 18:19:30 -07:00
RoboErik
477d1197c3 Combine MediaSession Callback and TransportControlsCallback
This combines them into a single Callback class and adds default
handling to media buttons to check the available actions and call
one of the other methods if appropriate.

Change-Id: If9897d8cf6d8d8046aa85a646c22382f1db1461b
2014-08-07 16:54:52 -07:00
RoboErik
75847b98f3 Add display metadata and change strings to CharSequences
This adds some fields for display purposes to MediaMetadata and also
makes the default for all text CharSequence instead of String. Also
adds a hidden method for getting a Description for the metadata.

bug: 11708293
Change-Id: I0ed58d9ac3aeff41325c4ccf5fed0539bbf03b4d
2014-08-05 14:30:27 -07:00
Gabriel Peal
f364f94496 Added Action to PlaybackState
Added the ability to discover MediaBrowsers

Change-Id: I925c8738ac73afd0bee3dada2ee7ff2d5047e63f
2014-07-23 11:45:03 -07:00
RoboErik
edb158f55f Deprecate apis that were replaced by sessions
These classes all have new components in the session APIs.

bug:16218444
Change-Id: Ib64ff0e23503e4c9eb2fd9162a878e1eaba7c4df
2014-07-21 18:26:42 +00:00
RoboErik
c785a78fb4 Make PlaybackState immutable with a builder
bug:15862252
Change-Id: I51f2e466bd2c41bbe80d20aa9785126a7ac6ab3f
2014-07-14 13:40:43 -07:00
Erik Pasternak
b2e93efcac Revert "Make PlaybackState immutable with a builder"
Will resubmit tomorrow for Build Breakage Friday as this change needs new SDK prebuilts for unbundled app branches.

This reverts commit aa746b27610680a2c0fbdf7d81a6455c4597f05e.

Change-Id: I28ba7e1b09234a5eb1b725aed043b9de98e1bc16
2014-07-10 22:51:34 +00:00
RoboErik
5a4e011143 Make PlaybackState immutable with a builder
bug:15862252
Change-Id: I8944b7753cd6a36a74b0091f71a386f77040c4ab
2014-07-10 22:39:03 +00:00
RoboErik
430fc48865 Work on removing non-session media routing code
Change-Id: I73e7d22f2f8772c7b07ccf32d962161d79d5db74
2014-06-16 14:00:16 -07:00
RoboErik
c47fa84b0a Refactor transport controls APIs
This merges TransportPerformer into MediaSession + a
TransportControlsCallback and makes TransportController into an
inner class on MediaController called TransportControls. Also makes
the PlaybackState and Metadata part of the session APIs instead of
transport controls.

Change-Id: I16ad392e6d318abe3119ad5d89656d253af25e16
2014-05-30 10:35:44 -07:00
RoboErik
79fa4630bb API changes to sessions
Changes requested by API Council review. A second CL will refactor
TransportController and TransportPerformer based on feedback.

Change-Id: Ie26a7d01d7021232a66c2edf1eb58120437fdfde
2014-05-29 11:28:48 -07:00
RoboErik
5f31737c68 Add getMediaSession to RCC
This is to make integration with Media notifications easier.

Change-Id: I783ae5c2620ff0e11bf5584604b9c9623850e2f0
2014-05-20 14:00:53 -07:00
RoboErik
42ea7eecd1 Rename session classes to have media prefix, hide routes
This renames several of the core session classes to be prefixed
with Media. It also adds @hide to all route references for now.

Change-Id: Idb42897d490cf24626e4e93ca975b2cb93ec054c
2014-05-16 16:40:17 -07:00
RoboErik
f1372428f2 Add Session API calls to RCC and AudioManager
This makes RCC and MediaButtonReceiver (via AudioManager) also use the new Session APIs in parallel to their existing code. This will allow us to bring up the Session compatibility pieces without disrupting the old behavior and then switch everything over to just using the new APIs when ready.

Change-Id: I33ce0a044dea3ec763f2302b91a5e415be27d4a4
2014-05-01 17:14:01 +00:00
John Spurlock
6090995951 Remove unused imports from frameworks/base.
Change-Id: Ia1f99bd2c1105b0b0f70aa614f1f4a67b2840906
2013-11-20 11:31:47 -05:00
Jean-Michel Trivi
f108cdd9ee Also rely on enabled notification listeners for RemoteController registration
Registration of a RemoteController may succeed only if:
 - the caller has the MEDIA_CONTENT_CONTROL permission,
 - or if the RemoteController.OnClientUpdateListener it
   registers if one of the enabled notification listeners.

For using the "enabled notification listener" functionality,
 the CL involved:
 - making OnClientUpdateListener an interface so a 3rd-party
   application may have its implementation extend
   NotificationListenerService, which is required for a
   listener to be enabled by the user.
 - add the concept of "enabled" status in an
   IRemoteControlDisplay, so a RemoteController (which
   encapsulates the IRemoteControlDisplay implementation)
   may be registered, but later temporarily disabled by
   the user, as a result of a user action in the security
   settings, or a user switch.
 - making MediaFocusControl, the component tied to
   AudioService, monitor changes in enabled notification
   listeners, and act upon enable/disable changes.

Bug 8209392

Change-Id: Ia8dfa2156c65668b2b0d4ae92048005912652d84
2013-10-04 17:50:44 -07:00
Adam Powell
f8895248e2 Add a scrubber to keyguard; layout tweaks
Switch KeyguardTransportControlView over to using RemoteController
instead of the internal API.

Guard transition animations behind a flag until we can work out some
intermittent issues.

Change-Id: Ie9f41339ce6e735c5d524db88437672f2c9859e2
2013-10-03 14:55:18 -07:00
Jean-Michel Trivi
86142da1ce Improve RemoteControlDisplay registration
When a new RemoteControlDisplay gets registered, don't cause all
  existing RemoteControlDisplays to re-receive RemoteControl
  information they already have.

Bug 8417073

Change-Id: Icc8e7104d6870f748fddd702692789dbaef948ac
2013-09-29 16:57:08 -07:00
Jean-Michel Trivi
f841d70155 Fix javadoc in RemoteControlClient and MediaMetadataEditor
Change-Id: Ibd333d9cb47e74c4ca1d8ec7bd950224d81783b0
2013-09-17 19:13:55 -07:00
Jean-Michel Trivi
7ddd226e7c RemoteController class to expose IRemoteControlDisplay features
Wrap all the features of IRemoteControlDisplay.aidl in a
 new class, RemoteController, that implements the
 IRemoteControlDisplay interface.

The API functions to expose in the SDK are tagged with
 "CANDIDATE FOR API"

Bug 8209392

Change-Id: I597bcd503ac93e73889c9ae8b47b16c4fcb363bc
2013-09-18 01:47:25 +00:00
Jean-Michel Trivi
88183e67d4 Revise new public API for ratings in RemoteControlClient
Refactor RemoteControlClient.MetadataEditor to move functionality
 in new abstract class MediaMetadataEditor, so it can be also
 used on the "display" side of the RemoteControl functionality.
Compatibility of these changes has been tested against
 existing Play applications which use the RemoteControlClient API.

Move the new constants and method definitions related to the
 ratings feature to MediaMetadataEditor. This changes the
 yet-to-be-published ratings API, so this doesn't break
 compatibility.
Rating feature is handled by the new Rating class with a set
 of constructors that handle the different rating models.

Bug 8440498

Change-Id: I9b6dc2204bfc48594bad5cd6449d357f8a485da0
2013-09-17 15:13:00 -07:00
Jean-Michel Trivi
b23cd118ce Public API for RemoteControlClient ratings and editable metadata
A rating for RemoteControlClient content is:
  - a value between 0 and 100
  - or a value indicating there is no rating
 For a same piece of content, a rating can come from:
  - the user
  - "others" (i.e. not the user), to provide an average rating
 Rating styles are:
  - heart (a toggle)
  - thumb up / down
  - stars (with a configurable maximum number of stars)

For editable metadata, add:
  - methods to control which keys can be edited,
  - interface for an application to receive new values for a key.

Rating by user is editable metadata.

Bug 8440498

Change-Id: Ia9f61e750772658051cea1ac7c316187717f0f58
2013-08-29 11:41:04 -07:00
Jean-Michel Trivi
22e3eb64bf "Year" is an authorized metadate long field.
MediaMetadataRetriever.METADATA_KEY_YEAR is listed as one of the
 supported long fields but is not declared in the list of authorized
 long keys.

Change-Id: If277f0c300e2bfed10472e23a2eeba08bfa6ed33
2013-08-26 11:23:32 -07:00
Jean-Michel Trivi
f823fc4dba Ratings for RemoteControl
Add support for metadata of a RemoteControlClient that can be
 updated:
 - methods to control which keys can be edited,
 - interface for an application to receive new values for a key.

Add definitions for ratings.
 A rating is:
  - a value between 0 and 100
  - or a value indicating there is no rating
 For a same piece of content, a rating can come from:
  - the user
  - "others" (i.e. not the user), to provide an average rating
 Rating styles are:
  - heart (a toggle)
  - thumb up / down
  - stars (with a configurable maximum number of stars)

Rating by user is editable metadata.

Bug 8440498

Change-Id: I1d45972f9ace4cb505ee0757e917f1d5dedd264e
2013-08-22 09:29:19 -07:00
Jean-Michel Trivi
1b16cc3de5 Let RemoteControlDisplay know more about playback position
The BT stack needs to differentiate between applications that use
 the new RemoteControlClient APIs to pass a playback position but
 don't have one yet, and applications that use the legacy API and
 will never pass a position.

Bug 9294855

Change-Id: I05cba82a073e6e0aaea1d8bbf9cc8c99da715f58
2013-06-07 15:48:22 -07:00
Jean-Michel Trivi
c3c4babf84 Opt-in mechanism for RemoteControlClient position anti-drift check
RemoteControlClient has an interface for the framework to query
 the playback position. This mechanism is used to detect
 when the estimated position drifts from the real position by
 having the framework regularly poll (every 15s when playing at
 1x) this interface and compare against the estimation.
But this mechanism:
 - should only be used when IRemoteControlDisplay implementation
  care about position display
 - should not be used by default because the implementation of
  the position query interface might involve network traffic
  in some remote media player implementation for instance.

This CL implements an opt-in mechanism to be used by
 implementators of IRemoteControlDisplay, to request the
 anti-drift mechanism to be turned on.

bug 8120740

Change-Id: I1baa3e515546ac41e0ac9c3a41bfa3147ecf3d7f
2013-04-22 14:15:34 -07:00
Jean-Michel Trivi
521e68e76c Anti-drift in RCC playback position
Periodically verify that the reported playback position hasn't
 drifted from the estimated playback position.
If a drift is noticed, re-synchronize registered
 IRemoteControlDisplay implementations.

bug 8120740

Note that this implementation updates the playback position
 of  all IRemoteControlDisplay implementations,
 and always causes the OnGetPlaybackPositionListener to be
 called. This might be undesirable in some circumstances
 and will be addressed in a subsequent CL.

Change-Id: Ib9f40e1b000e912f6c35fa03e41adf81efadc894
2013-04-18 18:01:49 -07:00
Jean-Michel Trivi
05e7c2ff8c Fix message handling in RemoteControlClient
Internal message must go through the message queue, not be
  dispatched immediately.
Missing 'break' when handling MSG_SEEK_TO message.
  This was spamming the log with fake error messages.

Bug 8120740

Change-Id: Ib53ec05ef33133637e587eb1b24dac9ea32a5680
2013-04-16 16:14:38 -07:00
Scott Main
e63b0609c3 fix javadoc build
Change-Id: I9b86dda5aea075832d5e165043f45c8d507b5c16
2013-04-15 11:11:44 -07:00
Jean-Michel Trivi
9157477300 Public APIs for media position in RemoteControlClient
New APIs in android.media.RemoteControlClient to support application
 exposing their current media playback position and speed, and
 let the framework request position changes.

Bug 8120740

Change-Id: Ibfc41f60e279413c26147e3276d96f28b7f506e7
2013-04-14 12:17:56 -07:00
Jean-Michel Trivi
3fbf67e217 Handle seek requests in AudioService
AudioService handles seek requests to RemoteControlClients.
Discard old or unprocessed seek requests when handling a new one.
Update javadoc for OnPlaybackPositionUpdateListener interface.

bug 8120740

Change-Id: Id17c2852b24d4b8af85e472a177484b98cfeba05
2013-04-09 14:37:26 -07:00
Jean-Michel Trivi
3261b537c5 RemoteControlClient receives playback position change requests
RemoteControlClient defines two listener interfaces for playback
  position, one to let the framework query the current playback
  position, the other to request playback to seek to a given
  position.

Updated IRemoteControlDisplay interface to support passing info
  about whether the user of RemoteControlClient can provide a
  playback position, and receive a new one.
Updated implementations of IRemoteControlDisplay to new
  interface.

Bug 8120740

Change-Id: I1a5a969da4d0f8c9ad27f691919dd08f8653982b
2013-04-01 18:14:30 -07:00
Jean-Michel Trivi
bc43b4c2f2 RemoteControlClient can report current position, speed
Extend RemoteControlClient class to support reporting the
 current playback position, and the playback speed.
Define listener for an application to receive new playback
 position to seek to (use of listener to be implemented).
Update IRemoteControlDisplay implementations to new interface.

bug 8120740

Change-Id: I2654daeca1ac49713d325df8226dceb85943c020
2013-03-29 09:47:48 -07:00
Jean-Michel Trivi
4a57005561 Support multiple IRemoteControlDisplay
Modify RemoteControlClient and AudioService to support multiple
 simulataneous IRemoteControlDisplay interfaces active at the
 same time.

Change-Id: I9f200a488afdd62a5e6957e64624d745e0f28149
2013-03-08 14:22:42 -08:00
Jean-Michel Trivi
f98de1e8dd Asynchronous handling of remote volume updates
Remote playback information updates will be posted from the
 application thread, and sent to AudioService. Because they
 require locking the stack containing the remote playback
 information, the update should happen on AudioService's handler
 thread to avoid lock contention.

Change-Id: Ie04898295e08c16dd8ab5985fd825301e9cf1981
2012-06-20 13:40:22 -07:00
Jean-Michel Trivi
1357012968 Remote volume handling in MediaRouter
Extend MediaRouter.UserRouteInfo to enable setting playback
 information, which includes volume. When the user route instance
 has a RemoteControlClient, forward any playback information to it.
 Enable specifying a callback to be notified of volume events
 on the route.
Extend MediaRouter.RouteInfo to enable retrieving playback
 information.

Update RemoteControlClient javadoc to reflect which parts of the
 API are not intended to be made public.

Change-Id: I59d728eb61747af6c8c89d53f0faeb07940594c3
2012-06-19 19:41:35 -07:00
Jean-Michel Trivi
3114ce3861 Remote volume handling
Extend RemoteControlClient class to enable an applicaton to
 specify more information about how it's playing media, now covering
 usecases where media playback happens "remotely". This playback
 information can be used to set the volume and maximum volume
 used remotely.
Declare a new intent and associated extras in Intent,
 ACTION_VOLUME_UPDATE, so an application can be notified that
 the volume it handles should be updated. It can then use
 the new RemoteControlClient.setPlaybackInformation() method
 to notify AudioService what the volume is.
Extend AudioService to maintain playback information associated
 with the RemoteControlClient information in the stack of
 media button event receivers (mRCStack). The information
 about the active remote is cached so the stack doesn't have
 to be iterated over in order to retrieve remote playback info.
 Events to "adjust" the remote volume based on hardware key
 presses cause the client application to be notified of
 volume updates, and the volume panel to display the volume
 set by the app.
 Revise which stream type is controlled when none is specified
 according to latest guidelines for remote playback.
Update VolumePanel class to support a new pseudo stream type,
 AudioService.STREAM_REMOTE_MUSIC, that corresponds to the
 remote playback volume, and uses the new "media route" icon.
 Enable it to receive asynchronously new volume values for
 the remote that will be displayed if the UI is still up,
 and ignored otherwise.
 Now supports hiding/showing sliders dynamically so remote
 volume only appears when AudioService has a remote control
 client handling remote volume.
Define new java symbols for the two media route icons.
Modify lockscreen behavior: don't automatically control music
 volume when music is active, consider also remote playback.

Still to do:
- playback information set by RemoteControlClient should post
  a message for AudioService to update playback information
  instead of updating it synchronously

Change-Id: I557aa687239f9acfe33a609f05876c67fa7eb967
2012-06-18 18:37:17 -07:00
Jack Palevich
05c66cc5cc Don't crash when scaling Bitmaps with private Bitmap.Configs
Bug: 6526197
Change-Id: I89f008f90888f0a679274c00293342ab0fb0e28e
2012-06-04 16:15:47 +08:00
Glenn Kasten
30c918ce7f Use final on new member variables
Use final for member fields initialized to a new and that are never modified.

Change-Id: I042352c7bc21879613e7a50b1205b6923f8083cf
2012-01-27 16:13:00 -08:00
Jean-Michel Trivi
ad87f5b40f Fix 5389442 RemoteControlClient javadoc
Extend RemoteControlClient class description with an example
 of instance creation showing how the PendingIntent is created
 and how it uses the same ComponentName as the one used
 in AudioManager.registerMediaButtonEventReceiver()

Change-Id: If8f050f94b112f9680ba6bf32ba622bc648fb1d0
2011-10-11 14:09:23 -07:00
Jean-Michel Trivi
68622396b6 Bug 5045498 Keep track of RemoteControlClient play state change time
Store the time at which a RemoteControlClient changes it playback
 state, and send that time to the IRemoteControlDisplay.
This change will enable displays to implement strategies such as
 timeouts (e.g. to not display transport controls for clients which have
 been paused or stopped for a certain amount of time).

Change-Id: I902882500565743d455d56f6000efaf612cbe0a9
2011-09-20 11:59:51 -07:00
Jean-Michel Trivi
f0cff04562 Bug 5300223 RemoteControlClient uses PendingIntent for media button events
Update the implementation of the RemoteControlClient / Display
 feature rely on PendingIntent as provided in the construction
 of the RemoteControlClient instance.
The ComponentName that describes the target of the media button
 events is set as the target of the Intent from which
 a PendingIntent is constructed.
This ComponentName is still saved in the stack for persisting
 the last media button event receiver.

This CL also updates the lockscreen IRemoteControlDisplay
 implementation to use the PendingIntent supplied by the
 application when sending transport control events. A (good)
 side effect of doing this is that intent will be directly
 targeted at the application.

Restoration of the media button event receiver
 after reboot is not fully functional yet.

Change-Id: I2be82f2839e9dee1de02512437b3fb41cc386cde
2011-09-16 12:40:43 -07:00
Jean-Michel Trivi
34d0d300ca Fix bug 5327199 Recycle bitmaps in RemoteControlClient
When applying the new bitmap from the editor to the client,
 recycle the old bitmap, and set the reference to the editor
 bitmap to null.

Change-Id: I7d79e4b8410e5035fa51b20be4b1ada391c84c28
2011-09-16 11:33:50 -07:00
Jean-Michel Trivi
6e920e6dac Bug 5300223 RemoteControlClient uses PendingIntent
API change so RemoteControlClient is given a PendingIntent in
 its constructor, which will be used for receiving media button
 events from remote controls.
Leave the old constructors (but hidden) to not break
 current functionality until the AudioManager and AudioService
 implementations have been updated.

Change-Id: Ifa12c8036c948931adc386a827dce2936788e1cd
2011-09-13 19:27:20 -07:00
Jean-Michel Trivi
466ade5ad6 Fix bug 5045498 Unhide Remote Control Client API
The RemoteControlClient API enables media application to have
 information such as album art, current song, playback state
 be displayed on "remote control displays", as well as be
 controlled by "remote controls".
The new API consists in:
 - a new class, RemoteControlClient
 - new methods in AudioManager to register a RemoteControlClient
 - a new class, RemoteControlClient.MetadataEditor to edit and
  apply the information associated with a RemoteControlClient,
  and which will be displayed on a "remote control display"

Change-Id: I5616085e4ad58ce0bbc1a5953b0a5a28d32f8703
2011-09-01 16:13:50 -07:00
Jean-Michel Trivi
5ad4b9fb96 RemoteControlClient metadata: add method for metadata of long type
Update to the RemoteControlClient.Editor API:
 - new method for setting metadata of type long
 - methods for setting metadata throw an exception if using
    the wrong key with the wrong method.

Note that this change will cause the Music2 application to
 throw an exception when it tries to set the duration as a string.

Change-Id: I17cff86467851a0aff313c07653e752ae6b6180f
2011-08-30 18:42:33 -07:00
Jean-Michel Trivi
7309c83b95 Cannot compare Binder references for RC display to unregister
Cannot trust references to IRemoteControlDisplay to remain the
 same when removing a RemoteControlDisplay, compare the
 result of .asBinder() instead.

Change-Id: Ib2e82aa24bd4b12804bccff94a6a0090ff83bea8
2011-08-26 18:54:44 -07:00