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