MediaRouteControllerDialog.java revision 6051d8374c90da4826698b66ed7cb13ebc2c65bf
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 196051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport static android.widget.SeekBar.OnSeekBarChangeListener; 206051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 21005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.content.ContentResolver; 2211417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.content.Context; 2394be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.content.IntentSender; 246051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport android.content.res.TypedArray; 25005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.graphics.Bitmap; 26005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.graphics.BitmapFactory; 272ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brownimport android.graphics.drawable.Drawable; 28005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.net.Uri; 29005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.os.AsyncTask; 3011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.os.Bundle; 3194be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.os.RemoteException; 3294be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.MediaDescriptionCompat; 3394be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.MediaMetadataCompat; 3494be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.MediaControllerCompat; 3594be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.MediaSessionCompat; 3694be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.support.v4.media.session.PlaybackStateCompat; 37005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport android.support.v7.graphics.Palette; 3811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouteSelector; 3911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.media.MediaRouter; 4011417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.support.v7.mediarouter.R; 4194be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.text.TextUtils; 4294be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.util.Log; 4311417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.KeyEvent; 446051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport android.view.LayoutInflater; 4511417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.view.View; 466051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport android.view.ViewGroup; 476051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport android.widget.ArrayAdapter; 4811417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.Button; 4911417b1cfde8f1749905f2d735623af9214148afJeff Brownimport android.widget.FrameLayout; 5094be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.ImageButton; 5194be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.ImageView; 52f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shahimport android.widget.LinearLayout; 536051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport android.widget.ListView; 54f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shahimport android.widget.SeekBar; 5594be6100218126ce6a08bf1f56209578500b361fRoboErikimport android.widget.TextView; 5611417b1cfde8f1749905f2d735623af9214148afJeff Brown 57005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport java.io.BufferedInputStream; 58005482649154d0970693b3967241eb4d2cb22003Jaewan Kimimport java.io.IOException; 596051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seoimport java.util.List; 60005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 6111417b1cfde8f1749905f2d735623af9214148afJeff Brown/** 6211417b1cfde8f1749905f2d735623af9214148afJeff Brown * This class implements the route controller dialog for {@link MediaRouter}. 6311417b1cfde8f1749905f2d735623af9214148afJeff Brown * <p> 6411417b1cfde8f1749905f2d735623af9214148afJeff Brown * This dialog allows the user to control or disconnect from the currently selected route. 6511417b1cfde8f1749905f2d735623af9214148afJeff Brown * </p> 6611417b1cfde8f1749905f2d735623af9214148afJeff Brown * 6711417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteButton 6811417b1cfde8f1749905f2d735623af9214148afJeff Brown * @see MediaRouteActionProvider 6911417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 7089530d511efd566d53bedd9178454dd01d227c61Jae Seopublic class MediaRouteControllerDialog extends AlertDialog { 7111417b1cfde8f1749905f2d735623af9214148afJeff Brown private static final String TAG = "MediaRouteControllerDialog"; 7211417b1cfde8f1749905f2d735623af9214148afJeff Brown 73a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo // STOPSHIP: Remove the flag when the group volume control implementation completes. 74a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo private static final boolean USE_GROUP = false; 75a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo 76f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // Time to wait before updating the volume when the user lets go of the seek bar 77f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // to allow the route provider time to propagate the change and publish a new 78f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // route descriptor. 79f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private static final int VOLUME_UPDATE_DELAY_MILLIS = 250; 80f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 8111417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouter mRouter; 8211417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouterCallback mCallback; 8311417b1cfde8f1749905f2d735623af9214148afJeff Brown private final MediaRouter.RouteInfo mRoute; 8411417b1cfde8f1749905f2d735623af9214148afJeff Brown 85eff7719415542ba819054863b0995f07742a7a8aJeff Brown private boolean mCreated; 86e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik private boolean mAttachedToWindow; 872ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable mMediaRouteConnectingDrawable; 882ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable mMediaRouteOnDrawable; 8911417b1cfde8f1749905f2d735623af9214148afJeff Brown 9011417b1cfde8f1749905f2d735623af9214148afJeff Brown private View mControlView; 9111417b1cfde8f1749905f2d735623af9214148afJeff Brown 9211417b1cfde8f1749905f2d735623af9214148afJeff Brown private Button mDisconnectButton; 9394be6100218126ce6a08bf1f56209578500b361fRoboErik private Button mStopCastingButton; 9494be6100218126ce6a08bf1f56209578500b361fRoboErik private ImageButton mPlayPauseButton; 9594be6100218126ce6a08bf1f56209578500b361fRoboErik private ImageButton mSettingsButton; 9610433d5f7b77f5453fb9a10e8e1c1a58c0f08e7bDongwon Kang private ImageButton mGroupExpandCollapseButton; 9794be6100218126ce6a08bf1f56209578500b361fRoboErik 9894be6100218126ce6a08bf1f56209578500b361fRoboErik private ImageView mArtView; 9994be6100218126ce6a08bf1f56209578500b361fRoboErik private TextView mTitleView; 10094be6100218126ce6a08bf1f56209578500b361fRoboErik private TextView mSubtitleView; 10194be6100218126ce6a08bf1f56209578500b361fRoboErik private TextView mRouteNameView; 10294be6100218126ce6a08bf1f56209578500b361fRoboErik 103f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private boolean mVolumeControlEnabled = true; 104f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private LinearLayout mVolumeLayout; 1056051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo private ListView mVolumeGroupList; 106f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private SeekBar mVolumeSlider; 107f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private boolean mVolumeSliderTouched; 108f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 10994be6100218126ce6a08bf1f56209578500b361fRoboErik private MediaControllerCompat mMediaController; 11094be6100218126ce6a08bf1f56209578500b361fRoboErik private MediaControllerCallback mControllerCallback; 11194be6100218126ce6a08bf1f56209578500b361fRoboErik private PlaybackStateCompat mState; 11294be6100218126ce6a08bf1f56209578500b361fRoboErik private MediaDescriptionCompat mDescription; 11394be6100218126ce6a08bf1f56209578500b361fRoboErik 114005482649154d0970693b3967241eb4d2cb22003Jaewan Kim private FetchArtTask mFetchArtTask; 11511417b1cfde8f1749905f2d735623af9214148afJeff Brown 11611417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouteControllerDialog(Context context) { 11711417b1cfde8f1749905f2d735623af9214148afJeff Brown this(context, 0); 11811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 11911417b1cfde8f1749905f2d735623af9214148afJeff Brown 12011417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouteControllerDialog(Context context, int theme) { 12194be6100218126ce6a08bf1f56209578500b361fRoboErik super(MediaRouterThemeHelper.createThemedContext(context), theme); 12211417b1cfde8f1749905f2d735623af9214148afJeff Brown context = getContext(); 12311417b1cfde8f1749905f2d735623af9214148afJeff Brown 12494be6100218126ce6a08bf1f56209578500b361fRoboErik mControllerCallback = new MediaControllerCallback(); 12511417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter = MediaRouter.getInstance(context); 12611417b1cfde8f1749905f2d735623af9214148afJeff Brown mCallback = new MediaRouterCallback(); 12711417b1cfde8f1749905f2d735623af9214148afJeff Brown mRoute = mRouter.getSelectedRoute(); 128e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik setMediaSession(mRouter.getMediaSessionToken()); 12911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13011417b1cfde8f1749905f2d735623af9214148afJeff Brown 13111417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 13211417b1cfde8f1749905f2d735623af9214148afJeff Brown * Gets the route that this dialog is controlling. 13311417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 13411417b1cfde8f1749905f2d735623af9214148afJeff Brown public MediaRouter.RouteInfo getRoute() { 13511417b1cfde8f1749905f2d735623af9214148afJeff Brown return mRoute; 13611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 13711417b1cfde8f1749905f2d735623af9214148afJeff Brown 1386051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo private MediaRouter.RouteGroup getGroup() { 1396051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo if (mRoute instanceof MediaRouter.RouteGroup) { 1406051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo return (MediaRouter.RouteGroup) mRoute; 1416051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 1426051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo return null; 1436051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 1446051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 14511417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 14611417b1cfde8f1749905f2d735623af9214148afJeff Brown * Provides the subclass an opportunity to create a view that will 14711417b1cfde8f1749905f2d735623af9214148afJeff Brown * be included within the body of the dialog to offer additional media controls 14811417b1cfde8f1749905f2d735623af9214148afJeff Brown * for the currently playing content. 14911417b1cfde8f1749905f2d735623af9214148afJeff Brown * 15011417b1cfde8f1749905f2d735623af9214148afJeff Brown * @param savedInstanceState The dialog's saved instance state. 15111417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The media control view, or null if none. 15211417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 15311417b1cfde8f1749905f2d735623af9214148afJeff Brown public View onCreateMediaControlView(Bundle savedInstanceState) { 15411417b1cfde8f1749905f2d735623af9214148afJeff Brown return null; 15511417b1cfde8f1749905f2d735623af9214148afJeff Brown } 15611417b1cfde8f1749905f2d735623af9214148afJeff Brown 15711417b1cfde8f1749905f2d735623af9214148afJeff Brown /** 15811417b1cfde8f1749905f2d735623af9214148afJeff Brown * Gets the media control view that was created by {@link #onCreateMediaControlView(Bundle)}. 15911417b1cfde8f1749905f2d735623af9214148afJeff Brown * 16011417b1cfde8f1749905f2d735623af9214148afJeff Brown * @return The media control view, or null if none. 16111417b1cfde8f1749905f2d735623af9214148afJeff Brown */ 16211417b1cfde8f1749905f2d735623af9214148afJeff Brown public View getMediaControlView() { 16311417b1cfde8f1749905f2d735623af9214148afJeff Brown return mControlView; 16411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 16511417b1cfde8f1749905f2d735623af9214148afJeff Brown 166eff7719415542ba819054863b0995f07742a7a8aJeff Brown /** 167f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * Sets whether to enable the volume slider and volume control using the volume keys 168f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * when the route supports it. 169f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * <p> 170f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * The default value is true. 171f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * </p> 172f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah */ 173f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public void setVolumeControlEnabled(boolean enable) { 174f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (mVolumeControlEnabled != enable) { 175f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeControlEnabled = enable; 176f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (mCreated) { 177f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah updateVolume(); 178f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 179f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 180f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 181f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 182f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah /** 183f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * Returns whether to enable the volume slider and volume control using the volume keys 184f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah * when the route supports it. 185f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah */ 186f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public boolean isVolumeControlEnabled() { 187f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah return mVolumeControlEnabled; 188f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 189f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 190f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah /** 19194be6100218126ce6a08bf1f56209578500b361fRoboErik * Set the session to use for metadata and transport controls. The dialog 19294be6100218126ce6a08bf1f56209578500b361fRoboErik * will listen to changes on this session and update the UI automatically in 19394be6100218126ce6a08bf1f56209578500b361fRoboErik * response to changes. 19494be6100218126ce6a08bf1f56209578500b361fRoboErik * 19594be6100218126ce6a08bf1f56209578500b361fRoboErik * @param sessionToken The token for the session to use. 196eff7719415542ba819054863b0995f07742a7a8aJeff Brown */ 197e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik private void setMediaSession(MediaSessionCompat.Token sessionToken) { 19894be6100218126ce6a08bf1f56209578500b361fRoboErik if (mMediaController != null) { 19994be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController.unregisterCallback(mControllerCallback); 20094be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController = null; 20194be6100218126ce6a08bf1f56209578500b361fRoboErik } 20294be6100218126ce6a08bf1f56209578500b361fRoboErik if (sessionToken == null) { 20394be6100218126ce6a08bf1f56209578500b361fRoboErik return; 20494be6100218126ce6a08bf1f56209578500b361fRoboErik } 205e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik if (!mAttachedToWindow) { 206e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik return; 207e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik } 20894be6100218126ce6a08bf1f56209578500b361fRoboErik try { 20994be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController = new MediaControllerCompat(getContext(), sessionToken); 21094be6100218126ce6a08bf1f56209578500b361fRoboErik } catch (RemoteException e) { 21194be6100218126ce6a08bf1f56209578500b361fRoboErik Log.e(TAG, "Error creating media controller in setMediaSession.", e); 21294be6100218126ce6a08bf1f56209578500b361fRoboErik } 21394be6100218126ce6a08bf1f56209578500b361fRoboErik if (mMediaController != null) { 21494be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController.registerCallback(mControllerCallback); 215eff7719415542ba819054863b0995f07742a7a8aJeff Brown } 21694be6100218126ce6a08bf1f56209578500b361fRoboErik MediaMetadataCompat metadata = mMediaController == null ? null 21794be6100218126ce6a08bf1f56209578500b361fRoboErik : mMediaController.getMetadata(); 21894be6100218126ce6a08bf1f56209578500b361fRoboErik mDescription = metadata == null ? null : metadata.getDescription(); 21994be6100218126ce6a08bf1f56209578500b361fRoboErik mState = mMediaController == null ? null : mMediaController.getPlaybackState(); 22094be6100218126ce6a08bf1f56209578500b361fRoboErik update(); 221eff7719415542ba819054863b0995f07742a7a8aJeff Brown } 222eff7719415542ba819054863b0995f07742a7a8aJeff Brown 223eff7719415542ba819054863b0995f07742a7a8aJeff Brown /** 22494be6100218126ce6a08bf1f56209578500b361fRoboErik * Gets the description being used by the default UI. 22594be6100218126ce6a08bf1f56209578500b361fRoboErik * 22694be6100218126ce6a08bf1f56209578500b361fRoboErik * @return The current description. 227eff7719415542ba819054863b0995f07742a7a8aJeff Brown */ 22894be6100218126ce6a08bf1f56209578500b361fRoboErik public MediaSessionCompat.Token getMediaSession() { 22994be6100218126ce6a08bf1f56209578500b361fRoboErik return mMediaController == null ? null : mMediaController.getSessionToken(); 230eff7719415542ba819054863b0995f07742a7a8aJeff Brown } 231eff7719415542ba819054863b0995f07742a7a8aJeff Brown 23211417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 23311417b1cfde8f1749905f2d735623af9214148afJeff Brown protected void onCreate(Bundle savedInstanceState) { 23411417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onCreate(savedInstanceState); 23511417b1cfde8f1749905f2d735623af9214148afJeff Brown 23694be6100218126ce6a08bf1f56209578500b361fRoboErik setContentView(R.layout.mr_media_route_controller_material_dialog_b); 23711417b1cfde8f1749905f2d735623af9214148afJeff Brown 23894be6100218126ce6a08bf1f56209578500b361fRoboErik ClickListener listener = new ClickListener(); 239d6748a7926ebb2450337f9f0ff4d445c980344e5Jeff Brown 24094be6100218126ce6a08bf1f56209578500b361fRoboErik mDisconnectButton = (Button) findViewById(R.id.disconnect); 24194be6100218126ce6a08bf1f56209578500b361fRoboErik mDisconnectButton.setOnClickListener(listener); 24211417b1cfde8f1749905f2d735623af9214148afJeff Brown 24394be6100218126ce6a08bf1f56209578500b361fRoboErik mStopCastingButton = (Button) findViewById(R.id.stop); 24494be6100218126ce6a08bf1f56209578500b361fRoboErik mStopCastingButton.setOnClickListener(listener); 24511417b1cfde8f1749905f2d735623af9214148afJeff Brown 24694be6100218126ce6a08bf1f56209578500b361fRoboErik mSettingsButton = (ImageButton) findViewById(R.id.settings); 24794be6100218126ce6a08bf1f56209578500b361fRoboErik mSettingsButton.setOnClickListener(listener); 24811417b1cfde8f1749905f2d735623af9214148afJeff Brown 24994be6100218126ce6a08bf1f56209578500b361fRoboErik mArtView = (ImageView) findViewById(R.id.art); 25094be6100218126ce6a08bf1f56209578500b361fRoboErik mTitleView = (TextView) findViewById(R.id.title); 25194be6100218126ce6a08bf1f56209578500b361fRoboErik mSubtitleView = (TextView) findViewById(R.id.subtitle); 25294be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton = (ImageButton) findViewById(R.id.play_pause); 25394be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setOnClickListener(listener); 25494be6100218126ce6a08bf1f56209578500b361fRoboErik mRouteNameView = (TextView) findViewById(R.id.route_name); 255f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeLayout = (LinearLayout)findViewById(R.id.media_route_volume_layout); 2566051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mVolumeGroupList = (ListView)findViewById(R.id.media_route_volume_group_list); 2576051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 2586051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo TypedArray styledAttributes = getContext().obtainStyledAttributes(new int[] { 2596051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo R.attr.mediaRouteExpandGroupDrawable, 2606051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo R.attr.mediaRouteCollapseGroupDrawable }); 2616051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo final Drawable expandGroupDrawable = styledAttributes.getDrawable(0); 2626051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo final Drawable collapseGroupDrawable = styledAttributes.getDrawable(1); 2636051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo styledAttributes.recycle(); 2646051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 26510433d5f7b77f5453fb9a10e8e1c1a58c0f08e7bDongwon Kang mGroupExpandCollapseButton = (ImageButton)findViewById( 26610433d5f7b77f5453fb9a10e8e1c1a58c0f08e7bDongwon Kang R.id.media_route_group_expand_collapse); 2676051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mGroupExpandCollapseButton.setOnClickListener(new View.OnClickListener() { 2686051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo private boolean mIsExpanded; 2696051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 2706051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo @Override 2716051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public void onClick(View v) { 2726051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mIsExpanded = !mIsExpanded; 2736051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo if (mIsExpanded) { 2746051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mGroupExpandCollapseButton.setImageDrawable(collapseGroupDrawable); 2756051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mVolumeGroupList.setVisibility(View.VISIBLE); 2766051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mVolumeGroupList.setAdapter( 2776051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo new VolumeGroupAdapter(getContext(), getGroup().getRoutes())); 2786051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } else { 2796051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mGroupExpandCollapseButton.setImageDrawable(expandGroupDrawable); 2806051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo mVolumeGroupList.setVisibility(View.GONE); 2816051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 2826051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 2836051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo }); 284f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider = (SeekBar)findViewById(R.id.media_route_volume_slider); 285f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 286f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private final Runnable mStopTrackingTouch = new Runnable() { 287f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah @Override 288f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public void run() { 289f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (mVolumeSliderTouched) { 290f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSliderTouched = false; 291f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah updateVolume(); 292f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 293f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 294f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah }; 295f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 296f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah @Override 297f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public void onStartTrackingTouch(SeekBar seekBar) { 298f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (mVolumeSliderTouched) { 299f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider.removeCallbacks(mStopTrackingTouch); 300f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } else { 301f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSliderTouched = true; 302f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 303f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 304f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 305f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah @Override 306f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public void onStopTrackingTouch(SeekBar seekBar) { 307f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // Defer resetting mVolumeSliderTouched to allow the media route provider 308f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // a little time to settle into its new state and publish the final 309f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah // volume update. 310f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider.postDelayed(mStopTrackingTouch, VOLUME_UPDATE_DELAY_MILLIS); 311f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 312f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 313f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah @Override 314f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 315f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (fromUser) { 316f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mRoute.requestSetVolume(progress); 317f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 318f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 319f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah }); 32011417b1cfde8f1749905f2d735623af9214148afJeff Brown 321eff7719415542ba819054863b0995f07742a7a8aJeff Brown mCreated = true; 32211417b1cfde8f1749905f2d735623af9214148afJeff Brown if (update()) { 32311417b1cfde8f1749905f2d735623af9214148afJeff Brown mControlView = onCreateMediaControlView(savedInstanceState); 324697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah FrameLayout controlFrame = 325697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah (FrameLayout)findViewById(R.id.media_route_control_frame); 32611417b1cfde8f1749905f2d735623af9214148afJeff Brown if (mControlView != null) { 32794be6100218126ce6a08bf1f56209578500b361fRoboErik controlFrame.findViewById(R.id.default_control_frame).setVisibility(View.GONE); 328697ff1cbd5efee431fb10c74b31071cf95341203Prameet Shah controlFrame.addView(mControlView); 32911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 33011417b1cfde8f1749905f2d735623af9214148afJeff Brown } 33111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 33211417b1cfde8f1749905f2d735623af9214148afJeff Brown 33311417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 33411417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onAttachedToWindow() { 33511417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onAttachedToWindow(); 336e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik mAttachedToWindow = true; 33711417b1cfde8f1749905f2d735623af9214148afJeff Brown 33811417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter.addCallback(MediaRouteSelector.EMPTY, mCallback, 33911417b1cfde8f1749905f2d735623af9214148afJeff Brown MediaRouter.CALLBACK_FLAG_UNFILTERED_EVENTS); 340e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik setMediaSession(mRouter.getMediaSessionToken()); 34111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 34211417b1cfde8f1749905f2d735623af9214148afJeff Brown 34311417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 34411417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onDetachedFromWindow() { 34511417b1cfde8f1749905f2d735623af9214148afJeff Brown mRouter.removeCallback(mCallback); 346e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik setMediaSession(null); 347e49860b0f76d8336c1d41831ed370b0ff94278efRoboErik mAttachedToWindow = false; 34811417b1cfde8f1749905f2d735623af9214148afJeff Brown super.onDetachedFromWindow(); 34911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 35011417b1cfde8f1749905f2d735623af9214148afJeff Brown 35111417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 35211417b1cfde8f1749905f2d735623af9214148afJeff Brown public boolean onKeyDown(int keyCode, KeyEvent event) { 353ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 354ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 355ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown mRoute.requestUpdateVolume(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ? -1 : 1); 356ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown return true; 35711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 35811417b1cfde8f1749905f2d735623af9214148afJeff Brown return super.onKeyDown(keyCode, event); 35911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 36011417b1cfde8f1749905f2d735623af9214148afJeff Brown 36111417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 36211417b1cfde8f1749905f2d735623af9214148afJeff Brown public boolean onKeyUp(int keyCode, KeyEvent event) { 363ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 364ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 365ce8cbd614a64f94e54b936d66ecd14b6c1282ddfJeff Brown return true; 36611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 36711417b1cfde8f1749905f2d735623af9214148afJeff Brown return super.onKeyUp(keyCode, event); 36811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 36911417b1cfde8f1749905f2d735623af9214148afJeff Brown 37011417b1cfde8f1749905f2d735623af9214148afJeff Brown private boolean update() { 37111417b1cfde8f1749905f2d735623af9214148afJeff Brown if (!mRoute.isSelected() || mRoute.isDefault()) { 37211417b1cfde8f1749905f2d735623af9214148afJeff Brown dismiss(); 37311417b1cfde8f1749905f2d735623af9214148afJeff Brown return false; 37411417b1cfde8f1749905f2d735623af9214148afJeff Brown } 37594be6100218126ce6a08bf1f56209578500b361fRoboErik if (!mCreated) { 37694be6100218126ce6a08bf1f56209578500b361fRoboErik return false; 37794be6100218126ce6a08bf1f56209578500b361fRoboErik } 37811417b1cfde8f1749905f2d735623af9214148afJeff Brown 379f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah updateVolume(); 380f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 38194be6100218126ce6a08bf1f56209578500b361fRoboErik mRouteNameView.setText(mRoute.getName()); 38211417b1cfde8f1749905f2d735623af9214148afJeff Brown 38394be6100218126ce6a08bf1f56209578500b361fRoboErik if (mRoute.canDisconnect()) { 38494be6100218126ce6a08bf1f56209578500b361fRoboErik mDisconnectButton.setVisibility(View.VISIBLE); 38594be6100218126ce6a08bf1f56209578500b361fRoboErik } else { 38694be6100218126ce6a08bf1f56209578500b361fRoboErik mDisconnectButton.setVisibility(View.GONE); 38794be6100218126ce6a08bf1f56209578500b361fRoboErik } 3882ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown 38994be6100218126ce6a08bf1f56209578500b361fRoboErik if (mRoute.getSettingsIntent() != null) { 39094be6100218126ce6a08bf1f56209578500b361fRoboErik mSettingsButton.setVisibility(View.VISIBLE); 39194be6100218126ce6a08bf1f56209578500b361fRoboErik } else { 39294be6100218126ce6a08bf1f56209578500b361fRoboErik mSettingsButton.setVisibility(View.GONE); 39394be6100218126ce6a08bf1f56209578500b361fRoboErik } 39494be6100218126ce6a08bf1f56209578500b361fRoboErik 39594be6100218126ce6a08bf1f56209578500b361fRoboErik if (mControlView == null) { 396005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (mFetchArtTask != null) { 397005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mFetchArtTask.cancel(true); 39866937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang } 399005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setVisibility(View.GONE); 400005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mFetchArtTask = new FetchArtTask(); 401005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mFetchArtTask.execute(); 4025db1d51338a41b1dab537a5a37a0de8f5f0cc5b9Jae Seo 40366937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang CharSequence title = mDescription == null ? null : mDescription.getTitle(); 40466937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang boolean hasTitle = !TextUtils.isEmpty(title); 40566937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang 40666937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang CharSequence subtitle = mDescription == null ? null : mDescription.getSubtitle(); 40766937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang boolean hasSubtitle = !TextUtils.isEmpty(subtitle); 40866937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang 40966937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang if (!hasTitle && !hasSubtitle) { 41066937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setText(R.string.mr_media_route_controller_no_info_available); 41166937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setEnabled(false); 41266937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setVisibility(View.VISIBLE); 41366937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mSubtitleView.setVisibility(View.GONE); 41466937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang } else { 41566937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setText(title); 41666937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setEnabled(hasTitle); 41766937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mTitleView.setVisibility(hasTitle ? View.VISIBLE : View.GONE); 41866937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mSubtitleView.setText(subtitle); 41966937fc7dfe22c8c505bf735781d1f5b62f08e34Dongwon Kang mSubtitleView.setVisibility(hasSubtitle ? View.VISIBLE : View.GONE); 42094be6100218126ce6a08bf1f56209578500b361fRoboErik } 42194be6100218126ce6a08bf1f56209578500b361fRoboErik if (mState != null) { 42294be6100218126ce6a08bf1f56209578500b361fRoboErik boolean isPlaying = mState.getState() == PlaybackStateCompat.STATE_BUFFERING 42394be6100218126ce6a08bf1f56209578500b361fRoboErik || mState.getState() == PlaybackStateCompat.STATE_PLAYING; 42494be6100218126ce6a08bf1f56209578500b361fRoboErik boolean supportsPlay = (mState.getActions() & (PlaybackStateCompat.ACTION_PLAY 42594be6100218126ce6a08bf1f56209578500b361fRoboErik | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0; 42694be6100218126ce6a08bf1f56209578500b361fRoboErik boolean supportsPause = (mState.getActions() & (PlaybackStateCompat.ACTION_PAUSE 42794be6100218126ce6a08bf1f56209578500b361fRoboErik | PlaybackStateCompat.ACTION_PLAY_PAUSE)) != 0; 42894be6100218126ce6a08bf1f56209578500b361fRoboErik if (isPlaying && supportsPause) { 42994be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setVisibility(View.VISIBLE); 43092badabc6a274e3bf8ea2a0072e8a6371f252722RoboErik mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource( 43192badabc6a274e3bf8ea2a0072e8a6371f252722RoboErik getContext(), R.attr.mediaRoutePauseDrawable)); 43294be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setContentDescription(getContext().getResources() 43394be6100218126ce6a08bf1f56209578500b361fRoboErik .getText(R.string.mr_media_route_controller_pause)); 43494be6100218126ce6a08bf1f56209578500b361fRoboErik } else if (!isPlaying && supportsPlay) { 43594be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setVisibility(View.VISIBLE); 43692badabc6a274e3bf8ea2a0072e8a6371f252722RoboErik mPlayPauseButton.setImageResource(MediaRouterThemeHelper.getThemeResource( 43792badabc6a274e3bf8ea2a0072e8a6371f252722RoboErik getContext(), R.attr.mediaRoutePlayDrawable)); 43894be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setContentDescription(getContext().getResources() 43994be6100218126ce6a08bf1f56209578500b361fRoboErik .getText(R.string.mr_media_route_controller_play)); 44094be6100218126ce6a08bf1f56209578500b361fRoboErik } else { 44194be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setVisibility(View.GONE); 44294be6100218126ce6a08bf1f56209578500b361fRoboErik } 44394be6100218126ce6a08bf1f56209578500b361fRoboErik } else { 44494be6100218126ce6a08bf1f56209578500b361fRoboErik mPlayPauseButton.setVisibility(View.GONE); 44594be6100218126ce6a08bf1f56209578500b361fRoboErik } 4462ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 44711417b1cfde8f1749905f2d735623af9214148afJeff Brown return true; 44811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 44911417b1cfde8f1749905f2d735623af9214148afJeff Brown 4502ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown private Drawable getIconDrawable() { 4512ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mRoute.isConnecting()) { 4522ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mMediaRouteConnectingDrawable == null) { 4532ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown mMediaRouteConnectingDrawable = MediaRouterThemeHelper.getThemeDrawable( 4542ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown getContext(), R.attr.mediaRouteConnectingDrawable); 4552ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 4562ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown return mMediaRouteConnectingDrawable; 4572ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } else { 4582ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown if (mMediaRouteOnDrawable == null) { 4592ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown mMediaRouteOnDrawable = MediaRouterThemeHelper.getThemeDrawable( 4602ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown getContext(), R.attr.mediaRouteOnDrawable); 4612ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 4622ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown return mMediaRouteOnDrawable; 4632ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 4642ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown } 4652ef36d857302c5cd738c7c8bdec53d31feebebbaJeff Brown 466f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private void updateVolume() { 467f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (!mVolumeSliderTouched) { 468f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah if (isVolumeControlAvailable()) { 469f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeLayout.setVisibility(View.VISIBLE); 470f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider.setMax(mRoute.getVolumeMax()); 471f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeSlider.setProgress(mRoute.getVolume()); 472a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo if (USE_GROUP) { 473a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo mGroupExpandCollapseButton.setVisibility( 4746051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo getGroup() != null ? View.VISIBLE : View.GONE); 475a4bcfe765789ebef71c36cbb2dba3f9f881fa5b4Jae Seo } 476f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } else { 477f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah mVolumeLayout.setVisibility(View.GONE); 478f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 479f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 480f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 481f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 482f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah private boolean isVolumeControlAvailable() { 483f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah return mVolumeControlEnabled && mRoute.getVolumeHandling() == 484f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE; 485f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah } 486f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah 48711417b1cfde8f1749905f2d735623af9214148afJeff Brown private final class MediaRouterCallback extends MediaRouter.Callback { 48811417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 48911417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo route) { 49011417b1cfde8f1749905f2d735623af9214148afJeff Brown update(); 49111417b1cfde8f1749905f2d735623af9214148afJeff Brown } 49211417b1cfde8f1749905f2d735623af9214148afJeff Brown 49311417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 49411417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo route) { 49511417b1cfde8f1749905f2d735623af9214148afJeff Brown update(); 49611417b1cfde8f1749905f2d735623af9214148afJeff Brown } 49711417b1cfde8f1749905f2d735623af9214148afJeff Brown 49811417b1cfde8f1749905f2d735623af9214148afJeff Brown @Override 49911417b1cfde8f1749905f2d735623af9214148afJeff Brown public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) { 50011417b1cfde8f1749905f2d735623af9214148afJeff Brown if (route == mRoute) { 501f1ca2f34f5efed21a49d92dd06e8e51be104c10bPrameet Shah updateVolume(); 50294be6100218126ce6a08bf1f56209578500b361fRoboErik } 50394be6100218126ce6a08bf1f56209578500b361fRoboErik } 50494be6100218126ce6a08bf1f56209578500b361fRoboErik } 50594be6100218126ce6a08bf1f56209578500b361fRoboErik 50694be6100218126ce6a08bf1f56209578500b361fRoboErik private final class MediaControllerCallback extends MediaControllerCompat.Callback { 50794be6100218126ce6a08bf1f56209578500b361fRoboErik @Override 50894be6100218126ce6a08bf1f56209578500b361fRoboErik public void onSessionDestroyed() { 50994be6100218126ce6a08bf1f56209578500b361fRoboErik if (mMediaController != null) { 51094be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController.unregisterCallback(mControllerCallback); 51194be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController = null; 51294be6100218126ce6a08bf1f56209578500b361fRoboErik } 51394be6100218126ce6a08bf1f56209578500b361fRoboErik } 51494be6100218126ce6a08bf1f56209578500b361fRoboErik 51594be6100218126ce6a08bf1f56209578500b361fRoboErik @Override 51694be6100218126ce6a08bf1f56209578500b361fRoboErik public void onPlaybackStateChanged(PlaybackStateCompat state) { 51794be6100218126ce6a08bf1f56209578500b361fRoboErik mState = state; 51894be6100218126ce6a08bf1f56209578500b361fRoboErik update(); 51994be6100218126ce6a08bf1f56209578500b361fRoboErik } 52094be6100218126ce6a08bf1f56209578500b361fRoboErik 52194be6100218126ce6a08bf1f56209578500b361fRoboErik @Override 52294be6100218126ce6a08bf1f56209578500b361fRoboErik public void onMetadataChanged(MediaMetadataCompat metadata) { 52394be6100218126ce6a08bf1f56209578500b361fRoboErik mDescription = metadata == null ? null : metadata.getDescription(); 52494be6100218126ce6a08bf1f56209578500b361fRoboErik update(); 52594be6100218126ce6a08bf1f56209578500b361fRoboErik } 52694be6100218126ce6a08bf1f56209578500b361fRoboErik } 52794be6100218126ce6a08bf1f56209578500b361fRoboErik 52894be6100218126ce6a08bf1f56209578500b361fRoboErik private final class ClickListener implements View.OnClickListener { 52994be6100218126ce6a08bf1f56209578500b361fRoboErik @Override 53094be6100218126ce6a08bf1f56209578500b361fRoboErik public void onClick(View v) { 53194be6100218126ce6a08bf1f56209578500b361fRoboErik int id = v.getId(); 53294be6100218126ce6a08bf1f56209578500b361fRoboErik if (id == R.id.stop || id == R.id.disconnect) { 53394be6100218126ce6a08bf1f56209578500b361fRoboErik if (mRoute.isSelected()) { 53494be6100218126ce6a08bf1f56209578500b361fRoboErik mRouter.unselect(id == R.id.stop ? 53594be6100218126ce6a08bf1f56209578500b361fRoboErik MediaRouter.UNSELECT_REASON_STOPPED : 53694be6100218126ce6a08bf1f56209578500b361fRoboErik MediaRouter.UNSELECT_REASON_DISCONNECTED); 53794be6100218126ce6a08bf1f56209578500b361fRoboErik } 53894be6100218126ce6a08bf1f56209578500b361fRoboErik dismiss(); 53994be6100218126ce6a08bf1f56209578500b361fRoboErik } else if (id == R.id.play_pause) { 54094be6100218126ce6a08bf1f56209578500b361fRoboErik if (mMediaController != null && mState != null) { 54194be6100218126ce6a08bf1f56209578500b361fRoboErik if (mState.getState() == PlaybackStateCompat.STATE_PLAYING) { 54294be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController.getTransportControls().pause(); 54394be6100218126ce6a08bf1f56209578500b361fRoboErik } else { 54494be6100218126ce6a08bf1f56209578500b361fRoboErik mMediaController.getTransportControls().play(); 54594be6100218126ce6a08bf1f56209578500b361fRoboErik } 54694be6100218126ce6a08bf1f56209578500b361fRoboErik } 54794be6100218126ce6a08bf1f56209578500b361fRoboErik } else if (id == R.id.settings) { 54894be6100218126ce6a08bf1f56209578500b361fRoboErik IntentSender is = mRoute.getSettingsIntent(); 54994be6100218126ce6a08bf1f56209578500b361fRoboErik if (is != null) { 55094be6100218126ce6a08bf1f56209578500b361fRoboErik try { 55194be6100218126ce6a08bf1f56209578500b361fRoboErik is.sendIntent(null, 0, null, null, null); 55294be6100218126ce6a08bf1f56209578500b361fRoboErik dismiss(); 55394be6100218126ce6a08bf1f56209578500b361fRoboErik } catch (Exception e) { 55494be6100218126ce6a08bf1f56209578500b361fRoboErik Log.e(TAG, "Error opening route settings.", e); 55594be6100218126ce6a08bf1f56209578500b361fRoboErik } 55694be6100218126ce6a08bf1f56209578500b361fRoboErik } 55711417b1cfde8f1749905f2d735623af9214148afJeff Brown } 55811417b1cfde8f1749905f2d735623af9214148afJeff Brown } 55911417b1cfde8f1749905f2d735623af9214148afJeff Brown } 560005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 5616051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo private class VolumeGroupAdapter extends ArrayAdapter<MediaRouter.RouteInfo> { 5626051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo final OnSeekBarChangeListener mOnSeekBarChangeListener = new OnSeekBarChangeListener() { 5636051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo @Override 5646051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 5656051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo if (fromUser) { 5666051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo int position = (int) seekBar.getTag(); 5676051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo getGroup().getRouteAt(position).requestSetVolume(progress); 5686051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5696051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5706051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 5716051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo @Override 5726051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public void onStartTrackingTouch(SeekBar seekBar) { 5736051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo // TODO: Implement 5746051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5756051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 5766051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo @Override 5776051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public void onStopTrackingTouch(SeekBar seekBar) { 5786051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo // TODO: Implement 5796051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5806051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo }; 5816051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 5826051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public VolumeGroupAdapter(Context context, List<MediaRouter.RouteInfo> objects) { 5836051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo super(context, 0, objects); 5846051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5856051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 5866051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo @Override 5876051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo public View getView(final int position, View convertView, ViewGroup parent) { 5886051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo View v = convertView; 5896051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo if (v == null) { 5906051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo v = LayoutInflater.from(getContext()).inflate( 5916051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo R.layout.mr_media_route_controller_volume_item, null); 5926051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 5936051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo MediaRouter.RouteInfo route = getItem(position); 5946051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo if (route != null) { 5956051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo TextView textView = (TextView) v.findViewById(R.id.media_route_name); 5966051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo textView.setText(route.getName()); 5976051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 5986051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo SeekBar volumeSlider = (SeekBar) v.findViewById(R.id.media_route_volume_slider); 5996051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo volumeSlider.setTag(position); 6006051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo volumeSlider.setOnSeekBarChangeListener(mOnSeekBarChangeListener); 6016051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 6026051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo return v; 6036051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 6046051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo } 6056051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo 606005482649154d0970693b3967241eb4d2cb22003Jaewan Kim private class FetchArtTask extends AsyncTask<Void, Void, Bitmap> { 607005482649154d0970693b3967241eb4d2cb22003Jaewan Kim private int mBackgroundColor; 608005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 609005482649154d0970693b3967241eb4d2cb22003Jaewan Kim @Override 610005482649154d0970693b3967241eb4d2cb22003Jaewan Kim protected Bitmap doInBackground(Void... arg) { 611005482649154d0970693b3967241eb4d2cb22003Jaewan Kim Bitmap bitmap = null; 612005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (mDescription == null) { 613005482649154d0970693b3967241eb4d2cb22003Jaewan Kim return null; 614005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 615005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (mDescription.getIconBitmap() != null) { 616005482649154d0970693b3967241eb4d2cb22003Jaewan Kim bitmap = mDescription.getIconBitmap(); 617005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } else if (mDescription.getIconUri() != null) { 618005482649154d0970693b3967241eb4d2cb22003Jaewan Kim Uri iconUri = mDescription.getIconUri(); 619005482649154d0970693b3967241eb4d2cb22003Jaewan Kim String scheme = iconUri.getScheme(); 620005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (!(ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme) 621005482649154d0970693b3967241eb4d2cb22003Jaewan Kim || ContentResolver.SCHEME_CONTENT.equals(scheme) 622005482649154d0970693b3967241eb4d2cb22003Jaewan Kim || ContentResolver.SCHEME_FILE.equals(scheme))) { 623005482649154d0970693b3967241eb4d2cb22003Jaewan Kim Log.w(TAG, "Icon Uri should point to local resources."); 624005482649154d0970693b3967241eb4d2cb22003Jaewan Kim return null; 625005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 626005482649154d0970693b3967241eb4d2cb22003Jaewan Kim BufferedInputStream stream = null; 627005482649154d0970693b3967241eb4d2cb22003Jaewan Kim try { 628005482649154d0970693b3967241eb4d2cb22003Jaewan Kim stream = new BufferedInputStream( 629005482649154d0970693b3967241eb4d2cb22003Jaewan Kim getContext().getContentResolver().openInputStream(iconUri)); 630005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 631005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // Query bitmap size. 632005482649154d0970693b3967241eb4d2cb22003Jaewan Kim BitmapFactory.Options options = new BitmapFactory.Options(); 633005482649154d0970693b3967241eb4d2cb22003Jaewan Kim options.inJustDecodeBounds = true; 634005482649154d0970693b3967241eb4d2cb22003Jaewan Kim BitmapFactory.decodeStream(stream, null, options); 635005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 636005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // Rewind the stream in order to restart bitmap decoding. 637005482649154d0970693b3967241eb4d2cb22003Jaewan Kim try { 638005482649154d0970693b3967241eb4d2cb22003Jaewan Kim stream.reset(); 639005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } catch (IOException e) { 640005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // Failed to rewind the stream, try to reopen it. 641005482649154d0970693b3967241eb4d2cb22003Jaewan Kim stream.close(); 642005482649154d0970693b3967241eb4d2cb22003Jaewan Kim stream = new BufferedInputStream(getContext().getContentResolver() 643005482649154d0970693b3967241eb4d2cb22003Jaewan Kim .openInputStream(iconUri)); 644005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 645005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 646005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // Caculate required size to decode the bitmap and possibly resize it. 647005482649154d0970693b3967241eb4d2cb22003Jaewan Kim options.inJustDecodeBounds = false; 648005482649154d0970693b3967241eb4d2cb22003Jaewan Kim int reqWidth; 649005482649154d0970693b3967241eb4d2cb22003Jaewan Kim int reqHeight; 650005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (options.outWidth >= options.outHeight) { 651005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // For landscape image, fit width to dialog width. 652005482649154d0970693b3967241eb4d2cb22003Jaewan Kim reqWidth = getWindow().getDecorView().getWidth(); 653005482649154d0970693b3967241eb4d2cb22003Jaewan Kim reqHeight = reqWidth * (options.outHeight / options.outWidth); 654005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } else { 655005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // For portrait image, fit height to 16:9 ratio case's height. 656005482649154d0970693b3967241eb4d2cb22003Jaewan Kim reqHeight = getWindow().getDecorView().getWidth() * 9 / 16; 657005482649154d0970693b3967241eb4d2cb22003Jaewan Kim reqWidth = reqHeight * (options.outWidth / options.outHeight); 658005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 659005482649154d0970693b3967241eb4d2cb22003Jaewan Kim int ratio = Math.max( 660005482649154d0970693b3967241eb4d2cb22003Jaewan Kim options.outWidth / reqWidth, options.outHeight / reqHeight); 661005482649154d0970693b3967241eb4d2cb22003Jaewan Kim options.inSampleSize = Math.max(1, Integer.highestOneBit(ratio)); 662005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (isCancelled()) { 663005482649154d0970693b3967241eb4d2cb22003Jaewan Kim return null; 664005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 665005482649154d0970693b3967241eb4d2cb22003Jaewan Kim bitmap = BitmapFactory.decodeStream(stream, null, options); 666005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } catch (IOException e){ 667005482649154d0970693b3967241eb4d2cb22003Jaewan Kim Log.w(TAG, "Unable to open content: " + iconUri, e); 668005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } finally { 669005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (stream != null) { 670005482649154d0970693b3967241eb4d2cb22003Jaewan Kim try { 671005482649154d0970693b3967241eb4d2cb22003Jaewan Kim stream.close(); 672005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } catch (IOException e) { 673005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 674005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 675005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 676005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 677005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (bitmap != null) { 678005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (bitmap.getWidth() < bitmap.getHeight()) { 679005482649154d0970693b3967241eb4d2cb22003Jaewan Kim // Portrait image requires background color. 680005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mBackgroundColor = 681005482649154d0970693b3967241eb4d2cb22003Jaewan Kim new Palette.Builder(bitmap).generate().getDarkVibrantColor(0); 682005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 683005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 684005482649154d0970693b3967241eb4d2cb22003Jaewan Kim return bitmap; 685005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 686005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 687005482649154d0970693b3967241eb4d2cb22003Jaewan Kim @Override 688005482649154d0970693b3967241eb4d2cb22003Jaewan Kim protected void onCancelled() { 689005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mFetchArtTask = null; 690005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 691005482649154d0970693b3967241eb4d2cb22003Jaewan Kim 692005482649154d0970693b3967241eb4d2cb22003Jaewan Kim @Override 693005482649154d0970693b3967241eb4d2cb22003Jaewan Kim protected void onPostExecute(Bitmap bitmap) { 694005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mFetchArtTask = null; 695005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setImageBitmap(bitmap); 696005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (bitmap != null) { 697005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setVisibility(View.VISIBLE); 698005482649154d0970693b3967241eb4d2cb22003Jaewan Kim if (bitmap.getWidth() < bitmap.getHeight()) { 699005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setMaxHeight(getWindow().getDecorView().getWidth() * 9 / 16); 700005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setBackgroundColor(mBackgroundColor); 701005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } else { 702005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setMaxHeight(Integer.MAX_VALUE); 703005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 704005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } else { 705005482649154d0970693b3967241eb4d2cb22003Jaewan Kim mArtView.setVisibility(View.GONE); 706005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 707005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 708005482649154d0970693b3967241eb4d2cb22003Jaewan Kim } 7096051d8374c90da4826698b66ed7cb13ebc2c65bfJae Seo} 710