BrowseFragment.java revision 3ee2ea199ba4802754fb9108a45ef7c646c0eebb
1a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim/*
2a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * Copyright (C) 2015 The Android Open Source Project
3a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim *
4a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * Licensed under the Apache License, Version 2.0 (the "License");
5a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * you may not use this file except in compliance with the License.
6a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * You may obtain a copy of the License at
7a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim *
8a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim *      http://www.apache.org/licenses/LICENSE-2.0
9a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim *
10a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * Unless required by applicable law or agreed to in writing, software
11a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * distributed under the License is distributed on an "AS IS" BASIS,
12a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * See the License for the specific language governing permissions and
14a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * limitations under the License.
15a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim */
16a907614755847b2630561a1e5949b2b416600d97Sungsoo Limpackage com.example.android.supportv4.media;
17a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
18a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.app.Fragment;
19a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.content.ComponentName;
20a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.content.Context;
21a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.os.Bundle;
22a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.os.RemoteException;
23a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.support.v4.media.MediaBrowserCompat;
24a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.support.v4.media.session.MediaControllerCompat;
25a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.util.Log;
26a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.LayoutInflater;
27a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.View;
28a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.ViewGroup;
293ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moonimport android.widget.AbsListView;
30a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.AdapterView;
31a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ArrayAdapter;
32a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ImageView;
33a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ListView;
34a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.TextView;
35a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.Toast;
36a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
37a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport com.example.android.supportv4.R;
38a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
39a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport java.util.ArrayList;
40a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport java.util.List;
41a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
42a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim/**
43a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * A Fragment that lists all the various browsable queues available
44a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * from a {@link android.service.media.MediaBrowserService}.
45a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * <p/>
46a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * It uses a {@link MediaBrowserCompat} to connect to the {@link MediaBrowserServiceSupport}.
47a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * Once connected, the fragment subscribes to get all the children. All
483ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon * {@link MediaBrowserCompat.MediaItem} objects that can be browsed are shown in a ListView.
49a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim */
50a907614755847b2630561a1e5949b2b416600d97Sungsoo Limpublic class BrowseFragment extends Fragment {
51a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
52a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private static final String TAG = "BrowseFragment";
53a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
54a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static final String ARG_MEDIA_ID = "media_id";
55a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
563ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    // The number of media items per page.
573ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private static final int PAGE_SIZE = 6;
583ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
59a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static interface FragmentDataHelper {
60a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        void onMediaItemSelected(MediaBrowserCompat.MediaItem item);
61a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
62a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
63a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    // The mediaId to be used for subscribing for children using the MediaBrowser.
64a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private String mMediaId;
653ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private final List<MediaBrowserCompat.MediaItem> mMediaItems = new ArrayList<>();
66a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
673ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private boolean mCanLoadNewPage;
68a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat mMediaBrowser;
69a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private BrowseAdapter mBrowserAdapter;
70a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
71a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat.SubscriptionCallback mSubscriptionCallback =
72a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            new MediaBrowserCompat.SubscriptionCallback() {
733ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        @Override
743ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children,
753ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                Bundle options) {
763ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int page = options.getInt(MediaBrowserCompat.EXTRA_PAGE, -1);
773ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int pageSize = options.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1);
783ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (page < 0 || pageSize != PAGE_SIZE || children == null
793ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    || children.size() > PAGE_SIZE) {
803ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                return;
813ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
823ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
833ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int itemIndex = page * PAGE_SIZE;
843ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (itemIndex >= mMediaItems.size()) {
853ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (children.size() == 0) {
863ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    return;
873ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
883ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // An additional page is loaded.
893ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                mMediaItems.addAll(children);
903ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            } else {
913ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // An existing page is replaced by the newly loaded page.
923ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                for (MediaBrowserCompat.MediaItem item : children) {
933ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    if (itemIndex < mMediaItems.size()) {
943ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.set(itemIndex, item);
953ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    } else {
963ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.add(item);
973ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    }
983ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    itemIndex++;
993ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
1003ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1013ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // If the newly loaded page contains less than {PAGE_SIZE} items,
1023ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // then this page should be the last page.
1033ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (children.size() < PAGE_SIZE) {
1043ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    while (mMediaItems.size() > itemIndex) {
1053ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.remove(mMediaItems.size() - 1);
1063ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    }
1073ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
1083ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
1093ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mBrowserAdapter.notifyDataSetChanged();
1103ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mCanLoadNewPage = true;
1113ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        }
112a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
113a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
114a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children) {
1153ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            Log.d(TAG, "onChildrenLoaded: parentId=" + parentId);
1163ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mMediaItems.clear();
1173ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mMediaItems.addAll(children);
118a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            mBrowserAdapter.notifyDataSetChanged();
119a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
120a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
121a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
122a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onError(String id) {
123a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Toast.makeText(getActivity(), R.string.error_loading_media,
124a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    Toast.LENGTH_LONG).show();
125a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
126a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    };
127a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
128a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat.ConnectionCallback mConnectionCallback =
129a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            new MediaBrowserCompat.ConnectionCallback() {
130a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
131a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnected() {
132a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
133a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
134a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (mMediaBrowser.getSessionToken() == null) {
135a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                throw new IllegalArgumentException("No Session token");
136a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
137a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            MediaControllerCompat mediaController = null;
138a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            try {
139a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                mediaController = new MediaControllerCompat(getActivity(),
140a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                        mMediaBrowser.getSessionToken());
141a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            } catch (RemoteException e) {
142a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                Log.e(TAG, "Failed to create MediaController.", e);
143a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
144a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ((MediaBrowserSupport) getActivity()).setMediaController(mediaController);
1453ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1463ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (mMediaId == null) {
1473ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                mMediaId = mMediaBrowser.getRoot();
1483ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
1493ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1503ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (mMediaItems.size() == 0) {
1513ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                loadPage(0);
1523ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
153a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
154a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
155a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
156a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnectionFailed() {
157a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnectionFailed");
158a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
159a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
160a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
161a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnectionSuspended() {
162a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnectionSuspended");
163a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            getActivity().setMediaController(null);
164a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
165a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    };
166a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
167a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static BrowseFragment newInstance(String mediaId) {
168a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        Bundle args = new Bundle();
169a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        args.putString(ARG_MEDIA_ID, mediaId);
170a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        BrowseFragment fragment = new BrowseFragment();
171a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        fragment.setArguments(args);
172a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        return fragment;
173a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
174a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
175a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
176a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1773ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            Bundle savedInstanceState) {
178a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
179a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
1803ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        mBrowserAdapter = new BrowseAdapter(getActivity(), mMediaItems);
181a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
182a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        View controls = rootView.findViewById(R.id.controls);
183a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        controls.setVisibility(View.GONE);
184a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
185a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        ListView listView = (ListView) rootView.findViewById(R.id.list_view);
186a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        listView.setAdapter(mBrowserAdapter);
187a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
188a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            @Override
189a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
190a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                MediaBrowserCompat.MediaItem item = mBrowserAdapter.getItem(position);
191a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                try {
192a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    FragmentDataHelper listener = (FragmentDataHelper) getActivity();
193a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    listener.onMediaItemSelected(item);
194a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                } catch (ClassCastException ex) {
195a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    Log.e(TAG, "Exception trying to cast to FragmentDataHelper", ex);
196a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                }
197a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
198a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        });
199a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
200a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        Bundle args = getArguments();
201a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaId = args.getString(ARG_MEDIA_ID, null);
202a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
203a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser = new MediaBrowserCompat(getActivity(),
204a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                new ComponentName(getActivity(), MediaBrowserServiceSupport.class),
205a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                mConnectionCallback, null);
206a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2073ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
2083ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            @Override
2093ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
2103ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    int totalItemCount) {
2113ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (mCanLoadNewPage && firstVisibleItem + visibleItemCount == totalItemCount) {
2123ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    mCanLoadNewPage = false;
2133ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    loadPage((mMediaItems.size() + PAGE_SIZE - 1) / PAGE_SIZE);
2143ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
2153ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
2163ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
2173ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            @Override
2183ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            public void onScrollStateChanged(AbsListView view, int scrollState) {
2193ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // Do nothing
2203ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
2213ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        });
2223ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
223a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        return rootView;
224a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
225a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
226a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
227a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public void onStart() {
228a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        super.onStart();
229a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser.connect();
230a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
231a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
232a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
233a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public void onStop() {
234a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        super.onStop();
235a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser.disconnect();
236a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
237a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2383ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private void loadPage(int page) {
2393ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        Bundle options = new Bundle();
2403ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        options.putInt(MediaBrowserCompat.EXTRA_PAGE, page);
2413ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, PAGE_SIZE);
2423ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        mMediaBrowser.subscribe(mMediaId, options, mSubscriptionCallback);
2433ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    }
2443ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
2453ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    // An adapter for showing the list of browsed MediaItem objects
246a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private static class BrowseAdapter extends ArrayAdapter<MediaBrowserCompat.MediaItem> {
247a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2483ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        public BrowseAdapter(Context context, List<MediaBrowserCompat.MediaItem> mediaItems) {
2493ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            super(context, R.layout.media_list_item, mediaItems);
250a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
251a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
252a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        static class ViewHolder {
253a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ImageView mImageView;
254a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            TextView mTitleView;
255a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            TextView mDescriptionView;
256a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
257a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
258a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
259a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public View getView(int position, View convertView, ViewGroup parent) {
260a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
261a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ViewHolder holder;
262a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
263a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (convertView == null) {
264a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                convertView = LayoutInflater.from(getContext())
265a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                        .inflate(R.layout.media_list_item, parent, false);
266a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder = new ViewHolder();
267a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
268a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView.setVisibility(View.GONE);
269a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
270a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
271a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                convertView.setTag(holder);
272a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            } else {
273a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder = (ViewHolder) convertView.getTag();
274a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
275a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
276a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            MediaBrowserCompat.MediaItem item = getItem(position);
277a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            holder.mTitleView.setText(item.getDescription().getTitle());
278a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            holder.mDescriptionView.setText(item.getDescription().getDescription());
279a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (item.isPlayable()) {
280a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView.setImageDrawable(getContext().getResources()
281a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                        .getDrawable(R.drawable.ic_play_arrow_white_24dp));
282a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView.setVisibility(View.VISIBLE);
2833ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            } else {
2843ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                holder.mImageView.setVisibility(View.GONE);
285a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
286a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            return convertView;
287a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
288a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
2893ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon}