117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen/* 283e315244929ac174e0d87b93ad991b873df8910RoboErik * Copyright (C) 2014 The Android Open Source Project 317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * you may not use this file except in compliance with the License. 617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * You may obtain a copy of the License at 717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 1017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Unless required by applicable law or agreed to in writing, software 1117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 1217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * See the License for the specific language governing permissions and 1417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * limitations under the License. 1517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 1617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 1717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenpackage com.example.android.musicbrowserdemo; 1817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 1917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.Context; 2017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.ComponentName; 2117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.Intent; 2217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.pm.PackageManager; 2317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.pm.ResolveInfo; 246a6a8f00946f963191612f64238bd706c2188dd8RoboErikimport android.service.media.MediaBrowserService; 2517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.Bundle; 2617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.support.v4.app.FragmentActivity; 2717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.support.v4.app.FragmentTransaction; 2817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.support.v4.app.ListFragment; 2917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.util.Log; 3017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.view.LayoutInflater; 3117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.view.View; 3217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.view.ViewGroup; 3317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.widget.BaseAdapter; 3417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.widget.ListView; 3517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.widget.TextView; 3617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 3717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.ArrayList; 3817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.List; 3917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen// TODO: Include an icon. 4117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenpublic class AppListFragment extends ListFragment { 4317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private Adapter mAdapter; 4517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private List<Item> mItems; 4617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public AppListFragment() { 4817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 4917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 5017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 5117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public void onActivityCreated(Bundle savedInstanceState) { 5217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen super.onActivityCreated(savedInstanceState); 5317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mAdapter = new Adapter(); 5417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen setListAdapter(mAdapter); 5517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 5617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 5717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 5817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public void onListItemClick(ListView l, View v, int position, long id) { 5917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final Item item = mItems.get(position); 6017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.i("AppListFragment", "Item clicked: " + position + " -- " + item.component); 6217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final BrowserListFragment fragment = new BrowserListFragment(); 6417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final Bundle args = new Bundle(); 6617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen args.putParcelable(BrowserListFragment.ARG_COMPONENT, item.component); 6717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen fragment.setArguments(args); 6817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen getFragmentManager().beginTransaction() 7017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen .replace(android.R.id.content, fragment) 7117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 7217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen .addToBackStack(null) 7317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen .commit(); 7417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 7517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 7617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static class Item { 7717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final String label; 7817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final ComponentName component; 7917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 8017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Item(String l, ComponentName c) { 8117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen this.label = l; 8217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen this.component = c; 8317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 8417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 8517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 8617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private class Adapter extends BaseAdapter { 8717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private final LayoutInflater mInflater; 8817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 8917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Adapter() { 9017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen super(); 9117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 9217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final Context context = getActivity(); 9317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mInflater = LayoutInflater.from(context); 9417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 9517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen // Load the data 9617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final PackageManager pm = context.getPackageManager(); 9792e565f71526141cb38f864dcb4eeb54d2cbf869RoboErik final Intent intent = new Intent(MediaBrowserService.SERVICE_INTERFACE); 9817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final List<ResolveInfo> list = pm.queryIntentServices(intent, 0); 9917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final int N = list.size(); 10017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mItems = new ArrayList(N); 10117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen for (int i=0; i<N; i++) { 10217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final ResolveInfo ri = list.get(i); 10317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mItems.add(new Item(ri.loadLabel(pm).toString(), new ComponentName( 10417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen ri.serviceInfo.applicationInfo.packageName, 10517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen ri.serviceInfo.name))); 10617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 10717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 10817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 10917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 11017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public int getCount() { 11117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return mItems.size(); 11217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 11317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 11417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 11517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public Item getItem(int position) { 11617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return mItems.get(position); 11717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 11817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 11917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 12017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public long getItemId(int position) { 12117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return position; 12217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 12317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 12417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 12517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public int getItemViewType(int position) { 12617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return 1; 12717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 12817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 12917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 13017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public View getView(int position, View convertView, ViewGroup parent) { 13117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (convertView == null) { 13217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen convertView = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false); 13317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 13417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 13517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final TextView tv = (TextView)convertView; 13617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen final Item item = mItems.get(position); 13717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen tv.setText(item.label); 13817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 13917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return convertView; 14017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 14117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 14217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen @Override 14317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public int getViewTypeCount() { 14417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return 1; 14517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 14617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 14717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen} 14817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 14917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 150