MediaRouteControllerDialog.java revision 2ef36d857302c5cd738c7c8bdec53d31feebebba
111417b1cfde8f1749905f2d735623af9214148afJeff Brown/* 211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Copyright (C) 2013 The Android Open Source Project 311417b1cfde8f1749905f2d735623af9214148afJeff Brown * 411417b1cfde8f1749905f2d735623af9214148afJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 511417b1cfde8f1749905f2d735623af9214148afJeff Brown * you may not use this file except in compliance with the License. 611417b1cfde8f1749905f2d735623af9214148afJeff Brown * You may obtain a copy of the License at 711417b1cfde8f1749905f2d735623af9214148afJeff Brown * 811417b1cfde8f1749905f2d735623af9214148afJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 911417b1cfde8f1749905f2d735623af9214148afJeff Brown * 1011417b1cfde8f1749905f2d735623af9214148afJeff Brown * Unless required by applicable law or agreed to in writing, software 1111417b1cfde8f1749905f2d735623af9214148afJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1211417b1cfde8f1749905f2d735623af9214148afJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1311417b1cfde8f1749905f2d735623af9214148afJeff Brown * See the License for the specific language governing permissions and 1411417b1cfde8f1749905f2d735623af9214148afJeff Brown * limitations under the License. 1511417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 1611417b1cfde8f1749905f2d735623af9214148afJeff Brown 1711417b1cfde8f1749905f2d735623af9214148afJeff Brownpackage android.support.v7.app; 1811417b1cfde8f1749905f2d735623af9214148afJeff Brown 1911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.app.Dialog; 2011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.content.Context; 212ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brownimport android.graphics.drawable.Drawable; 2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle; 2311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouteSelector; 2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouter; 2511417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.mediarouter.R; 2611417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.KeyEvent; 2711417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.View; 2811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.Window; 2911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.Button; 3011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.FrameLayout; 3111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.ImageView; 3211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.LinearLayout; 3311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.SeekBar; 3411417b1cfde8f1749905f2d735623af9214148afJeff Brown 3511417b1cfde8f1749905f2d735623af9214148afJeff Brown/** 3611417b1cfde8f1749905f2d735623af9214148afJeff Brown * This class implements the route controller dialog for {@link MediaRouter}. 3711417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p> 3811417b1cfde8f1749905f2d735623af9214148afJeff Brown * This dialog allows the user to control or disconnect from the currently selected route. 3911417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p> 4011417b1cfde8f1749905f2d735623af9214148afJeff Brown * 4111417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteButton 4211417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteActionProvider 4311417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 4411417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic class MediaRouteControllerDialog extends Dialog { 4511417b1cfde8f1749905f2d735623af9214148afJeff Brown private static final String TAG = "MediaRouteControllerDialog"; 4611417b1cfde8f1749905f2d735623af9214148afJeff Brown 4711417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouter mRouter; 4811417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouterCallback mCallback; 4911417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouter.RouteInfo mRoute; 5011417b1cfde8f1749905f2d735623af9214148afJeff Brown 512ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable mMediaRouteConnectingDrawable; 522ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable mMediaRouteOnDrawable; 532ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable mCurrentIconDrawable; 5411417b1cfde8f1749905f2d735623af9214148afJeff Brown 5511417b1cfde8f1749905f2d735623af9214148afJeff Brown private LinearLayout mVolumeLayout; 5611417b1cfde8f1749905f2d735623af9214148afJeff Brown private ImageView mVolumeDivider; 5711417b1cfde8f1749905f2d735623af9214148afJeff Brown private SeekBar mVolumeSlider; 5811417b1cfde8f1749905f2d735623af9214148afJeff Brown private boolean mVolumeSliderTouched; 5911417b1cfde8f1749905f2d735623af9214148afJeff Brown 6011417b1cfde8f1749905f2d735623af9214148afJeff Brown private View mControlView; 6111417b1cfde8f1749905f2d735623af9214148afJeff Brown 6211417b1cfde8f1749905f2d735623af9214148afJeff Brown private Button mDisconnectButton; 6311417b1cfde8f1749905f2d735623af9214148afJeff Brown 6411417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouteControllerDialog(Context context) { 6511417b1cfde8f1749905f2d735623af9214148afJeff Brown this(context, 0); 6611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 6711417b1cfde8f1749905f2d735623af9214148afJeff Brown 6811417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouteControllerDialog(Context context, int theme) { 6911417b1cfde8f1749905f2d735623af9214148afJeff Brown super(MediaRouterThemeHelper.createThemedContext(context), theme); 7011417b1cfde8f1749905f2d735623af9214148afJeff Brown context = getContext(); 7111417b1cfde8f1749905f2d735623af9214148afJeff Brown 7211417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter = MediaRouter.getInstance(context); 7311417b1cfde8f1749905f2d735623af9214148afJeff Brown mCallback = new MediaRouterCallback(); 7411417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoute = mRouter.getSelectedRoute(); 7511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 7611417b1cfde8f1749905f2d735623af9214148afJeff Brown 7711417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 7811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Gets the route that this dialog is controlling. 7911417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 8011417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouter.RouteInfo getRoute() { 8111417b1cfde8f1749905f2d735623af9214148afJeff Brown return mRoute; 8211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 8311417b1cfde8f1749905f2d735623af9214148afJeff Brown 8411417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 8511417b1cfde8f1749905f2d735623af9214148afJeff Brown * Provides the subclass an opportunity to create a view that will 8611417b1cfde8f1749905f2d735623af9214148afJeff Brown * be included within the body of the dialog to offer additional media controls 8711417b1cfde8f1749905f2d735623af9214148afJeff Brown * for the currently playing content. 8811417b1cfde8f1749905f2d735623af9214148afJeff Brown * 8911417b1cfde8f1749905f2d735623af9214148afJeff Brown * @param savedInstanceState The dialog's saved instance state. 9011417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The media control view, or null if none. 9111417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 9211417b1cfde8f1749905f2d735623af9214148afJeff Brown public View onCreateMediaControlView(Bundle savedInstanceState) { 9311417b1cfde8f1749905f2d735623af9214148afJeff Brown return null; 9411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 9511417b1cfde8f1749905f2d735623af9214148afJeff Brown 9611417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 9711417b1cfde8f1749905f2d735623af9214148afJeff Brown * Gets the media control view that was created by {@link #onCreateMediaControlView(Bundle)}. 9811417b1cfde8f1749905f2d735623af9214148afJeff Brown * 9911417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The media control view, or null if none. 10011417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 10111417b1cfde8f1749905f2d735623af9214148afJeff Brown public View getMediaControlView() { 10211417b1cfde8f1749905f2d735623af9214148afJeff Brown return mControlView; 10311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 10411417b1cfde8f1749905f2d735623af9214148afJeff Brown 10511417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 10611417b1cfde8f1749905f2d735623af9214148afJeff Brown protected void onCreate(Bundle savedInstanceState) { 10711417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onCreate(savedInstanceState); 10811417b1cfde8f1749905f2d735623af9214148afJeff Brown 10911417b1cfde8f1749905f2d735623af9214148afJeff Brown getWindow().requestFeature(Window.FEATURE_LEFT_ICON); 11011417b1cfde8f1749905f2d735623af9214148afJeff Brown 11111417b1cfde8f1749905f2d735623af9214148afJeff Brown setContentView(R.layout.media_route_controller_dialog); 11211417b1cfde8f1749905f2d735623af9214148afJeff Brown 11311417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeLayout = (LinearLayout)findViewById(R.id.media_route_volume_layout); 11411417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSlider = (SeekBar)findViewById(R.id.media_route_volume_slider); 11511417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeDivider = (ImageView)findViewById(R.id.media_route_volume_divider); 11611417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 11711417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 11811417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onStartTrackingTouch(SeekBar seekBar) { 11911417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSliderTouched = true; 12011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 12111417b1cfde8f1749905f2d735623af9214148afJeff Brown 12211417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 12311417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onStopTrackingTouch(SeekBar seekBar) { 12411417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSliderTouched = false; 12511417b1cfde8f1749905f2d735623af9214148afJeff Brown updateVolume(); 12611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 12711417b1cfde8f1749905f2d735623af9214148afJeff Brown 12811417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 12911417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 13011417b1cfde8f1749905f2d735623af9214148afJeff Brown if (fromUser) { 13111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoute.requestSetVolume(progress); 13211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13411417b1cfde8f1749905f2d735623af9214148afJeff Brown }); 13511417b1cfde8f1749905f2d735623af9214148afJeff Brown 13611417b1cfde8f1749905f2d735623af9214148afJeff Brown mDisconnectButton = (Button)findViewById(R.id.media_route_disconnect_button); 13711417b1cfde8f1749905f2d735623af9214148afJeff Brown mDisconnectButton.setOnClickListener(new View.OnClickListener() { 13811417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 13911417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onClick(View v) { 14011417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoute.isSelected()) { 14111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter.getDefaultRoute().select(); 14211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 14311417b1cfde8f1749905f2d735623af9214148afJeff Brown dismiss(); 14411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 14511417b1cfde8f1749905f2d735623af9214148afJeff Brown }); 14611417b1cfde8f1749905f2d735623af9214148afJeff Brown 14711417b1cfde8f1749905f2d735623af9214148afJeff Brown if (update()) { 14811417b1cfde8f1749905f2d735623af9214148afJeff Brown mControlView = onCreateMediaControlView(savedInstanceState); 14911417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mControlView != null) { 15011417b1cfde8f1749905f2d735623af9214148afJeff Brown FrameLayout controlFrame = 15111417b1cfde8f1749905f2d735623af9214148afJeff Brown (FrameLayout)findViewById(R.id.media_route_control_frame); 15211417b1cfde8f1749905f2d735623af9214148afJeff Brown ImageView controlDivider = 15311417b1cfde8f1749905f2d735623af9214148afJeff Brown (ImageView)findViewById(R.id.media_route_control_divider); 15411417b1cfde8f1749905f2d735623af9214148afJeff Brown controlFrame.addView(controlFrame); 15511417b1cfde8f1749905f2d735623af9214148afJeff Brown controlFrame.setVisibility(View.VISIBLE); 15611417b1cfde8f1749905f2d735623af9214148afJeff Brown controlDivider.setVisibility(View.VISIBLE); 15711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 15811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 15911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 16011417b1cfde8f1749905f2d735623af9214148afJeff Brown 16111417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 16211417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onAttachedToWindow() { 16311417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onAttachedToWindow(); 16411417b1cfde8f1749905f2d735623af9214148afJeff Brown 16511417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback, 16611417b1cfde8f1749905f2d735623af9214148afJeff Brown MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS); 16711417b1cfde8f1749905f2d735623af9214148afJeff Brown update(); 16811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 16911417b1cfde8f1749905f2d735623af9214148afJeff Brown 17011417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 17111417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onDetachedFromWindow() { 17211417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter.removeCallback(mCallback); 17311417b1cfde8f1749905f2d735623af9214148afJeff Brown 17411417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onDetachedFromWindow(); 17511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 17611417b1cfde8f1749905f2d735623af9214148afJeff Brown 17711417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 17811417b1cfde8f1749905f2d735623af9214148afJeff Brown public boolean onKeyDown(int keyCode, KeyEvent event) { 17911417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoute.getVolumeHandling() == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) { 18011417b1cfde8f1749905f2d735623af9214148afJeff Brown if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { 18111417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoute.requestUpdateVolume(-1); 18211417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 18311417b1cfde8f1749905f2d735623af9214148afJeff Brown } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 18411417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoute.requestUpdateVolume(1); 18511417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 18611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 18711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 18811417b1cfde8f1749905f2d735623af9214148afJeff Brown return super.onKeyDown(keyCode, event); 18911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19011417b1cfde8f1749905f2d735623af9214148afJeff Brown 19111417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 19211417b1cfde8f1749905f2d735623af9214148afJeff Brown public boolean onKeyUp(int keyCode, KeyEvent event) { 19311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoute.getVolumeHandling() == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) { 19411417b1cfde8f1749905f2d735623af9214148afJeff Brown if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 19511417b1cfde8f1749905f2d735623af9214148afJeff Brown || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 19611417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 19711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 19911417b1cfde8f1749905f2d735623af9214148afJeff Brown return super.onKeyUp(keyCode, event); 20011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 20111417b1cfde8f1749905f2d735623af9214148afJeff Brown 20211417b1cfde8f1749905f2d735623af9214148afJeff Brown private boolean update() { 20311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (!mRoute.isSelected() || mRoute.isDefault()) { 20411417b1cfde8f1749905f2d735623af9214148afJeff Brown dismiss(); 20511417b1cfde8f1749905f2d735623af9214148afJeff Brown return false; 20611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 20711417b1cfde8f1749905f2d735623af9214148afJeff Brown 20811417b1cfde8f1749905f2d735623af9214148afJeff Brown setTitle(mRoute.getName()); 20911417b1cfde8f1749905f2d735623af9214148afJeff Brown updateVolume(); 21011417b1cfde8f1749905f2d735623af9214148afJeff Brown 2112ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown Drawable icon = getIconDrawable(); 2122ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (icon != mCurrentIconDrawable) { 2132ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown mCurrentIconDrawable = icon; 2142ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown 2152ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown // There seems to be a bug in the framework where feature drawables 2162ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown // will not start animating unless they experience a transition from 2172ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown // invisible to visible. So we force the drawable to be invisible here. 2182ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown // The window will make the drawable visible when attached. 2192ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown icon.setVisible(false, true); 2202ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown getWindow().setFeatureDrawable(Window.FEATURE_LEFT_ICON, icon); 2212ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 22211417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 22311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 22411417b1cfde8f1749905f2d735623af9214148afJeff Brown 2252ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable getIconDrawable() { 2262ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mRoute.isConnecting()) { 2272ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mMediaRouteConnectingDrawable == null) { 2282ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown mMediaRouteConnectingDrawable = MediaRouterThemeHelper.getThemeDrawable( 2292ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown getContext(), R.attr.mediaRouteConnectingDrawable); 2302ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 2312ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown return mMediaRouteConnectingDrawable; 2322ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } else { 2332ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mMediaRouteOnDrawable == null) { 2342ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown mMediaRouteOnDrawable = MediaRouterThemeHelper.getThemeDrawable( 2352ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown getContext(), R.attr.mediaRouteOnDrawable); 2362ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 2372ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown return mMediaRouteOnDrawable; 2382ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 2392ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 2402ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown 24111417b1cfde8f1749905f2d735623af9214148afJeff Brown private void updateVolume() { 24211417b1cfde8f1749905f2d735623af9214148afJeff Brown if (!mVolumeSliderTouched) { 24311417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mRoute.getVolumeHandling() == MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE) { 24411417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeLayout.setVisibility(View.VISIBLE); 24511417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeDivider.setVisibility(View.VISIBLE); 24611417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSlider.setMax(mRoute.getVolumeMax()); 24711417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeSlider.setProgress(mRoute.getVolume()); 24811417b1cfde8f1749905f2d735623af9214148afJeff Brown } else { 24911417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeLayout.setVisibility(View.GONE); 25011417b1cfde8f1749905f2d735623af9214148afJeff Brown mVolumeDivider.setVisibility(View.GONE); 25111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 25211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 25311417b1cfde8f1749905f2d735623af9214148afJeff Brown } 25411417b1cfde8f1749905f2d735623af9214148afJeff Brown 25511417b1cfde8f1749905f2d735623af9214148afJeff Brown private final class MediaRouterCallback extends MediaRouter.Callback { 25611417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 25711417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) { 25811417b1cfde8f1749905f2d735623af9214148afJeff Brown update(); 25911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 26011417b1cfde8f1749905f2d735623af9214148afJeff Brown 26111417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 26211417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) { 26311417b1cfde8f1749905f2d735623af9214148afJeff Brown update(); 26411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 26511417b1cfde8f1749905f2d735623af9214148afJeff Brown 26611417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 26711417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) { 26811417b1cfde8f1749905f2d735623af9214148afJeff Brown if (route == mRoute) { 26911417b1cfde8f1749905f2d735623af9214148afJeff Brown updateVolume(); 27011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 27111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 27211417b1cfde8f1749905f2d735623af9214148afJeff Brown } 27311417b1cfde8f1749905f2d735623af9214148afJeff Brown} 274