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.content.ComponentName;
19a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.content.Context;
20a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.os.Bundle;
21a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.os.RemoteException;
227a37b5e2010dd1e9a8775fc217b0e7043ed06417Donghyun Choimport android.support.v4.app.Fragment;
2367949f5f3bc1f721fa5f63250f0fd74a44f5381fAurimas Liutikasimport android.support.v4.content.ContextCompat;
24a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.support.v4.media.MediaBrowserCompat;
25a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.support.v4.media.session.MediaControllerCompat;
26a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.util.Log;
27a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.LayoutInflater;
28a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.View;
29a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.view.ViewGroup;
303ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moonimport android.widget.AbsListView;
31a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.AdapterView;
32a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ArrayAdapter;
33a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ImageView;
34a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.ListView;
35a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.TextView;
36a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport android.widget.Toast;
37a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
38a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport com.example.android.supportv4.R;
39a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
40a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport java.util.ArrayList;
419a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Choimport java.util.HashSet;
42a907614755847b2630561a1e5949b2b416600d97Sungsoo Limimport java.util.List;
439a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Choimport java.util.Set;
44a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
45a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim/**
46a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * A Fragment that lists all the various browsable queues available
47a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * from a {@link android.service.media.MediaBrowserService}.
48a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * <p/>
49a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * It uses a {@link MediaBrowserCompat} to connect to the {@link MediaBrowserServiceSupport}.
50a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim * Once connected, the fragment subscribes to get all the children. All
513ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon * {@link MediaBrowserCompat.MediaItem} objects that can be browsed are shown in a ListView.
52a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim */
53a907614755847b2630561a1e5949b2b416600d97Sungsoo Limpublic class BrowseFragment extends Fragment {
54a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
55a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private static final String TAG = "BrowseFragment";
56a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
57a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static final String ARG_MEDIA_ID = "media_id";
58a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
593ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    // The number of media items per page.
603ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private static final int PAGE_SIZE = 6;
613ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
62a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static interface FragmentDataHelper {
63a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        void onMediaItemSelected(MediaBrowserCompat.MediaItem item);
64a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
65a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
66a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    // The mediaId to be used for subscribing for children using the MediaBrowser.
67a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private String mMediaId;
683ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private final List<MediaBrowserCompat.MediaItem> mMediaItems = new ArrayList<>();
69a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
703ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private boolean mCanLoadNewPage;
719a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho    private final Set<Integer> mSubscribedPages = new HashSet<Integer>();
72a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat mMediaBrowser;
73a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private BrowseAdapter mBrowserAdapter;
74a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
75a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat.SubscriptionCallback mSubscriptionCallback =
76a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            new MediaBrowserCompat.SubscriptionCallback() {
773ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        @Override
783ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children,
793ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                Bundle options) {
803ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int page = options.getInt(MediaBrowserCompat.EXTRA_PAGE, -1);
813ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int pageSize = options.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1);
823ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (page < 0 || pageSize != PAGE_SIZE || children == null
833ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    || children.size() > PAGE_SIZE) {
843ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                return;
853ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
863ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
873ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            int itemIndex = page * PAGE_SIZE;
883ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (itemIndex >= mMediaItems.size()) {
893ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (children.size() == 0) {
903ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    return;
913ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
923ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // An additional page is loaded.
933ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                mMediaItems.addAll(children);
943ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            } else {
953ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // An existing page is replaced by the newly loaded page.
963ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                for (MediaBrowserCompat.MediaItem item : children) {
973ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    if (itemIndex < mMediaItems.size()) {
983ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.set(itemIndex, item);
993ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    } else {
1003ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.add(item);
1013ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    }
1023ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    itemIndex++;
1033ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
1043ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1053ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // If the newly loaded page contains less than {PAGE_SIZE} items,
1063ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // then this page should be the last page.
1073ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (children.size() < PAGE_SIZE) {
1083ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    while (mMediaItems.size() > itemIndex) {
1093ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                        mMediaItems.remove(mMediaItems.size() - 1);
1103ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    }
1113ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
1123ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
1133ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mBrowserAdapter.notifyDataSetChanged();
1143ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mCanLoadNewPage = true;
1153ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        }
116a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
117a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
118a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onChildrenLoaded(String parentId, List<MediaBrowserCompat.MediaItem> children) {
1193ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            Log.d(TAG, "onChildrenLoaded: parentId=" + parentId);
1203ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mMediaItems.clear();
1213ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            mMediaItems.addAll(children);
122a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            mBrowserAdapter.notifyDataSetChanged();
123a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
124a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
125a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
126a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onError(String id) {
127a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Toast.makeText(getActivity(), R.string.error_loading_media,
128a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    Toast.LENGTH_LONG).show();
129a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
130a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    };
131a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
132a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private MediaBrowserCompat.ConnectionCallback mConnectionCallback =
133a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            new MediaBrowserCompat.ConnectionCallback() {
134a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
135a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnected() {
136a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
137a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
138a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (mMediaBrowser.getSessionToken() == null) {
139a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                throw new IllegalArgumentException("No Session token");
140a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
141a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            MediaControllerCompat mediaController = null;
142a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            try {
143a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                mediaController = new MediaControllerCompat(getActivity(),
144a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                        mMediaBrowser.getSessionToken());
145a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            } catch (RemoteException e) {
146a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                Log.e(TAG, "Failed to create MediaController.", e);
147a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
148a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ((MediaBrowserSupport) getActivity()).setMediaController(mediaController);
1493ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1503ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (mMediaId == null) {
1513ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                mMediaId = mMediaBrowser.getRoot();
1523ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
1533ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
1543ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            if (mMediaItems.size() == 0) {
1553ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                loadPage(0);
1563ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
157a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
158a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
159a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
160a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnectionFailed() {
161a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnectionFailed");
162a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
163a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
164a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
165a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public void onConnectionSuspended() {
166a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            Log.d(TAG, "onConnectionSuspended");
167ff7a534d72423924d6087a011d17634a42199c03Aurimas Liutikas            ((MediaBrowserSupport) getActivity()).setMediaController((MediaControllerCompat) null);
168a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
169a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    };
170a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
171a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public static BrowseFragment newInstance(String mediaId) {
172a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        Bundle args = new Bundle();
173a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        args.putString(ARG_MEDIA_ID, mediaId);
174a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        BrowseFragment fragment = new BrowseFragment();
175a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        fragment.setArguments(args);
176a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        return fragment;
177a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
178a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
179a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
180a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public View onCreateView(LayoutInflater inflater, ViewGroup container,
1813ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            Bundle savedInstanceState) {
182a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
183a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
1843ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        mBrowserAdapter = new BrowseAdapter(getActivity(), mMediaItems);
185a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
186a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        View controls = rootView.findViewById(R.id.controls);
187a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        controls.setVisibility(View.GONE);
188a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
189a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        ListView listView = (ListView) rootView.findViewById(R.id.list_view);
190a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        listView.setAdapter(mBrowserAdapter);
191a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
192a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            @Override
193a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
194a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                MediaBrowserCompat.MediaItem item = mBrowserAdapter.getItem(position);
195a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                try {
196a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    FragmentDataHelper listener = (FragmentDataHelper) getActivity();
197a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    listener.onMediaItemSelected(item);
198a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                } catch (ClassCastException ex) {
199a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                    Log.e(TAG, "Exception trying to cast to FragmentDataHelper", ex);
200a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                }
201a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
202a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        });
203a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
204a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        Bundle args = getArguments();
205a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaId = args.getString(ARG_MEDIA_ID, null);
206a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
207a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser = new MediaBrowserCompat(getActivity(),
208a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                new ComponentName(getActivity(), MediaBrowserServiceSupport.class),
209a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                mConnectionCallback, null);
210a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2113ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
2123ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            @Override
2133ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
2143ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    int totalItemCount) {
2153ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                if (mCanLoadNewPage && firstVisibleItem + visibleItemCount == totalItemCount) {
2163ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    mCanLoadNewPage = false;
2173ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                    loadPage((mMediaItems.size() + PAGE_SIZE - 1) / PAGE_SIZE);
2183ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                }
2193ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
2203ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
2213ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            @Override
2223ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            public void onScrollStateChanged(AbsListView view, int scrollState) {
2233ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                // Do nothing
2243ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            }
2253ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        });
2263ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
227a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        return rootView;
228a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
229a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
230a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
231a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public void onStart() {
232a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        super.onStart();
233a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser.connect();
234a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
235a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
236a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    @Override
237a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    public void onStop() {
238a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        super.onStop();
239a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        mMediaBrowser.disconnect();
2409a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho        mSubscribedPages.clear();
241a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
242a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2433ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    private void loadPage(int page) {
2449a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho        Integer pageInteger = Integer.valueOf(page);
2459a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho        if (mSubscribedPages.contains(pageInteger)) {
2469a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho            return;
2479a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho        }
2489a42cee4c6809fa365249d2d8a118bd00c12b0b1Donghyun Cho        mSubscribedPages.add(pageInteger);
2493ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        Bundle options = new Bundle();
2503ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        options.putInt(MediaBrowserCompat.EXTRA_PAGE, page);
2513ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        options.putInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, PAGE_SIZE);
2523ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        mMediaBrowser.subscribe(mMediaId, options, mSubscriptionCallback);
2533ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    }
2543ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon
2553ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon    // An adapter for showing the list of browsed MediaItem objects
256a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    private static class BrowseAdapter extends ArrayAdapter<MediaBrowserCompat.MediaItem> {
257a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
2583ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon        public BrowseAdapter(Context context, List<MediaBrowserCompat.MediaItem> mediaItems) {
2593ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            super(context, R.layout.media_list_item, mediaItems);
260a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
261a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
262a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        static class ViewHolder {
263a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ImageView mImageView;
264a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            TextView mTitleView;
265a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            TextView mDescriptionView;
266a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
267a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
268a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        @Override
269a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        public View getView(int position, View convertView, ViewGroup parent) {
270a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
271a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            ViewHolder holder;
272a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
273a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (convertView == null) {
274a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                convertView = LayoutInflater.from(getContext())
275a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                        .inflate(R.layout.media_list_item, parent, false);
276a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder = new ViewHolder();
277a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
278a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView.setVisibility(View.GONE);
279a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
280a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
281a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                convertView.setTag(holder);
282a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            } else {
283a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder = (ViewHolder) convertView.getTag();
284a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
285a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim
286a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            MediaBrowserCompat.MediaItem item = getItem(position);
287a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            holder.mTitleView.setText(item.getDescription().getTitle());
288a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            holder.mDescriptionView.setText(item.getDescription().getDescription());
289a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            if (item.isPlayable()) {
29067949f5f3bc1f721fa5f63250f0fd74a44f5381fAurimas Liutikas
29167949f5f3bc1f721fa5f63250f0fd74a44f5381fAurimas Liutikas                holder.mImageView.setImageDrawable(ContextCompat.getDrawable(
29267949f5f3bc1f721fa5f63250f0fd74a44f5381fAurimas Liutikas                        getContext(), R.drawable.ic_play_arrow_white_24dp));
293a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim                holder.mImageView.setVisibility(View.VISIBLE);
2943ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon            } else {
2953ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon                holder.mImageView.setVisibility(View.GONE);
296a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            }
297a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim            return convertView;
298a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim        }
299a907614755847b2630561a1e5949b2b416600d97Sungsoo Lim    }
3003ee2ea199ba4802754fb9108a45ef7c646c0eebbHyundo Moon}