Merge "Import translations. DO NOT MERGE" into klp-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b730ba7..7c4be12 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1343,7 +1343,6 @@
</activity>
<activity android:name="Settings$WifiDisplaySettingsActivity"
- android:uiOptions="splitActionBarWhenNarrow"
android:label="@string/wifi_display_settings_title"
android:taskAffinity=""
android:excludeFromRecents="true">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bb537bf..e32ac43 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1226,37 +1226,22 @@
<string name="bluetooth_dock_settings_remember">Remember settings</string>
<!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
- <string name="wifi_display_settings_title">Wireless display</string>
- <!-- Wifi Display settings. Text displayed when Wifi display is off and device list is empty [CHAR LIMIT=80]-->
- <string name="wifi_display_settings_empty_list_wifi_display_off">To see devices, turn wireless display on.</string>
- <!-- Wifi Display settings. Text displayed when Wifi Display is off and device list is empty [CHAR LIMIT=80]-->
- <string name="wifi_display_settings_empty_list_wifi_display_disabled">Wireless display is disabled because Wi\u2011Fi is off.</string>
- <!-- Wifi Display settings. The title of the action button that initiates a search for nearby devices [CHAR LIMIT=20] -->
- <string name="wifi_display_search_for_devices">Search for displays</string>
- <!-- Wifi Display settings. The title of the action button while a search for nearby devices is in progress [CHAR LIMIT=20] -->
- <string name="wifi_display_searching_for_devices">Searching\u2026</string>
+ <string name="wifi_display_settings_title">Cast screen</string>
+ <!-- Wifi Display settings. The title of a menu item to enable wireless display [CHAR LIMIT=40] -->
+ <string name="wifi_display_enable_menu_item">Enable wireless display</string>
<!-- Wifi Display settings. Text that appears when scanning for devices is finished and no nearby device was found [CHAR LIMIT=40]-->
- <string name="wifi_display_no_devices_found">No nearby wireless displays were found.</string>
- <!-- Wifi Display settings. The sub heading for devices which have already been paired with this device. [CHAR LIMIT=40] -->
- <string name="wifi_display_paired_devices">Paired displays</string>
- <!-- Wifi Display settings. The sub heading for available devices during and after scanning. [CHAR LIMIT=40] -->
- <string name="wifi_display_available_devices">Available devices</string>
+ <string name="wifi_display_no_devices_found">No nearby devices were found.</string>
<!-- Wifi Display settings. The status summary for connecting devices. [CHAR LIMIT=40] -->
<string name="wifi_display_status_connecting">Connecting</string>
<!-- Wifi Display settings. The status summary for connected devices. [CHAR LIMIT=40] -->
<string name="wifi_display_status_connected">Connected</string>
- <!-- Wifi Display settings. The status summary for available devices. [CHAR LIMIT=40] -->
- <string name="wifi_display_status_available">Available</string>
<!-- Wifi Display settings. The status summary for devices that's already in use. [CHAR LIMIT=40] -->
<string name="wifi_display_status_in_use">In use</string>
+ <!-- Wifi Display settings. The status summary for devices that's not available. [CHAR LIMIT=40] -->
+ <string name="wifi_display_status_not_available">Unavailable</string>
<!-- Wifi Display settings. Image description for device details button. This opens the screen to rename, unpair, etc. a single device. -->
<string name="wifi_display_details">Display settings</string>
- <!-- Wifi Display settings. Disconnect dialog. The title of the dialog. [CHAR LIMIT=40] -->
- <string name="wifi_display_disconnect_title">Disconnect?</string>
- <!-- Wifi Display settings. Disconnect dialog. Message for disconnecting from the display. [CHAR LIMIT=NONE] -->
- <string name="wifi_display_disconnect_text">This will end your connection with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b></string>
-
<!-- Wifi Display settings. Options dialog. The title of the dialog. [CHAR LIMIT=40] -->
<string name="wifi_display_options_title">Wireless display options</string>
<!-- Wifi Display settings. Options dialog. The forget button text. [CHAR LIMIT=20] -->
@@ -1266,13 +1251,6 @@
<!-- Wifi Display settings. Options dialog. The name label used when prompting the user to rename the display. [CHAR LIMIT=20] -->
<string name="wifi_display_options_name">Name</string>
- <!-- Wifi Display settings. Summary shown in Display settings. Text used for 'On' state. [CHAR LIMIT=40] -->
- <string name="wifi_display_summary_on">On</string>
- <!-- Wifi Display settings. Summary shown in Display settings. Text used for 'Off' state. [CHAR LIMIT=40] -->
- <string name="wifi_display_summary_off">Off</string>
- <!-- Wifi Display settings. Summary shown in Display settings. Text used for 'Disabled' state. [CHAR LIMIT=40] -->
- <string name="wifi_display_summary_disabled">Disabled</string>
-
<!-- Wifi Display settings. The sub heading for wireless display certification options. [CHAR LIMIT=40] -->
<string name="wifi_display_certification_heading" translatable="false">Certification</string>
<!-- Wifi Display settings. The section title for wireless display session info. [CHAR LIMIT=40] -->
diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java
index c379ec3..7772b7c 100644
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -21,16 +21,10 @@
import android.app.ActivityManagerNative;
import android.app.Dialog;
import android.app.admin.DevicePolicyManager;
-import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
import android.content.res.Configuration;
import android.content.res.Resources;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.WifiDisplay;
-import android.hardware.display.WifiDisplayStatus;
import android.os.Bundle;
import android.os.RemoteException;
import android.preference.CheckBoxPreference;
@@ -40,7 +34,6 @@
import android.preference.PreferenceScreen;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
-import android.util.AttributeSet;
import android.util.Log;
import com.android.internal.view.RotationPolicy;
@@ -60,12 +53,9 @@
private static final String KEY_FONT_SIZE = "font_size";
private static final String KEY_NOTIFICATION_PULSE = "notification_pulse";
private static final String KEY_SCREEN_SAVER = "screensaver";
- private static final String KEY_WIFI_DISPLAY = "wifi_display";
private static final int DLG_GLOBAL_CHANGE_WARNING = 1;
- private DisplayManager mDisplayManager;
-
private CheckBoxPreference mAccelerometer;
private WarnedListPreference mFontSizePref;
private CheckBoxPreference mNotificationPulse;
@@ -75,9 +65,6 @@
private ListPreference mScreenTimeoutPreference;
private Preference mScreenSaverPreference;
- private WifiDisplayStatus mWifiDisplayStatus;
- private Preference mWifiDisplayPreference;
-
private final RotationPolicy.RotationPolicyListener mRotationPolicyListener =
new RotationPolicy.RotationPolicyListener() {
@Override
@@ -135,16 +122,6 @@
Log.e(TAG, Settings.System.NOTIFICATION_LIGHT_PULSE + " not found");
}
}
-
- mDisplayManager = (DisplayManager)getActivity().getSystemService(
- Context.DISPLAY_SERVICE);
- mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
- mWifiDisplayPreference = (Preference)findPreference(KEY_WIFI_DISPLAY);
- if (mWifiDisplayStatus.getFeatureState()
- == WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) {
- getPreferenceScreen().removePreference(mWifiDisplayPreference);
- mWifiDisplayPreference = null;
- }
}
private void updateTimeoutPreferenceDescription(long currentTimeout) {
@@ -252,12 +229,6 @@
RotationPolicy.registerRotationPolicyListener(getActivity(),
mRotationPolicyListener);
- if (mWifiDisplayPreference != null) {
- getActivity().registerReceiver(mReceiver, new IntentFilter(
- DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED));
- mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
- }
-
updateState();
}
@@ -267,10 +238,6 @@
RotationPolicy.unregisterRotationPolicyListener(getActivity(),
mRotationPolicyListener);
-
- if (mWifiDisplayPreference != null) {
- getActivity().unregisterReceiver(mReceiver);
- }
}
@Override
@@ -291,7 +258,6 @@
updateAccelerometerRotationCheckbox();
readFontSizePreference(mFontSizePref);
updateScreenSaverSummary();
- updateWifiDisplaySummary();
}
private void updateScreenSaverSummary() {
@@ -301,23 +267,6 @@
}
}
- private void updateWifiDisplaySummary() {
- if (mWifiDisplayPreference != null) {
- switch (mWifiDisplayStatus.getFeatureState()) {
- case WifiDisplayStatus.FEATURE_STATE_OFF:
- mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_off);
- break;
- case WifiDisplayStatus.FEATURE_STATE_ON:
- mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_on);
- break;
- case WifiDisplayStatus.FEATURE_STATE_DISABLED:
- default:
- mWifiDisplayPreference.setSummary(R.string.wifi_display_summary_disabled);
- break;
- }
- }
- }
-
private void updateAccelerometerRotationCheckbox() {
if (getActivity() == null) return;
@@ -347,6 +296,7 @@
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
+ @Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
final String key = preference.getKey();
if (KEY_SCREEN_TIMEOUT.equals(key)) {
@@ -365,17 +315,6 @@
return true;
}
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) {
- mWifiDisplayStatus = (WifiDisplayStatus)intent.getParcelableExtra(
- DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
- updateWifiDisplaySummary();
- }
- }
- };
-
@Override
public boolean onPreferenceClick(Preference preference) {
if (preference == mFontSizePref) {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index e93fa18..db7eb2b 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -506,7 +506,6 @@
// uiOptions for fragments also defined as activities in manifest.
if (WifiSettings.class.getName().equals(fragmentName) ||
WifiP2pSettings.class.getName().equals(fragmentName) ||
- WifiDisplaySettings.class.getName().equals(fragmentName) ||
BluetoothSettings.class.getName().equals(fragmentName) ||
DreamSettings.class.getName().equals(fragmentName) ||
LocationSettings.class.getName().equals(fragmentName) ||
diff --git a/src/com/android/settings/wfd/WifiDisplaySettings.java b/src/com/android/settings/wfd/WifiDisplaySettings.java
index 6ec79f3..d04f6f2 100755
--- a/src/com/android/settings/wfd/WifiDisplaySettings.java
+++ b/src/com/android/settings/wfd/WifiDisplaySettings.java
@@ -29,6 +29,8 @@
import android.hardware.display.DisplayManager;
import android.hardware.display.WifiDisplay;
import android.hardware.display.WifiDisplayStatus;
+import android.media.MediaRouter;
+import android.media.MediaRouter.RouteInfo;
import android.net.Uri;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.ActionListener;
@@ -63,31 +65,48 @@
import android.widget.Switch;
import android.widget.TextView;
+import com.android.internal.app.MediaRouteDialogPresenter;
import com.android.settings.ProgressCategory;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
/**
* The Settings screen for WifiDisplay configuration and connection management.
+ *
+ * The wifi display routes are integrated together with other remote display routes
+ * from the media router. It may happen that wifi display isn't actually available
+ * on the system. In that case, the enable option will not be shown but other
+ * remote display routes will continue to be made available.
*/
public final class WifiDisplaySettings extends SettingsPreferenceFragment {
private static final String TAG = "WifiDisplaySettings";
private static final boolean DEBUG = false;
- private static final int MENU_ID_SCAN = Menu.FIRST;
+ private static final int MENU_ID_ENABLE_WIFI_DISPLAY = Menu.FIRST;
+ private static final int CHANGE_SETTINGS = 1 << 0;
+ private static final int CHANGE_ROUTES = 1 << 1;
+ private static final int CHANGE_WIFI_DISPLAY_STATUS = 1 << 2;
+ private static final int CHANGE_ALL = -1;
+
+ private static final int ORDER_CERTIFICATION = 1;
+ private static final int ORDER_CONNECTED = 2;
+ private static final int ORDER_AVAILABLE = 3;
+ private static final int ORDER_UNAVAILABLE = 4;
+
+ private final Handler mHandler;
+
+ private MediaRouter mRouter;
private DisplayManager mDisplayManager;
+ private boolean mStarted;
+ private int mPendingChanges;
+
private boolean mWifiDisplayOnSetting;
private WifiDisplayStatus mWifiDisplayStatus;
- private PreferenceGroup mPairedDevicesCategory;
- private ProgressCategory mAvailableDevicesCategory;
-
private TextView mEmptyView;
- private Switch mActionBarSwitch;
-
/* certification */
private boolean mWifiDisplayCertificationOn;
private WifiP2pManager mWifiP2pManager;
@@ -100,15 +119,18 @@
private int mOperatingChannel;
public WifiDisplaySettings() {
+ mHandler = new Handler();
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
- mDisplayManager = (DisplayManager)getActivity().getSystemService(Context.DISPLAY_SERVICE);
- mWifiP2pManager = (WifiP2pManager)getActivity().getSystemService(Context.WIFI_P2P_SERVICE);
- mWifiP2pChannel = mWifiP2pManager.initialize(getActivity(), Looper.getMainLooper(), null);
+ final Context context = getActivity();
+ mRouter = (MediaRouter)context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
+ mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
+ mWifiP2pManager = (WifiP2pManager)context.getSystemService(Context.WIFI_P2P_SERVICE);
+ mWifiP2pChannel = mWifiP2pManager.initialize(context, Looper.getMainLooper(), null);
addPreferencesFromResource(R.xml.wifi_display_settings);
setHasOptionsMenu(true);
@@ -118,42 +140,17 @@
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- Activity activity = getActivity();
- mActionBarSwitch = new Switch(activity);
- mActionBarSwitch.setOnCheckedChangeListener(mSwitchOnCheckedChangedListener);
-
- final int padding = activity.getResources().getDimensionPixelSize(
- R.dimen.action_bar_switch_padding);
- mActionBarSwitch.setPaddingRelative(0, 0, padding, 0);
- activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
- ActionBar.DISPLAY_SHOW_CUSTOM);
- activity.getActionBar().setCustomView(mActionBarSwitch,
- new ActionBar.LayoutParams(
- ActionBar.LayoutParams.WRAP_CONTENT,
- ActionBar.LayoutParams.WRAP_CONTENT,
- Gravity.CENTER_VERTICAL | Gravity.END));
-
mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
+ mEmptyView.setText(R.string.wifi_display_no_devices_found);
getListView().setEmptyView(mEmptyView);
-
- update();
-
- if (mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) {
- activity.finish();
- }
}
@Override
- public void onDestroyView() {
- getActivity().getActionBar().setCustomView(null);
- super.onDestroyView();
- }
+ public void onStart() {
+ super.onStart();
+ mStarted = true;
- @Override
- public void onResume() {
- super.onResume();
-
- Context context = getActivity();
+ final Context context = getActivity();
IntentFilter filter = new IntentFilter();
filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
context.registerReceiver(mReceiver, filter);
@@ -163,136 +160,156 @@
getContentResolver().registerContentObserver(Settings.Global.getUriFor(
Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON), false, mSettingsObserver);
getContentResolver().registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.WIFI_DISPLAY_WPS_CONFIG), false, mSettingsObserver);
+ Settings.Global.WIFI_DISPLAY_WPS_CONFIG), false, mSettingsObserver);
- mDisplayManager.scanWifiDisplays();
+ mRouter.addCallback(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, mRouterCallback,
+ MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- update();
+ update(CHANGE_ALL);
}
@Override
- public void onPause() {
- super.onPause();
+ public void onStop() {
+ super.onStop();
+ mStarted = false;
- Context context = getActivity();
+ final Context context = getActivity();
context.unregisterReceiver(mReceiver);
getContentResolver().unregisterContentObserver(mSettingsObserver);
+
+ mRouter.removeCallback(mRouterCallback);
+
+ unscheduleUpdate();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- MenuItem item = menu.add(Menu.NONE, MENU_ID_SCAN, 0,
- mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING ?
- R.string.wifi_display_searching_for_devices :
- R.string.wifi_display_search_for_devices);
- item.setEnabled(mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON
- && mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_NOT_SCANNING);
- item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ if (mWifiDisplayStatus != null && mWifiDisplayStatus.getFeatureState()
+ != WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) {
+ MenuItem item = menu.add(Menu.NONE, MENU_ID_ENABLE_WIFI_DISPLAY, 0,
+ R.string.wifi_display_enable_menu_item);
+ item.setCheckable(true);
+ item.setChecked(mWifiDisplayOnSetting);
+ }
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case MENU_ID_SCAN:
- if (mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
- mDisplayManager.scanWifiDisplays();
- }
+ case MENU_ID_ENABLE_WIFI_DISPLAY:
+ mWifiDisplayOnSetting = !item.isChecked();
+ item.setChecked(mWifiDisplayOnSetting);
+ Settings.Global.putInt(getContentResolver(),
+ Settings.Global.WIFI_DISPLAY_ON, mWifiDisplayOnSetting ? 1 : 0);
return true;
}
return super.onOptionsItemSelected(item);
}
- @Override
- public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
- Preference preference) {
- if (preference instanceof WifiDisplayPreference) {
- WifiDisplayPreference p = (WifiDisplayPreference)preference;
- WifiDisplay display = p.getDisplay();
-
- if (display.equals(mWifiDisplayStatus.getActiveDisplay())) {
- showDisconnectDialog(display);
- } else if (display.canConnect()){
- mDisplayManager.connectWifiDisplay(display.getDeviceAddress());
+ private void scheduleUpdate(int changes) {
+ if (mStarted) {
+ if (mPendingChanges == 0) {
+ mHandler.post(mUpdateRunnable);
}
+ mPendingChanges |= changes;
+ }
+ }
+
+ private void unscheduleUpdate() {
+ if (mPendingChanges != 0) {
+ mPendingChanges = 0;
+ mHandler.removeCallbacks(mUpdateRunnable);
+ }
+ }
+
+ private void update(int changes) {
+ boolean invalidateOptions = false;
+
+ // Update settings.
+ if ((changes & CHANGE_SETTINGS) != 0) {
+ mWifiDisplayOnSetting = Settings.Global.getInt(getContentResolver(),
+ Settings.Global.WIFI_DISPLAY_ON, 0) != 0;
+ mWifiDisplayCertificationOn = Settings.Global.getInt(getContentResolver(),
+ Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 0) != 0;
+ mWpsConfig = Settings.Global.getInt(getContentResolver(),
+ Settings.Global.WIFI_DISPLAY_WPS_CONFIG, WpsInfo.INVALID);
+
+ // The wifi display enabled setting may have changed.
+ invalidateOptions = true;
}
- return super.onPreferenceTreeClick(preferenceScreen, preference);
- }
+ // Update wifi display state.
+ if ((changes & CHANGE_WIFI_DISPLAY_STATUS) != 0) {
+ mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
- private void update() {
- mWifiDisplayOnSetting = Settings.Global.getInt(getContentResolver(),
- Settings.Global.WIFI_DISPLAY_ON, 0) != 0;
- mWifiDisplayCertificationOn = Settings.Global.getInt(getContentResolver(),
- Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 0) != 0;
- mWpsConfig = Settings.Global.getInt(getContentResolver(),
- Settings.Global.WIFI_DISPLAY_WPS_CONFIG, WpsInfo.INVALID);
- mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
+ // The wifi display feature state may have changed.
+ invalidateOptions = true;
+ }
- applyState();
- }
-
- private void applyState() {
- final int featureState = mWifiDisplayStatus.getFeatureState();
- mActionBarSwitch.setEnabled(featureState != WifiDisplayStatus.FEATURE_STATE_DISABLED);
- mActionBarSwitch.setChecked(mWifiDisplayOnSetting);
-
+ // Rebuild the routes.
final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removeAll();
- if (featureState == WifiDisplayStatus.FEATURE_STATE_ON) {
- final WifiDisplay[] displays = mWifiDisplayStatus.getDisplays();
+ // Add all known remote display routes.
+ final int routeCount = mRouter.getRouteCount();
+ for (int i = 0; i < routeCount; i++) {
+ MediaRouter.RouteInfo route = mRouter.getRouteAt(i);
+ if (route.matchesTypes(MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY)) {
+ preferenceScreen.addPreference(createRoutePreference(route));
+ }
+ }
+ // Additional features for wifi display routes.
+ if (mWifiDisplayStatus != null
+ && mWifiDisplayStatus.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON) {
+ // Add all unpaired wifi displays.
+ for (WifiDisplay display : mWifiDisplayStatus.getDisplays()) {
+ if (!display.isRemembered() && display.isAvailable()
+ && !display.equals(mWifiDisplayStatus.getActiveDisplay())) {
+ preferenceScreen.addPreference(new UnpairedWifiDisplayPreference(
+ getActivity(), display));
+ }
+ }
+
+ // Add the certification menu if enabled in developer options.
if (mWifiDisplayCertificationOn) {
buildCertificationMenu(preferenceScreen);
}
-
- if (mPairedDevicesCategory == null) {
- mPairedDevicesCategory = new PreferenceCategory(getActivity());
- mPairedDevicesCategory.setTitle(R.string.wifi_display_paired_devices);
- } else {
- mPairedDevicesCategory.removeAll();
- }
- preferenceScreen.addPreference(mPairedDevicesCategory);
-
- if (mAvailableDevicesCategory == null) {
- mAvailableDevicesCategory = new ProgressCategory(getActivity(), null,
- R.string.wifi_display_no_devices_found);
- mAvailableDevicesCategory.setTitle(R.string.wifi_display_available_devices);
- } else {
- mAvailableDevicesCategory.removeAll();
- }
- preferenceScreen.addPreference(mAvailableDevicesCategory);
-
- for (WifiDisplay d : displays) {
- if (d.isRemembered()) {
- mPairedDevicesCategory.addPreference(createWifiDisplayPreference(d));
- } else if (d.isAvailable()){
- mAvailableDevicesCategory.addPreference(createWifiDisplayPreference(d));
- }
- }
- if (mPairedDevicesCategory.getPreferenceCount() == 0) {
- preferenceScreen.removePreference(mPairedDevicesCategory);
- }
- if (mWifiDisplayStatus.getScanState() == WifiDisplayStatus.SCAN_STATE_SCANNING) {
- mAvailableDevicesCategory.setProgress(true);
- } else {
- mAvailableDevicesCategory.setProgress(false);
- }
- } else {
- mEmptyView.setText(featureState == WifiDisplayStatus.FEATURE_STATE_OFF ?
- R.string.wifi_display_settings_empty_list_wifi_display_off :
- R.string.wifi_display_settings_empty_list_wifi_display_disabled);
}
- getActivity().invalidateOptionsMenu();
+ // Invalidate menu options if needed.
+ if (invalidateOptions) {
+ getActivity().invalidateOptionsMenu();
+ }
+ }
+
+ private RoutePreference createRoutePreference(MediaRouter.RouteInfo route) {
+ WifiDisplay display = findWifiDisplay(route.getDeviceAddress());
+ if (display != null) {
+ return new WifiDisplayRoutePreference(getActivity(), route, display);
+ } else {
+ return new RoutePreference(getActivity(), route);
+ }
+ }
+
+ private WifiDisplay findWifiDisplay(String deviceAddress) {
+ if (mWifiDisplayStatus != null && deviceAddress != null) {
+ for (WifiDisplay display : mWifiDisplayStatus.getDisplays()) {
+ if (display.getDeviceAddress().equals(deviceAddress)) {
+ return display;
+ }
+ }
+ }
+ return null;
}
private void buildCertificationMenu(final PreferenceScreen preferenceScreen) {
if (mCertCategory == null) {
mCertCategory = new PreferenceCategory(getActivity());
mCertCategory.setTitle(R.string.wifi_display_certification_heading);
+ mCertCategory.setOrder(ORDER_CERTIFICATION);
} else {
mCertCategory.removeAll();
}
@@ -526,53 +543,22 @@
});
}
- private Preference createWifiDisplayPreference(final WifiDisplay d) {
- WifiDisplayPreference p = new WifiDisplayPreference(getActivity(), d);
- if (d.equals(mWifiDisplayStatus.getActiveDisplay())) {
- switch (mWifiDisplayStatus.getActiveDisplayState()) {
- case WifiDisplayStatus.DISPLAY_STATE_CONNECTED:
- p.setSummary(R.string.wifi_display_status_connected);
- break;
- case WifiDisplayStatus.DISPLAY_STATE_CONNECTING:
- p.setSummary(R.string.wifi_display_status_connecting);
- break;
- }
- } else if (d.isAvailable()) {
- if (!d.canConnect()) {
- p.setSummary(R.string.wifi_display_status_in_use);
- p.setEnabled(false);
- } else if (d.isRemembered()) {
- p.setSummary(R.string.wifi_display_status_available);
- }
+ private void toggleRoute(MediaRouter.RouteInfo route) {
+ if (route.isSelected()) {
+ MediaRouteDialogPresenter.showDialogFragment(getActivity(),
+ MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY, null);
+ } else {
+ route.select();
}
- if (d.isRemembered()) {
- p.setWidgetLayoutResource(R.layout.wifi_display_preference);
- }
- return p;
}
- private void showDisconnectDialog(final WifiDisplay display) {
- DialogInterface.OnClickListener ok = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- if (display.equals(mWifiDisplayStatus.getActiveDisplay())) {
- mDisplayManager.disconnectWifiDisplay();
- }
- }
- };
-
- AlertDialog dialog = new AlertDialog.Builder(getActivity())
- .setCancelable(true)
- .setTitle(R.string.wifi_display_disconnect_title)
- .setMessage(Html.fromHtml(getResources().getString(
- R.string.wifi_display_disconnect_text, display.getFriendlyDisplayName())))
- .setPositiveButton(android.R.string.ok, ok)
- .setNegativeButton(android.R.string.cancel, null)
- .create();
- dialog.show();
+ private void pairWifiDisplay(WifiDisplay display) {
+ if (display.canConnect()) {
+ mDisplayManager.connectWifiDisplay(display.getDeviceAddress());
+ }
}
- private void showOptionsDialog(final WifiDisplay display) {
+ private void showWifiDisplayOptionsDialog(final WifiDisplay display) {
View view = getActivity().getLayoutInflater().inflate(R.layout.wifi_display_options, null);
final EditText nameEditText = (EditText)view.findViewById(R.id.name);
nameEditText.setText(display.getFriendlyDisplayName());
@@ -604,22 +590,12 @@
dialog.show();
}
- private static boolean contains(WifiDisplay[] displays, String address) {
- for (WifiDisplay d : displays) {
- if (d.getDeviceAddress().equals(address)) {
- return true;
- }
- }
- return false;
- }
-
- private final CompoundButton.OnCheckedChangeListener mSwitchOnCheckedChangedListener =
- new CompoundButton.OnCheckedChangeListener() {
+ private final Runnable mUpdateRunnable = new Runnable() {
@Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- mWifiDisplayOnSetting = isChecked;
- Settings.Global.putInt(getContentResolver(),
- Settings.Global.WIFI_DISPLAY_ON, isChecked ? 1 : 0);
+ public void run() {
+ final int changes = mPendingChanges;
+ mPendingChanges = 0;
+ update(changes);
}
};
@@ -628,10 +604,7 @@
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) {
- WifiDisplayStatus status = (WifiDisplayStatus)intent.getParcelableExtra(
- DisplayManager.EXTRA_WIFI_DISPLAY_STATUS);
- mWifiDisplayStatus = status;
- applyState();
+ scheduleUpdate(CHANGE_WIFI_DISPLAY_STATUS);
}
}
};
@@ -639,23 +612,87 @@
private final ContentObserver mSettingsObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange, Uri uri) {
- update();
+ scheduleUpdate(CHANGE_SETTINGS);
}
};
- private final class WifiDisplayPreference extends Preference
+ private final MediaRouter.Callback mRouterCallback = new MediaRouter.SimpleCallback() {
+ @Override
+ public void onRouteAdded(MediaRouter router, RouteInfo info) {
+ scheduleUpdate(CHANGE_ROUTES);
+ }
+
+ @Override
+ public void onRouteChanged(MediaRouter router, RouteInfo info) {
+ scheduleUpdate(CHANGE_ROUTES);
+ }
+
+ @Override
+ public void onRouteRemoved(MediaRouter router, RouteInfo info) {
+ scheduleUpdate(CHANGE_ROUTES);
+ }
+
+ @Override
+ public void onRouteSelected(MediaRouter router, int type, RouteInfo info) {
+ scheduleUpdate(CHANGE_ROUTES);
+ }
+
+ @Override
+ public void onRouteUnselected(MediaRouter router, int type, RouteInfo info) {
+ scheduleUpdate(CHANGE_ROUTES);
+ }
+ };
+
+ private class RoutePreference extends Preference
+ implements Preference.OnPreferenceClickListener {
+ private final MediaRouter.RouteInfo mRoute;
+
+ public RoutePreference(Context context, MediaRouter.RouteInfo route) {
+ super(context);
+
+ mRoute = route;
+ setTitle(route.getName());
+ setSummary(route.getDescription());
+ setEnabled(route.isEnabled());
+ if (route.isSelected()) {
+ setOrder(ORDER_CONNECTED);
+ if (route.isConnecting()) {
+ setSummary(R.string.wifi_display_status_connecting);
+ } else {
+ setSummary(R.string.wifi_display_status_connected);
+ }
+ } else {
+ if (isEnabled()) {
+ setOrder(ORDER_AVAILABLE);
+ } else {
+ setOrder(ORDER_UNAVAILABLE);
+ if (route.getStatusCode() == MediaRouter.RouteInfo.STATUS_IN_USE) {
+ setSummary(R.string.wifi_display_status_in_use);
+ } else {
+ setSummary(R.string.wifi_display_status_not_available);
+ }
+ }
+ }
+ setOnPreferenceClickListener(this);
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ toggleRoute(mRoute);
+ return true;
+ }
+ }
+
+ private class WifiDisplayRoutePreference extends RoutePreference
implements View.OnClickListener {
private final WifiDisplay mDisplay;
- public WifiDisplayPreference(Context context, WifiDisplay display) {
- super(context);
+ public WifiDisplayRoutePreference(Context context, MediaRouter.RouteInfo route,
+ WifiDisplay display) {
+ super(context, route);
mDisplay = display;
- setTitle(display.getFriendlyDisplayName());
- }
-
- public WifiDisplay getDisplay() {
- return mDisplay;
+ setWidgetLayoutResource(R.layout.wifi_display_preference);
}
@Override
@@ -665,19 +702,46 @@
ImageView deviceDetails = (ImageView) view.findViewById(R.id.deviceDetails);
if (deviceDetails != null) {
deviceDetails.setOnClickListener(this);
-
if (!isEnabled()) {
TypedValue value = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.disabledAlpha,
value, true);
deviceDetails.setImageAlpha((int)(value.getFloat() * 255));
+ deviceDetails.setEnabled(true); // always allow button to be pressed
}
}
}
@Override
public void onClick(View v) {
- showOptionsDialog(mDisplay);
+ showWifiDisplayOptionsDialog(mDisplay);
+ }
+ }
+
+ private class UnpairedWifiDisplayPreference extends Preference
+ implements Preference.OnPreferenceClickListener {
+ private final WifiDisplay mDisplay;
+
+ public UnpairedWifiDisplayPreference(Context context, WifiDisplay display) {
+ super(context);
+
+ mDisplay = display;
+ setTitle(display.getFriendlyDisplayName());
+ setSummary(com.android.internal.R.string.wireless_display_route_description);
+ setEnabled(display.canConnect());
+ if (isEnabled()) {
+ setOrder(ORDER_AVAILABLE);
+ } else {
+ setOrder(ORDER_UNAVAILABLE);
+ setSummary(R.string.wifi_display_status_in_use);
+ }
+ setOnPreferenceClickListener(this);
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ pairWifiDisplay(mDisplay);
+ return true;
}
}
}