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