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