Commit Graph

38 Commits

Author SHA1 Message Date
Jean-Michel Trivi
0212be5150 Support collaborative audio focus handling
Add new flag for an app to define it doesn't duck, but rather
  pauses when losing focus with AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK.
  This flag is to be used when requesting focus.
Add support for AudioPolicy to specify whether it will implement
  ducking itself, rather than it being handled by an app.
When ducking is handled by a policy, do not notify focus owners
  when they lose audio focus with LOSS_TRANSIENT_CAN_DUCK, unless
  they would have paused, as expressed with the
  AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS flag.
Add a focus listener for a policy to be notified of focus changes
  so it can properly implement its own ducking.

Bug 16010554

Change-Id: I11d7cdb85c52fd086128a44f4d938aaa44db5c25
2014-12-05 18:41:28 -08:00
Jean-Michel Trivi
958876fe55 Add support for audio focus locking
New API for a registered AudioPolicy to lock/unlock the audio
  focus stack and prevent any new grant of focus, similar to
  the way phone calls behave.

Bug 16010554

Change-Id: If34a58ca9bd43d5479e94a2a7b540750b4c6efe9
2014-11-24 10:46:12 -08:00
Jean-Michel Trivi
fd6ad747e6 Support for delayed audio focus
New internal API for an audio focus requester to always enter
 the audio focus stack even if audio focus can't be granted
 immediately (e.g. during a phone call).
Remap the "no delay" interface to the new "requestAudioFocus"
 method signature and AIDL.

Bug 16010554

Change-Id: Iff91ddb0beb411cca1f8cf98300a9afc4178dc7f
2014-11-11 17:07:45 -08:00
Jean-Michel Trivi
f2bbad1e76 Remove MediaFocusControl persisting media button receiver
MediaFocusControl doesn't handle media button receivers anymore,
 so it should read and persist a receiver, and monitor
 package addition/removals.
Also involved a security vulnerability, see bug

Bug 15428797

Change-Id: Ia2be01b20dc4a9820cc0cd3d0605ac03770b266b
2014-07-24 10:06:13 -07:00
RoboErik
d09bd0c6eb Move VolumeController into AudioService
VolumeController was a hidden class only used by AudioService and
MediaFocusControl. Since we added a public VolumeProvider class
moving VolumeController to avoid confusion.

Change-Id: I6838daf9b83846e1393b1a8502d3b10345a4799a
2014-06-25 14:36:51 -07:00
RoboErik
19c9518f6a b/15729204 Pipe sessions through to VolumePanel
When remote volume is changed via volume buttons we need to notify
the system UI so it can show the slider. This also passes it the
controller to use so adjustments to the slider are sent back to
the correct session.

Change-Id: If5847bcd5db16c56e0e9904b88c94e5b28954c41
2014-06-25 14:36:51 -07:00
RoboErik
6f0e4ddd66 Remove more dead audio service code
Hit a snag in remote volume changes. Trying off this round of
removal so I can work on fixing remote volume handling in a
separate CL.

Change-Id: I49b1ba4b75d770ba7c77da081755f3210a9e9483
2014-06-20 11:35:20 -07:00
Jean-Michel Trivi
0d90876893 Fix MediaFocusControl index management for PlayerRecord
When updating the PlayerRecord stack on playstate changes and
 media button event receiver registrations, evaluate the index
 of the stack entry to remove against the index of the last playing
 entry as this index was valid before the entry was removed.
 This affects the insertion index.

Change-Id: Iec58d2df6bcbd8f55925e9e0f9d48f698f7cf4e5
2014-04-30 15:38:32 -07:00
Jean-Michel Trivi
8be88d1144 MediaFocusControl: priority to playing players for media button
When registering a media button event receiver (through
 AudioManager.registerMediaButtonEventReceiver()), do not
 always push the receiver to the top of the stack of event
 receivers:
 - only push to the top if the associated RemoteControlClient
   is in a playing state
 - otherwise push it below the entries at the top of the stack
   that are in a playing state
When changing the playstate of a RemoteControlClient:
 - push to the top of the stack the corresponding PlayerRecord
   is the state is a playing state
 - otherwise push it below the entries at the top of the stack
   that are in a playing state

When AudioService starts (e.g. after boot) and the last media
 button receiver is restored, it goes in the stack.
After this CL, this entry is not "orphaned" anymore after the
 same application registers itself to receive media buttons:
 the entry from the restoration is now properly associated with
 the registration from the application.

Bug 10749554

Change-Id: I985f9cc17b64a60ed4f2f2f6d03e117fb4e27570
2014-04-22 09:46:59 -07:00
Jean-Michel Trivi
f51e113469 MediaFocusControl: fix comment
Comment about role of audio focus isn't valid anymore.

Change-Id: I608d8cf9d5d9c4449384e2788e5eb5ea42c97eca
2014-04-10 15:05:44 -07:00
Jean-Michel Trivi
b416838051 Audio focus doesn't affect RemoteController
The top of the stack of PlayerRecord instances is the "promoted"
 instance whose RemoteControlClient information is available
 to RemoteController objects, only when it also has audio focus.

This change removes the condition on audio focus ownership:
- whenever the player record stack ordering changes, no need to
  check if it also has audio focus
- since the player record and audio focus stacks operate separately,
  there is no need to synchronize access to both stacks.

Change-Id: I668f2aa2950f19f8c2a30bc59c7352246edcc56e
2014-04-08 16:35:54 -07:00
Jean-Michel Trivi
dda1c4040c Continue refactoring MediaFocusControl
Rename MediaController to PlayerRecord.

Change-Id: Icf474b4107649f501341309bf7ec520aa1e71586
2014-03-25 17:25:25 -07:00
Jean-Michel Trivi
7d3168cef2 Continue refactoring of MediaFocusControl
Move RemoteControlClient death handler and remote playback state
 inside MediaController class.
Make MediaController data fields private. Document which accessors
 can be removed once the audio focus and media button receiver
 mechanisms are dissociated.

Change-Id: Icd14fb0d99bf74512c8f8552d124c0353ce1f06d
2014-03-25 16:27:23 -07:00
Jean-Michel Trivi
223fd631f6 Continue refactoring of MediaFocusControl
Close external access to MediaFocusControl event handler.

Change-Id: Id82718399806c246b5ac2cb3b49189286dcd8e89
2014-03-25 12:43:58 -07:00
Jean-Michel Trivi
de23f56360 Begin refactor of MediaFocusControl
Extract class that handles each entry in the remote control stack
  and move it to another file, MediaController.java.
Rename RemoteControlStackEntry to MediaController as each instance
  will not just encapsulate information about the corresponding
  (if any) RemoteControlClient.
This is just a CL for the renaming and extraction into a new file
  of existing code. Obvious required changes are labelled "FIXME".

Change-Id: Ifbdac1d70e4d279ab175eef03e9d792d44873c51
2014-03-25 10:47:58 -07:00
RoboErik
01fe661ae5 Initial round of MediaSession APIs
This is far from complete but puts the basic components in place
for an app to interact with media sessions.

Change-Id: Icfe313f90ad76ae56badbe42b0e43fc5f68db36f
2014-02-19 13:41:37 -08:00
John Spurlock
6090995951 Remove unused imports from frameworks/base.
Change-Id: Ia1f99bd2c1105b0b0f70aa614f1f4a67b2840906
2013-11-20 11:31:47 -05:00
Jean-Michel Trivi
320ad9fa1d Fix RemoteController update in RemoteControlClient registration
A regression was introduced when trying to limit the number of
 internal synchronization generation IDs that caused RCC
 information to be shown only for applications that requested
 audio focus after media button receiver and RCC registration,
 (such as Play Music), not for applications that requested focus
 first (such as Play Movies).
The correct behavior is to always check and update the
 RemoteControllers (seen by MediaFocusControl as RCD interfaces)
 whenever a RemoteControlClient is registered (even if it's a
 re-registration) when it is associated when an entry at the top
 of the remote control stack.

Bug 11657655

Change-Id: I30716e2028f7f718a31e13401b191178735229ff
2013-11-13 20:06:41 -08:00
Jean-Michel Trivi
0b60534917 Limit RemoteControlClient generation ID changes
At the beginning of each song, the Music app re-registers its
 media button event and requests audio focus, which causes
 the reevaluation of each corresponding stack of clients. Each
 reevaluation is accompanied by the incrementation of the
 RemoteControlClient generation ID, which causes RemoteController
 to issue a notification that the client has changed. The lockscreen
 correctly interprets this as a reason to dump the current
 RemoteControlClient data (including the artwork) because it will
 receive the new data if new one is available. This is what causes
 the "flashing" of the wallpaper on the lockscreen: for an instant,
 no client data is available.
The fix consists in not causing the client generation ID to be
 incremented when registrations don't cause any change in the
 RemoteControlClient stack. Even though Music re-registers everything,
 nothing has changed: it still is the current media button receiver,
 and it still has the same RemoteControlClient.

Bug 11307382

Change-Id: I4d2404b571e88aeedb0eca6bd19d39f7ec4fc8b1
2013-10-24 19:10:24 -07:00
Jean-Michel Trivi
19566543c4 Update RemoteController info when enabling/disabling it
When a RemoteController listener is disabled: send its listener
 "blank" information (no artist, "stopped state"...)
When a RemoteController listener is enabled: have the current
 RemoteControlClient send the current information.

Bug 8209392

Change-Id: I375bf3c42a425ada94c61453b51669d7e819dde4
2013-10-07 17:10:08 -07: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
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
a83487e8c6 Public API for RemoteController
Public API, under system|signature permission for access to
  currently playing metadata and playback state.
Public API for sending media key events.

Bug 8209392

Change-Id: I39b9309ca3fb1bc305492bad98740df0ae0842b2
2013-09-18 18:12:51 -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
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
55e1bc6c58 Event handler should be private in MediaFocusControl
Change-Id: I034224d42a3cfed8c49bfee55b332068796f9977
2013-08-06 12:01:03 -07:00
Jean-Michel Trivi
73673ab798 Reorder and comment MediaFocusControl code
Change-Id: Iacc03a7233789bd1588e9f7d2ca5df10a756fb0d
2013-08-06 10:42:45 -07:00
Jean-Michel Trivi
3523a06375 Remove outdated comment in MediaFocusControl
The stream type is used in audio focus to better deal with
  RemoteControlClient/Display in the case of notifications
  during media playback. This comment is therefore outdated.

Change-Id: Ifa33bc4c0fbf065d8288ff5fdfaf1bc67b2a337e
2013-08-01 14:36:32 -07:00
Jean-Michel Trivi
2380566deb Notification muting conditional to exclusive audio focus request
Summary of feature:
Do not mute notifications when speech recognition recording is
  active, but when an app has requested audio focus with
  AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE.

Implementation:
Move definition of AUDIOFOCUS_NONE to AudioManager where other
  audio focus codes are defined.
Add support for querying the current audio focus type.
When audio focus is requested as GAIN_TRANSIENT_EXCLUSIVE, make
  the corresponding loss by LOSS_TRANSIENT.
Before playing a notification, check whether GAIN_TRANSIENT_EXCLUSIVE
  has been requested.

Bug 8251963

Change-Id: I41edc77326b70639d2fdcb4642c53109995b72a8
2013-07-31 14:37:19 -07:00
Jean-Michel Trivi
cbb212ff6f Focus gain sends focus loss through the focus stack
When a new focus owner lands on the stack, don't just make the
 previous top of the stack lose focus, propagate the loss throughout
 the stack.
Only dispatch focus loss on focus loss state change
Remove canDispatchFocus() method as it now doesn't need to be known
 (and shouldn't be known) outside of the implementation.
Fix error where the focus code for a focus gain request should
 always be a focus loss code.

Bug 8315302

Change-Id: I92c8f51fdcc090851d34d00fefed916e25da40c1
2013-07-30 17:13:00 -07:00
Jean-Michel Trivi
83283f23eb Audio focus request managed by FocusRequester class
Move all audio focus request functionality under a new class/file.
Clean up encapsulation of data related to the request.

Change-Id: I989796e1ee1a5fc99799a64e1612294e0e40fa6d
2013-07-30 11:27:08 -07:00
Jean-Michel Trivi
00bf4b1817 More refactor of audio focus, keep track of focus loss
Move more audio focus-specific functionality into the class
  representing each audio focus owner, FocusStackEntry.
Keep track of how each FocusStackEntry instance lost focus.

Change-Id: I35df0717765a26ec747cb0110e2e951d155d1525
2013-07-29 18:15:29 -07:00
Jean-Michel Trivi
caa2c5bba8 More info in audio focus stack entry
Add fields in an audio focus stack entry to track what type of audio
 focus was requested, and why it was lost.
Make audio focus dump easier to read.

Change-Id: I61f6e43c13a32328a07125a2ba0dce1053872c86
2013-07-24 14:52:57 -07:00
Jean-Michel Trivi
2352228ff1 Merge "Launch voice-based searches as current user" 2013-07-23 16:20:26 +00:00
Jean-Michel Trivi
f47634edfe Fix dump formatting of RemoteControlClient playback state dump
Take into account the two types of undefined plyback position.
Only use "ms" unit when there is a position to write.
Fix misplaced ",".

Change-Id: I5033ec6ee7480f1ac525af7b7b0a9da259614783
2013-07-22 17:47:11 -07:00
Jean-Michel Trivi
dcd40c0e57 Launch voice-based searches as current user
Launch the voice-based interactions (voice search, web search) as
 the current user.

Change-Id: I5a038feea24346c3c94f86097f574ffdc499cf60
2013-07-22 16:46:42 -07:00
Jean-Michel Trivi
fa9a69805b Refactor for audio focus, remote control, media button handling
Extract audio focus, remote control and media button handling
 outside of AudioService without any changes in functionality.
 Moving logic to new class, MediaFocusControl.
Introduce interface for managing volum control logic, VolumeController.
 The VolumePanel class implements this interface.

Change-Id: I72bda2e0670c26e61ff076fd729c15f9f1156dc5
2013-07-22 16:09:15 -07:00