MediaRouteControllerDialog.java revision 94be6100218126ce6a08bf1f56209578500b361f
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;
2194be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.content.IntentSender;
2294be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.content.IntentSender.SendIntentException;
232ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brownimport android.graphics.drawable.Drawable;
2411417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle;
2594be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.os.RemoteException;
2694be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.MediaDescriptionCompat;
2794be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.MediaMetadataCompat;
2894be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.MediaControllerCompat;
2994be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.MediaSessionCompat;
3094be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.PlaybackStateCompat;
3111417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouteSelector;
3211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouter;
3311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.mediarouter.R;
3494be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.text.TextUtils;
3594be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.util.Log;
3611417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.KeyEvent;
3711417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.View;
3811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.Window;
3911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.Button;
4011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.FrameLayout;
4194be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.ImageButton;
4294be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.ImageView;
4394be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.TextView;
4411417b1cfde8f1749905f2d735623af9214148afJeff Brown
4511417b1cfde8f1749905f2d735623af9214148afJeff Brown/**
4611417b1cfde8f1749905f2d735623af9214148afJeff Brown * This class implements the route controller dialog for {@link MediaRouter}.
4711417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p>
4811417b1cfde8f1749905f2d735623af9214148afJeff Brown * This dialog allows the user to control or disconnect from the currently selected route.
4911417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p>
5011417b1cfde8f1749905f2d735623af9214148afJeff Brown *
5111417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteButton
5211417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteActionProvider
5311417b1cfde8f1749905f2d735623af9214148afJeff Brown */
5411417b1cfde8f1749905f2d735623af9214148afJeff Brownpublic class MediaRouteControllerDialog extends Dialog {
5511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private static final String TAG = "MediaRouteControllerDialog";
5611417b1cfde8f1749905f2d735623af9214148afJeff Brown
5711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final MediaRouter mRouter;
5811417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final MediaRouterCallback mCallback;
5911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final MediaRouter.RouteInfo mRoute;
6011417b1cfde8f1749905f2d735623af9214148afJeff Brown
61eff7719415542ba819054863b0995f07742a7a8aJeff Brown    private boolean mCreated;
622ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown    private Drawable mMediaRouteConnectingDrawable;
632ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown    private Drawable mMediaRouteOnDrawable;
642ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown    private Drawable mCurrentIconDrawable;
6594be6100218126ce6a08bf1f56209578500b361fRoboErik    private Drawable mSettingsDrawable;
6611417b1cfde8f1749905f2d735623af9214148afJeff Brown
6711417b1cfde8f1749905f2d735623af9214148afJeff Brown    private View mControlView;
6811417b1cfde8f1749905f2d735623af9214148afJeff Brown
6911417b1cfde8f1749905f2d735623af9214148afJeff Brown    private Button mDisconnectButton;
7094be6100218126ce6a08bf1f56209578500b361fRoboErik    private Button mStopCastingButton;
7194be6100218126ce6a08bf1f56209578500b361fRoboErik    private ImageButton mPlayPauseButton;
7294be6100218126ce6a08bf1f56209578500b361fRoboErik    private ImageButton mSettingsButton;
7394be6100218126ce6a08bf1f56209578500b361fRoboErik
7494be6100218126ce6a08bf1f56209578500b361fRoboErik    private ImageView mArtView;
7594be6100218126ce6a08bf1f56209578500b361fRoboErik    private TextView mTitleView;
7694be6100218126ce6a08bf1f56209578500b361fRoboErik    private TextView mSubtitleView;
7794be6100218126ce6a08bf1f56209578500b361fRoboErik    private TextView mRouteNameView;
7894be6100218126ce6a08bf1f56209578500b361fRoboErik    private View mTitlesWrapper;
7994be6100218126ce6a08bf1f56209578500b361fRoboErik
8094be6100218126ce6a08bf1f56209578500b361fRoboErik    private MediaControllerCompat mMediaController;
8194be6100218126ce6a08bf1f56209578500b361fRoboErik    private MediaControllerCallback mControllerCallback;
8294be6100218126ce6a08bf1f56209578500b361fRoboErik    private PlaybackStateCompat mState;
8394be6100218126ce6a08bf1f56209578500b361fRoboErik    private MediaDescriptionCompat mDescription;
8494be6100218126ce6a08bf1f56209578500b361fRoboErik
8511417b1cfde8f1749905f2d735623af9214148afJeff Brown
8611417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteControllerDialog(Context context) {
8711417b1cfde8f1749905f2d735623af9214148afJeff Brown        this(context, 0);
8811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
8911417b1cfde8f1749905f2d735623af9214148afJeff Brown
9011417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouteControllerDialog(Context context, int theme) {
9194be6100218126ce6a08bf1f56209578500b361fRoboErik        super(MediaRouterThemeHelper.createThemedContext(context), theme);
9211417b1cfde8f1749905f2d735623af9214148afJeff Brown        context = getContext();
9311417b1cfde8f1749905f2d735623af9214148afJeff Brown
9494be6100218126ce6a08bf1f56209578500b361fRoboErik        mControllerCallback = new MediaControllerCallback();
9511417b1cfde8f1749905f2d735623af9214148afJeff Brown        mRouter = MediaRouter.getInstance(context);
9611417b1cfde8f1749905f2d735623af9214148afJeff Brown        mCallback = new MediaRouterCallback();
9711417b1cfde8f1749905f2d735623af9214148afJeff Brown        mRoute = mRouter.getSelectedRoute();
9811417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
9911417b1cfde8f1749905f2d735623af9214148afJeff Brown
10011417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10111417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the route that this dialog is controlling.
10211417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
10311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public MediaRouter.RouteInfo getRoute() {
10411417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mRoute;
10511417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
10611417b1cfde8f1749905f2d735623af9214148afJeff Brown
10711417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
10811417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Provides the subclass an opportunity to create a view that will
10911417b1cfde8f1749905f2d735623af9214148afJeff Brown     * be included within the body of the dialog to offer additional media controls
11011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * for the currently playing content.
11111417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
11211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @param savedInstanceState The dialog's saved instance state.
11311417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The media control view, or null if none.
11411417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
11511417b1cfde8f1749905f2d735623af9214148afJeff Brown    public View onCreateMediaControlView(Bundle savedInstanceState) {
11611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return null;
11711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
11811417b1cfde8f1749905f2d735623af9214148afJeff Brown
11911417b1cfde8f1749905f2d735623af9214148afJeff Brown    /**
12011417b1cfde8f1749905f2d735623af9214148afJeff Brown     * Gets the media control view that was created by {@link #onCreateMediaControlView(Bundle)}.
12111417b1cfde8f1749905f2d735623af9214148afJeff Brown     *
12211417b1cfde8f1749905f2d735623af9214148afJeff Brown     * @return The media control view, or null if none.
12311417b1cfde8f1749905f2d735623af9214148afJeff Brown     */
12411417b1cfde8f1749905f2d735623af9214148afJeff Brown    public View getMediaControlView() {
12511417b1cfde8f1749905f2d735623af9214148afJeff Brown        return mControlView;
12611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
12711417b1cfde8f1749905f2d735623af9214148afJeff Brown
128eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
12994be6100218126ce6a08bf1f56209578500b361fRoboErik     * Set the session to use for metadata and transport controls. The dialog
13094be6100218126ce6a08bf1f56209578500b361fRoboErik     * will listen to changes on this session and update the UI automatically in
13194be6100218126ce6a08bf1f56209578500b361fRoboErik     * response to changes.
13294be6100218126ce6a08bf1f56209578500b361fRoboErik     *
13394be6100218126ce6a08bf1f56209578500b361fRoboErik     * @param sessionToken The token for the session to use.
134eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
13594be6100218126ce6a08bf1f56209578500b361fRoboErik    public void setMediaSession(MediaSessionCompat.Token sessionToken) {
13694be6100218126ce6a08bf1f56209578500b361fRoboErik        if (mMediaController != null) {
13794be6100218126ce6a08bf1f56209578500b361fRoboErik            mMediaController.unregisterCallback(mControllerCallback);
13894be6100218126ce6a08bf1f56209578500b361fRoboErik            mMediaController = null;
13994be6100218126ce6a08bf1f56209578500b361fRoboErik        }
14094be6100218126ce6a08bf1f56209578500b361fRoboErik        if (sessionToken == null) {
14194be6100218126ce6a08bf1f56209578500b361fRoboErik            return;
14294be6100218126ce6a08bf1f56209578500b361fRoboErik        }
14394be6100218126ce6a08bf1f56209578500b361fRoboErik        try {
14494be6100218126ce6a08bf1f56209578500b361fRoboErik            mMediaController = new MediaControllerCompat(getContext(), sessionToken);
14594be6100218126ce6a08bf1f56209578500b361fRoboErik        } catch (RemoteException e) {
14694be6100218126ce6a08bf1f56209578500b361fRoboErik            Log.e(TAG, "Error creating media controller in setMediaSession.", e);
14794be6100218126ce6a08bf1f56209578500b361fRoboErik        }
14894be6100218126ce6a08bf1f56209578500b361fRoboErik        if (mMediaController != null) {
14994be6100218126ce6a08bf1f56209578500b361fRoboErik            mMediaController.registerCallback(mControllerCallback);
150eff7719415542ba819054863b0995f07742a7a8aJeff Brown        }
15194be6100218126ce6a08bf1f56209578500b361fRoboErik        MediaMetadataCompat metadata = mMediaController == null ? null
15294be6100218126ce6a08bf1f56209578500b361fRoboErik                : mMediaController.getMetadata();
15394be6100218126ce6a08bf1f56209578500b361fRoboErik        mDescription = metadata == null ? null : metadata.getDescription();
15494be6100218126ce6a08bf1f56209578500b361fRoboErik        mState = mMediaController == null ? null : mMediaController.getPlaybackState();
15594be6100218126ce6a08bf1f56209578500b361fRoboErik        update();
156eff7719415542ba819054863b0995f07742a7a8aJeff Brown    }
157eff7719415542ba819054863b0995f07742a7a8aJeff Brown
158eff7719415542ba819054863b0995f07742a7a8aJeff Brown    /**
15994be6100218126ce6a08bf1f56209578500b361fRoboErik     * Gets the description being used by the default UI.
16094be6100218126ce6a08bf1f56209578500b361fRoboErik     *
16194be6100218126ce6a08bf1f56209578500b361fRoboErik     * @return The current description.
162eff7719415542ba819054863b0995f07742a7a8aJeff Brown     */
16394be6100218126ce6a08bf1f56209578500b361fRoboErik    public MediaSessionCompat.Token getMediaSession() {
16494be6100218126ce6a08bf1f56209578500b361fRoboErik        return mMediaController == null ? null : mMediaController.getSessionToken();
165eff7719415542ba819054863b0995f07742a7a8aJeff Brown    }
166eff7719415542ba819054863b0995f07742a7a8aJeff Brown
16711417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
16811417b1cfde8f1749905f2d735623af9214148afJeff Brown    protected void onCreate(Bundle savedInstanceState) {
16911417b1cfde8f1749905f2d735623af9214148afJeff Brown        super.onCreate(savedInstanceState);
17011417b1cfde8f1749905f2d735623af9214148afJeff Brown
17194be6100218126ce6a08bf1f56209578500b361fRoboErik        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
17211417b1cfde8f1749905f2d735623af9214148afJeff Brown
17394be6100218126ce6a08bf1f56209578500b361fRoboErik        setContentView(R.layout.mr_media_route_controller_material_dialog_b);
17411417b1cfde8f1749905f2d735623af9214148afJeff Brown
17594be6100218126ce6a08bf1f56209578500b361fRoboErik        ClickListener listener = new ClickListener();
176d6748a7926ebb2450337f9f0ff4d445c980344e5Jeff Brown
17794be6100218126ce6a08bf1f56209578500b361fRoboErik        mDisconnectButton = (Button) findViewById(R.id.disconnect);
17894be6100218126ce6a08bf1f56209578500b361fRoboErik        mDisconnectButton.setOnClickListener(listener);
17911417b1cfde8f1749905f2d735623af9214148afJeff Brown
18094be6100218126ce6a08bf1f56209578500b361fRoboErik        mStopCastingButton = (Button) findViewById(R.id.stop);
18194be6100218126ce6a08bf1f56209578500b361fRoboErik        mStopCastingButton.setOnClickListener(listener);
18211417b1cfde8f1749905f2d735623af9214148afJeff Brown
18394be6100218126ce6a08bf1f56209578500b361fRoboErik        mSettingsButton = (ImageButton) findViewById(R.id.settings);
18494be6100218126ce6a08bf1f56209578500b361fRoboErik        mSettingsButton.setOnClickListener(listener);
18511417b1cfde8f1749905f2d735623af9214148afJeff Brown
18694be6100218126ce6a08bf1f56209578500b361fRoboErik        mArtView = (ImageView) findViewById(R.id.art);
18794be6100218126ce6a08bf1f56209578500b361fRoboErik        mTitleView = (TextView) findViewById(R.id.title);
18894be6100218126ce6a08bf1f56209578500b361fRoboErik        mSubtitleView = (TextView) findViewById(R.id.subtitle);
18994be6100218126ce6a08bf1f56209578500b361fRoboErik        mTitlesWrapper = findViewById(R.id.text_wrapper);
19094be6100218126ce6a08bf1f56209578500b361fRoboErik        mPlayPauseButton = (ImageButton) findViewById(R.id.play_pause);
19194be6100218126ce6a08bf1f56209578500b361fRoboErik        mPlayPauseButton.setOnClickListener(listener);
19294be6100218126ce6a08bf1f56209578500b361fRoboErik        mRouteNameView = (TextView) findViewById(R.id.route_name);
19311417b1cfde8f1749905f2d735623af9214148afJeff Brown
194eff7719415542ba819054863b0995f07742a7a8aJeff Brown        mCreated = true;
19511417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (update()) {
19611417b1cfde8f1749905f2d735623af9214148afJeff Brown            mControlView = onCreateMediaControlView(savedInstanceState);
197697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah            FrameLayout controlFrame =
198697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah                    (FrameLayout)findViewById(R.id.media_route_control_frame);
19911417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (mControlView != null) {
20094be6100218126ce6a08bf1f56209578500b361fRoboErik                controlFrame.findViewById(R.id.default_control_frame).setVisibility(View.GONE);
201697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah                controlFrame.addView(mControlView);
20211417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
20311417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
20411417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
20511417b1cfde8f1749905f2d735623af9214148afJeff Brown
20611417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
20711417b1cfde8f1749905f2d735623af9214148afJeff Brown    public void onAttachedToWindow() {
20811417b1cfde8f1749905f2d735623af9214148afJeff Brown        super.onAttachedToWindow();
20911417b1cfde8f1749905f2d735623af9214148afJeff Brown
21011417b1cfde8f1749905f2d735623af9214148afJeff Brown        mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback,
21111417b1cfde8f1749905f2d735623af9214148afJeff Brown                MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS);
21211417b1cfde8f1749905f2d735623af9214148afJeff Brown        update();
21311417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
21411417b1cfde8f1749905f2d735623af9214148afJeff Brown
21511417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
21611417b1cfde8f1749905f2d735623af9214148afJeff Brown    public void onDetachedFromWindow() {
21711417b1cfde8f1749905f2d735623af9214148afJeff Brown        mRouter.removeCallback(mCallback);
21811417b1cfde8f1749905f2d735623af9214148afJeff Brown
21911417b1cfde8f1749905f2d735623af9214148afJeff Brown        super.onDetachedFromWindow();
22011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
22111417b1cfde8f1749905f2d735623af9214148afJeff Brown
22211417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
22311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean onKeyDown(int keyCode, KeyEvent event) {
224ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
225ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown                || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
226ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown            mRoute.requestUpdateVolume(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ? -1 : 1);
227ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown            return true;
22811417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
22911417b1cfde8f1749905f2d735623af9214148afJeff Brown        return super.onKeyDown(keyCode, event);
23011417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
23111417b1cfde8f1749905f2d735623af9214148afJeff Brown
23211417b1cfde8f1749905f2d735623af9214148afJeff Brown    @Override
23311417b1cfde8f1749905f2d735623af9214148afJeff Brown    public boolean onKeyUp(int keyCode, KeyEvent event) {
234ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
235ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown                || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
236ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown            return true;
23711417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
23811417b1cfde8f1749905f2d735623af9214148afJeff Brown        return super.onKeyUp(keyCode, event);
23911417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
24011417b1cfde8f1749905f2d735623af9214148afJeff Brown
24111417b1cfde8f1749905f2d735623af9214148afJeff Brown    private boolean update() {
24211417b1cfde8f1749905f2d735623af9214148afJeff Brown        if (!mRoute.isSelected() || mRoute.isDefault()) {
24311417b1cfde8f1749905f2d735623af9214148afJeff Brown            dismiss();
24411417b1cfde8f1749905f2d735623af9214148afJeff Brown            return false;
24511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
24694be6100218126ce6a08bf1f56209578500b361fRoboErik        if (!mCreated) {
24794be6100218126ce6a08bf1f56209578500b361fRoboErik            return false;
24894be6100218126ce6a08bf1f56209578500b361fRoboErik        }
24911417b1cfde8f1749905f2d735623af9214148afJeff Brown
25094be6100218126ce6a08bf1f56209578500b361fRoboErik        mRouteNameView.setText(mRoute.getName());
25111417b1cfde8f1749905f2d735623af9214148afJeff Brown
25294be6100218126ce6a08bf1f56209578500b361fRoboErik        if (mRoute.canDisconnect()) {
25394be6100218126ce6a08bf1f56209578500b361fRoboErik            mDisconnectButton.setVisibility(View.VISIBLE);
25494be6100218126ce6a08bf1f56209578500b361fRoboErik        } else {
25594be6100218126ce6a08bf1f56209578500b361fRoboErik            mDisconnectButton.setVisibility(View.GONE);
25694be6100218126ce6a08bf1f56209578500b361fRoboErik        }
2572ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown
25894be6100218126ce6a08bf1f56209578500b361fRoboErik        if (mRoute.getSettingsIntent() != null) {
25994be6100218126ce6a08bf1f56209578500b361fRoboErik            mSettingsButton.setVisibility(View.VISIBLE);
26094be6100218126ce6a08bf1f56209578500b361fRoboErik        } else {
26194be6100218126ce6a08bf1f56209578500b361fRoboErik            mSettingsButton.setVisibility(View.GONE);
26294be6100218126ce6a08bf1f56209578500b361fRoboErik        }
26394be6100218126ce6a08bf1f56209578500b361fRoboErik
26494be6100218126ce6a08bf1f56209578500b361fRoboErik        if (mControlView == null) {
26594be6100218126ce6a08bf1f56209578500b361fRoboErik            if (mDescription != null) {
26694be6100218126ce6a08bf1f56209578500b361fRoboErik                if (mDescription.getIconBitmap() != null) {
26794be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setImageBitmap(mDescription.getIconBitmap());
26894be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setVisibility(View.VISIBLE);
26994be6100218126ce6a08bf1f56209578500b361fRoboErik                } else if (mDescription.getIconUri() != null) {
27094be6100218126ce6a08bf1f56209578500b361fRoboErik                    // TODO replace with background load of icon
27194be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setImageURI(mDescription.getIconUri());
27294be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setVisibility(View.VISIBLE);
27394be6100218126ce6a08bf1f56209578500b361fRoboErik                } else {
27494be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setImageDrawable(null);
27594be6100218126ce6a08bf1f56209578500b361fRoboErik                    mArtView.setVisibility(View.GONE);
27694be6100218126ce6a08bf1f56209578500b361fRoboErik                }
27794be6100218126ce6a08bf1f56209578500b361fRoboErik
27894be6100218126ce6a08bf1f56209578500b361fRoboErik                boolean haveText = false;
27994be6100218126ce6a08bf1f56209578500b361fRoboErik                CharSequence text = mDescription.getTitle();
28094be6100218126ce6a08bf1f56209578500b361fRoboErik                if (!TextUtils.isEmpty(text)) {
28194be6100218126ce6a08bf1f56209578500b361fRoboErik                    mTitleView.setText(text);
28294be6100218126ce6a08bf1f56209578500b361fRoboErik                    haveText = true;
28394be6100218126ce6a08bf1f56209578500b361fRoboErik                } else {
28494be6100218126ce6a08bf1f56209578500b361fRoboErik                    mTitleView.setText(null);
28594be6100218126ce6a08bf1f56209578500b361fRoboErik                    mTitleView.setVisibility(View.GONE);
28694be6100218126ce6a08bf1f56209578500b361fRoboErik                }
28794be6100218126ce6a08bf1f56209578500b361fRoboErik                text = mDescription.getSubtitle();
28894be6100218126ce6a08bf1f56209578500b361fRoboErik                if (!TextUtils.isEmpty(text)) {
28994be6100218126ce6a08bf1f56209578500b361fRoboErik                    mSubtitleView.setText(mDescription.getSubtitle());
29094be6100218126ce6a08bf1f56209578500b361fRoboErik                    haveText = true;
29194be6100218126ce6a08bf1f56209578500b361fRoboErik                } else {
29294be6100218126ce6a08bf1f56209578500b361fRoboErik                    mSubtitleView.setText(null);
29394be6100218126ce6a08bf1f56209578500b361fRoboErik                    mSubtitleView.setVisibility(View.GONE);
29494be6100218126ce6a08bf1f56209578500b361fRoboErik                }
29594be6100218126ce6a08bf1f56209578500b361fRoboErik                if (!haveText) {
29694be6100218126ce6a08bf1f56209578500b361fRoboErik                    mTitlesWrapper.setVisibility(View.GONE);
29794be6100218126ce6a08bf1f56209578500b361fRoboErik                }
29894be6100218126ce6a08bf1f56209578500b361fRoboErik            } else {
29994be6100218126ce6a08bf1f56209578500b361fRoboErik                mArtView.setVisibility(View.GONE);
30094be6100218126ce6a08bf1f56209578500b361fRoboErik                mTitlesWrapper.setVisibility(View.GONE);
30194be6100218126ce6a08bf1f56209578500b361fRoboErik            }
30294be6100218126ce6a08bf1f56209578500b361fRoboErik            if (mState != null) {
30394be6100218126ce6a08bf1f56209578500b361fRoboErik                boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING
30494be6100218126ce6a08bf1f56209578500b361fRoboErik                        || mState.getState() == PlaybackStateCompat.STATE_PLAYING;
30594be6100218126ce6a08bf1f56209578500b361fRoboErik                boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY
30694be6100218126ce6a08bf1f56209578500b361fRoboErik                        | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
30794be6100218126ce6a08bf1f56209578500b361fRoboErik                boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE
30894be6100218126ce6a08bf1f56209578500b361fRoboErik                                | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0;
30994be6100218126ce6a08bf1f56209578500b361fRoboErik                if (isPlaying && supportsPause) {
31094be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setVisibility(View.VISIBLE);
31194be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setImageResource(R.drawable.ic_media_pause);
31294be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setContentDescription(getContext().getResources()
31394be6100218126ce6a08bf1f56209578500b361fRoboErik                            .getText(R.string.mr_media_route_controller_pause));
31494be6100218126ce6a08bf1f56209578500b361fRoboErik                } else if (!isPlaying && supportsPlay) {
31594be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setVisibility(View.VISIBLE);
31694be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setImageResource(R.drawable.ic_media_play);
31794be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setContentDescription(getContext().getResources()
31894be6100218126ce6a08bf1f56209578500b361fRoboErik                            .getText(R.string.mr_media_route_controller_play));
31994be6100218126ce6a08bf1f56209578500b361fRoboErik                } else {
32094be6100218126ce6a08bf1f56209578500b361fRoboErik                    mPlayPauseButton.setVisibility(View.GONE);
32194be6100218126ce6a08bf1f56209578500b361fRoboErik                }
32294be6100218126ce6a08bf1f56209578500b361fRoboErik            } else {
32394be6100218126ce6a08bf1f56209578500b361fRoboErik                mPlayPauseButton.setVisibility(View.GONE);
32494be6100218126ce6a08bf1f56209578500b361fRoboErik            }
3252ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown        }
32611417b1cfde8f1749905f2d735623af9214148afJeff Brown        return true;
32711417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
32811417b1cfde8f1749905f2d735623af9214148afJeff Brown
3292ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown    private Drawable getIconDrawable() {
3302ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown        if (mRoute.isConnecting()) {
3312ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            if (mMediaRouteConnectingDrawable == null) {
3322ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown                mMediaRouteConnectingDrawable = MediaRouterThemeHelper.getThemeDrawable(
3332ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown                        getContext(), R.attr.mediaRouteConnectingDrawable);
3342ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            }
3352ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            return mMediaRouteConnectingDrawable;
3362ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown        } else {
3372ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            if (mMediaRouteOnDrawable == null) {
3382ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown                mMediaRouteOnDrawable = MediaRouterThemeHelper.getThemeDrawable(
3392ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown                        getContext(), R.attr.mediaRouteOnDrawable);
3402ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            }
3412ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown            return mMediaRouteOnDrawable;
3422ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown        }
3432ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown    }
3442ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown
34511417b1cfde8f1749905f2d735623af9214148afJeff Brown    private final class MediaRouterCallback extends MediaRouter.Callback {
34611417b1cfde8f1749905f2d735623af9214148afJeff Brown        @Override
34711417b1cfde8f1749905f2d735623af9214148afJeff Brown        public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) {
34811417b1cfde8f1749905f2d735623af9214148afJeff Brown            update();
34911417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
35011417b1cfde8f1749905f2d735623af9214148afJeff Brown
35111417b1cfde8f1749905f2d735623af9214148afJeff Brown        @Override
35211417b1cfde8f1749905f2d735623af9214148afJeff Brown        public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) {
35311417b1cfde8f1749905f2d735623af9214148afJeff Brown            update();
35411417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
35511417b1cfde8f1749905f2d735623af9214148afJeff Brown
35611417b1cfde8f1749905f2d735623af9214148afJeff Brown        @Override
35711417b1cfde8f1749905f2d735623af9214148afJeff Brown        public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
35811417b1cfde8f1749905f2d735623af9214148afJeff Brown            if (route == mRoute) {
35994be6100218126ce6a08bf1f56209578500b361fRoboErik            }
36094be6100218126ce6a08bf1f56209578500b361fRoboErik        }
36194be6100218126ce6a08bf1f56209578500b361fRoboErik    }
36294be6100218126ce6a08bf1f56209578500b361fRoboErik
36394be6100218126ce6a08bf1f56209578500b361fRoboErik    private final class MediaControllerCallback extends MediaControllerCompat.Callback {
36494be6100218126ce6a08bf1f56209578500b361fRoboErik        @Override
36594be6100218126ce6a08bf1f56209578500b361fRoboErik        public void onSessionDestroyed() {
36694be6100218126ce6a08bf1f56209578500b361fRoboErik            if (mMediaController != null) {
36794be6100218126ce6a08bf1f56209578500b361fRoboErik                mMediaController.unregisterCallback(mControllerCallback);
36894be6100218126ce6a08bf1f56209578500b361fRoboErik                mMediaController = null;
36994be6100218126ce6a08bf1f56209578500b361fRoboErik            }
37094be6100218126ce6a08bf1f56209578500b361fRoboErik        }
37194be6100218126ce6a08bf1f56209578500b361fRoboErik
37294be6100218126ce6a08bf1f56209578500b361fRoboErik        @Override
37394be6100218126ce6a08bf1f56209578500b361fRoboErik        public void onPlaybackStateChanged(PlaybackStateCompat state) {
37494be6100218126ce6a08bf1f56209578500b361fRoboErik            mState = state;
37594be6100218126ce6a08bf1f56209578500b361fRoboErik            update();
37694be6100218126ce6a08bf1f56209578500b361fRoboErik        }
37794be6100218126ce6a08bf1f56209578500b361fRoboErik
37894be6100218126ce6a08bf1f56209578500b361fRoboErik        @Override
37994be6100218126ce6a08bf1f56209578500b361fRoboErik        public void onMetadataChanged(MediaMetadataCompat metadata) {
38094be6100218126ce6a08bf1f56209578500b361fRoboErik            mDescription = metadata == null ? null : metadata.getDescription();
38194be6100218126ce6a08bf1f56209578500b361fRoboErik            update();
38294be6100218126ce6a08bf1f56209578500b361fRoboErik        }
38394be6100218126ce6a08bf1f56209578500b361fRoboErik    }
38494be6100218126ce6a08bf1f56209578500b361fRoboErik
38594be6100218126ce6a08bf1f56209578500b361fRoboErik    private final class ClickListener implements View.OnClickListener {
38694be6100218126ce6a08bf1f56209578500b361fRoboErik        @Override
38794be6100218126ce6a08bf1f56209578500b361fRoboErik        public void onClick(View v) {
38894be6100218126ce6a08bf1f56209578500b361fRoboErik            int id = v.getId();
38994be6100218126ce6a08bf1f56209578500b361fRoboErik            if (id == R.id.stop || id == R.id.disconnect) {
39094be6100218126ce6a08bf1f56209578500b361fRoboErik                if (mRoute.isSelected()) {
39194be6100218126ce6a08bf1f56209578500b361fRoboErik                    mRouter.unselect(id == R.id.stop ?
39294be6100218126ce6a08bf1f56209578500b361fRoboErik                            MediaRouter.UNSELECT_REASON_STOPPED :
39394be6100218126ce6a08bf1f56209578500b361fRoboErik                            MediaRouter.UNSELECT_REASON_DISCONNECTED);
39494be6100218126ce6a08bf1f56209578500b361fRoboErik                }
39594be6100218126ce6a08bf1f56209578500b361fRoboErik                dismiss();
39694be6100218126ce6a08bf1f56209578500b361fRoboErik            } else if (id == R.id.play_pause) {
39794be6100218126ce6a08bf1f56209578500b361fRoboErik                if (mMediaController != null && mState != null) {
39894be6100218126ce6a08bf1f56209578500b361fRoboErik                    if (mState.getState() == PlaybackStateCompat.STATE_PLAYING) {
39994be6100218126ce6a08bf1f56209578500b361fRoboErik                        mMediaController.getTransportControls().pause();
40094be6100218126ce6a08bf1f56209578500b361fRoboErik                    } else {
40194be6100218126ce6a08bf1f56209578500b361fRoboErik                        mMediaController.getTransportControls().play();
40294be6100218126ce6a08bf1f56209578500b361fRoboErik                    }
40394be6100218126ce6a08bf1f56209578500b361fRoboErik                }
40494be6100218126ce6a08bf1f56209578500b361fRoboErik            } else if (id == R.id.settings) {
40594be6100218126ce6a08bf1f56209578500b361fRoboErik                IntentSender is = mRoute.getSettingsIntent();
40694be6100218126ce6a08bf1f56209578500b361fRoboErik                if (is != null) {
40794be6100218126ce6a08bf1f56209578500b361fRoboErik                    try {
40894be6100218126ce6a08bf1f56209578500b361fRoboErik                        is.sendIntent(null, 0, null, null, null);
40994be6100218126ce6a08bf1f56209578500b361fRoboErik                        dismiss();
41094be6100218126ce6a08bf1f56209578500b361fRoboErik                    } catch (Exception e) {
41194be6100218126ce6a08bf1f56209578500b361fRoboErik                        Log.e(TAG, "Error opening route settings.", e);
41294be6100218126ce6a08bf1f56209578500b361fRoboErik                    }
41394be6100218126ce6a08bf1f56209578500b361fRoboErik                }
41411417b1cfde8f1749905f2d735623af9214148afJeff Brown            }
41511417b1cfde8f1749905f2d735623af9214148afJeff Brown        }
41611417b1cfde8f1749905f2d735623af9214148afJeff Brown    }
41711417b1cfde8f1749905f2d735623af9214148afJeff Brown}
418