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