| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.musicbrowserdemo; |
| |
| import android.content.Context; |
| import android.content.ComponentName; |
| import android.content.Intent; |
| import android.content.pm.PackageManager; |
| import android.content.pm.ResolveInfo; |
| import android.media.browse.MediaBrowser; |
| import android.service.media.MediaBrowserService; |
| import android.os.Bundle; |
| import android.net.Uri; |
| import android.support.v4.app.FragmentActivity; |
| import android.support.v4.app.FragmentTransaction; |
| import android.support.v4.app.ListFragment; |
| import android.util.Log; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.BaseAdapter; |
| import android.widget.ListView; |
| import android.widget.TextView; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| public class BrowserListFragment extends ListFragment { |
| private static final String TAG = "BrowserListFragment"; |
| |
| // Hints |
| public static final String HINT_DISPLAY = "com.example.android.musicbrowserdemo.DISPLAY"; |
| |
| // For args |
| public static final String ARG_COMPONENT = "component"; |
| public static final String ARG_ID = "uri"; |
| |
| private Adapter mAdapter; |
| private List<Item> mItems = new ArrayList(); |
| private ComponentName mComponent; |
| private String mNodeId; |
| private MediaBrowser mBrowser; |
| |
| private static class Item { |
| final MediaBrowser.MediaItem media; |
| |
| Item(MediaBrowser.MediaItem m) { |
| this.media = m; |
| } |
| } |
| |
| public BrowserListFragment() { |
| } |
| |
| @Override |
| public void onActivityCreated(Bundle savedInstanceState) { |
| super.onActivityCreated(savedInstanceState); |
| Log.d(TAG, "onActivityCreated -- " + hashCode()); |
| mAdapter = new Adapter(); |
| setListAdapter(mAdapter); |
| |
| // Get our arguments |
| final Bundle args = getArguments(); |
| mComponent = args.getParcelable(ARG_COMPONENT); |
| mNodeId = args.getString(ARG_ID); |
| |
| // A hint about who we are, so the service can customize the results if it wants to. |
| final Bundle rootHints = new Bundle(); |
| rootHints.putBoolean(HINT_DISPLAY, true); |
| |
| mBrowser = new MediaBrowser(getActivity(), mComponent, mConnectionCallbacks, rootHints); |
| } |
| |
| @Override |
| public void onStart() { |
| super.onStart(); |
| mBrowser.connect(); |
| } |
| |
| @Override |
| public void onStop() { |
| super.onStop(); |
| mBrowser.disconnect(); |
| } |
| |
| @Override |
| public void onListItemClick(ListView l, View v, int position, long id) { |
| final Item item = mItems.get(position); |
| |
| Log.i("BrowserListFragment", "Item clicked: " + position + " -- " |
| + mAdapter.getItem(position).media.getDescription().getIconUri()); |
| |
| final BrowserListFragment fragment = new BrowserListFragment(); |
| |
| final Bundle args = new Bundle(); |
| args.putParcelable(BrowserListFragment.ARG_COMPONENT, mComponent); |
| args.putParcelable(BrowserListFragment.ARG_ID, item.media.getDescription().getIconUri()); |
| fragment.setArguments(args); |
| |
| getFragmentManager().beginTransaction() |
| .replace(android.R.id.content, fragment) |
| .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) |
| .addToBackStack(null) |
| .commit(); |
| |
| } |
| |
| final MediaBrowser.ConnectionCallback mConnectionCallbacks |
| = new MediaBrowser.ConnectionCallback() { |
| @Override |
| public void onConnected() { |
| Log.d(TAG, "mConnectionCallbacks.onConnected"); |
| if (mNodeId == null) { |
| mNodeId = mBrowser.getRoot(); |
| } |
| mBrowser.subscribe(mNodeId, new MediaBrowser.SubscriptionCallback() { |
| @Override |
| public void onChildrenLoaded(String parentId, |
| List<MediaBrowser.MediaItem> children) { |
| Log.d(TAG, "onChildrenLoaded parentId=" + parentId |
| + " children= " + children); |
| mItems.clear(); |
| final int N = children.size(); |
| for (int i=0; i<N; i++) { |
| mItems.add(new Item(children.get(i))); |
| } |
| mAdapter.notifyDataSetChanged(); |
| } |
| |
| @Override |
| public void onError(String parentId) { |
| Log.d(TAG, "onError parentId=" + parentId); |
| } |
| }); |
| } |
| |
| @Override |
| public void onConnectionSuspended() { |
| Log.d(TAG, "mConnectionCallbacks.onConnectionSuspended"); |
| } |
| |
| @Override |
| public void onConnectionFailed() { |
| Log.d(TAG, "mConnectionCallbacks.onConnectionFailed"); |
| } |
| }; |
| |
| private class Adapter extends BaseAdapter { |
| private final LayoutInflater mInflater; |
| |
| Adapter() { |
| super(); |
| |
| final Context context = getActivity(); |
| mInflater = LayoutInflater.from(context); |
| } |
| |
| @Override |
| public int getCount() { |
| return mItems.size(); |
| } |
| |
| @Override |
| public Item getItem(int position) { |
| return mItems.get(position); |
| } |
| |
| @Override |
| public long getItemId(int position) { |
| return position; |
| } |
| |
| @Override |
| public int getItemViewType(int position) { |
| return 1; |
| } |
| |
| @Override |
| public View getView(int position, View convertView, ViewGroup parent) { |
| if (convertView == null) { |
| convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); |
| } |
| |
| final TextView tv = (TextView)convertView; |
| final Item item = mItems.get(position); |
| tv.setText(item.media.getDescription().getTitle()); |
| |
| return convertView; |
| } |
| |
| @Override |
| public int getViewTypeCount() { |
| return 1; |
| } |
| } |
| } |
| |
| |