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}