close
The Wayback Machine - https://web.archive.org/web/20171110024319/https://developer.android.com/samples/MediaBrowserService/src/com.example.android.mediabrowserservice/BrowseFragment.html
Skip to content

Most visited

Recently visited

navigation
MediaBrowserService / src / com.example.android.mediabrowserservice /

BrowseFragment.java

1
/*
2
 * Copyright (C) 2014 The Android Open Source Project
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package com.example.android.mediabrowserservice;
17
 
18
import android.app.Fragment;
19
import android.content.ComponentName;
20
import android.content.Context;
21
import android.media.browse.MediaBrowser;
22
import android.media.session.MediaController;
23
import android.os.Bundle;
24
import android.util.Log;
25
import android.view.LayoutInflater;
26
import android.view.View;
27
import android.view.ViewGroup;
28
import android.widget.AdapterView;
29
import android.widget.ArrayAdapter;
30
import android.widget.ImageView;
31
import android.widget.ListView;
32
import android.widget.TextView;
33
import android.widget.Toast;
34
 
35
import com.example.android.mediabrowserservice.utils.LogHelper;
36
 
37
import java.util.ArrayList;
38
import java.util.List;
39
 
40
/**
41
 * A Fragment that lists all the various browsable queues available
42
 * from a {@link android.service.media.MediaBrowserService}.
43
 * <p/>
44
 * It uses a {@link MediaBrowser} to connect to the {@link MusicService}. Once connected,
45
 * the fragment subscribes to get all the children. All {@link MediaBrowser.MediaItem}'s
46
 * that can be browsed are shown in a ListView.
47
 */
48
public class BrowseFragment extends Fragment {
49
 
50
    private static final String TAG = LogHelper.makeLogTag(BrowseFragment.class.getSimpleName());
51
 
52
    public static final String ARG_MEDIA_ID = "media_id";
53
 
54
    public static interface FragmentDataHelper {
55
        void onMediaItemSelected(MediaBrowser.MediaItem item);
56
    }
57
 
58
    // The mediaId to be used for subscribing for children using the MediaBrowser.
59
    private String mMediaId;
60
 
61
    private MediaBrowser mMediaBrowser;
62
    private BrowseAdapter mBrowserAdapter;
63
 
64
    private MediaBrowser.SubscriptionCallback mSubscriptionCallback = new MediaBrowser.SubscriptionCallback() {
65
 
66
        @Override
67
        public void onChildrenLoaded(String parentId, List<MediaBrowser.MediaItem> children) {
68
            mBrowserAdapter.clear();
69
            mBrowserAdapter.notifyDataSetInvalidated();
70
            for (MediaBrowser.MediaItem item : children) {
71
                mBrowserAdapter.add(item);
72
            }
73
            mBrowserAdapter.notifyDataSetChanged();
74
        }
75
 
76
        @Override
77
        public void onError(String id) {
78
            Toast.makeText(getActivity(), R.string.error_loading_media,
79
                    Toast.LENGTH_LONG).show();
80
        }
81
    };
82
 
83
    private MediaBrowser.ConnectionCallback mConnectionCallback =
84
            new MediaBrowser.ConnectionCallback() {
85
        @Override
86
        public void onConnected() {
87
            LogHelper.d(TAG, "onConnected: session token " + mMediaBrowser.getSessionToken());
88
 
89
            if (mMediaId == null) {
90
                mMediaId = mMediaBrowser.getRoot();
91
            }
92
            mMediaBrowser.subscribe(mMediaId, mSubscriptionCallback);
93
            if (mMediaBrowser.getSessionToken() == null) {
94
                throw new IllegalArgumentException("No Session token");
95
            }
96
            MediaController mediaController = new MediaController(getActivity(),
97
                    mMediaBrowser.getSessionToken());
98
            getActivity().setMediaController(mediaController);
99
        }
100
 
101
        @Override
102
        public void onConnectionFailed() {
103
            LogHelper.d(TAG, "onConnectionFailed");
104
        }
105
 
106
        @Override
107
        public void onConnectionSuspended() {
108
            LogHelper.d(TAG, "onConnectionSuspended");
109
            getActivity().setMediaController(null);
110
        }
111
    };
112
 
113
    public static BrowseFragment newInstance(String mediaId) {
114
        Bundle args = new Bundle();
115
        args.putString(ARG_MEDIA_ID, mediaId);
116
        BrowseFragment fragment = new BrowseFragment();
117
        fragment.setArguments(args);
118
        return fragment;
119
    }
120
 
121
    @Override
122
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
123
                             Bundle savedInstanceState) {
124
        View rootView = inflater.inflate(R.layout.fragment_list, container, false);
125
 
126
        mBrowserAdapter = new BrowseAdapter(getActivity());
127
 
128
        View controls = rootView.findViewById(R.id.controls);
129
        controls.setVisibility(View.GONE);
130
 
131
        ListView listView = (ListView) rootView.findViewById(R.id.list_view);
132
        listView.setAdapter(mBrowserAdapter);
133
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
134
            @Override
135
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
136
                MediaBrowser.MediaItem item = mBrowserAdapter.getItem(position);
137
                try {
138
                    FragmentDataHelper listener = (FragmentDataHelper) getActivity();
139
                    listener.onMediaItemSelected(item);
140
                } catch (ClassCastException ex) {
141
                    Log.e(TAG, "Exception trying to cast to FragmentDataHelper", ex);
142
                }
143
            }
144
        });
145
 
146
        Bundle args = getArguments();
147
        mMediaId = args.getString(ARG_MEDIA_ID, null);
148
 
149
        mMediaBrowser = new MediaBrowser(getActivity(),
150
                new ComponentName(getActivity(), MusicService.class),
151
                mConnectionCallback, null);
152
 
153
        return rootView;
154
    }
155
 
156
    @Override
157
    public void onStart() {
158
        super.onStart();
159
        mMediaBrowser.connect();
160
    }
161
 
162
    @Override
163
    public void onStop() {
164
        super.onStop();
165
        mMediaBrowser.disconnect();
166
    }
167
 
168
    // An adapter for showing the list of browsed MediaItem's
169
    private static class BrowseAdapter extends ArrayAdapter<MediaBrowser.MediaItem> {
170
 
171
        public BrowseAdapter(Context context) {
172
            super(context, R.layout.media_list_item, new ArrayList<MediaBrowser.MediaItem>());
173
        }
174
 
175
        static class ViewHolder {
176
            ImageView mImageView;
177
            TextView mTitleView;
178
            TextView mDescriptionView;
179
        }
180
 
181
        @Override
182
        public View getView(int position, View convertView, ViewGroup parent) {
183
 
184
            ViewHolder holder;
185
 
186
            if (convertView == null) {
187
                convertView = LayoutInflater.from(getContext())
188
                        .inflate(R.layout.media_list_item, parent, false);
189
                holder = new ViewHolder();
190
                holder.mImageView = (ImageView) convertView.findViewById(R.id.play_eq);
191
                holder.mImageView.setVisibility(View.GONE);
192
                holder.mTitleView = (TextView) convertView.findViewById(R.id.title);
193
                holder.mDescriptionView = (TextView) convertView.findViewById(R.id.description);
194
                convertView.setTag(holder);
195
            } else {
196
                holder = (ViewHolder) convertView.getTag();
197
            }
198
 
199
            MediaBrowser.MediaItem item = getItem(position);
200
            holder.mTitleView.setText(item.getDescription().getTitle());
201
            holder.mDescriptionView.setText(item.getDescription().getDescription());
202
            if (item.isPlayable()) {
203
                holder.mImageView.setImageDrawable(
204
                        getContext().getDrawable(R.drawable.ic_play_arrow_white_24dp));
205
                holder.mImageView.setVisibility(View.VISIBLE);
206
            }
207
            return convertView;
208
        }
209
    }
210
}
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

BERJAYA

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)