3030import android .media .MediaRouter .RouteCategory ;
3131import android .media .MediaRouter .RouteGroup ;
3232import android .media .MediaRouter .RouteInfo ;
33- import android .media .MediaRouter .UserRouteInfo ;
34- import android .media .RemoteControlClient ;
3533import android .os .Bundle ;
3634import android .text .TextUtils ;
3735import android .view .KeyEvent ;
@@ -85,7 +83,8 @@ public class MediaRouteChooserDialogFragment extends DialogFragment {
8583
8684 final RouteComparator mComparator = new RouteComparator ();
8785 final MediaRouterCallback mCallback = new MediaRouterCallback ();
88- private boolean mIgnoreVolumeChanges ;
86+ private boolean mIgnoreSliderVolumeChanges ;
87+ private boolean mIgnoreCallbackVolumeChanges ;
8988
9089 public MediaRouteChooserDialogFragment () {
9190 setStyle (STYLE_NO_TITLE , R .style .Theme_DeviceDefault_Dialog );
@@ -126,52 +125,34 @@ public void setRouteTypes(int types) {
126125
127126 void updateVolume () {
128127 final RouteInfo selectedRoute = mRouter .getSelectedRoute (mRouteTypes );
129- final boolean defaultAudioSelected = selectedRoute == mRouter .getSystemAudioRoute ();
130- final boolean selectedSystemRoute =
131- selectedRoute .getCategory () == mRouter .getSystemAudioCategory ();
132- mVolumeIcon .setImageResource (defaultAudioSelected ?
128+ mVolumeIcon .setImageResource (
129+ selectedRoute .getPlaybackType () == RouteInfo .PLAYBACK_TYPE_LOCAL ?
133130 R .drawable .ic_audio_vol : R .drawable .ic_media_route_on_holo_dark );
134131
135- mIgnoreVolumeChanges = true ;
136- mVolumeSlider .setEnabled (true );
137- if (selectedSystemRoute ) {
138- // Use the standard media audio stream
139- mVolumeSlider .setMax (mAudio .getStreamMaxVolume (AudioManager .STREAM_MUSIC ));
140- mVolumeSlider .setProgress (mAudio .getStreamVolume (AudioManager .STREAM_MUSIC ));
141- } else {
142- final RouteInfo firstSelected ;
143- if (selectedRoute instanceof RouteGroup ) {
144- firstSelected = ((RouteGroup ) selectedRoute ).getRouteAt (0 );
145- } else {
146- firstSelected = selectedRoute ;
147- }
132+ mIgnoreSliderVolumeChanges = true ;
148133
149- RemoteControlClient rcc = null ;
150- if (firstSelected instanceof UserRouteInfo ) {
151- rcc = ((UserRouteInfo ) firstSelected ).getRemoteControlClient ();
152- }
153-
154- if (rcc == null ) {
155- // No RemoteControlClient? Assume volume can't be controlled.
156- // Disable the slider and show it at max volume.
157- mVolumeSlider .setMax (1 );
158- mVolumeSlider .setProgress (1 );
159- mVolumeSlider .setEnabled (false );
160- } else {
161- // TODO: Connect this to the remote control volume
162- }
134+ if (selectedRoute .getVolumeHandling () == RouteInfo .PLAYBACK_VOLUME_FIXED ) {
135+ // Disable the slider and show it at max volume.
136+ mVolumeSlider .setMax (1 );
137+ mVolumeSlider .setProgress (1 );
138+ mVolumeSlider .setEnabled (false );
139+ } else {
140+ mVolumeSlider .setEnabled (true );
141+ mVolumeSlider .setMax (selectedRoute .getVolumeMax ());
142+ mVolumeSlider .setProgress (selectedRoute .getVolume ());
163143 }
164- mIgnoreVolumeChanges = false ;
144+
145+ mIgnoreSliderVolumeChanges = false ;
165146 }
166147
167148 void changeVolume (int newValue ) {
168- if (mIgnoreVolumeChanges ) return ;
149+ if (mIgnoreSliderVolumeChanges ) return ;
169150
170- RouteCategory selectedCategory = mRouter .getSelectedRoute (mRouteTypes ). getCategory ( );
171- if (selectedCategory == mRouter . getSystemAudioCategory () ) {
151+ final RouteInfo selectedRoute = mRouter .getSelectedRoute (mRouteTypes );
152+ if (selectedRoute . getVolumeHandling () == RouteInfo . PLAYBACK_VOLUME_VARIABLE ) {
172153 final int maxVolume = mAudio .getStreamMaxVolume (AudioManager .STREAM_MUSIC );
173154 newValue = Math .max (0 , Math .min (newValue , maxVolume ));
174- mAudio . setStreamVolume ( AudioManager . STREAM_MUSIC , newValue , 0 );
155+ selectedRoute . requestSetVolume ( newValue );
175156 }
176157 }
177158
@@ -595,7 +576,6 @@ public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
595576 @ Override
596577 public void onRouteAdded (MediaRouter router , RouteInfo info ) {
597578 mAdapter .update ();
598- updateVolume ();
599579 }
600580
601581 @ Override
@@ -604,7 +584,6 @@ public void onRouteRemoved(MediaRouter router, RouteInfo info) {
604584 mAdapter .finishGrouping ();
605585 }
606586 mAdapter .update ();
607- updateVolume ();
608587 }
609588
610589 @ Override
@@ -622,6 +601,13 @@ public void onRouteGrouped(MediaRouter router, RouteInfo info,
622601 public void onRouteUngrouped (MediaRouter router , RouteInfo info , RouteGroup group ) {
623602 mAdapter .update ();
624603 }
604+
605+ @ Override
606+ public void onRouteVolumeChanged (MediaRouter router , RouteInfo info ) {
607+ if (!mIgnoreCallbackVolumeChanges ) {
608+ updateVolume ();
609+ }
610+ }
625611 }
626612
627613 class RouteComparator implements Comparator <RouteInfo > {
@@ -648,15 +634,25 @@ public void onBackPressed() {
648634
649635 public boolean onKeyDown (int keyCode , KeyEvent event ) {
650636 if (keyCode == KeyEvent .KEYCODE_VOLUME_DOWN && mVolumeSlider .isEnabled ()) {
651- mVolumeSlider . incrementProgressBy (-1 );
637+ mRouter . getSelectedRoute ( mRouteTypes ). requestUpdateVolume (-1 );
652638 return true ;
653639 } else if (keyCode == KeyEvent .KEYCODE_VOLUME_UP && mVolumeSlider .isEnabled ()) {
654- mVolumeSlider . incrementProgressBy (1 );
640+ mRouter . getSelectedRoute ( mRouteTypes ). requestUpdateVolume (1 );
655641 return true ;
656642 } else {
657643 return super .onKeyDown (keyCode , event );
658644 }
659645 }
646+
647+ public boolean onKeyUp (int keyCode , KeyEvent event ) {
648+ if (keyCode == KeyEvent .KEYCODE_VOLUME_DOWN && mVolumeSlider .isEnabled ()) {
649+ return true ;
650+ } else if (keyCode == KeyEvent .KEYCODE_VOLUME_UP && mVolumeSlider .isEnabled ()) {
651+ return true ;
652+ } else {
653+ return super .onKeyUp (keyCode , event );
654+ }
655+ }
660656 }
661657
662658 /**
@@ -675,10 +671,13 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
675671
676672 @ Override
677673 public void onStartTrackingTouch (SeekBar seekBar ) {
674+ mIgnoreCallbackVolumeChanges = true ;
678675 }
679676
680677 @ Override
681678 public void onStopTrackingTouch (SeekBar seekBar ) {
679+ mIgnoreCallbackVolumeChanges = false ;
680+ updateVolume ();
682681 }
683682
684683 }
0 commit comments