@@ -4243,6 +4243,7 @@ private static class RemoteControlStackEntry {
42434243 public int mPlaybackVolumeHandling ;
42444244 public int mPlaybackStream ;
42454245 public int mPlaybackState ;
4246+ public IRemoteVolumeObserver mRemoteVolumeObs ;
42464247
42474248 public void resetPlaybackInfo () {
42484249 mPlaybackType = RemoteControlClient .PLAYBACK_TYPE_LOCAL ;
@@ -4251,6 +4252,7 @@ public void resetPlaybackInfo() {
42514252 mPlaybackVolumeHandling = RemoteControlClient .DEFAULT_PLAYBACK_VOLUME_HANDLING ;
42524253 mPlaybackStream = AudioManager .STREAM_MUSIC ;
42534254 mPlaybackState = RemoteControlClient .PLAYSTATE_STOPPED ;
4255+ mRemoteVolumeObs = null ;
42544256 }
42554257
42564258 /** precondition: mediaIntent != null, eventReceiver != null */
@@ -4335,7 +4337,9 @@ private void dumpRCCStack(PrintWriter pw) {
43354337 " -- state: " + rcse .mPlaybackState +
43364338 " -- vol handling: " + rcse .mPlaybackVolumeHandling +
43374339 " -- vol: " + rcse .mPlaybackVolume +
4338- " -- volMax: " + rcse .mPlaybackVolumeMax );
4340+ " -- volMax: " + rcse .mPlaybackVolumeMax +
4341+ " -- volObs: " + rcse .mRemoteVolumeObs );
4342+
43394343 }
43404344 }
43414345 synchronized (mMainRemote ) {
@@ -5018,6 +5022,20 @@ public void setPlaybackInfoForRcc(int rccId, int what, int value) {
50185022 }
50195023 }
50205024
5025+ // FIXME send a message instead of updating the stack synchronously
5026+ public void registerRemoteVolumeObserverForRcc (int rccId , IRemoteVolumeObserver rvo ) {
5027+ synchronized (mRCStack ) {
5028+ Iterator <RemoteControlStackEntry > stackIterator = mRCStack .iterator ();
5029+ while (stackIterator .hasNext ()) {
5030+ RemoteControlStackEntry rcse = stackIterator .next ();
5031+ if (rcse .mRccId == rccId ) {
5032+ rcse .mRemoteVolumeObs = rvo ;
5033+ break ;
5034+ }
5035+ }
5036+ }
5037+ }
5038+
50215039 /**
50225040 * Checks if a remote client is active on the supplied stream type. Update the remote stream
50235041 * volume state if found and playing
@@ -5100,23 +5118,24 @@ private void sendVolumeUpdateToRemote(int rccId, int direction) {
51005118 // only handling discrete events
51015119 return ;
51025120 }
5103- String packageForRcc = null ;
5121+ IRemoteVolumeObserver rvo = null ;
51045122 synchronized (mRCStack ) {
51055123 Iterator <RemoteControlStackEntry > stackIterator = mRCStack .iterator ();
51065124 while (stackIterator .hasNext ()) {
51075125 RemoteControlStackEntry rcse = stackIterator .next ();
51085126 //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate?
51095127 if (rcse .mRccId == rccId ) {
5110- packageForRcc = rcse .mReceiverComponent . getPackageName () ;
5128+ rvo = rcse .mRemoteVolumeObs ;
51115129 break ;
51125130 }
51135131 }
51145132 }
5115- if (packageForRcc != null ) {
5116- Intent intent = new Intent (Intent .ACTION_VOLUME_UPDATE );
5117- intent .putExtra (Intent .EXTRA_VOLUME_UPDATE_DIRECTION , direction );
5118- intent .setPackage (packageForRcc );
5119- mContext .sendBroadcast (intent );
5133+ if (rvo != null ) {
5134+ try {
5135+ rvo .dispatchRemoteVolumeUpdate (direction , -1 );
5136+ } catch (RemoteException e ) {
5137+ Log .e (TAG , "Error dispatching relative volume update" , e );
5138+ }
51205139 }
51215140 }
51225141
@@ -5147,23 +5166,24 @@ public void setRemoteStreamVolume(int vol) {
51475166 }
51485167 rccId = mMainRemote .mRccId ;
51495168 }
5150- String packageForRcc = null ;
5169+ IRemoteVolumeObserver rvo = null ;
51515170 synchronized (mRCStack ) {
51525171 Iterator <RemoteControlStackEntry > stackIterator = mRCStack .iterator ();
51535172 while (stackIterator .hasNext ()) {
51545173 RemoteControlStackEntry rcse = stackIterator .next ();
51555174 if (rcse .mRccId == rccId ) {
51565175 //FIXME OPTIMIZE store this info in mMainRemote so we don't have to iterate?
5157- packageForRcc = rcse .mReceiverComponent . getPackageName () ;
5176+ rvo = rcse .mRemoteVolumeObs ;
51585177 break ;
51595178 }
51605179 }
51615180 }
5162- if (packageForRcc != null ) {
5163- Intent intent = new Intent (Intent .ACTION_VOLUME_UPDATE );
5164- intent .putExtra (Intent .EXTRA_VOLUME_UPDATE_VALUE , vol );
5165- intent .setPackage (packageForRcc );
5166- mContext .sendBroadcast (intent );
5181+ if (rvo != null ) {
5182+ try {
5183+ rvo .dispatchRemoteVolumeUpdate (0 , vol );
5184+ } catch (RemoteException e ) {
5185+ Log .e (TAG , "Error dispatching absolute volume update" , e );
5186+ }
51675187 }
51685188 }
51695189
0 commit comments