19e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown/* 29e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * Copyright (C) 2012 The Android Open Source Project 39e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * 49e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 59e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * you may not use this file except in compliance with the License. 69e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * You may obtain a copy of the License at 79e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * 89e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 99e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * 109e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * Unless required by applicable law or agreed to in writing, software 119e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 129e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * See the License for the specific language governing permissions and 149e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * limitations under the License. 159e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown */ 169e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 179e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownpackage com.android.settings.wfd; 189e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 199e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.app.ActionBar; 209e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.app.Activity; 219e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.app.AlertDialog; 229e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.BroadcastReceiver; 239e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.Context; 249e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.DialogInterface; 259e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.Intent; 269e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.content.IntentFilter; 279e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.database.ContentObserver; 289e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.DisplayManager; 299e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.WifiDisplay; 309e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.hardware.display.WifiDisplayStatus; 319e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.net.Uri; 329e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.os.Bundle; 339e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.os.Handler; 349e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.preference.Preference; 359e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.preference.PreferenceActivity; 369e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.preference.PreferenceCategory; 379e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.preference.PreferenceGroup; 389e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.preference.PreferenceScreen; 399e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.provider.Settings; 409e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.text.Html; 419e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.util.TypedValue; 429e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.view.Gravity; 439e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.view.Menu; 449e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.view.MenuInflater; 459e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.view.MenuItem; 469e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.view.View; 479e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.widget.CompoundButton; 489e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.widget.EditText; 499e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.widget.ImageView; 509e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.widget.Switch; 519e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport android.widget.TextView; 529e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 539e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport com.android.settings.ProgressCategory; 549e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport com.android.settings.R; 559e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownimport com.android.settings.SettingsPreferenceFragment; 569e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 579e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown/** 589e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown * The Settings screen for WifiDisplay configuration and connection management. 599e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown */ 609e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brownpublic final class WifiDisplaySettings extends SettingsPreferenceFragment { 619e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private static final String TAG = "WifiDisplaySettings"; 629e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private static final int MENU_ID_SCAN = Menu.FIRST; 649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private DisplayManager mDisplayManager; 669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private boolean mWifiDisplayOnSetting; 689e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private WifiDisplayStatus mWifiDisplayStatus; 699e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 709e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private PreferenceGroup mPairedDevicesCategory; 719e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private ProgressCategory mAvailableDevicesCategory; 729e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 739e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private TextView mEmptyView; 749e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 759e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private Switch mActionBarSwitch; 769e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 779e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public WifiDisplaySettings() { 789e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 799e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 809e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 819e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onCreate(Bundle icicle) { 829e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onCreate(icicle); 839e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 849e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager = (DisplayManager)getActivity().getSystemService(Context.DISPLAY_SERVICE); 859e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 869e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown addPreferencesFromResource(R.xml.wifi_display_settings); 879e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown setHasOptionsMenu(true); 889e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 899e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 909e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 919e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onActivityCreated(Bundle savedInstanceState) { 929e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onActivityCreated(savedInstanceState); 939e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 949e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Activity activity = getActivity(); 959e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mActionBarSwitch = new Switch(activity); 969e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (activity instanceof PreferenceActivity) { 979e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown PreferenceActivity preferenceActivity = (PreferenceActivity) activity; 989e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { 999e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final int padding = activity.getResources().getDimensionPixelSize( 1009e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.dimen.action_bar_switch_padding); 1019e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mActionBarSwitch.setPadding(0, 0, padding, 0); 1029e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 1039e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown ActionBar.DISPLAY_SHOW_CUSTOM); 1049e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown activity.getActionBar().setCustomView(mActionBarSwitch, 1059e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown new ActionBar.LayoutParams( 1069e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown ActionBar.LayoutParams.WRAP_CONTENT, 1079e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown ActionBar.LayoutParams.WRAP_CONTENT, 1089e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Gravity.CENTER_VERTICAL | Gravity.END)); 1099e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1109e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1119e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1129e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mActionBarSwitch.setOnCheckedChangeListener(mSwitchOnCheckedChangedListener); 1139e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1149e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mEmptyView = (TextView) getView().findViewById(android.R.id.empty); 1159e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown getListView().setEmptyView(mEmptyView); 1169e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1179e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown update(); 1189e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1199e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) { 1209e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown activity.finish(); 1219e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1229e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1239e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1249e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 1259e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onResume() { 1269e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onResume(); 1279e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1289e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Context context = getActivity(); 1299e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown IntentFilter filter = new IntentFilter(); 1309e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED); 1319e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown context.registerReceiver(mReceiver, filter); 1329e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1339e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown getContentResolver().registerContentObserver(Settings.Secure.getUriFor( 1349e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Settings.Global.WIFI_DISPLAY_ON), false, mSettingsObserver); 1359e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1369e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.scanWifiDisplays(); 1379e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1389e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown update(); 1399e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1409e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1419e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 1429e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onPause() { 1439e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onPause(); 1449e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1459e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Context context = getActivity(); 1469e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown context.unregisterReceiver(mReceiver); 1479e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1489e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown getContentResolver().unregisterContentObserver(mSettingsObserver); 1499e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1509e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1519e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 1529e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1539e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown MenuItem item = menu.add(Menu.NONE, MENU_ID_SCAN, 0, 1549e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING ? 1559e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_searching_for_devices : 1569e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_search_for_devices); 1579e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown item.setEnabled(mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON 1589e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown && mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_NOT_SCANNING); 1599e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 1609e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onCreateOptionsMenu(menu, inflater); 1619e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1629e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 1649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public boolean onOptionsItemSelected(MenuItem item) { 1659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown switch (item.getItemId()) { 1669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown case MENU_ID_SCAN: 1679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) { 1689e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.scanWifiDisplays(); 1699e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1709e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return true; 1719e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1729e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return super.onOptionsItemSelected(item); 1739e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1749e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1759e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 1769e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, 1779e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Preference preference) { 1789e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (preference instanceof WifiDisplayPreference) { 1799e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown WifiDisplayPreference p = (WifiDisplayPreference)preference; 1809e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown WifiDisplay display = p.getDisplay(); 1819e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1829e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (display.equals(mWifiDisplayStatus.getActiveDisplay())) { 1839e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown showDisconnectDialog(display); 1849e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else { 1859e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.connectWifiDisplay(display.getDeviceAddress()); 1869e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1879e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1889e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1899e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return super.onPreferenceTreeClick(preferenceScreen, preference); 1909e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1919e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1929e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private void update() { 1939e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mWifiDisplayOnSetting = Settings.Global.getInt(getContentResolver(), 1949e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Settings.Global.WIFI_DISPLAY_ON, 0) != 0; 1959e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus(); 1969e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 1979e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown applyState(); 1989e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 1999e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2009e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private void applyState() { 2019e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final int featureState = mWifiDisplayStatus.getFeatureState(); 2029e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mActionBarSwitch.setEnabled(featureState != WifiDisplayStatus.FEATURE_STATE_DISABLED); 2039e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mActionBarSwitch.setChecked(mWifiDisplayOnSetting); 2049e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2059e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final PreferenceScreen preferenceScreen = getPreferenceScreen(); 2069e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown preferenceScreen.removeAll(); 2079e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2089e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (featureState == WifiDisplayStatus.FEATURE_STATE_ON) { 2099e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final WifiDisplay[] pairedDisplays = mWifiDisplayStatus.getRememberedDisplays(); 2109e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final WifiDisplay[] availableDisplays = mWifiDisplayStatus.getAvailableDisplays(); 2119e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2129e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mPairedDevicesCategory == null) { 2139e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mPairedDevicesCategory = new PreferenceCategory(getActivity()); 2149e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mPairedDevicesCategory.setTitle(R.string.wifi_display_paired_devices); 2159e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else { 2169e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mPairedDevicesCategory.removeAll(); 2179e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2189e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown preferenceScreen.addPreference(mPairedDevicesCategory); 2199e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2209e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown for (WifiDisplay d : pairedDisplays) { 2219e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mPairedDevicesCategory.addPreference(createWifiDisplayPreference(d, true)); 2229e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2239e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mPairedDevicesCategory.getPreferenceCount() == 0) { 2249e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown preferenceScreen.removePreference(mPairedDevicesCategory); 2259e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2269e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2279e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mAvailableDevicesCategory == null) { 2289e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory = new ProgressCategory(getActivity(), null, 2299e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_no_devices_found); 2309e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory.setTitle(R.string.wifi_display_available_devices); 2319e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else { 2329e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory.removeAll(); 2339e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2349e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown preferenceScreen.addPreference(mAvailableDevicesCategory); 2359e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2369e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown for (WifiDisplay d : availableDisplays) { 2379e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (!contains(pairedDisplays, d.getDeviceAddress())) { 2389e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory.addPreference(createWifiDisplayPreference(d, false)); 2399e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2409e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2419e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) { 2429e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory.setProgress(true); 2439e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else { 2449e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mAvailableDevicesCategory.setProgress(false); 2459e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2469e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else { 2479e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mEmptyView.setText(featureState == WifiDisplayStatus.FEATURE_STATE_OFF ? 2489e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_settings_empty_list_wifi_display_off : 2499e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_settings_empty_list_wifi_display_disabled); 2509e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2519e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2529e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown getActivity().invalidateOptionsMenu(); 2539e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2549e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2559e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private Preference createWifiDisplayPreference(final WifiDisplay d, boolean paired) { 2569e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown WifiDisplayPreference p = new WifiDisplayPreference(getActivity(), d); 2579e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (d.equals(mWifiDisplayStatus.getActiveDisplay())) { 2589e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown switch (mWifiDisplayStatus.getActiveDisplayState()) { 2599e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown case WifiDisplayStatus.DISPLAY_STATE_CONNECTED: 2609e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown p.setSummary(R.string.wifi_display_status_connected); 2619e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown break; 2629e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown case WifiDisplayStatus.DISPLAY_STATE_CONNECTING: 2639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown p.setSummary(R.string.wifi_display_status_connecting); 2649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown break; 2659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } else if (paired && contains(mWifiDisplayStatus.getAvailableDisplays(), 2679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown d.getDeviceAddress())) { 2689e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown p.setSummary(R.string.wifi_display_status_available); 2699e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2709e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (paired) { 2719e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown p.setWidgetLayoutResource(R.layout.wifi_display_preference); 2729e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2739e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return p; 2749e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2759e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2769e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private void showDisconnectDialog(final WifiDisplay display) { 2779e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown DialogInterface.OnClickListener ok = new DialogInterface.OnClickListener() { 2789e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 2799e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onClick(DialogInterface dialog, int which) { 2809e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (display.equals(mWifiDisplayStatus.getActiveDisplay())) { 2819e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.disconnectWifiDisplay(); 2829e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2839e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2849e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 2859e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2869e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown AlertDialog dialog = new AlertDialog.Builder(getActivity()) 2879e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setCancelable(true) 2889e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setTitle(R.string.wifi_display_disconnect_title) 2899e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setMessage(Html.fromHtml(getResources().getString( 2909e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown R.string.wifi_display_disconnect_text, display.getFriendlyDisplayName()))) 2919e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setPositiveButton(android.R.string.ok, ok) 2929e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setNegativeButton(android.R.string.cancel, null) 2939e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .create(); 2949e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown dialog.show(); 2959e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 2969e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 2979e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private void showOptionsDialog(final WifiDisplay display) { 2989e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown View view = getActivity().getLayoutInflater().inflate(R.layout.wifi_display_options, null); 2999e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown final EditText nameEditText = (EditText)view.findViewById(R.id.name); 3009e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown nameEditText.setText(display.getFriendlyDisplayName()); 3019e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3029e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown DialogInterface.OnClickListener done = new DialogInterface.OnClickListener() { 3039e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3049e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onClick(DialogInterface dialog, int which) { 3059e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown String name = nameEditText.getText().toString().trim(); 3069e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (name.isEmpty() || name.equals(display.getDeviceName())) { 3079e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown name = null; 3089e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3099e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.renameWifiDisplay(display.getDeviceAddress(), name); 3109e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3119e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 3129e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown DialogInterface.OnClickListener forget = new DialogInterface.OnClickListener() { 3139e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3149e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onClick(DialogInterface dialog, int which) { 3159e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplayManager.forgetWifiDisplay(display.getDeviceAddress()); 3169e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3179e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 3189e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3199e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown AlertDialog dialog = new AlertDialog.Builder(getActivity()) 3209e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setCancelable(true) 3219e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setTitle(R.string.wifi_display_options_title) 3229e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setView(view) 3239e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setPositiveButton(R.string.wifi_display_options_done, done) 3249e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .setNegativeButton(R.string.wifi_display_options_forget, forget) 3259e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown .create(); 3269e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown dialog.show(); 3279e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3289e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3299e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private static boolean contains(WifiDisplay[] displays, String address) { 3309e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown for (WifiDisplay d : displays) { 3319e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (d.getDeviceAddress().equals(address)) { 3329e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return true; 3339e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3349e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3359e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return false; 3369e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3379e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3389e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private final CompoundButton.OnCheckedChangeListener mSwitchOnCheckedChangedListener = 3399e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown new CompoundButton.OnCheckedChangeListener() { 3409e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3419e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 3429e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mWifiDisplayOnSetting = isChecked; 3439e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Settings.Global.putInt(getContentResolver(), 3449e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown Settings.Global.WIFI_DISPLAY_ON, isChecked ? 1 : 0); 3459e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3469e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 3479e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3489e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 3499e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3509e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onReceive(Context context, Intent intent) { 3519e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown String action = intent.getAction(); 3529e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (action.equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) { 3539e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra( 3549e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown DisplayManager.EXTRA_WIFI_DISPLAY_STATUS); 3559e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mWifiDisplayStatus = status; 3569e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown applyState(); 3579e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3589e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3599e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 3609e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3619e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) { 3629e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3639e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onChange(boolean selfChange, Uri uri) { 3649e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown update(); 3659e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3669e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown }; 3679e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3689e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private final class WifiDisplayPreference extends Preference 3699e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown implements View.OnClickListener { 3709e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown private final WifiDisplay mDisplay; 3719e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3729e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public WifiDisplayPreference(Context context, WifiDisplay display) { 3739e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super(context); 3749e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3759e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown mDisplay = display; 3769e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown setTitle(display.getFriendlyDisplayName()); 3779e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3789e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3799e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public WifiDisplay getDisplay() { 3809e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown return mDisplay; 3819e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3829e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3839e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 3849e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown protected void onBindView(View view) { 3859e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown super.onBindView(view); 3869e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3879e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown ImageView deviceDetails = (ImageView) view.findViewById(R.id.deviceDetails); 3889e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (deviceDetails != null) { 3899e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown deviceDetails.setOnClickListener(this); 3909e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 3919e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown if (!isEnabled()) { 3929e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown TypedValue value = new TypedValue(); 3939e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown getContext().getTheme().resolveAttribute(android.R.attr.disabledAlpha, 3949e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown value, true); 3959e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown deviceDetails.setImageAlpha((int)(value.getFloat() * 255)); 3969e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3979e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3989e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 3999e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown 4009e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown @Override 4019e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown public void onClick(View v) { 4029e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown showOptionsDialog(mDisplay); 4039e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 4049e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown } 4059e143f5e9d836d2d3dd0b2f59f7d14327ade0193Jeff Brown} 406