Upgrade Bluetooth pairing dialogs for ICS.
* Change Bluetooth pairing dialogs to match ICS wireframes. * Default to numeric soft keyboard for PIN entry, and add checkbox to allow user to switch to alphanumeric keyboard if necessary. * Move all Bluetooth advanced settings into action bar menu. * Toggle visibility by touching "My device" entry in devices list. Change-Id: Ic2377eb4364f41d215181cb1e3933997c9db9106
This commit is contained in:
@@ -227,21 +227,6 @@
|
|||||||
android:resource="@id/bluetooth_settings" />
|
android:resource="@id/bluetooth_settings" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name="Settings$AdvancedBluetoothSettingsActivity"
|
|
||||||
android:label="@string/bluetooth_advanced_settings_label"
|
|
||||||
android:targetActivity="Settings">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.MAIN" />
|
|
||||||
<action android:name="android.settings.ADVANCED_BLUETOOTH_SETTINGS" />
|
|
||||||
<category android:name="android.intent.category.VOICE_LAUNCH" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
|
||||||
android:value="com.android.settings.bluetooth.AdvancedBluetoothSettings" />
|
|
||||||
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
|
|
||||||
android:resource="@id/bluetooth_settings" />
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<activity android:name=".bluetooth.DevicePickerActivity"
|
<activity android:name=".bluetooth.DevicePickerActivity"
|
||||||
android:theme="@android:style/Theme.Holo.DialogWhenLarge"
|
android:theme="@android:style/Theme.Holo.DialogWhenLarge"
|
||||||
android:label="@string/device_picker"
|
android:label="@string/device_picker"
|
||||||
|
44
res/layout/bluetooth_pin_confirm.xml
Normal file
44
res/layout/bluetooth_pin_confirm.xml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
/*
|
||||||
|
** Copyright 2011, The Android Open Source Project
|
||||||
|
**
|
||||||
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
** you may not use this file except in compliance with the License.
|
||||||
|
** You may obtain a copy of the License at
|
||||||
|
**
|
||||||
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
**
|
||||||
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
** See the License for the specific language governing permissions and
|
||||||
|
** limitations under the License.
|
||||||
|
*/
|
||||||
|
-->
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="20dip"
|
||||||
|
android:layout_marginRight="20dip"
|
||||||
|
android:layout_marginTop="20dip"
|
||||||
|
android:layout_marginBottom="20dip"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</ScrollView>
|
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!--
|
<!--
|
||||||
/*
|
/*
|
||||||
** Copyright 2008, The Android Open Source Project
|
** Copyright 2011, The Android Open Source Project
|
||||||
**
|
**
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
** you may not use this file except in compliance with the License.
|
** you may not use this file except in compliance with the License.
|
||||||
@@ -30,23 +30,53 @@
|
|||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/message"
|
android:id="@+id/message"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="20dip"
|
android:layout_marginLeft="20dip"
|
||||||
android:layout_marginRight="20dip"
|
android:layout_marginRight="20dip"
|
||||||
android:gravity="center_horizontal"
|
android:layout_marginTop="20dip"
|
||||||
|
android:layout_marginBottom="20dip"
|
||||||
|
android:gravity="center_vertical"
|
||||||
android:textAppearance="?android:attr/textAppearanceMedium" />
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/text"
|
android:id="@+id/text"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_marginTop="20dip"
|
|
||||||
android:layout_marginLeft="20dip"
|
android:layout_marginLeft="20dip"
|
||||||
android:layout_marginRight="20dip"
|
android:layout_marginRight="20dip"
|
||||||
android:inputType="textPassword"
|
android:inputType="textPassword"
|
||||||
android:singleLine="true" />
|
android:singleLine="true" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/pin_values_hint"
|
||||||
|
android:text="@string/bluetooth_pin_values_hint"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="20dip"
|
||||||
|
android:layout_marginRight="20dip"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/alphanumeric_pin"
|
||||||
|
android:text="@string/bluetooth_enable_alphanumeric_pin"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="20dip"
|
||||||
|
android:layout_marginRight="20dip"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceSmall" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/message_below_pin"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="20dip"
|
||||||
|
android:layout_marginRight="20dip"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceMedium" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
@@ -334,14 +334,6 @@
|
|||||||
<item>Never</item>
|
<item>Never</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<!-- Values for visibility_duration_entries matching constants in BluetoothSettings. Do not translate. -->
|
|
||||||
<string-array name="bluetooth_visibility_timeout_values" translatable="false">
|
|
||||||
<item>twomin</item>
|
|
||||||
<item>fivemin</item>
|
|
||||||
<item>onehour</item>
|
|
||||||
<item>never</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<!-- Match this with drawable.wifi_signal. --> <skip />
|
<!-- Match this with drawable.wifi_signal. --> <skip />
|
||||||
<!-- Wi-Fi settings. The signal strength a Wi-Fi network has. -->
|
<!-- Wi-Fi settings. The signal strength a Wi-Fi network has. -->
|
||||||
<string-array name="wifi_signal">
|
<string-array name="wifi_signal">
|
||||||
|
@@ -191,14 +191,18 @@
|
|||||||
<string name="bluetooth">Bluetooth</string>
|
<string name="bluetooth">Bluetooth</string>
|
||||||
<!-- Bluetooth settings screen, check box label when the Bluetooth device can be seen by others -->
|
<!-- Bluetooth settings screen, check box label when the Bluetooth device can be seen by others -->
|
||||||
<string name="bluetooth_visibility">Discoverable</string>
|
<string name="bluetooth_visibility">Discoverable</string>
|
||||||
<!-- Bluetooth settings screen, summary after selecting Discoverable check box -->
|
<!-- Bluetooth settings screen, summary after selecting Discoverable check box [CHAR LIMIT=50] -->
|
||||||
<string name="bluetooth_is_discoverable">Discoverable for <xliff:g id="discoverable_time_period">%1$s</xliff:g> seconds\u2026</string>
|
<string name="bluetooth_is_discoverable">Visible to all nearby Bluetooth devices (<xliff:g id="discoverable_time_period">%1$s</xliff:g>)</string>
|
||||||
<!-- Bluetooth settings screen, Discoverable checkbox summary text when Discoverable duration is set to "forever" -->
|
<!-- Bluetooth settings screen, summary when Discoverable duration is set to "forever" [CHAR LIMIT=50] -->
|
||||||
<string name="bluetooth_is_discoverable_always">Discoverable</string>
|
<string name="bluetooth_is_discoverable_always">Visible to all nearby Bluetooth devices</string>
|
||||||
|
<!-- Bluetooth settings screen, summary text when not discoverable and no paired devices [CHAR LIMIT=50] -->
|
||||||
|
<string name="bluetooth_not_visible_to_other_devices">Not visible to other Bluetooth devices</string>
|
||||||
|
<!-- Bluetooth settings screen, summary text when not discoverable with paired devices [CHAR LIMIT=50] -->
|
||||||
|
<string name="bluetooth_only_visible_to_paired_devices">Only visible to paired devices</string>
|
||||||
<!-- Bluetooth settings screen, Discoverable checkbox summary text -->
|
<!-- Bluetooth settings screen, Discoverable checkbox summary text -->
|
||||||
<string name="bluetooth_not_discoverable">Make device discoverable</string>
|
<string name="bluetooth_not_discoverable">Make device discoverable</string>
|
||||||
<!-- Bluetooth settings screen, option name to pick discoverability timeout duration (a list dialog comes up) -->
|
<!-- Bluetooth settings screen, option name to pick discoverability timeout duration (a list dialog comes up) -->
|
||||||
<string name="bluetooth_visibility_timeout">Discoverable timeout</string>
|
<string name="bluetooth_visibility_timeout">Visibility timeout</string>
|
||||||
<!-- Bluetooth settings screen, Discoverable timout list dialog summary text -->
|
<!-- Bluetooth settings screen, Discoverable timout list dialog summary text -->
|
||||||
<string name="bluetooth_visibility_timeout_summary">Set how long device will be discoverable</string>
|
<string name="bluetooth_visibility_timeout_summary">Set how long device will be discoverable</string>
|
||||||
<!-- Bluetooth settings screen, check box label whether or not to allow
|
<!-- Bluetooth settings screen, check box label whether or not to allow
|
||||||
@@ -216,8 +220,16 @@
|
|||||||
<string name="bluetooth_name_not_set">No name set, using account name</string>
|
<string name="bluetooth_name_not_set">No name set, using account name</string>
|
||||||
<!-- Bluetooth settings screen, menu item to scan for nearby bluetooth devices -->
|
<!-- Bluetooth settings screen, menu item to scan for nearby bluetooth devices -->
|
||||||
<string name="bluetooth_scan_for_devices">Scan for devices</string>
|
<string name="bluetooth_scan_for_devices">Scan for devices</string>
|
||||||
<!-- Bluetooth settings. Message for disconnecting from a bluetooth device -->
|
<!-- Bluetooth settings screen, menu item to change this device's Bluetooth name. [CHAR LIMIT=30] -->
|
||||||
<string name="bluetooth_disconnect_blank"><xliff:g id="device_name">%1$s</xliff:g> will be disconnected.</string>
|
<string name="bluetooth_rename_device" product="tablet">Rename tablet</string>
|
||||||
|
<!-- Bluetooth settings screen, menu item to change this device's Bluetooth name. [CHAR LIMIT=30] -->
|
||||||
|
<string name="bluetooth_rename_device" product="default">Rename phone</string>
|
||||||
|
<!-- Bluetooth settings screen, confirmation button for rename device dialog. [CHAR LIMIT=20] -->
|
||||||
|
<string name="bluetooth_rename_button">Rename</string>
|
||||||
|
<!-- Bluetooth settings. Dialog title to confirm disconnecting from all profiles of a device. [CHAR LIMIT=30] -->
|
||||||
|
<string name="bluetooth_disconnect_title">Disconnect?</string>
|
||||||
|
<!-- Bluetooth settings. Message for disconnecting from all profiles of a bluetooth device. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="bluetooth_disconnect_all_profiles">This will end your connection with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b></string>
|
||||||
<!-- Bluetooth settings. Message when connected to a device -->
|
<!-- Bluetooth settings. Message when connected to a device -->
|
||||||
<string name="bluetooth_connected">Connected</string>
|
<string name="bluetooth_connected">Connected</string>
|
||||||
<!-- Bluetooth settings. Message when a device is disconnected -->
|
<!-- Bluetooth settings. Message when a device is disconnected -->
|
||||||
@@ -234,8 +246,8 @@
|
|||||||
<string name="bluetooth_pairing">Pairing\u2026</string>
|
<string name="bluetooth_pairing">Pairing\u2026</string>
|
||||||
<!--Bluetooth settings screen, summary text under individual Bluetooth devices when paired with one -->
|
<!--Bluetooth settings screen, summary text under individual Bluetooth devices when paired with one -->
|
||||||
<string name="bluetooth_paired">Paired but not connected</string>
|
<string name="bluetooth_paired">Paired but not connected</string>
|
||||||
<!--Bluetooth settings screen, summary text under individual Bluetooth devices that are hands free or a headset -->
|
<!--Bluetooth settings screen, summary text for Bluetooth device with no name -->
|
||||||
<string name="bluetooth_device">handsfree/headset</string>
|
<string name="bluetooth_device">Unnamed Bluetooth device</string>
|
||||||
<!--Bluetooth settings screen, text that appears in heading bar when scanning for devices -->
|
<!--Bluetooth settings screen, text that appears in heading bar when scanning for devices -->
|
||||||
<string name="progress_scanning">Searching</string>
|
<string name="progress_scanning">Searching</string>
|
||||||
<!--Bluetooth settings screen, text that appears in heading bar when scanning for devices is finished, indicating that user can tap on a device to pair with it [CHAR LIMIT=20]-->
|
<!--Bluetooth settings screen, text that appears in heading bar when scanning for devices is finished, indicating that user can tap on a device to pair with it [CHAR LIMIT=20]-->
|
||||||
@@ -248,10 +260,8 @@
|
|||||||
<string name="bluetooth_notif_title">Pairing request</string>
|
<string name="bluetooth_notif_title">Pairing request</string>
|
||||||
<!-- Notification message when a Bluetooth device wants to pair with us -->
|
<!-- Notification message when a Bluetooth device wants to pair with us -->
|
||||||
<string name="bluetooth_notif_message">Select to pair with <xliff:g id="device_name">%1$s</xliff:g></string>
|
<string name="bluetooth_notif_message">Select to pair with <xliff:g id="device_name">%1$s</xliff:g></string>
|
||||||
<!-- Bluetooth settings screen, title of the item to show the list of received files [CHAR LIMIT=30] -->
|
<!-- Bluetooth settings screen, menu to show the list of received files [CHAR LIMIT=30] -->
|
||||||
<string name="bluetooth_show_received_files_title">Show received files</string>
|
<string name="bluetooth_show_received_files">Show received files</string>
|
||||||
<!-- Bluetooth settings screen, summary of the item to show the list of received files [CHAR LIMIT=50] -->
|
|
||||||
<string name="bluetooth_show_received_files_summary">Show the list of files received via Bluetooth</string>
|
|
||||||
|
|
||||||
<!-- Strings for BluetoothDevicePicker -->
|
<!-- Strings for BluetoothDevicePicker -->
|
||||||
<string name="device_picker">Bluetooth device picker</string>
|
<string name="device_picker">Bluetooth device picker</string>
|
||||||
@@ -913,24 +923,45 @@
|
|||||||
<!--Wireless controls screen, settings summary for the item tot ake you to the bluetooth settings screen -->
|
<!--Wireless controls screen, settings summary for the item tot ake you to the bluetooth settings screen -->
|
||||||
<string name="bluetooth_settings_summary">Manage connections, set device name & discoverability</string>
|
<string name="bluetooth_settings_summary">Manage connections, set device name & discoverability</string>
|
||||||
|
|
||||||
<!-- Title for the dialog to enter PIN. -->
|
<!-- ======================================================================================= -->
|
||||||
|
<!-- Note: The opening brackets of HTML style tags are escaped (e.g. "<b>" is "<b>") in -->
|
||||||
|
<!-- the following resources to enable formatting followed by HTML styling, as described -->
|
||||||
|
<!-- here: http://developer.android.com/guide/topics/resources/string-resource.html -->
|
||||||
|
<!-- ======================================================================================= -->
|
||||||
|
|
||||||
|
<!-- Title for the dialog to enter PIN. [CHAR LIMIT=40] -->
|
||||||
<string name="bluetooth_pairing_request">Bluetooth pairing request</string>
|
<string name="bluetooth_pairing_request">Bluetooth pairing request</string>
|
||||||
<!-- Message when bluetooth dialog for pin entry is showing -->
|
|
||||||
<string name="bluetooth_enter_pin_msg">\nEnter PIN to pair with \u0022<xliff:g id="device_name">%1$s</xliff:g>\u0022. (Try 0000 or 1234.) You may need to enter the same PIN on the Bluetooth device.</string>
|
<!-- Message when bluetooth dialog for pin entry is showing. [CHAR LIMIT=NONE] -->
|
||||||
<!-- Message when bluetooth dialog for passkey entry is showing -->
|
<string name="bluetooth_enter_pin_msg">To pair with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b><br><br>Enter the device\'s required PIN:</string>
|
||||||
<string name="bluetooth_enter_passkey_msg">\nEnter passkey to pair with \u0022<xliff:g id="device_name">%1$s</xliff:g>\u0022.</string>
|
|
||||||
<!-- Message when bluetooth dialog for confirmation of passkey is showing -->
|
<!-- Message when bluetooth dialog for passkey entry is showing. [CHAR LIMIT=NONE] -->
|
||||||
<string name="bluetooth_confirm_passkey_msg">To pair with \u0022<xliff:g id="device_name">%1$s</xliff:g>\u0022, confirm that it is showing the passkey: <xliff:g id="passkey">%2$s</xliff:g>.</string>
|
<string name="bluetooth_enter_passkey_msg">To pair with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b><br><br>Enter the device\'s required passkey:</string>
|
||||||
|
|
||||||
|
<!-- Checkbox label for alphanumeric PIN entry (default is numeric PIN). [CHAR LIMIT=50] -->
|
||||||
|
<string name="bluetooth_enable_alphanumeric_pin">PIN contains letters or symbols</string>
|
||||||
|
|
||||||
|
<!-- Bluetooth PIN hint text (below the text entry box). [CHAR LIMIT=30] -->
|
||||||
|
<string name="bluetooth_pin_values_hint">Usually 0000 or 1234</string>
|
||||||
|
|
||||||
|
<!-- Pairing dialog text to remind user to enter the PIN on the other device. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="bluetooth_enter_pin_other_device">You may also need to enter this PIN on the other device.</string>
|
||||||
|
<!-- Pairing dialog text to remind user to enter the passkey on the other device. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="bluetooth_enter_passkey_other_device">You may also need to enter this passkey on the other device.</string>
|
||||||
|
|
||||||
|
<!-- Message for confirmation of passkey to complete pairing. [CHAR LIMIT=NONE] -->
|
||||||
|
<string name="bluetooth_confirm_passkey_msg">To pair with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b><br><br>Make sure it is showing this passkey:<br><b><xliff:g id="passkey">%2$s</xliff:g></b></string>
|
||||||
|
|
||||||
<!-- Message when bluetooth incoming pairing request for (2.1 devices) dialog is showing -->
|
<!-- Message when bluetooth incoming pairing request for (2.1 devices) dialog is showing -->
|
||||||
<string name="bluetooth_incoming_pairing_msg"><xliff:g id="device_name">%1$s</xliff:g>\nwants to pair.</string>
|
<string name="bluetooth_incoming_pairing_msg">From:<br><b><xliff:g id="device_name">%1$s</xliff:g></b><br><br>Pair with this device?</string>
|
||||||
|
|
||||||
<!-- Message when bluetooth dialog when passkey or pin needs to be displayed. -->
|
<!-- Message when bluetooth dialog when passkey or pin needs to be displayed. -->
|
||||||
<string name="bluetooth_display_passkey_pin_msg">Enter \u0022<xliff:g id="passkey">%2$s</xliff:g>\u0022 on \u0022<xliff:g id="device_name">%1$s</xliff:g>\u0022 to pair followed by return or enter. </string>
|
<string name="bluetooth_display_passkey_pin_msg">To pair with:<br><b><xliff:g id="device_name">%1$s</xliff:g></b><br><br>Type on it:<br><b><xliff:g id="passkey">%2$s</xliff:g></b>, then Return or Enter.</string>
|
||||||
<!-- Button text for accepting an incoming pairing request -->
|
|
||||||
|
<!-- Button text for accepting an incoming pairing request. [CHAR LIMIT=20] -->
|
||||||
<string name="bluetooth_pairing_accept">Pair</string>
|
<string name="bluetooth_pairing_accept">Pair</string>
|
||||||
<!-- Button text for declining an incoming pairing request -->
|
<!-- Button text for declining an incoming pairing request. [CHAR LIMIT=20] -->
|
||||||
<string name="bluetooth_pairing_decline">Don\u0027t Pair</string>
|
<string name="bluetooth_pairing_decline">Cancel</string>
|
||||||
<!-- Generic string for remote Bluetooth device -->
|
|
||||||
<string name="bluetooth_remote_device">bluetooth device</string>
|
|
||||||
|
|
||||||
<!-- Title for BT error dialogs. -->
|
<!-- Title for BT error dialogs. -->
|
||||||
<string name="bluetooth_error_title">Attention</string>
|
<string name="bluetooth_error_title">Attention</string>
|
||||||
@@ -975,8 +1006,6 @@
|
|||||||
<string name="bluetooth_menu_advanced">Advanced</string>
|
<string name="bluetooth_menu_advanced">Advanced</string>
|
||||||
<!-- Bluetooth settings. Title of the advanced bluetooth settings screen [CHAR LIMIT=30]-->
|
<!-- Bluetooth settings. Title of the advanced bluetooth settings screen [CHAR LIMIT=30]-->
|
||||||
<string name="bluetooth_advanced_titlebar">Advanced Bluetooth</string>
|
<string name="bluetooth_advanced_titlebar">Advanced Bluetooth</string>
|
||||||
<!-- Bluetooth Advanced settings. Used as a label under the shortcut icon that goes to Bluetooth advanced settings. [CHAR LIMIT=20]-->
|
|
||||||
<string name="bluetooth_advanced_settings_label">Advanced Bluetooth</string>
|
|
||||||
<!-- Bluetooth settings. Text displayed when Bluetooth is off and device list is empty [CHAR LIMIT=50]-->
|
<!-- Bluetooth settings. Text displayed when Bluetooth is off and device list is empty [CHAR LIMIT=50]-->
|
||||||
<string name="bluetooth_empty_list_bluetooth_off">To see devices, turn Bluetooth on.</string>
|
<string name="bluetooth_empty_list_bluetooth_off">To see devices, turn Bluetooth on.</string>
|
||||||
|
|
||||||
|
@@ -1,47 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Copyright (C) 2008 The Android Open Source Project
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:title="@string/bluetooth_advanced_titlebar">
|
|
||||||
|
|
||||||
<com.android.settings.bluetooth.BluetoothNamePreference
|
|
||||||
android:key="bt_name"
|
|
||||||
android:title="@string/bluetooth_device_name"
|
|
||||||
android:summary="@string/bluetooth_name_not_set"
|
|
||||||
android:dialogTitle="@string/bluetooth_device_name"
|
|
||||||
android:persistent="false"
|
|
||||||
android:singleLine="true" />
|
|
||||||
|
|
||||||
<CheckBoxPreference
|
|
||||||
android:key="bt_discoverable"
|
|
||||||
android:title="@string/bluetooth_visibility"
|
|
||||||
android:summaryOn="@string/bluetooth_is_discoverable"
|
|
||||||
android:summaryOff="@string/bluetooth_not_discoverable"
|
|
||||||
android:persistent="false" />
|
|
||||||
|
|
||||||
<ListPreference
|
|
||||||
android:key="bt_discoverable_timeout"
|
|
||||||
android:title="@string/bluetooth_visibility_timeout"
|
|
||||||
android:summary="@string/bluetooth_visibility_timeout_summary"
|
|
||||||
android:entries="@array/bluetooth_visibility_timeout_entries"
|
|
||||||
android:entryValues="@array/bluetooth_visibility_timeout_values" />
|
|
||||||
|
|
||||||
<Preference
|
|
||||||
android:key="bt_show_received_files"
|
|
||||||
android:title="@string/bluetooth_show_received_files_title"
|
|
||||||
android:summary="@string/bluetooth_show_received_files_summary" />
|
|
||||||
|
|
||||||
</PreferenceScreen>
|
|
@@ -584,6 +584,5 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler {
|
|||||||
public static class DeviceAdminSettingsActivity extends Settings { /* empty */ }
|
public static class DeviceAdminSettingsActivity extends Settings { /* empty */ }
|
||||||
public static class DataUsageSummaryActivity extends Settings { /* empty */ }
|
public static class DataUsageSummaryActivity extends Settings { /* empty */ }
|
||||||
public static class AdvancedWifiSettingsActivity extends Settings { /* empty */ }
|
public static class AdvancedWifiSettingsActivity extends Settings { /* empty */ }
|
||||||
public static class AdvancedBluetoothSettingsActivity extends Settings { /* empty */ }
|
|
||||||
public static class TextToSpeechSettingsActivity extends Settings { /* empty */ }
|
public static class TextToSpeechSettingsActivity extends Settings { /* empty */ }
|
||||||
}
|
}
|
||||||
|
@@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.bluetooth;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.CheckBoxPreference;
|
|
||||||
import android.preference.ListPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.PreferenceScreen;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
|
||||||
|
|
||||||
public class AdvancedBluetoothSettings extends SettingsPreferenceFragment
|
|
||||||
implements Preference.OnPreferenceChangeListener {
|
|
||||||
|
|
||||||
private static final String KEY_BT_DISCOVERABLE = "bt_discoverable";
|
|
||||||
private static final String KEY_BT_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout";
|
|
||||||
private static final String KEY_BT_NAME = "bt_name";
|
|
||||||
private static final String KEY_BT_SHOW_RECEIVED = "bt_show_received_files";
|
|
||||||
|
|
||||||
/* Private intent to show the list of received files */
|
|
||||||
private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
|
|
||||||
"android.btopp.intent.action.OPEN_RECEIVED_FILES";
|
|
||||||
|
|
||||||
private BluetoothDiscoverableEnabler mDiscoverableEnabler;
|
|
||||||
private BluetoothNamePreference mNamePreference;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
addPreferencesFromResource(R.xml.bluetooth_advanced_settings);
|
|
||||||
|
|
||||||
LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(getActivity());
|
|
||||||
if (localManager != null) {
|
|
||||||
LocalBluetoothAdapter localAdapter = localManager.getBluetoothAdapter();
|
|
||||||
mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
|
|
||||||
localAdapter,
|
|
||||||
(CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE),
|
|
||||||
(ListPreference) findPreference(KEY_BT_DISCOVERABLE_TIMEOUT));
|
|
||||||
}
|
|
||||||
|
|
||||||
mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
|
||||||
super.onActivityCreated(savedInstanceState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
mDiscoverableEnabler.resume();
|
|
||||||
mNamePreference.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
|
|
||||||
mNamePreference.pause();
|
|
||||||
mDiscoverableEnabler.pause();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
|
|
||||||
if (KEY_BT_SHOW_RECEIVED.equals(preference.getKey())) {
|
|
||||||
Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES);
|
|
||||||
getActivity().sendBroadcast(intent);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.onPreferenceTreeClick(preferenceScreen, preference);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -24,6 +24,7 @@ import android.content.Context;
|
|||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
|
import android.text.Html;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
@@ -200,7 +201,8 @@ public final class BluetoothDevicePreference extends Preference implements
|
|||||||
if (TextUtils.isEmpty(name)) {
|
if (TextUtils.isEmpty(name)) {
|
||||||
name = context.getString(R.string.bluetooth_device);
|
name = context.getString(R.string.bluetooth_device);
|
||||||
}
|
}
|
||||||
String message = context.getString(R.string.bluetooth_disconnect_blank, name);
|
String message = context.getString(R.string.bluetooth_disconnect_all_profiles, name);
|
||||||
|
String title = context.getString(R.string.bluetooth_disconnect_title);
|
||||||
|
|
||||||
DialogInterface.OnClickListener disconnectListener = new DialogInterface.OnClickListener() {
|
DialogInterface.OnClickListener disconnectListener = new DialogInterface.OnClickListener() {
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
@@ -209,7 +211,7 @@ public final class BluetoothDevicePreference extends Preference implements
|
|||||||
};
|
};
|
||||||
|
|
||||||
mDisconnectDialog = Utils.showDisconnectDialog(context,
|
mDisconnectDialog = Utils.showDisconnectDialog(context,
|
||||||
mDisconnectDialog, disconnectListener, name, message);
|
mDisconnectDialog, disconnectListener, title, Html.fromHtml(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void pair() {
|
private void pair() {
|
||||||
@@ -221,7 +223,6 @@ public final class BluetoothDevicePreference extends Preference implements
|
|||||||
|
|
||||||
private int getConnectionSummary() {
|
private int getConnectionSummary() {
|
||||||
final CachedBluetoothDevice cachedDevice = mCachedDevice;
|
final CachedBluetoothDevice cachedDevice = mCachedDevice;
|
||||||
final BluetoothDevice device = cachedDevice.getDevice();
|
|
||||||
|
|
||||||
// if any profiles are connected or busy, return that status
|
// if any profiles are connected or busy, return that status
|
||||||
for (LocalBluetoothProfile profile : cachedDevice.getProfiles()) {
|
for (LocalBluetoothProfile profile : cachedDevice.getProfiles()) {
|
||||||
|
@@ -21,11 +21,11 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.preference.CheckBoxPreference;
|
|
||||||
import android.preference.ListPreference;
|
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
|
import android.text.format.DateUtils;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ import com.android.settings.R;
|
|||||||
* checkbox. It sets/unsets discoverability and keeps track of how much time
|
* checkbox. It sets/unsets discoverability and keeps track of how much time
|
||||||
* until the the discoverability is automatically turned off.
|
* until the the discoverability is automatically turned off.
|
||||||
*/
|
*/
|
||||||
final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChangeListener {
|
final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceClickListener {
|
||||||
|
|
||||||
private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT =
|
private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT =
|
||||||
"debug.bt.discoverable_time";
|
"debug.bt.discoverable_time";
|
||||||
@@ -44,6 +44,10 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
private static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600;
|
private static final int DISCOVERABLE_TIMEOUT_ONE_HOUR = 3600;
|
||||||
static final int DISCOVERABLE_TIMEOUT_NEVER = 0;
|
static final int DISCOVERABLE_TIMEOUT_NEVER = 0;
|
||||||
|
|
||||||
|
// Bluetooth advanced settings screen was replaced with action bar items.
|
||||||
|
// Use the same preference key for discoverable timeout as the old ListPreference.
|
||||||
|
private static final String KEY_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout";
|
||||||
|
|
||||||
private static final String VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES = "twomin";
|
private static final String VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES = "twomin";
|
||||||
private static final String VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES = "fivemin";
|
private static final String VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES = "fivemin";
|
||||||
private static final String VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR = "onehour";
|
private static final String VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR = "onehour";
|
||||||
@@ -53,11 +57,17 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final Handler mUiHandler;
|
private final Handler mUiHandler;
|
||||||
private final CheckBoxPreference mCheckBoxPreference;
|
private final Preference mDiscoveryPreference;
|
||||||
private final ListPreference mTimeoutListPreference;
|
|
||||||
|
|
||||||
private final LocalBluetoothAdapter mLocalAdapter;
|
private final LocalBluetoothAdapter mLocalAdapter;
|
||||||
|
|
||||||
|
private final SharedPreferences mSharedPreferences;
|
||||||
|
|
||||||
|
private boolean mDiscoverable;
|
||||||
|
private int mNumberOfPairedDevices;
|
||||||
|
|
||||||
|
private int mTimeoutSecs = -1;
|
||||||
|
|
||||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
@@ -78,21 +88,13 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
};
|
};
|
||||||
|
|
||||||
BluetoothDiscoverableEnabler(Context context, LocalBluetoothAdapter adapter,
|
BluetoothDiscoverableEnabler(Context context, LocalBluetoothAdapter adapter,
|
||||||
CheckBoxPreference checkBoxPreference, ListPreference timeoutListPreference) {
|
Preference discoveryPreference) {
|
||||||
mContext = context;
|
mContext = context;
|
||||||
mUiHandler = new Handler();
|
mUiHandler = new Handler();
|
||||||
mCheckBoxPreference = checkBoxPreference;
|
|
||||||
mTimeoutListPreference = timeoutListPreference;
|
|
||||||
|
|
||||||
checkBoxPreference.setPersistent(false);
|
|
||||||
// we actually want to persist this since can't infer from BT device state
|
|
||||||
mTimeoutListPreference.setPersistent(true);
|
|
||||||
|
|
||||||
mLocalAdapter = adapter;
|
mLocalAdapter = adapter;
|
||||||
if (adapter == null) {
|
mDiscoveryPreference = discoveryPreference;
|
||||||
// Bluetooth not supported
|
mSharedPreferences = discoveryPreference.getSharedPreferences();
|
||||||
checkBoxPreference.setEnabled(false);
|
discoveryPreference.setPersistent(false);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resume() {
|
public void resume() {
|
||||||
@@ -102,8 +104,7 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
|
|
||||||
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
|
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
|
||||||
mContext.registerReceiver(mReceiver, filter);
|
mContext.registerReceiver(mReceiver, filter);
|
||||||
mCheckBoxPreference.setOnPreferenceChangeListener(this);
|
mDiscoveryPreference.setOnPreferenceClickListener(this);
|
||||||
mTimeoutListPreference.setOnPreferenceChangeListener(this);
|
|
||||||
handleModeChanged(mLocalAdapter.getScanMode());
|
handleModeChanged(mLocalAdapter.getScanMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -113,20 +114,14 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
}
|
}
|
||||||
|
|
||||||
mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
|
mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
|
||||||
mCheckBoxPreference.setOnPreferenceChangeListener(null);
|
|
||||||
mTimeoutListPreference.setOnPreferenceChangeListener(null);
|
|
||||||
mContext.unregisterReceiver(mReceiver);
|
mContext.unregisterReceiver(mReceiver);
|
||||||
|
mDiscoveryPreference.setOnPreferenceClickListener(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object value) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
if (preference == mCheckBoxPreference) {
|
// toggle discoverability
|
||||||
// Turn on/off BT discoverability
|
mDiscoverable = !mDiscoverable;
|
||||||
setEnabled((Boolean) value);
|
setEnabled(mDiscoverable);
|
||||||
} else if (preference == mTimeoutListPreference) {
|
|
||||||
mTimeoutListPreference.setValue((String) value);
|
|
||||||
setEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,9 +133,8 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
long endTimestamp = System.currentTimeMillis() + timeout * 1000L;
|
long endTimestamp = System.currentTimeMillis() + timeout * 1000L;
|
||||||
LocalBluetoothPreferences.persistDiscoverableEndTimestamp(mContext, endTimestamp);
|
LocalBluetoothPreferences.persistDiscoverableEndTimestamp(mContext, endTimestamp);
|
||||||
|
|
||||||
updateCountdownSummary();
|
|
||||||
|
|
||||||
mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);
|
mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeout);
|
||||||
|
updateCountdownSummary();
|
||||||
} else {
|
} else {
|
||||||
mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
|
mLocalAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
|
||||||
}
|
}
|
||||||
@@ -148,22 +142,51 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
|
|
||||||
private void updateTimerDisplay(int timeout) {
|
private void updateTimerDisplay(int timeout) {
|
||||||
if (getDiscoverableTimeout() == DISCOVERABLE_TIMEOUT_NEVER) {
|
if (getDiscoverableTimeout() == DISCOVERABLE_TIMEOUT_NEVER) {
|
||||||
mCheckBoxPreference.setSummaryOn(
|
mDiscoveryPreference.setSummary(R.string.bluetooth_is_discoverable_always);
|
||||||
mContext.getString(R.string.bluetooth_is_discoverable_always));
|
|
||||||
} else {
|
} else {
|
||||||
mCheckBoxPreference.setSummaryOn(
|
String textTimeout = DateUtils.formatElapsedTime(timeout);
|
||||||
mContext.getString(R.string.bluetooth_is_discoverable, timeout));
|
mDiscoveryPreference.setSummary(mContext.getString(R.string.bluetooth_is_discoverable,
|
||||||
|
textTimeout));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setDiscoverableTimeout(int index) {
|
||||||
|
String timeoutValue;
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
mTimeoutSecs = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
|
||||||
|
timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
mTimeoutSecs = DISCOVERABLE_TIMEOUT_FIVE_MINUTES;
|
||||||
|
timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_FIVE_MINUTES;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
mTimeoutSecs = DISCOVERABLE_TIMEOUT_ONE_HOUR;
|
||||||
|
timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_ONE_HOUR;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
mTimeoutSecs = DISCOVERABLE_TIMEOUT_NEVER;
|
||||||
|
timeoutValue = VALUE_DISCOVERABLE_TIMEOUT_NEVER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mSharedPreferences.edit().putString(KEY_DISCOVERABLE_TIMEOUT, timeoutValue).apply();
|
||||||
|
setEnabled(true); // enable discovery and reset timer
|
||||||
|
}
|
||||||
|
|
||||||
private int getDiscoverableTimeout() {
|
private int getDiscoverableTimeout() {
|
||||||
|
if (mTimeoutSecs != -1) {
|
||||||
|
return mTimeoutSecs;
|
||||||
|
}
|
||||||
|
|
||||||
int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1);
|
int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1);
|
||||||
if (timeout < 0) {
|
if (timeout < 0) {
|
||||||
String timeoutValue = mTimeoutListPreference.getValue();
|
String timeoutValue = mSharedPreferences.getString(KEY_DISCOVERABLE_TIMEOUT,
|
||||||
if (timeoutValue == null) {
|
VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES);
|
||||||
mTimeoutListPreference.setValue(VALUE_DISCOVERABLE_TIMEOUT_TWO_MINUTES);
|
|
||||||
return DISCOVERABLE_TIMEOUT_TWO_MINUTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_NEVER)) {
|
if (timeoutValue.equals(VALUE_DISCOVERABLE_TIMEOUT_NEVER)) {
|
||||||
timeout = DISCOVERABLE_TIMEOUT_NEVER;
|
timeout = DISCOVERABLE_TIMEOUT_NEVER;
|
||||||
@@ -175,16 +198,48 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
timeout = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
|
timeout = DISCOVERABLE_TIMEOUT_TWO_MINUTES;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mTimeoutSecs = timeout;
|
||||||
return timeout;
|
return timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleModeChanged(int mode) {
|
int getDiscoverableTimeoutIndex() {
|
||||||
|
int timeout = getDiscoverableTimeout();
|
||||||
|
switch (timeout) {
|
||||||
|
case DISCOVERABLE_TIMEOUT_TWO_MINUTES:
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
case DISCOVERABLE_TIMEOUT_FIVE_MINUTES:
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case DISCOVERABLE_TIMEOUT_ONE_HOUR:
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
case DISCOVERABLE_TIMEOUT_NEVER:
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setNumberOfPairedDevices(int pairedDevices) {
|
||||||
|
mNumberOfPairedDevices = pairedDevices;
|
||||||
|
setSummaryNotDiscoverable();
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleModeChanged(int mode) {
|
||||||
if (mode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
|
if (mode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
|
||||||
mCheckBoxPreference.setChecked(true);
|
mDiscoverable = true;
|
||||||
updateCountdownSummary();
|
updateCountdownSummary();
|
||||||
} else {
|
} else {
|
||||||
mCheckBoxPreference.setChecked(false);
|
mDiscoverable = false;
|
||||||
|
setSummaryNotDiscoverable();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSummaryNotDiscoverable() {
|
||||||
|
if (mNumberOfPairedDevices != 0) {
|
||||||
|
mDiscoveryPreference.setSummary(R.string.bluetooth_only_visible_to_paired_devices);
|
||||||
|
} else {
|
||||||
|
mDiscoveryPreference.setSummary(R.string.bluetooth_not_visible_to_other_devices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +254,7 @@ final class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChang
|
|||||||
|
|
||||||
if (currentTimestamp > endTimestamp) {
|
if (currentTimestamp > endTimestamp) {
|
||||||
// We're still in discoverable mode, but maybe there isn't a timeout.
|
// We're still in discoverable mode, but maybe there isn't a timeout.
|
||||||
mCheckBoxPreference.setSummaryOn(null);
|
updateTimerDisplay(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,161 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.bluetooth;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.DialogFragment;
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.InputFilter;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog fragment for renaming the local Bluetooth device.
|
||||||
|
*/
|
||||||
|
final class BluetoothNameDialogFragment extends DialogFragment implements TextWatcher {
|
||||||
|
private static final int BLUETOOTH_NAME_MAX_LENGTH_BYTES = 248;
|
||||||
|
|
||||||
|
private AlertDialog mAlertDialog;
|
||||||
|
private Button mOkButton;
|
||||||
|
|
||||||
|
// accessed from inner class (not private to avoid thunks)
|
||||||
|
static final String TAG = "BluetoothNameDialogFragment";
|
||||||
|
final LocalBluetoothAdapter mLocalAdapter;
|
||||||
|
EditText mDeviceNameView;
|
||||||
|
|
||||||
|
// This flag is set when the name is updated by code, to distinguish from user changes
|
||||||
|
private boolean mDeviceNameUpdated;
|
||||||
|
|
||||||
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (action.equals(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED)) {
|
||||||
|
updateDeviceName();
|
||||||
|
} else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) &&
|
||||||
|
(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR) ==
|
||||||
|
BluetoothAdapter.STATE_ON)) {
|
||||||
|
updateDeviceName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public BluetoothNameDialogFragment(LocalBluetoothAdapter adapter) {
|
||||||
|
mLocalAdapter = adapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
mAlertDialog = new AlertDialog.Builder(getActivity())
|
||||||
|
.setIcon(android.R.drawable.ic_dialog_info)
|
||||||
|
.setTitle(R.string.bluetooth_rename_device)
|
||||||
|
.setView(createDialogView())
|
||||||
|
.setPositiveButton(R.string.bluetooth_rename_button,
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (mLocalAdapter != null) {
|
||||||
|
String deviceName = mDeviceNameView.getText().toString();
|
||||||
|
Log.d(TAG, "Setting device name to " + deviceName);
|
||||||
|
mLocalAdapter.setName(deviceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
return mAlertDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
private View createDialogView() {
|
||||||
|
final LayoutInflater layoutInflater = (LayoutInflater)getActivity()
|
||||||
|
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
View view = layoutInflater.inflate(R.layout.dialog_edittext, null);
|
||||||
|
mDeviceNameView = (EditText) view.findViewById(R.id.edittext);
|
||||||
|
mDeviceNameView.setFilters(new InputFilter[] {
|
||||||
|
new Utf8ByteLengthFilter(BLUETOOTH_NAME_MAX_LENGTH_BYTES)
|
||||||
|
});
|
||||||
|
mDeviceNameView.addTextChangedListener(this);
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
mAlertDialog = null;
|
||||||
|
mDeviceNameView = null;
|
||||||
|
mOkButton = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
if (mOkButton == null) {
|
||||||
|
mOkButton = mAlertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
|
||||||
|
mOkButton.setEnabled(false); // Ok button is enabled when the user edits the name
|
||||||
|
}
|
||||||
|
IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
||||||
|
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
|
||||||
|
getActivity().registerReceiver(mReceiver, filter);
|
||||||
|
updateDeviceName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
getActivity().unregisterReceiver(mReceiver);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateDeviceName() {
|
||||||
|
if (mLocalAdapter != null && mLocalAdapter.isEnabled()) {
|
||||||
|
mDeviceNameUpdated = true;
|
||||||
|
mDeviceNameView.setText(mLocalAdapter.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void afterTextChanged(Editable s) {
|
||||||
|
if (mDeviceNameUpdated) {
|
||||||
|
// Device name changed by code; disable Ok button until edited by user
|
||||||
|
mDeviceNameUpdated = false;
|
||||||
|
mOkButton.setEnabled(false);
|
||||||
|
} else {
|
||||||
|
mOkButton.setEnabled(s.length() != 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not used */
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not used */
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
}
|
||||||
|
}
|
@@ -1,143 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2008 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.bluetooth;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
|
|
||||||
import android.bluetooth.BluetoothAdapter;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.text.Editable;
|
|
||||||
import android.text.InputFilter;
|
|
||||||
import android.text.TextWatcher;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.EditText;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* BluetoothNamePreference is the preference type for editing the device's
|
|
||||||
* Bluetooth name. It asks the user for a name, and persists it via the
|
|
||||||
* Bluetooth API.
|
|
||||||
*/
|
|
||||||
public final class BluetoothNamePreference extends EditTextPreference implements TextWatcher {
|
|
||||||
// private static final String TAG = "BluetoothNamePreference";
|
|
||||||
private static final int BLUETOOTH_NAME_MAX_LENGTH_BYTES = 248;
|
|
||||||
|
|
||||||
private final LocalBluetoothAdapter mLocalAdapter;
|
|
||||||
|
|
||||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
String action = intent.getAction();
|
|
||||||
if (action.equals(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED)) {
|
|
||||||
setSummaryToName();
|
|
||||||
} else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) &&
|
|
||||||
(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR) ==
|
|
||||||
BluetoothAdapter.STATE_ON)) {
|
|
||||||
setSummaryToName();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public BluetoothNamePreference(Context context, AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
|
|
||||||
mLocalAdapter = LocalBluetoothManager.getInstance(context).getBluetoothAdapter();
|
|
||||||
|
|
||||||
setSummaryToName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void resume() {
|
|
||||||
IntentFilter filter = new IntentFilter();
|
|
||||||
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
|
||||||
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
|
|
||||||
getContext().registerReceiver(mReceiver, filter);
|
|
||||||
|
|
||||||
// Make sure the OK button is disabled (if necessary) after rotation
|
|
||||||
EditText et = getEditText();
|
|
||||||
if (et != null) {
|
|
||||||
et.setFilters(new InputFilter[] {
|
|
||||||
new Utf8ByteLengthFilter(BLUETOOTH_NAME_MAX_LENGTH_BYTES)
|
|
||||||
});
|
|
||||||
|
|
||||||
et.addTextChangedListener(this);
|
|
||||||
Dialog d = getDialog();
|
|
||||||
if (d instanceof AlertDialog) {
|
|
||||||
Button b = ((AlertDialog) d).getButton(AlertDialog.BUTTON_POSITIVE);
|
|
||||||
b.setEnabled(et.getText().length() > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void pause() {
|
|
||||||
EditText et = getEditText();
|
|
||||||
if (et != null) {
|
|
||||||
et.removeTextChangedListener(this);
|
|
||||||
}
|
|
||||||
getContext().unregisterReceiver(mReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setSummaryToName() {
|
|
||||||
if (mLocalAdapter != null && mLocalAdapter.isEnabled()) {
|
|
||||||
setSummary(mLocalAdapter.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean persistString(String value) {
|
|
||||||
// Persist with Bluez instead of shared preferences
|
|
||||||
if (mLocalAdapter != null) {
|
|
||||||
mLocalAdapter.setName(value);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onClick() {
|
|
||||||
super.onClick();
|
|
||||||
|
|
||||||
// The dialog should be created by now
|
|
||||||
EditText et = getEditText();
|
|
||||||
if (et != null && mLocalAdapter != null) {
|
|
||||||
et.setText(mLocalAdapter.getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextWatcher interface
|
|
||||||
public void afterTextChanged(Editable s) {
|
|
||||||
Dialog d = getDialog();
|
|
||||||
if (d instanceof AlertDialog) {
|
|
||||||
((AlertDialog) d).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(s.length() > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextWatcher interface
|
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
||||||
// not used
|
|
||||||
}
|
|
||||||
|
|
||||||
// TextWatcher interface
|
|
||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
|
||||||
// not used
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@@ -24,13 +24,17 @@ import android.content.Intent;
|
|||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
import android.text.Html;
|
||||||
import android.text.InputFilter;
|
import android.text.InputFilter;
|
||||||
import android.text.InputType;
|
import android.text.InputType;
|
||||||
|
import android.text.Spanned;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.text.InputFilter.LengthFilter;
|
import android.text.InputFilter.LengthFilter;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.CompoundButton;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
@@ -42,8 +46,8 @@ import com.android.settings.R;
|
|||||||
* BluetoothPairingDialog asks the user to enter a PIN / Passkey / simple confirmation
|
* BluetoothPairingDialog asks the user to enter a PIN / Passkey / simple confirmation
|
||||||
* for pairing with a remote Bluetooth device. It is an activity that appears as a dialog.
|
* for pairing with a remote Bluetooth device. It is an activity that appears as a dialog.
|
||||||
*/
|
*/
|
||||||
public final class BluetoothPairingDialog extends AlertActivity implements DialogInterface.OnClickListener,
|
public final class BluetoothPairingDialog extends AlertActivity implements
|
||||||
TextWatcher {
|
CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener, TextWatcher {
|
||||||
private static final String TAG = "BluetoothPairingDialog";
|
private static final String TAG = "BluetoothPairingDialog";
|
||||||
|
|
||||||
private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
|
private static final int BLUETOOTH_PIN_MAX_LENGTH = 16;
|
||||||
@@ -156,7 +160,7 @@ public final class BluetoothPairingDialog extends AlertActivity implements Dialo
|
|||||||
final AlertController.AlertParams p = mAlertParams;
|
final AlertController.AlertParams p = mAlertParams;
|
||||||
p.mIconId = android.R.drawable.ic_dialog_info;
|
p.mIconId = android.R.drawable.ic_dialog_info;
|
||||||
p.mTitle = getString(R.string.bluetooth_pairing_request);
|
p.mTitle = getString(R.string.bluetooth_pairing_request);
|
||||||
p.mView = createView(deviceManager);
|
p.mView = createPinEntryView(deviceManager.getName(mDevice));
|
||||||
p.mPositiveButtonText = getString(android.R.string.ok);
|
p.mPositiveButtonText = getString(android.R.string.ok);
|
||||||
p.mPositiveButtonListener = this;
|
p.mPositiveButtonListener = this;
|
||||||
p.mNegativeButtonText = getString(android.R.string.cancel);
|
p.mNegativeButtonText = getString(android.R.string.cancel);
|
||||||
@@ -167,56 +171,78 @@ public final class BluetoothPairingDialog extends AlertActivity implements Dialo
|
|||||||
mOkButton.setEnabled(false);
|
mOkButton.setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private View createView(CachedBluetoothDeviceManager deviceManager) {
|
private View createPinEntryView(String deviceName) {
|
||||||
View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
|
View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
|
||||||
String name = deviceManager.getName(mDevice);
|
|
||||||
TextView messageView = (TextView) view.findViewById(R.id.message);
|
TextView messageView = (TextView) view.findViewById(R.id.message);
|
||||||
|
TextView messageView2 = (TextView) view.findViewById(R.id.message_below_pin);
|
||||||
|
CheckBox alphanumericPin = (CheckBox) view.findViewById(R.id.alphanumeric_pin);
|
||||||
mPairingView = (EditText) view.findViewById(R.id.text);
|
mPairingView = (EditText) view.findViewById(R.id.text);
|
||||||
mPairingView.addTextChangedListener(this);
|
mPairingView.addTextChangedListener(this);
|
||||||
|
alphanumericPin.setOnCheckedChangeListener(this);
|
||||||
|
|
||||||
|
int messageId1;
|
||||||
|
int messageId2;
|
||||||
|
int maxLength;
|
||||||
switch (mType) {
|
switch (mType) {
|
||||||
case BluetoothDevice.PAIRING_VARIANT_PIN:
|
case BluetoothDevice.PAIRING_VARIANT_PIN:
|
||||||
messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name));
|
messageId1 = R.string.bluetooth_enter_pin_msg;
|
||||||
// Maximum of 16 characters in a PIN adb sync
|
messageId2 = R.string.bluetooth_enter_pin_other_device;
|
||||||
mPairingView.setFilters(new InputFilter[] {
|
// Maximum of 16 characters in a PIN
|
||||||
new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) });
|
maxLength = BLUETOOTH_PIN_MAX_LENGTH;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
|
case BluetoothDevice.PAIRING_VARIANT_PASSKEY:
|
||||||
messageView.setText(getString(R.string.bluetooth_enter_passkey_msg, name));
|
messageId1 = R.string.bluetooth_enter_passkey_msg;
|
||||||
|
messageId2 = R.string.bluetooth_enter_passkey_other_device;
|
||||||
// Maximum of 6 digits for passkey
|
// Maximum of 6 digits for passkey
|
||||||
mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER |
|
maxLength = BLUETOOTH_PASSKEY_MAX_LENGTH;
|
||||||
InputType.TYPE_NUMBER_FLAG_SIGNED);
|
alphanumericPin.setVisibility(View.GONE);
|
||||||
mPairingView.setFilters(new InputFilter[] {
|
|
||||||
new LengthFilter(BLUETOOTH_PASSKEY_MAX_LENGTH)});
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Log.e(TAG, "Incorrect pairing type for createPinEntryView: " + mType);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format the message string, then parse HTML style tags
|
||||||
|
String messageText = getString(messageId1, deviceName);
|
||||||
|
messageView.setText(Html.fromHtml(messageText));
|
||||||
|
messageView2.setText(messageId2);
|
||||||
|
mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||||
|
mPairingView.setFilters(new InputFilter[] {
|
||||||
|
new LengthFilter(maxLength) });
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
private View createView(CachedBluetoothDeviceManager deviceManager) {
|
||||||
|
View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_confirm, null);
|
||||||
|
String name = deviceManager.getName(mDevice);
|
||||||
|
TextView messageView = (TextView) view.findViewById(R.id.message);
|
||||||
|
|
||||||
|
String messageText; // formatted string containing HTML style tags
|
||||||
|
switch (mType) {
|
||||||
case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
|
case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION:
|
||||||
mPairingView.setVisibility(View.GONE);
|
messageText = getString(R.string.bluetooth_confirm_passkey_msg,
|
||||||
messageView.setText(getString(R.string.bluetooth_confirm_passkey_msg, name,
|
name, mPairingKey);
|
||||||
mPairingKey));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BluetoothDevice.PAIRING_VARIANT_CONSENT:
|
case BluetoothDevice.PAIRING_VARIANT_CONSENT:
|
||||||
mPairingView.setVisibility(View.GONE);
|
case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
|
||||||
messageView.setText(getString(R.string.bluetooth_incoming_pairing_msg, name));
|
messageText = getString(R.string.bluetooth_incoming_pairing_msg, name);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
|
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY:
|
||||||
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
|
case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN:
|
||||||
mPairingView.setVisibility(View.GONE);
|
messageText = getString(R.string.bluetooth_display_passkey_pin_msg, name,
|
||||||
messageView.setText(getString(R.string.bluetooth_display_passkey_pin_msg, name,
|
mPairingKey);
|
||||||
mPairingKey));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BluetoothDevice.PAIRING_VARIANT_OOB_CONSENT:
|
|
||||||
mPairingView.setVisibility(View.GONE);
|
|
||||||
messageView.setText(getString(R.string.bluetooth_incoming_pairing_msg, name));
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Log.e(TAG, "Incorrect pairing type received, not creating view");
|
Log.e(TAG, "Incorrect pairing type received, not creating view");
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
messageView.setText(Html.fromHtml(messageText));
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,7 +343,11 @@ public final class BluetoothPairingDialog extends AlertActivity implements Dialo
|
|||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
switch (which) {
|
switch (which) {
|
||||||
case BUTTON_POSITIVE:
|
case BUTTON_POSITIVE:
|
||||||
|
if (mPairingView != null) {
|
||||||
onPair(mPairingView.getText().toString());
|
onPair(mPairingView.getText().toString());
|
||||||
|
} else {
|
||||||
|
onPair(null);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BUTTON_NEGATIVE:
|
case BUTTON_NEGATIVE:
|
||||||
@@ -335,4 +365,12 @@ public final class BluetoothPairingDialog extends AlertActivity implements Dialo
|
|||||||
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||||
|
// change input type for soft keyboard to numeric or alphanumeric
|
||||||
|
if (isChecked) {
|
||||||
|
mPairingView.setInputType(InputType.TYPE_CLASS_TEXT);
|
||||||
|
} else {
|
||||||
|
mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,10 @@ import android.app.ActionBar;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
@@ -48,16 +52,48 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
private static final String TAG = "BluetoothSettings";
|
private static final String TAG = "BluetoothSettings";
|
||||||
|
|
||||||
private static final int MENU_ID_SCAN = Menu.FIRST;
|
private static final int MENU_ID_SCAN = Menu.FIRST;
|
||||||
private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
|
private static final int MENU_ID_RENAME_DEVICE = Menu.FIRST + 1;
|
||||||
|
private static final int MENU_ID_VISIBILITY_TIMEOUT = Menu.FIRST + 2;
|
||||||
|
private static final int MENU_ID_SHOW_RECEIVED = Menu.FIRST + 3;
|
||||||
|
|
||||||
|
/* Private intent to show the list of received files */
|
||||||
|
private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES =
|
||||||
|
"android.btopp.intent.action.OPEN_RECEIVED_FILES";
|
||||||
|
|
||||||
private BluetoothEnabler mBluetoothEnabler;
|
private BluetoothEnabler mBluetoothEnabler;
|
||||||
|
|
||||||
|
private BluetoothDiscoverableEnabler mDiscoverableEnabler;
|
||||||
|
|
||||||
|
private PreferenceGroup mPairedDevicesCategory;
|
||||||
|
|
||||||
private PreferenceGroup mAvailableDevicesCategory;
|
private PreferenceGroup mAvailableDevicesCategory;
|
||||||
private boolean mAvailableDevicesCategoryIsPresent;
|
private boolean mAvailableDevicesCategoryIsPresent;
|
||||||
|
|
||||||
private View mView;
|
private View mView;
|
||||||
private TextView mEmptyView;
|
private TextView mEmptyView;
|
||||||
|
|
||||||
|
// accessed from inner class (not private to avoid thunks)
|
||||||
|
Preference mMyDevicePreference;
|
||||||
|
|
||||||
|
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (action.equals(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED) ||
|
||||||
|
(action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) &&
|
||||||
|
(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
|
||||||
|
BluetoothAdapter.ERROR) == BluetoothAdapter.STATE_ON))) {
|
||||||
|
updateDeviceName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateDeviceName() {
|
||||||
|
if (mLocalAdapter != null && mLocalAdapter.isEnabled() && mMyDevicePreference != null) {
|
||||||
|
mMyDevicePreference.setTitle(mLocalAdapter.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
@@ -106,15 +142,26 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
mBluetoothEnabler.resume();
|
mBluetoothEnabler.resume();
|
||||||
|
|
||||||
updateContent(mLocalAdapter.getBluetoothState());
|
updateContent(mLocalAdapter.getBluetoothState());
|
||||||
|
|
||||||
|
if (mDiscoverableEnabler != null) {
|
||||||
|
mDiscoverableEnabler.resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
IntentFilter filter = new IntentFilter();
|
||||||
|
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
||||||
|
filter.addAction(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
|
||||||
|
getActivity().registerReceiver(mReceiver, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPause() {
|
public void onPause() {
|
||||||
super.onPause();
|
super.onPause();
|
||||||
|
|
||||||
mBluetoothEnabler.pause();
|
mBluetoothEnabler.pause();
|
||||||
|
getActivity().unregisterReceiver(mReceiver);
|
||||||
|
if (mDiscoverableEnabler != null) {
|
||||||
|
mDiscoverableEnabler.pause();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -124,12 +171,14 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
int textId = isDiscovering ? R.string.bluetooth_searching_for_devices :
|
int textId = isDiscovering ? R.string.bluetooth_searching_for_devices :
|
||||||
R.string.bluetooth_search_for_devices;
|
R.string.bluetooth_search_for_devices;
|
||||||
menu.add(Menu.NONE, MENU_ID_SCAN, 0, textId)
|
menu.add(Menu.NONE, MENU_ID_SCAN, 0, textId)
|
||||||
//.setIcon(R.drawable.ic_menu_scan_network)
|
|
||||||
.setEnabled(bluetoothIsEnabled && !isDiscovering)
|
.setEnabled(bluetoothIsEnabled && !isDiscovering)
|
||||||
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||||
menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.bluetooth_menu_advanced)
|
menu.add(Menu.NONE, MENU_ID_RENAME_DEVICE, 0, R.string.bluetooth_rename_device)
|
||||||
//.setIcon(android.R.drawable.ic_menu_manage)
|
|
||||||
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||||
|
menu.add(Menu.NONE, MENU_ID_VISIBILITY_TIMEOUT, 0, R.string.bluetooth_visibility_timeout)
|
||||||
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
|
||||||
|
menu.add(Menu.NONE, MENU_ID_SHOW_RECEIVED, 0, R.string.bluetooth_show_received_files)
|
||||||
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -140,16 +189,20 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
startScanning();
|
startScanning();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case MENU_ID_ADVANCED:
|
|
||||||
if (getActivity() instanceof PreferenceActivity) {
|
case MENU_ID_RENAME_DEVICE:
|
||||||
((PreferenceActivity) getActivity()).startPreferencePanel(
|
new BluetoothNameDialogFragment(mLocalAdapter).show(
|
||||||
AdvancedBluetoothSettings.class.getCanonicalName(),
|
getFragmentManager(), "rename device");
|
||||||
null,
|
return true;
|
||||||
R.string.bluetooth_advanced_titlebar, null,
|
|
||||||
this, 0);
|
case MENU_ID_VISIBILITY_TIMEOUT:
|
||||||
} else {
|
new BluetoothVisibilityTimeoutFragment(mDiscoverableEnabler).show(
|
||||||
startFragment(this, AdvancedBluetoothSettings.class.getCanonicalName(), -1, null);
|
getFragmentManager(), "visibility timeout");
|
||||||
}
|
return true;
|
||||||
|
|
||||||
|
case MENU_ID_SHOW_RECEIVED:
|
||||||
|
Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES);
|
||||||
|
getActivity().sendBroadcast(intent);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
@@ -195,9 +248,15 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
if (mLocalAdapter != null) {
|
if (mLocalAdapter != null) {
|
||||||
mMyDevicePreference.setTitle(mLocalAdapter.getName());
|
mMyDevicePreference.setTitle(mLocalAdapter.getName());
|
||||||
}
|
}
|
||||||
|
mMyDevicePreference.setPersistent(false);
|
||||||
mMyDevicePreference.setEnabled(true);
|
mMyDevicePreference.setEnabled(true);
|
||||||
preferenceScreen.addPreference(mMyDevicePreference);
|
preferenceScreen.addPreference(mMyDevicePreference);
|
||||||
|
|
||||||
|
if (mDiscoverableEnabler == null) {
|
||||||
|
mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
|
||||||
|
mLocalAdapter, mMyDevicePreference);
|
||||||
|
}
|
||||||
|
|
||||||
// Paired devices category
|
// Paired devices category
|
||||||
if (mPairedDevicesCategory == null) {
|
if (mPairedDevicesCategory == null) {
|
||||||
mPairedDevicesCategory = new PreferenceCategory(getActivity());
|
mPairedDevicesCategory = new PreferenceCategory(getActivity());
|
||||||
@@ -209,6 +268,8 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
|
BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
|
||||||
int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
|
int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
|
||||||
|
|
||||||
|
mDiscoverableEnabler.setNumberOfPairedDevices(numberOfPairedDevices);
|
||||||
|
|
||||||
// Available devices category
|
// Available devices category
|
||||||
if (mAvailableDevicesCategory == null) {
|
if (mAvailableDevicesCategory == null) {
|
||||||
mAvailableDevicesCategory = new ProgressCategory(getActivity(), null);
|
mAvailableDevicesCategory = new ProgressCategory(getActivity(), null);
|
||||||
@@ -291,10 +352,6 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private Preference mMyDevicePreference;
|
|
||||||
|
|
||||||
private PreferenceGroup mPairedDevicesCategory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a listener, which enables the advanced settings icon.
|
* Add a listener, which enables the advanced settings icon.
|
||||||
* @param preference the newly added preference
|
* @param preference the newly added preference
|
||||||
|
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.bluetooth;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.DialogFragment;
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.InputFilter;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
import com.android.internal.app.AlertController;
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog fragment for setting the discoverability timeout.
|
||||||
|
*/
|
||||||
|
final class BluetoothVisibilityTimeoutFragment extends DialogFragment
|
||||||
|
implements DialogInterface.OnClickListener {
|
||||||
|
|
||||||
|
private final BluetoothDiscoverableEnabler mDiscoverableEnabler;
|
||||||
|
|
||||||
|
public BluetoothVisibilityTimeoutFragment(BluetoothDiscoverableEnabler enabler) {
|
||||||
|
mDiscoverableEnabler = enabler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
return new AlertDialog.Builder(getActivity())
|
||||||
|
.setIcon(android.R.drawable.ic_dialog_info)
|
||||||
|
.setTitle(R.string.bluetooth_visibility_timeout)
|
||||||
|
.setSingleChoiceItems(R.array.bluetooth_visibility_timeout_entries,
|
||||||
|
mDiscoverableEnabler.getDiscoverableTimeoutIndex(), this)
|
||||||
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
mDiscoverableEnabler.setDiscoverableTimeout(which);
|
||||||
|
dismiss();
|
||||||
|
}
|
||||||
|
}
|
@@ -257,6 +257,14 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if user initiated pairing on this device. The message text is
|
||||||
|
* slightly different for local vs. remote initiated pairing dialogs.
|
||||||
|
*/
|
||||||
|
boolean isUserInitiatedPairing() {
|
||||||
|
return mConnectAfterPairing;
|
||||||
|
}
|
||||||
|
|
||||||
void unpair() {
|
void unpair() {
|
||||||
disconnect();
|
disconnect();
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user