10abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown/* 20abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Copyright (C) 2013 The Android Open Source Project 30abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 40abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 50abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * you may not use this file except in compliance with the License. 60abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * You may obtain a copy of the License at 70abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 80abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 90abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 100abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Unless required by applicable law or agreed to in writing, software 110abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 120abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * See the License for the specific language governing permissions and 140abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * limitations under the License. 150abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 160abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 170abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownpackage com.android.internal.app; 180abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 190abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport com.android.internal.R; 200abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 210abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.app.Dialog; 220abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.content.Context; 230abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.media.MediaRouter; 240abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.media.MediaRouter.RouteInfo; 250abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.os.Bundle; 260abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.text.TextUtils; 27d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kerstenimport android.util.TypedValue; 280abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.view.LayoutInflater; 290abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.view.View; 300abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.view.ViewGroup; 310abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.view.Window; 320abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.widget.AdapterView; 330abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.widget.ArrayAdapter; 340abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.widget.Button; 350abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.widget.ListView; 360abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport android.widget.TextView; 370abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 380abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownimport java.util.Comparator; 390abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 400abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown/** 410abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * This class implements the route chooser dialog for {@link MediaRouter}. 420abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * <p> 430abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * This dialog allows the user to choose a route that matches a given selector. 440abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * </p> 450abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 460abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @see MediaRouteButton 470abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @see MediaRouteActionProvider 480abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 490abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * TODO: Move this back into the API, as in the support library media router. 500abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 510abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brownpublic class MediaRouteChooserDialog extends Dialog { 520abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private final MediaRouter mRouter; 530abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private final MediaRouterCallback mCallback; 540abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 550abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private int mRouteTypes; 560abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private View.OnClickListener mExtendedSettingsClickListener; 570abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private RouteAdapter mAdapter; 580abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private ListView mListView; 590abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private Button mExtendedSettingsButton; 600abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private boolean mAttachedToWindow; 610abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 620abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public MediaRouteChooserDialog(Context context, int theme) { 630abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown super(context, theme); 640abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 650abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouter = (MediaRouter) context.getSystemService(Context.MEDIA_ROUTER_SERVICE); 660abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mCallback = new MediaRouterCallback(); 670abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 680abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 690abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown /** 700abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Gets the media route types for filtering the routes that the user can 710abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * select using the media route chooser dialog. 720abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 730abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @return The route types. 740abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 750abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public int getRouteTypes() { 760abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown return mRouteTypes; 770abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 780abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 790abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown /** 800abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Sets the types of routes that will be shown in the media route chooser dialog 810abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * launched by this button. 820abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 830abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @param types The route types to match. 840abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 850abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void setRouteTypes(int types) { 860abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (mRouteTypes != types) { 870abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouteTypes = types; 880abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 890abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (mAttachedToWindow) { 900abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouter.removeCallback(mCallback); 910abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouter.addCallback(types, mCallback, 920abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); 930abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 940abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 950abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown refreshRoutes(); 960abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 970abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 980abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 990abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void setExtendedSettingsClickListener(View.OnClickListener listener) { 1000abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (listener != mExtendedSettingsClickListener) { 1010abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mExtendedSettingsClickListener = listener; 1020abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown updateExtendedSettingsButton(); 1030abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1040abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1050abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1060abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown /** 1070abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Returns true if the route should be included in the list. 1080abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * <p> 10939ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown * The default implementation returns true for enabled non-default routes that 11039ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown * match the route types. Subclasses can override this method to filter routes 1110abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * differently. 1120abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * </p> 1130abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * 1140abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @param route The route to consider, never null. 1150abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * @return True if the route should be included in the chooser dialog. 1160abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 1170abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public boolean onFilterRoute(MediaRouter.RouteInfo route) { 11839ad0e559896b45185429ea17cd12f18f7ae842cJeff Brown return !route.isDefault() && route.isEnabled() && route.matchesTypes(mRouteTypes); 1190abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1200abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1210abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 1220abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown protected void onCreate(Bundle savedInstanceState) { 1230abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown super.onCreate(savedInstanceState); 1240abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1250abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown getWindow().requestFeature(Window.FEATURE_LEFT_ICON); 1260abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1270abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown setContentView(R.layout.media_route_chooser_dialog); 128cef34fce3c925f8db20bb4d3791415bcf150ed78Jeff Brown setTitle(mRouteTypes == MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY 129cef34fce3c925f8db20bb4d3791415bcf150ed78Jeff Brown ? R.string.media_route_chooser_title_for_remote_display 130cef34fce3c925f8db20bb4d3791415bcf150ed78Jeff Brown : R.string.media_route_chooser_title); 1310abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1320abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown // Must be called after setContentView. 1330abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, 134d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten isLightTheme(getContext()) ? R.drawable.ic_media_route_off_holo_light 135d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten : R.drawable.ic_media_route_off_holo_dark); 1360abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1370abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mAdapter = new RouteAdapter(getContext()); 1380abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mListView = (ListView)findViewById(R.id.media_route_list); 1390abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mListView.setAdapter(mAdapter); 1400abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mListView.setOnItemClickListener(mAdapter); 1410abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mListView.setEmptyView(findViewById(android.R.id.empty)); 1420abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1430abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mExtendedSettingsButton = (Button)findViewById(R.id.media_route_extended_settings_button); 1440abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown updateExtendedSettingsButton(); 1450abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1460abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1470abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private void updateExtendedSettingsButton() { 1480abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (mExtendedSettingsButton != null) { 1490abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mExtendedSettingsButton.setOnClickListener(mExtendedSettingsClickListener); 1500abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mExtendedSettingsButton.setVisibility( 1510abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mExtendedSettingsClickListener != null ? View.VISIBLE : View.GONE); 1520abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1530abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1540abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1550abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 1560abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onAttachedToWindow() { 1570abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown super.onAttachedToWindow(); 1580abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1590abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mAttachedToWindow = true; 1600abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouter.addCallback(mRouteTypes, mCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); 1610abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown refreshRoutes(); 1620abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1630abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1640abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 1650abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onDetachedFromWindow() { 1660abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mAttachedToWindow = false; 1670abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mRouter.removeCallback(mCallback); 1680abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1690abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown super.onDetachedFromWindow(); 1700abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1710abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1720abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown /** 1730abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown * Refreshes the list of routes that are shown in the chooser dialog. 1740abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown */ 1750abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void refreshRoutes() { 1760abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (mAttachedToWindow) { 1770abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mAdapter.update(); 1780abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1790abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1800abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 181d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten static boolean isLightTheme(Context context) { 182d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten TypedValue value = new TypedValue(); 183d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten return context.getTheme().resolveAttribute(R.attr.isLightTheme, value, true) 184d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten && value.data != 0; 185d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten } 186d51640ba508e22051f869b1fabc73746579fccf0Christofer Ã…kersten 1870abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private final class RouteAdapter extends ArrayAdapter<MediaRouter.RouteInfo> 1880abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown implements ListView.OnItemClickListener { 1890abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private final LayoutInflater mInflater; 1900abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1910abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public RouteAdapter(Context context) { 1920abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown super(context, 0); 1930abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown mInflater = LayoutInflater.from(context); 1940abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 1950abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 1960abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void update() { 1970abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown clear(); 1980abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown final int count = mRouter.getRouteCount(); 1990abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown for (int i = 0; i < count; i++) { 2000abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown MediaRouter.RouteInfo route = mRouter.getRouteAt(i); 2010abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (onFilterRoute(route)) { 2020abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown add(route); 2030abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2040abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2050abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown sort(RouteComparator.sInstance); 2060abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown notifyDataSetChanged(); 2070abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2080abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2090abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2100abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public boolean areAllItemsEnabled() { 2110abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown return false; 2120abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2130abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2140abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2150abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public boolean isEnabled(int position) { 2160abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown return getItem(position).isEnabled(); 2170abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2180abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2190abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2200abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public View getView(int position, View convertView, ViewGroup parent) { 2210abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown View view = convertView; 2220abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (view == null) { 2230abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown view = mInflater.inflate(R.layout.media_route_list_item, parent, false); 2240abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2250abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown MediaRouter.RouteInfo route = getItem(position); 2260abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown TextView text1 = (TextView)view.findViewById(android.R.id.text1); 2270abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown TextView text2 = (TextView)view.findViewById(android.R.id.text2); 2280abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown text1.setText(route.getName()); 2290abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown CharSequence description = route.getDescription(); 2300abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (TextUtils.isEmpty(description)) { 2310abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown text2.setVisibility(View.GONE); 2320abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown text2.setText(""); 2330abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } else { 2340abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown text2.setVisibility(View.VISIBLE); 2350abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown text2.setText(description); 2360abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2370abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown view.setEnabled(route.isEnabled()); 2380abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown return view; 2390abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2400abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2410abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2420abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 2430abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown MediaRouter.RouteInfo route = getItem(position); 2440abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown if (route.isEnabled()) { 2450abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown route.select(); 2460abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown dismiss(); 2470abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2480abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2490abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2500abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2510abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private final class MediaRouterCallback extends MediaRouter.SimpleCallback { 2520abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2530abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) { 2540abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown refreshRoutes(); 2550abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2560abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2570abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2580abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) { 2590abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown refreshRoutes(); 2600abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2610abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2620abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2630abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) { 2640abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown refreshRoutes(); 2650abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2660abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2670abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2680abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public void onRouteSelected(MediaRouter router, int type, RouteInfo info) { 2690abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown dismiss(); 2700abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2710abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2720abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2730abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown private static final class RouteComparator implements Comparator<MediaRouter.RouteInfo> { 2740abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public static final RouteComparator sInstance = new RouteComparator(); 2750abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown 2760abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown @Override 2770abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown public int compare(MediaRouter.RouteInfo lhs, MediaRouter.RouteInfo rhs) { 2780abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown return lhs.getName().toString().compareTo(rhs.getName().toString()); 2790abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2800abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown } 2810abd3a6ce83ed23abe614155e776b600ef2a66c3Jeff Brown} 282