Wait for playback when playing a browsed media item
Currently, BrowsedPlayerWrapper treats all browsing and playing actions as transient operations where it sets an operation to do, connect()'s, invokes the function with the desired operation, disconnect()'s and clears the callback for the operation. The key thing here is connect and disconnect translate to bind() and unbind() calls on the browse service. Unbinding from a service when you're the last person that is bound to that service can cause the service to go down. With browsing, we subscribe once connected and wait for media items to be loaded before we disconnect. This is fine, as we get the data we're after before the service goes down. With playing from a media ID, we simply get transport controls, call playFromMediaId(), and disconnect(). The play call is async though and assuming the media source isn't in the foreground yet, can result in the service AND its session being torn down before playback can began and the service can transition into a foreground audio source. This results in no metadata being loaded or audio playing. This can be very impactful in a car where you might need to take your phone out while driving to start a media app so you can begin playback on your own. This change makes it so the BrowsedPlayerWrapper will wait until it gets a playback state of STATUS_PLAYING before it disconnects from the browse service (with a timeout). Proper synchronization is also added to the callback object used on connections. Tests are updated to reflect the new wait for playback, timing out and synchronization behaviors. Bug: b/139430948 Test: Connect to a car kit that supports playing from a browsed media item and select an item to play + atest BrowsedPlayerWrapperTest Change-Id: Ib9135196b578561813df9e0663c0960b4af7899b
Loading
Please register or sign in to comment