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