MediaRouteChooserDialogFragment.java revision 70e11e50eecfc8f1dfb76316d099e4331ebd28f7
170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell/*
270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * Copyright (C) 2012 The Android Open Source Project
370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell *
470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * you may not use this file except in compliance with the License.
670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * You may obtain a copy of the License at
770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell *
870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell *
1070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * Unless required by applicable law or agreed to in writing, software
1170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
1270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * See the License for the specific language governing permissions and
1470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * limitations under the License.
1570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell */
1670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
1770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellpackage com.android.internal.app;
1870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
1970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport com.android.internal.R;
2070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
2170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.app.Activity;
2270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.app.DialogFragment;
2370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.app.MediaRouteActionProvider;
2470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.app.MediaRouteButton;
2570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.content.Context;
2670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.media.MediaRouter;
2770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.media.MediaRouter.RouteCategory;
2870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.media.MediaRouter.RouteGroup;
2970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.media.MediaRouter.RouteInfo;
3070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.os.Bundle;
3170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.text.TextUtils;
3270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.view.LayoutInflater;
3370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.view.View;
3470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.view.ViewGroup;
3570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.widget.AdapterView;
3670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.widget.BaseAdapter;
3770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.widget.ListView;
3870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport android.widget.TextView;
3970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
4070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellimport java.util.ArrayList;
4170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
4270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell/**
4370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * This class implements the route chooser dialog for {@link MediaRouter}.
4470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell *
4570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * @see MediaRouteButton
4670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell * @see MediaRouteActionProvider
4770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell */
4870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powellpublic class MediaRouteChooserDialogFragment extends DialogFragment {
4970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private static final String TAG = "MediaRouteChooserDialogFragment";
5070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public static final String FRAGMENT_TAG = "android:MediaRouteChooserDialogFragment";
5170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
5270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    MediaRouter mRouter;
5370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private int mRouteTypes;
5470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
5570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private LauncherListener mLauncherListener;
5670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private View.OnClickListener mExtendedSettingsListener;
5770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private RouteAdapter mAdapter;
5870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private ListView mListView;
5970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
6070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public MediaRouteChooserDialogFragment() {
6170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        setStyle(STYLE_NO_TITLE, R.style.Theme_DeviceDefault_Dialog);
6270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
6370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
6470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public void setLauncherListener(LauncherListener listener) {
6570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mLauncherListener = listener;
6670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
6770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
6870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    @Override
6970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public void onAttach(Activity activity) {
7070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        super.onAttach(activity);
7170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mRouter = (MediaRouter) activity.getSystemService(Context.MEDIA_ROUTER_SERVICE);
7270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
7370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
7470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    @Override
7570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public void onDetach() {
7670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        super.onDetach();
7770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        if (mLauncherListener != null) {
7870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mLauncherListener.onDetached(this);
7970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
8070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        if (mAdapter != null) {
8170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mRouter.removeCallback(mAdapter);
8270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mAdapter = null;
8370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
8470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mRouter = null;
8570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
8670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
8770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    /**
8870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell     * Implemented by the MediaRouteButton that launched this dialog
8970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell     */
9070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public interface LauncherListener {
9170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onDetached(MediaRouteChooserDialogFragment detachedFragment);
9270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
9370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
9470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public void setExtendedSettingsClickListener(View.OnClickListener listener) {
9570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mExtendedSettingsListener = listener;
9670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
9770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
9870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public void setRouteTypes(int types) {
9970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mRouteTypes = types;
10070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
10170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
10270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    @Override
10370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    public View onCreateView(LayoutInflater inflater, ViewGroup container,
10470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            Bundle savedInstanceState) {
10570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        final View layout = inflater.inflate(R.layout.media_route_chooser_layout, container, false);
10670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        final View extendedSettingsButton = layout.findViewById(R.id.extended_settings);
10770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
10870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        if (mExtendedSettingsListener != null) {
10970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            extendedSettingsButton.setVisibility(View.VISIBLE);
11070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            extendedSettingsButton.setOnClickListener(mExtendedSettingsListener);
11170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
11270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
11370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        final ListView list = (ListView) layout.findViewById(R.id.list);
11470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
11570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        list.setAdapter(mAdapter = new RouteAdapter(inflater));
11670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        list.setItemChecked(mAdapter.getSelectedRoutePosition(), true);
11770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        list.setOnItemClickListener(mAdapter);
11870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
11970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mListView = list;
12070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        mRouter.addCallback(mRouteTypes, mAdapter);
12170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
12270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        return layout;
12370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
12470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
12570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private static final int[] ITEM_LAYOUTS = new int[] {
12670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        R.layout.media_route_list_item_top_header,
12770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        R.layout.media_route_list_item_section_header,
12870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        R.layout.media_route_list_item
12970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    };
13070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
13170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private class RouteAdapter extends BaseAdapter implements MediaRouter.Callback,
13270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            ListView.OnItemClickListener {
13370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private static final int VIEW_TOP_HEADER = 0;
13470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private static final int VIEW_SECTION_HEADER = 1;
13570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private static final int VIEW_ROUTE = 2;
13670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
13770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private int mSelectedItemPosition;
13870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private final ArrayList<Object> mItems = new ArrayList<Object>();
13970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        private final LayoutInflater mInflater;
14070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
14170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        RouteAdapter(LayoutInflater inflater) {
14270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mInflater = inflater;
14370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
14470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
14570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
14670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        void update() {
14770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // TODO this is kind of naive, but our data sets are going to be
14870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // fairly small on average.
14970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mItems.clear();
15070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
15170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final RouteInfo selectedRoute = mRouter.getSelectedRoute(mRouteTypes);
15270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
15370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final ArrayList<RouteInfo> routes = new ArrayList<RouteInfo>();
15470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final int catCount = mRouter.getCategoryCount();
15570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            for (int i = 0; i < catCount; i++) {
15670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                final RouteCategory cat = mRouter.getCategoryAt(i);
15770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                cat.getRoutes(routes);
15870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
15970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                mItems.add(cat);
16070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
16170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                final int routeCount = routes.size();
16270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                for (int j = 0; j < routeCount; j++) {
16370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                    final RouteInfo info = routes.get(j);
16470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                    if (info == selectedRoute) {
16570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                        mSelectedItemPosition = mItems.size();
16670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                    }
16770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                    mItems.add(info);
16870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                }
16970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
17070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
17170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            notifyDataSetChanged();
17270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (mListView != null) {
17370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                mListView.setItemChecked(mSelectedItemPosition, true);
17470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
17570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
17670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
17770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
17870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public int getCount() {
17970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return mItems.size();
18070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
18170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
18270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
18370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public int getViewTypeCount() {
18470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return 3;
18570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
18670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
18770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
18870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public int getItemViewType(int position) {
18970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final Object item = getItem(position);
19070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (item instanceof RouteCategory) {
19170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                return position == 0 ? VIEW_TOP_HEADER : VIEW_SECTION_HEADER;
19270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            } else {
19370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                return VIEW_ROUTE;
19470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
19570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
19670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
19770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
19870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public boolean areAllItemsEnabled() {
19970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return false;
20070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
20170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
20270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
20370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public boolean isEnabled(int position) {
20470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return getItemViewType(position) == VIEW_ROUTE;
20570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
20670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
20770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
20870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public Object getItem(int position) {
20970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return mItems.get(position);
21070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
21170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
21270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
21370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public long getItemId(int position) {
21470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return position;
21570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
21670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
21770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
21870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public View getView(int position, View convertView, ViewGroup parent) {
21970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final int viewType = getItemViewType(position);
22070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
22170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            ViewHolder holder;
22270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (convertView == null) {
22370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                convertView = mInflater.inflate(ITEM_LAYOUTS[viewType], parent, false);
22470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder = new ViewHolder();
22570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder.text1 = (TextView) convertView.findViewById(R.id.text1);
22670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder.text2 = (TextView) convertView.findViewById(R.id.text2);
22770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                convertView.setTag(holder);
22870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            } else {
22970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder = (ViewHolder) convertView.getTag();
23070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
23170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
23270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (viewType == VIEW_ROUTE) {
23370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                bindItemView(position, holder);
23470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            } else {
23570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                bindHeaderView(position, holder);
23670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
23770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
23870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return convertView;
23970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
24070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
24170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        void bindItemView(int position, ViewHolder holder) {
24270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            RouteInfo info = (RouteInfo) mItems.get(position);
24370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            holder.text1.setText(info.getName());
24470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final CharSequence status = info.getStatus();
24570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (TextUtils.isEmpty(status)) {
24670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder.text2.setVisibility(View.GONE);
24770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            } else {
24870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder.text2.setVisibility(View.VISIBLE);
24970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                holder.text2.setText(status);
25070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
25170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
25270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
25370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        void bindHeaderView(int position, ViewHolder holder) {
25470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            RouteCategory cat = (RouteCategory) mItems.get(position);
25570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            holder.text1.setText(cat.getName());
25670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
25770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
25870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public int getSelectedRoutePosition() {
25970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return mSelectedItemPosition;
26070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
26170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
26270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
26370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
26470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
26570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
26670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
26770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
26870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
26970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
27070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
27170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
27270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
27370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteAdded(MediaRouter router, RouteInfo info) {
27470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
27570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
27670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
27770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
27870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteRemoved(MediaRouter router, RouteInfo info) {
27970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
28070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
28170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
28270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
28370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteChanged(MediaRouter router, RouteInfo info) {
28470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            notifyDataSetChanged();
28570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
28670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
28770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
28870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteGrouped(MediaRouter router, RouteInfo info,
28970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                RouteGroup group, int index) {
29070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
29170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
29270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
29370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
29470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onRouteUngrouped(MediaRouter router, RouteInfo info, RouteGroup group) {
29570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            update();
29670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
29770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
29870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
29970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
30070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            ListView lv = (ListView) parent;
30170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            final Object item = getItem(lv.getCheckedItemPosition());
30270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            if (!(item instanceof RouteInfo)) {
30370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                // Oops. Stale event running around? Skip it.
30470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell                return;
30570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            }
30670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            mRouter.selectRoute(mRouteTypes, (RouteInfo) item);
30770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            dismiss();
30870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
30970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
31070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
31170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private static class ViewHolder {
31270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public TextView text1;
31370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public TextView text2;
31470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
31570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
31670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    private class GroupAdapter extends BaseAdapter {
31770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
31870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public int getCount() {
31970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // TODO Auto-generated method stub
32070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return 0;
32170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
32270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
32370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
32470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public Object getItem(int position) {
32570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // TODO Auto-generated method stub
32670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return null;
32770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
32870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
32970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
33070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public long getItemId(int position) {
33170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // TODO Auto-generated method stub
33270e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return 0;
33370e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
33470e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell
33570e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        @Override
33670e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        public View getView(int position, View convertView, ViewGroup parent) {
33770e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            // TODO Auto-generated method stub
33870e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell            return null;
33970e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell        }
34070e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell    }
34170e11e50eecfc8f1dfb76316d099e4331ebd28f7Adam Powell}
342