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
17package com.example.android.musicbrowserdemo;
18
19import android.content.Context;
20import android.content.ComponentName;
21import android.content.Intent;
22import android.content.pm.PackageManager;
23import android.content.pm.ResolveInfo;
24import android.media.browse.MediaBrowser;
25import android.service.media.MediaBrowserService;
26import android.os.Bundle;
27import android.net.Uri;
28import android.support.v4.app.FragmentActivity;
29import android.support.v4.app.FragmentTransaction;
30import android.support.v4.app.ListFragment;
31import android.util.Log;
32import android.view.LayoutInflater;
33import android.view.View;
34import android.view.ViewGroup;
35import android.widget.BaseAdapter;
36import android.widget.ListView;
37import android.widget.TextView;
38
39import java.util.ArrayList;
40import java.util.List;
41
42public class BrowserListFragment extends ListFragment {
43    private static final String TAG = "BrowserListFragment";
44
45    // Hints
46    public static final String HINT_DISPLAY = "com.example.android.musicbrowserdemo.DISPLAY";
47
48    // For args
49    public static final String ARG_COMPONENT = "component";
50    public static final String ARG_ID = "uri";
51
52    private Adapter mAdapter;
53    private List<Item> mItems = new ArrayList();
54    private ComponentName mComponent;
55    private String mNodeId;
56    private MediaBrowser mBrowser;
57
58    private static class Item {
59        final MediaBrowser.MediaItem media;
60
61        Item(MediaBrowser.MediaItem m) {
62            this.media = m;
63        }
64    }
65
66    public BrowserListFragment() {
67    }
68
69    @Override
70    public void onActivityCreated(Bundle savedInstanceState) {
71        super.onActivityCreated(savedInstanceState);
72        Log.d(TAG, "onActivityCreated -- " + hashCode());
73        mAdapter = new Adapter();
74        setListAdapter(mAdapter);
75
76        // Get our arguments
77        final Bundle args = getArguments();
78        mComponent = args.getParcelable(ARG_COMPONENT);
79        mNodeId = args.getString(ARG_ID);
80
81        // A hint about who we are, so the service can customize the results if it wants to.
82        final Bundle rootHints = new Bundle();
83        rootHints.putBoolean(HINT_DISPLAY, true);
84
85        mBrowser = new MediaBrowser(getActivity(), mComponent, mConnectionCallbacks, rootHints);
86    }
87
88    @Override
89    public void onStart() {
90        super.onStart();
91        mBrowser.connect();
92    }
93
94    @Override
95    public void onStop() {
96        super.onStop();
97        mBrowser.disconnect();
98    }
99
100    @Override
101    public void onListItemClick(ListView l, View v, int position, long id) {
102        final Item item = mItems.get(position);
103
104        Log.i("BrowserListFragment", "Item clicked: " + position + " -- "
105                + mAdapter.getItem(position).media.getDescription().getIconUri());
106
107        final BrowserListFragment fragment = new BrowserListFragment();
108
109        final Bundle args = new Bundle();
110        args.putParcelable(BrowserListFragment.ARG_COMPONENT, mComponent);
111        args.putParcelable(BrowserListFragment.ARG_ID, item.media.getDescription().getIconUri());
112        fragment.setArguments(args);
113
114        getFragmentManager().beginTransaction()
115                .replace(android.R.id.content, fragment)
116                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
117                .addToBackStack(null)
118                .commit();
119
120    }
121
122    final MediaBrowser.ConnectionCallback mConnectionCallbacks
123            = new MediaBrowser.ConnectionCallback() {
124        @Override
125        public void onConnected() {
126            Log.d(TAG, "mConnectionCallbacks.onConnected");
127            if (mNodeId == null) {
128                mNodeId = mBrowser.getRoot();
129            }
130            mBrowser.subscribe(mNodeId, new MediaBrowser.SubscriptionCallback() {
131                    @Override
132                public void onChildrenLoaded(String parentId,
133                            List<MediaBrowser.MediaItem> children) {
134                    Log.d(TAG, "onChildrenLoaded parentId=" + parentId
135                                + " children= " + children);
136                        mItems.clear();
137                        final int N = children.size();
138                        for (int i=0; i<N; i++) {
139                            mItems.add(new Item(children.get(i)));
140                        }
141                        mAdapter.notifyDataSetChanged();
142                    }
143
144                    @Override
145                public void onError(String parentId) {
146                    Log.d(TAG, "onError parentId=" + parentId);
147                    }
148                });
149        }
150
151        @Override
152        public void onConnectionSuspended() {
153            Log.d(TAG, "mConnectionCallbacks.onConnectionSuspended");
154        }
155
156        @Override
157        public void onConnectionFailed() {
158            Log.d(TAG, "mConnectionCallbacks.onConnectionFailed");
159        }
160    };
161
162    private class Adapter extends BaseAdapter {
163        private final LayoutInflater mInflater;
164
165        Adapter() {
166            super();
167
168            final Context context = getActivity();
169            mInflater = LayoutInflater.from(context);
170        }
171
172        @Override
173        public int getCount() {
174            return mItems.size();
175        }
176
177        @Override
178        public Item getItem(int position) {
179            return mItems.get(position);
180        }
181
182        @Override
183        public long getItemId(int position) {
184            return position;
185        }
186
187        @Override
188        public int getItemViewType(int position) {
189            return 1;
190        }
191
192        @Override
193        public View getView(int position, View convertView, ViewGroup parent) {
194            if (convertView == null) {
195                convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
196            }
197
198            final TextView tv = (TextView)convertView;
199            final Item item = mItems.get(position);
200            tv.setText(item.media.getDescription().getTitle());
201
202            return convertView;
203        }
204
205        @Override
206        public int getViewTypeCount() {
207            return 1;
208        }
209    }
210}
211
212
213