diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index bf410d66348..d1aaa00f8e8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -6,6 +6,7 @@
+
@@ -15,6 +16,7 @@
+
@@ -64,7 +66,7 @@
@@ -103,7 +105,7 @@
@@ -124,6 +126,10 @@
+
+
+
+
-
@@ -209,7 +216,8 @@
-
@@ -217,6 +225,7 @@
+
@@ -241,6 +250,15 @@
+
+
+
+
+
+
+
@@ -274,7 +292,20 @@
-
+
+
+
+
+
+
+
+
+
+
@@ -282,14 +313,34 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -299,10 +350,12 @@
-
+
+
+
@@ -353,7 +406,8 @@
-
+
@@ -424,25 +478,46 @@
-
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:theme="@*android:style/Theme.Dialog.Alert"
+ android:finishOnCloseSystemDialogs="true">
@@ -545,7 +620,8 @@
+ android:theme="@*android:style/Theme.Dialog.Alert"
+ android:finishOnCloseSystemDialogs="true">
@@ -590,7 +666,7 @@
-
+
diff --git a/res/drawable-hdpi/app_gauge.9.png b/res/drawable-hdpi/app_gauge.9.png
new file mode 100644
index 00000000000..ac79d21cdc1
Binary files /dev/null and b/res/drawable-hdpi/app_gauge.9.png differ
diff --git a/res/drawable-hdpi/app_settings.png b/res/drawable-hdpi/app_settings.png
new file mode 100644
index 00000000000..68b6ec6ba03
Binary files /dev/null and b/res/drawable-hdpi/app_settings.png differ
diff --git a/res/drawable-hdpi/appwidget_bg.9.png b/res/drawable-hdpi/appwidget_bg.9.png
new file mode 100644
index 00000000000..3b29eae77be
Binary files /dev/null and b/res/drawable-hdpi/appwidget_bg.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_focus_c.9.png b/res/drawable-hdpi/appwidget_inner_focus_c.9.png
new file mode 100644
index 00000000000..a949bd2c3b6
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_focus_c.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_focus_l.9.png b/res/drawable-hdpi/appwidget_inner_focus_l.9.png
new file mode 100644
index 00000000000..4aaca6c504c
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_focus_l.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_focus_r.9.png b/res/drawable-hdpi/appwidget_inner_focus_r.9.png
new file mode 100644
index 00000000000..1fc0f900af9
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_focus_r.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_press_c.9.png b/res/drawable-hdpi/appwidget_inner_press_c.9.png
new file mode 100644
index 00000000000..ca6f16cd1df
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_press_c.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_press_l.9.png b/res/drawable-hdpi/appwidget_inner_press_l.9.png
new file mode 100644
index 00000000000..642eb3d326b
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_press_l.9.png differ
diff --git a/res/drawable-hdpi/appwidget_inner_press_r.9.png b/res/drawable-hdpi/appwidget_inner_press_r.9.png
new file mode 100644
index 00000000000..5e1f70a39bc
Binary files /dev/null and b/res/drawable-hdpi/appwidget_inner_press_r.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_divider.9.png b/res/drawable-hdpi/appwidget_settings_divider.9.png
new file mode 100644
index 00000000000..01a03bf6ae1
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_divider.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_mid_c.9.png b/res/drawable-hdpi/appwidget_settings_ind_mid_c.9.png
new file mode 100644
index 00000000000..7b053c88f6f
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_mid_c.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_mid_l.9.png b/res/drawable-hdpi/appwidget_settings_ind_mid_l.9.png
new file mode 100644
index 00000000000..97e00f67135
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_mid_l.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_mid_r.9.png b/res/drawable-hdpi/appwidget_settings_ind_mid_r.9.png
new file mode 100644
index 00000000000..2922fc384f4
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_mid_r.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_off_c.9.png b/res/drawable-hdpi/appwidget_settings_ind_off_c.9.png
new file mode 100644
index 00000000000..10b02968cdb
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_off_c.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_off_l.9.png b/res/drawable-hdpi/appwidget_settings_ind_off_l.9.png
new file mode 100644
index 00000000000..5f217349eaa
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_off_l.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_off_r.9.png b/res/drawable-hdpi/appwidget_settings_ind_off_r.9.png
new file mode 100644
index 00000000000..c7d5dd7c9b7
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_off_r.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_on_c.9.png b/res/drawable-hdpi/appwidget_settings_ind_on_c.9.png
new file mode 100644
index 00000000000..8b9872b5ad2
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_on_c.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_on_l.9.png b/res/drawable-hdpi/appwidget_settings_ind_on_l.9.png
new file mode 100644
index 00000000000..0c80f61c18f
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_on_l.9.png differ
diff --git a/res/drawable-hdpi/appwidget_settings_ind_on_r.9.png b/res/drawable-hdpi/appwidget_settings_ind_on_r.9.png
new file mode 100644
index 00000000000..f1f0b3d2356
Binary files /dev/null and b/res/drawable-hdpi/appwidget_settings_ind_on_r.9.png differ
diff --git a/res/drawable-hdpi/dotted_line_480px.png b/res/drawable-hdpi/dotted_line_480px.png
new file mode 100644
index 00000000000..4c25bae3853
Binary files /dev/null and b/res/drawable-hdpi/dotted_line_480px.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_bluetooth_off.png b/res/drawable-hdpi/ic_appwidget_settings_bluetooth_off.png
new file mode 100644
index 00000000000..be96dd951fb
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_bluetooth_off.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_bluetooth_on.png b/res/drawable-hdpi/ic_appwidget_settings_bluetooth_on.png
new file mode 100644
index 00000000000..0b7ccc66065
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_bluetooth_on.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png b/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png
new file mode 100644
index 00000000000..c258d1c8323
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_brightness_off.png b/res/drawable-hdpi/ic_appwidget_settings_brightness_off.png
new file mode 100644
index 00000000000..1bbde2d43fc
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_brightness_off.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_brightness_on.png b/res/drawable-hdpi/ic_appwidget_settings_brightness_on.png
new file mode 100644
index 00000000000..296ccb354cc
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_brightness_on.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_gps_off.png b/res/drawable-hdpi/ic_appwidget_settings_gps_off.png
new file mode 100644
index 00000000000..ec6bcde68d5
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_gps_off.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_gps_on.png b/res/drawable-hdpi/ic_appwidget_settings_gps_on.png
new file mode 100644
index 00000000000..e52caa41660
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_gps_on.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_sync_off.png b/res/drawable-hdpi/ic_appwidget_settings_sync_off.png
new file mode 100644
index 00000000000..a0a46a58eab
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_sync_off.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_sync_on.png b/res/drawable-hdpi/ic_appwidget_settings_sync_on.png
new file mode 100644
index 00000000000..1342751a663
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_sync_on.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_wifi_off.png b/res/drawable-hdpi/ic_appwidget_settings_wifi_off.png
new file mode 100644
index 00000000000..cafb195378b
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_wifi_off.png differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_wifi_on.png b/res/drawable-hdpi/ic_appwidget_settings_wifi_on.png
new file mode 100644
index 00000000000..c6ac993ddff
Binary files /dev/null and b/res/drawable-hdpi/ic_appwidget_settings_wifi_on.png differ
diff --git a/res/drawable-hdpi/ic_bt_cellphone.png b/res/drawable-hdpi/ic_bt_cellphone.png
new file mode 100644
index 00000000000..a3571ad8ecf
Binary files /dev/null and b/res/drawable-hdpi/ic_bt_cellphone.png differ
diff --git a/res/drawable-hdpi/ic_bt_headphones_a2dp.png b/res/drawable-hdpi/ic_bt_headphones_a2dp.png
new file mode 100644
index 00000000000..777094ee3a1
Binary files /dev/null and b/res/drawable-hdpi/ic_bt_headphones_a2dp.png differ
diff --git a/res/drawable-hdpi/ic_bt_headset_hfp.png b/res/drawable-hdpi/ic_bt_headset_hfp.png
new file mode 100644
index 00000000000..6450b4b9b6a
Binary files /dev/null and b/res/drawable-hdpi/ic_bt_headset_hfp.png differ
diff --git a/res/drawable-hdpi/ic_bt_laptop.png b/res/drawable-hdpi/ic_bt_laptop.png
new file mode 100644
index 00000000000..6a04c1d9234
Binary files /dev/null and b/res/drawable-hdpi/ic_bt_laptop.png differ
diff --git a/res/drawable-hdpi/ic_btn_next.png b/res/drawable-hdpi/ic_btn_next.png
new file mode 100644
index 00000000000..ad00a956a8e
Binary files /dev/null and b/res/drawable-hdpi/ic_btn_next.png differ
diff --git a/res/drawable-hdpi/ic_launcher_settings.png b/res/drawable-hdpi/ic_launcher_settings.png
new file mode 100644
index 00000000000..ff34a7ffcc4
Binary files /dev/null and b/res/drawable-hdpi/ic_launcher_settings.png differ
diff --git a/res/drawable-hdpi/ic_menu_3d_globe.png b/res/drawable-hdpi/ic_menu_3d_globe.png
new file mode 100644
index 00000000000..0858fec50be
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_3d_globe.png differ
diff --git a/res/drawable-hdpi/ic_menu_add.png b/res/drawable-hdpi/ic_menu_add.png
new file mode 100644
index 00000000000..65cc01eb7e4
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_add.png differ
diff --git a/res/drawable-hdpi/ic_menu_filter_settings.png b/res/drawable-hdpi/ic_menu_filter_settings.png
new file mode 100644
index 00000000000..a6777e92798
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_filter_settings.png differ
diff --git a/res/drawable-hdpi/ic_menu_scan_network.png b/res/drawable-hdpi/ic_menu_scan_network.png
new file mode 100644
index 00000000000..196ece002eb
Binary files /dev/null and b/res/drawable-hdpi/ic_menu_scan_network.png differ
diff --git a/res/drawable-hdpi/ic_network_signal_0.png b/res/drawable-hdpi/ic_network_signal_0.png
new file mode 100644
index 00000000000..6bbf947514b
Binary files /dev/null and b/res/drawable-hdpi/ic_network_signal_0.png differ
diff --git a/res/drawable-hdpi/ic_network_signal_1.png b/res/drawable-hdpi/ic_network_signal_1.png
new file mode 100644
index 00000000000..d3aa559e30a
Binary files /dev/null and b/res/drawable-hdpi/ic_network_signal_1.png differ
diff --git a/res/drawable-hdpi/ic_network_signal_2.png b/res/drawable-hdpi/ic_network_signal_2.png
new file mode 100644
index 00000000000..9c4828517f5
Binary files /dev/null and b/res/drawable-hdpi/ic_network_signal_2.png differ
diff --git a/res/drawable-hdpi/ic_network_signal_3.png b/res/drawable-hdpi/ic_network_signal_3.png
new file mode 100644
index 00000000000..3e94fc5ab9b
Binary files /dev/null and b/res/drawable-hdpi/ic_network_signal_3.png differ
diff --git a/res/drawable-hdpi/ic_network_signal_4.png b/res/drawable-hdpi/ic_network_signal_4.png
new file mode 100644
index 00000000000..e29b3aec3e6
Binary files /dev/null and b/res/drawable-hdpi/ic_network_signal_4.png differ
diff --git a/res/drawable-hdpi/ic_popup_brightness.png b/res/drawable-hdpi/ic_popup_brightness.png
new file mode 100644
index 00000000000..a68b44f686e
Binary files /dev/null and b/res/drawable-hdpi/ic_popup_brightness.png differ
diff --git a/res/drawable-hdpi/ic_settings_about.png b/res/drawable-hdpi/ic_settings_about.png
new file mode 100755
index 00000000000..ea8234a2443
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_about.png differ
diff --git a/res/drawable-hdpi/ic_settings_accessibility.png b/res/drawable-hdpi/ic_settings_accessibility.png
new file mode 100755
index 00000000000..8390084d405
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_accessibility.png differ
diff --git a/res/drawable-hdpi/ic_settings_applications.png b/res/drawable-hdpi/ic_settings_applications.png
new file mode 100755
index 00000000000..5cea33f487a
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_applications.png differ
diff --git a/res/drawable-hdpi/ic_settings_bluetooth.png b/res/drawable-hdpi/ic_settings_bluetooth.png
new file mode 100644
index 00000000000..3d9015fc862
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_bluetooth.png differ
diff --git a/res/drawable-hdpi/ic_settings_call.png b/res/drawable-hdpi/ic_settings_call.png
new file mode 100755
index 00000000000..e1c7fea3635
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_call.png differ
diff --git a/res/drawable-hdpi/ic_settings_cell_standby.png b/res/drawable-hdpi/ic_settings_cell_standby.png
new file mode 100644
index 00000000000..262a8609387
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_cell_standby.png differ
diff --git a/res/drawable-hdpi/ic_settings_date_time.png b/res/drawable-hdpi/ic_settings_date_time.png
new file mode 100755
index 00000000000..dd479276a55
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_date_time.png differ
diff --git a/res/drawable-hdpi/ic_settings_display.png b/res/drawable-hdpi/ic_settings_display.png
new file mode 100644
index 00000000000..20568d22772
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_display.png differ
diff --git a/res/drawable-hdpi/ic_settings_language.png b/res/drawable-hdpi/ic_settings_language.png
new file mode 100755
index 00000000000..475b04e0a94
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_language.png differ
diff --git a/res/drawable-hdpi/ic_settings_phone_idle.png b/res/drawable-hdpi/ic_settings_phone_idle.png
new file mode 100644
index 00000000000..fd66f84acfe
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_phone_idle.png differ
diff --git a/res/drawable-hdpi/ic_settings_privacy.png b/res/drawable-hdpi/ic_settings_privacy.png
new file mode 100644
index 00000000000..5fb60c2e094
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_privacy.png differ
diff --git a/res/drawable-hdpi/ic_settings_search.png b/res/drawable-hdpi/ic_settings_search.png
new file mode 100755
index 00000000000..ec07f370313
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_search.png differ
diff --git a/res/drawable-hdpi/ic_settings_security.png b/res/drawable-hdpi/ic_settings_security.png
new file mode 100755
index 00000000000..54fb7996d0a
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_security.png differ
diff --git a/res/drawable-hdpi/ic_settings_sound_display.png b/res/drawable-hdpi/ic_settings_sound_display.png
new file mode 100755
index 00000000000..6ed90399ece
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_sound_display.png differ
diff --git a/res/drawable-hdpi/ic_settings_speech.png b/res/drawable-hdpi/ic_settings_speech.png
new file mode 100755
index 00000000000..8268f64af64
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_speech.png differ
diff --git a/res/drawable-hdpi/ic_settings_storage.png b/res/drawable-hdpi/ic_settings_storage.png
new file mode 100755
index 00000000000..fbdc5487fce
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_storage.png differ
diff --git a/res/drawable-hdpi/ic_settings_sync.png b/res/drawable-hdpi/ic_settings_sync.png
new file mode 100755
index 00000000000..d8544d97b7e
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_sync.png differ
diff --git a/res/drawable-hdpi/ic_settings_voice_calls.png b/res/drawable-hdpi/ic_settings_voice_calls.png
new file mode 100644
index 00000000000..3cb7e49025c
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_voice_calls.png differ
diff --git a/res/drawable-hdpi/ic_settings_wifi.png b/res/drawable-hdpi/ic_settings_wifi.png
new file mode 100644
index 00000000000..b8c3eaad35c
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_wifi.png differ
diff --git a/res/drawable-hdpi/ic_settings_wireless.png b/res/drawable-hdpi/ic_settings_wireless.png
new file mode 100755
index 00000000000..b96ad00156a
Binary files /dev/null and b/res/drawable-hdpi/ic_settings_wireless.png differ
diff --git a/res/drawable-hdpi/ic_wifi_lock_signal_1.png b/res/drawable-hdpi/ic_wifi_lock_signal_1.png
new file mode 100644
index 00000000000..688df559d3e
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_lock_signal_1.png differ
diff --git a/res/drawable-hdpi/ic_wifi_lock_signal_2.png b/res/drawable-hdpi/ic_wifi_lock_signal_2.png
new file mode 100644
index 00000000000..a88675b6a4b
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_lock_signal_2.png differ
diff --git a/res/drawable-hdpi/ic_wifi_lock_signal_3.png b/res/drawable-hdpi/ic_wifi_lock_signal_3.png
new file mode 100644
index 00000000000..1b8e15acbd7
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_lock_signal_3.png differ
diff --git a/res/drawable-hdpi/ic_wifi_lock_signal_4.png b/res/drawable-hdpi/ic_wifi_lock_signal_4.png
new file mode 100644
index 00000000000..9ad64328fe6
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_lock_signal_4.png differ
diff --git a/res/drawable-hdpi/ic_wifi_signal_1.png b/res/drawable-hdpi/ic_wifi_signal_1.png
new file mode 100644
index 00000000000..b27f69bfa04
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_signal_1.png differ
diff --git a/res/drawable-hdpi/ic_wifi_signal_2.png b/res/drawable-hdpi/ic_wifi_signal_2.png
new file mode 100644
index 00000000000..5ea37f22ea9
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_signal_2.png differ
diff --git a/res/drawable-hdpi/ic_wifi_signal_3.png b/res/drawable-hdpi/ic_wifi_signal_3.png
new file mode 100644
index 00000000000..f8c0221ded8
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_signal_3.png differ
diff --git a/res/drawable-hdpi/ic_wifi_signal_4.png b/res/drawable-hdpi/ic_wifi_signal_4.png
new file mode 100644
index 00000000000..b62bf35a70e
Binary files /dev/null and b/res/drawable-hdpi/ic_wifi_signal_4.png differ
diff --git a/res/drawable-hdpi/icon.png b/res/drawable-hdpi/icon.png
new file mode 100644
index 00000000000..c30cc55a430
Binary files /dev/null and b/res/drawable-hdpi/icon.png differ
diff --git a/res/drawable-hdpi/lock_anim_00.png b/res/drawable-hdpi/lock_anim_00.png
new file mode 100644
index 00000000000..08732e44f7b
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_00.png differ
diff --git a/res/drawable-hdpi/lock_anim_02.png b/res/drawable-hdpi/lock_anim_02.png
new file mode 100644
index 00000000000..495b2da490a
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_02.png differ
diff --git a/res/drawable-hdpi/lock_anim_04.png b/res/drawable-hdpi/lock_anim_04.png
new file mode 100644
index 00000000000..8201fd94d54
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_04.png differ
diff --git a/res/drawable-hdpi/lock_anim_06.png b/res/drawable-hdpi/lock_anim_06.png
new file mode 100644
index 00000000000..dac09e1573c
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_06.png differ
diff --git a/res/drawable-hdpi/lock_anim_08.png b/res/drawable-hdpi/lock_anim_08.png
new file mode 100644
index 00000000000..07f7e347728
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_08.png differ
diff --git a/res/drawable-hdpi/lock_anim_10.png b/res/drawable-hdpi/lock_anim_10.png
new file mode 100644
index 00000000000..adb981d257e
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_10.png differ
diff --git a/res/drawable-hdpi/lock_anim_12.png b/res/drawable-hdpi/lock_anim_12.png
new file mode 100644
index 00000000000..3ccdc850b20
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_12.png differ
diff --git a/res/drawable-hdpi/lock_anim_14.png b/res/drawable-hdpi/lock_anim_14.png
new file mode 100644
index 00000000000..2f40d9e4996
Binary files /dev/null and b/res/drawable-hdpi/lock_anim_14.png differ
diff --git a/res/drawable/app_gauge.9.png b/res/drawable-mdpi/app_gauge.9.png
similarity index 100%
rename from res/drawable/app_gauge.9.png
rename to res/drawable-mdpi/app_gauge.9.png
diff --git a/res/drawable/app_settings.png b/res/drawable-mdpi/app_settings.png
similarity index 100%
rename from res/drawable/app_settings.png
rename to res/drawable-mdpi/app_settings.png
diff --git a/res/drawable-mdpi/appwidget_bg.9.png b/res/drawable-mdpi/appwidget_bg.9.png
new file mode 100644
index 00000000000..afe41b671e0
Binary files /dev/null and b/res/drawable-mdpi/appwidget_bg.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_focus_c.9.png b/res/drawable-mdpi/appwidget_inner_focus_c.9.png
new file mode 100644
index 00000000000..1450e65b11f
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_focus_c.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_focus_l.9.png b/res/drawable-mdpi/appwidget_inner_focus_l.9.png
new file mode 100644
index 00000000000..6e8f100e4c1
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_focus_l.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_focus_r.9.png b/res/drawable-mdpi/appwidget_inner_focus_r.9.png
new file mode 100644
index 00000000000..bc8757b88c6
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_focus_r.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_press_c.9.png b/res/drawable-mdpi/appwidget_inner_press_c.9.png
new file mode 100644
index 00000000000..bd542bac6e9
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_press_c.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_press_l.9.png b/res/drawable-mdpi/appwidget_inner_press_l.9.png
new file mode 100644
index 00000000000..575ecf4e13a
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_press_l.9.png differ
diff --git a/res/drawable-mdpi/appwidget_inner_press_r.9.png b/res/drawable-mdpi/appwidget_inner_press_r.9.png
new file mode 100644
index 00000000000..79eaea35a68
Binary files /dev/null and b/res/drawable-mdpi/appwidget_inner_press_r.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_divider.9.png b/res/drawable-mdpi/appwidget_settings_divider.9.png
new file mode 100644
index 00000000000..73c9a27492b
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_divider.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_mid_c.9.png b/res/drawable-mdpi/appwidget_settings_ind_mid_c.9.png
new file mode 100644
index 00000000000..fee031d76e7
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_mid_c.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_mid_l.9.png b/res/drawable-mdpi/appwidget_settings_ind_mid_l.9.png
new file mode 100644
index 00000000000..6549420f138
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_mid_l.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_mid_r.9.png b/res/drawable-mdpi/appwidget_settings_ind_mid_r.9.png
new file mode 100644
index 00000000000..ab124522ef9
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_mid_r.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_off_c.9.png b/res/drawable-mdpi/appwidget_settings_ind_off_c.9.png
new file mode 100644
index 00000000000..d9440f37209
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_off_c.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_off_l.9.png b/res/drawable-mdpi/appwidget_settings_ind_off_l.9.png
new file mode 100644
index 00000000000..a10a47abae1
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_off_l.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_off_r.9.png b/res/drawable-mdpi/appwidget_settings_ind_off_r.9.png
new file mode 100644
index 00000000000..ce766d031c3
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_off_r.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_on_c.9.png b/res/drawable-mdpi/appwidget_settings_ind_on_c.9.png
new file mode 100644
index 00000000000..72a86231d9b
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_on_c.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_on_l.9.png b/res/drawable-mdpi/appwidget_settings_ind_on_l.9.png
new file mode 100644
index 00000000000..75f6f74c982
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_on_l.9.png differ
diff --git a/res/drawable-mdpi/appwidget_settings_ind_on_r.9.png b/res/drawable-mdpi/appwidget_settings_ind_on_r.9.png
new file mode 100644
index 00000000000..0f8975cb286
Binary files /dev/null and b/res/drawable-mdpi/appwidget_settings_ind_on_r.9.png differ
diff --git a/res/drawable/dotted_line_480px.png b/res/drawable-mdpi/dotted_line_480px.png
similarity index 100%
rename from res/drawable/dotted_line_480px.png
rename to res/drawable-mdpi/dotted_line_480px.png
diff --git a/res/drawable-mdpi/ic_appwidget_settings_bluetooth_off.png b/res/drawable-mdpi/ic_appwidget_settings_bluetooth_off.png
new file mode 100644
index 00000000000..fd2572e212a
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_bluetooth_off.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_bluetooth_on.png b/res/drawable-mdpi/ic_appwidget_settings_bluetooth_on.png
new file mode 100644
index 00000000000..99441d410a7
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_bluetooth_on.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png b/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png
new file mode 100644
index 00000000000..5ffef7a37b9
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_brightness_off.png b/res/drawable-mdpi/ic_appwidget_settings_brightness_off.png
new file mode 100644
index 00000000000..6e3ee2ed4ad
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_brightness_off.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_brightness_on.png b/res/drawable-mdpi/ic_appwidget_settings_brightness_on.png
new file mode 100644
index 00000000000..b0f741a406a
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_brightness_on.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_gps_off.png b/res/drawable-mdpi/ic_appwidget_settings_gps_off.png
new file mode 100644
index 00000000000..c0dd0502fc9
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_gps_off.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_gps_on.png b/res/drawable-mdpi/ic_appwidget_settings_gps_on.png
new file mode 100644
index 00000000000..b6913dfe730
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_gps_on.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_sync_off.png b/res/drawable-mdpi/ic_appwidget_settings_sync_off.png
new file mode 100644
index 00000000000..58fdf56477f
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_sync_off.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_sync_on.png b/res/drawable-mdpi/ic_appwidget_settings_sync_on.png
new file mode 100644
index 00000000000..2b062ec7332
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_sync_on.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_wifi_off.png b/res/drawable-mdpi/ic_appwidget_settings_wifi_off.png
new file mode 100644
index 00000000000..0736b136b60
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_wifi_off.png differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_wifi_on.png b/res/drawable-mdpi/ic_appwidget_settings_wifi_on.png
new file mode 100644
index 00000000000..a76c36c0adf
Binary files /dev/null and b/res/drawable-mdpi/ic_appwidget_settings_wifi_on.png differ
diff --git a/res/drawable/ic_bt_cellphone.png b/res/drawable-mdpi/ic_bt_cellphone.png
similarity index 100%
rename from res/drawable/ic_bt_cellphone.png
rename to res/drawable-mdpi/ic_bt_cellphone.png
diff --git a/res/drawable/ic_bt_headphones_a2dp.png b/res/drawable-mdpi/ic_bt_headphones_a2dp.png
similarity index 100%
rename from res/drawable/ic_bt_headphones_a2dp.png
rename to res/drawable-mdpi/ic_bt_headphones_a2dp.png
diff --git a/res/drawable/ic_bt_headset_hfp.png b/res/drawable-mdpi/ic_bt_headset_hfp.png
similarity index 100%
rename from res/drawable/ic_bt_headset_hfp.png
rename to res/drawable-mdpi/ic_bt_headset_hfp.png
diff --git a/res/drawable/ic_bt_laptop.png b/res/drawable-mdpi/ic_bt_laptop.png
similarity index 100%
rename from res/drawable/ic_bt_laptop.png
rename to res/drawable-mdpi/ic_bt_laptop.png
diff --git a/res/drawable/ic_btn_next.png b/res/drawable-mdpi/ic_btn_next.png
similarity index 100%
rename from res/drawable/ic_btn_next.png
rename to res/drawable-mdpi/ic_btn_next.png
diff --git a/res/drawable/ic_launcher_settings.png b/res/drawable-mdpi/ic_launcher_settings.png
similarity index 100%
rename from res/drawable/ic_launcher_settings.png
rename to res/drawable-mdpi/ic_launcher_settings.png
diff --git a/res/drawable/ic_menu_3d_globe.png b/res/drawable-mdpi/ic_menu_3d_globe.png
similarity index 100%
rename from res/drawable/ic_menu_3d_globe.png
rename to res/drawable-mdpi/ic_menu_3d_globe.png
diff --git a/res/drawable/ic_menu_add.png b/res/drawable-mdpi/ic_menu_add.png
similarity index 100%
rename from res/drawable/ic_menu_add.png
rename to res/drawable-mdpi/ic_menu_add.png
diff --git a/res/drawable/ic_menu_filter_settings.png b/res/drawable-mdpi/ic_menu_filter_settings.png
similarity index 100%
rename from res/drawable/ic_menu_filter_settings.png
rename to res/drawable-mdpi/ic_menu_filter_settings.png
diff --git a/res/drawable/ic_menu_scan_network.png b/res/drawable-mdpi/ic_menu_scan_network.png
similarity index 100%
rename from res/drawable/ic_menu_scan_network.png
rename to res/drawable-mdpi/ic_menu_scan_network.png
diff --git a/res/drawable/ic_network_signal_0.png b/res/drawable-mdpi/ic_network_signal_0.png
similarity index 100%
rename from res/drawable/ic_network_signal_0.png
rename to res/drawable-mdpi/ic_network_signal_0.png
diff --git a/res/drawable/ic_network_signal_1.png b/res/drawable-mdpi/ic_network_signal_1.png
similarity index 100%
rename from res/drawable/ic_network_signal_1.png
rename to res/drawable-mdpi/ic_network_signal_1.png
diff --git a/res/drawable/ic_network_signal_2.png b/res/drawable-mdpi/ic_network_signal_2.png
similarity index 100%
rename from res/drawable/ic_network_signal_2.png
rename to res/drawable-mdpi/ic_network_signal_2.png
diff --git a/res/drawable/ic_network_signal_3.png b/res/drawable-mdpi/ic_network_signal_3.png
similarity index 100%
rename from res/drawable/ic_network_signal_3.png
rename to res/drawable-mdpi/ic_network_signal_3.png
diff --git a/res/drawable/ic_network_signal_4.png b/res/drawable-mdpi/ic_network_signal_4.png
similarity index 100%
rename from res/drawable/ic_network_signal_4.png
rename to res/drawable-mdpi/ic_network_signal_4.png
diff --git a/res/drawable/ic_popup_brightness.png b/res/drawable-mdpi/ic_popup_brightness.png
similarity index 100%
rename from res/drawable/ic_popup_brightness.png
rename to res/drawable-mdpi/ic_popup_brightness.png
diff --git a/res/drawable-mdpi/ic_settings_about.png b/res/drawable-mdpi/ic_settings_about.png
new file mode 100755
index 00000000000..b84d9447738
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_about.png differ
diff --git a/res/drawable-mdpi/ic_settings_accessibility.png b/res/drawable-mdpi/ic_settings_accessibility.png
new file mode 100755
index 00000000000..71663ee3895
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_accessibility.png differ
diff --git a/res/drawable-mdpi/ic_settings_applications.png b/res/drawable-mdpi/ic_settings_applications.png
new file mode 100755
index 00000000000..745ff2a1598
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_applications.png differ
diff --git a/res/drawable-mdpi/ic_settings_bluetooth.png b/res/drawable-mdpi/ic_settings_bluetooth.png
new file mode 100644
index 00000000000..8cf80c0420d
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_bluetooth.png differ
diff --git a/res/drawable-mdpi/ic_settings_call.png b/res/drawable-mdpi/ic_settings_call.png
new file mode 100755
index 00000000000..b4cf0db14c7
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_call.png differ
diff --git a/res/drawable-mdpi/ic_settings_cell_standby.png b/res/drawable-mdpi/ic_settings_cell_standby.png
new file mode 100644
index 00000000000..0ac7b5d1741
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_cell_standby.png differ
diff --git a/res/drawable-mdpi/ic_settings_date_time.png b/res/drawable-mdpi/ic_settings_date_time.png
new file mode 100755
index 00000000000..cc8d774d892
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_date_time.png differ
diff --git a/res/drawable-mdpi/ic_settings_display.png b/res/drawable-mdpi/ic_settings_display.png
new file mode 100644
index 00000000000..b676b85f83e
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_display.png differ
diff --git a/res/drawable-mdpi/ic_settings_language.png b/res/drawable-mdpi/ic_settings_language.png
new file mode 100755
index 00000000000..df271d6d426
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_language.png differ
diff --git a/res/drawable-mdpi/ic_settings_phone_idle.png b/res/drawable-mdpi/ic_settings_phone_idle.png
new file mode 100644
index 00000000000..7734b09d9db
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_phone_idle.png differ
diff --git a/res/drawable-mdpi/ic_settings_privacy.png b/res/drawable-mdpi/ic_settings_privacy.png
new file mode 100644
index 00000000000..30ba3173177
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_privacy.png differ
diff --git a/res/drawable-mdpi/ic_settings_search.png b/res/drawable-mdpi/ic_settings_search.png
new file mode 100755
index 00000000000..8e13de315e2
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_search.png differ
diff --git a/res/drawable-mdpi/ic_settings_security.png b/res/drawable-mdpi/ic_settings_security.png
new file mode 100755
index 00000000000..7e4868c1f5b
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_security.png differ
diff --git a/res/drawable-mdpi/ic_settings_sound_display.png b/res/drawable-mdpi/ic_settings_sound_display.png
new file mode 100755
index 00000000000..73c93bdf160
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_sound_display.png differ
diff --git a/res/drawable-mdpi/ic_settings_speech.png b/res/drawable-mdpi/ic_settings_speech.png
new file mode 100755
index 00000000000..042e7cc799b
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_speech.png differ
diff --git a/res/drawable-mdpi/ic_settings_storage.png b/res/drawable-mdpi/ic_settings_storage.png
new file mode 100755
index 00000000000..a209f6ff110
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_storage.png differ
diff --git a/res/drawable-mdpi/ic_settings_sync.png b/res/drawable-mdpi/ic_settings_sync.png
new file mode 100755
index 00000000000..71bf5f1d2c7
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_sync.png differ
diff --git a/res/drawable-mdpi/ic_settings_voice_calls.png b/res/drawable-mdpi/ic_settings_voice_calls.png
new file mode 100644
index 00000000000..89d04d742b5
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_voice_calls.png differ
diff --git a/res/drawable-mdpi/ic_settings_wifi.png b/res/drawable-mdpi/ic_settings_wifi.png
new file mode 100644
index 00000000000..e8f31299eb7
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_wifi.png differ
diff --git a/res/drawable-mdpi/ic_settings_wireless.png b/res/drawable-mdpi/ic_settings_wireless.png
new file mode 100755
index 00000000000..1eac153d2a0
Binary files /dev/null and b/res/drawable-mdpi/ic_settings_wireless.png differ
diff --git a/res/drawable/ic_wifi_lock_signal_1.png b/res/drawable-mdpi/ic_wifi_lock_signal_1.png
similarity index 100%
rename from res/drawable/ic_wifi_lock_signal_1.png
rename to res/drawable-mdpi/ic_wifi_lock_signal_1.png
diff --git a/res/drawable/ic_wifi_lock_signal_2.png b/res/drawable-mdpi/ic_wifi_lock_signal_2.png
similarity index 100%
rename from res/drawable/ic_wifi_lock_signal_2.png
rename to res/drawable-mdpi/ic_wifi_lock_signal_2.png
diff --git a/res/drawable/ic_wifi_lock_signal_3.png b/res/drawable-mdpi/ic_wifi_lock_signal_3.png
similarity index 100%
rename from res/drawable/ic_wifi_lock_signal_3.png
rename to res/drawable-mdpi/ic_wifi_lock_signal_3.png
diff --git a/res/drawable/ic_wifi_lock_signal_4.png b/res/drawable-mdpi/ic_wifi_lock_signal_4.png
similarity index 100%
rename from res/drawable/ic_wifi_lock_signal_4.png
rename to res/drawable-mdpi/ic_wifi_lock_signal_4.png
diff --git a/res/drawable/ic_wifi_signal_1.png b/res/drawable-mdpi/ic_wifi_signal_1.png
similarity index 100%
rename from res/drawable/ic_wifi_signal_1.png
rename to res/drawable-mdpi/ic_wifi_signal_1.png
diff --git a/res/drawable/ic_wifi_signal_2.png b/res/drawable-mdpi/ic_wifi_signal_2.png
similarity index 100%
rename from res/drawable/ic_wifi_signal_2.png
rename to res/drawable-mdpi/ic_wifi_signal_2.png
diff --git a/res/drawable/ic_wifi_signal_3.png b/res/drawable-mdpi/ic_wifi_signal_3.png
similarity index 100%
rename from res/drawable/ic_wifi_signal_3.png
rename to res/drawable-mdpi/ic_wifi_signal_3.png
diff --git a/res/drawable/ic_wifi_signal_4.png b/res/drawable-mdpi/ic_wifi_signal_4.png
similarity index 100%
rename from res/drawable/ic_wifi_signal_4.png
rename to res/drawable-mdpi/ic_wifi_signal_4.png
diff --git a/res/drawable/icon.png b/res/drawable-mdpi/icon.png
similarity index 100%
rename from res/drawable/icon.png
rename to res/drawable-mdpi/icon.png
diff --git a/res/drawable/lock_anim_00.png b/res/drawable-mdpi/lock_anim_00.png
similarity index 100%
rename from res/drawable/lock_anim_00.png
rename to res/drawable-mdpi/lock_anim_00.png
diff --git a/res/drawable/lock_anim_02.png b/res/drawable-mdpi/lock_anim_02.png
similarity index 100%
rename from res/drawable/lock_anim_02.png
rename to res/drawable-mdpi/lock_anim_02.png
diff --git a/res/drawable/lock_anim_04.png b/res/drawable-mdpi/lock_anim_04.png
similarity index 100%
rename from res/drawable/lock_anim_04.png
rename to res/drawable-mdpi/lock_anim_04.png
diff --git a/res/drawable/lock_anim_06.png b/res/drawable-mdpi/lock_anim_06.png
similarity index 100%
rename from res/drawable/lock_anim_06.png
rename to res/drawable-mdpi/lock_anim_06.png
diff --git a/res/drawable/lock_anim_08.png b/res/drawable-mdpi/lock_anim_08.png
similarity index 100%
rename from res/drawable/lock_anim_08.png
rename to res/drawable-mdpi/lock_anim_08.png
diff --git a/res/drawable/lock_anim_10.png b/res/drawable-mdpi/lock_anim_10.png
similarity index 100%
rename from res/drawable/lock_anim_10.png
rename to res/drawable-mdpi/lock_anim_10.png
diff --git a/res/drawable/lock_anim_12.png b/res/drawable-mdpi/lock_anim_12.png
similarity index 100%
rename from res/drawable/lock_anim_12.png
rename to res/drawable-mdpi/lock_anim_12.png
diff --git a/res/drawable/lock_anim_14.png b/res/drawable-mdpi/lock_anim_14.png
similarity index 100%
rename from res/drawable/lock_anim_14.png
rename to res/drawable-mdpi/lock_anim_14.png
diff --git a/res/drawable/appwidget_bg.9.png b/res/drawable/appwidget_bg.9.png
deleted file mode 100644
index 688d131cd84..00000000000
Binary files a/res/drawable/appwidget_bg.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_outer.xml b/res/drawable/appwidget_button_center.xml
similarity index 66%
rename from res/drawable/appwidget_outer.xml
rename to res/drawable/appwidget_button_center.xml
index d6f3cb6261b..194b3574af6 100644
--- a/res/drawable/appwidget_outer.xml
+++ b/res/drawable/appwidget_button_center.xml
@@ -16,18 +16,13 @@
-
-
+ android:drawable="@drawable/appwidget_inner_press_c" />
-
-
+ android:state_window_focused="true"
+ android:drawable="@drawable/appwidget_inner_focus_c" />
+ android:drawable="@android:color/transparent" />
diff --git a/res/drawable/appwidget_inner.xml b/res/drawable/appwidget_button_left.xml
similarity index 66%
rename from res/drawable/appwidget_inner.xml
rename to res/drawable/appwidget_button_left.xml
index fc7bb6dc254..cbbce866b6d 100644
--- a/res/drawable/appwidget_inner.xml
+++ b/res/drawable/appwidget_button_left.xml
@@ -16,18 +16,13 @@
-
-
+ android:drawable="@drawable/appwidget_inner_press_l" />
-
-
+ android:state_window_focused="true"
+ android:drawable="@drawable/appwidget_inner_focus_l" />
+ android:drawable="@android:color/transparent" />
diff --git a/res/drawable/appwidget_button_right.xml b/res/drawable/appwidget_button_right.xml
new file mode 100644
index 00000000000..9623f543786
--- /dev/null
+++ b/res/drawable/appwidget_button_right.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/appwidget_inner_default.9.png b/res/drawable/appwidget_inner_default.9.png
deleted file mode 100644
index f7e9db4d7cc..00000000000
Binary files a/res/drawable/appwidget_inner_default.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_inner_pressed.9.png b/res/drawable/appwidget_inner_pressed.9.png
deleted file mode 100644
index e2b62b79d0b..00000000000
Binary files a/res/drawable/appwidget_inner_pressed.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_inner_selected.9.png b/res/drawable/appwidget_inner_selected.9.png
deleted file mode 100644
index b6773915f5d..00000000000
Binary files a/res/drawable/appwidget_inner_selected.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_outer_default.9.png b/res/drawable/appwidget_outer_default.9.png
deleted file mode 100644
index d84e56a4070..00000000000
Binary files a/res/drawable/appwidget_outer_default.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_outer_pressed.9.png b/res/drawable/appwidget_outer_pressed.9.png
deleted file mode 100644
index 5348fef5510..00000000000
Binary files a/res/drawable/appwidget_outer_pressed.9.png and /dev/null differ
diff --git a/res/drawable/appwidget_outer_selected.9.png b/res/drawable/appwidget_outer_selected.9.png
deleted file mode 100644
index c6d5df77b2f..00000000000
Binary files a/res/drawable/appwidget_outer_selected.9.png and /dev/null differ
diff --git a/res/drawable/ic_power_system.png b/res/drawable/ic_power_system.png
new file mode 100755
index 00000000000..cce518787b5
Binary files /dev/null and b/res/drawable/ic_power_system.png differ
diff --git a/res/drawable/widget_btn_bluetooth.png b/res/drawable/widget_btn_bluetooth.png
deleted file mode 100644
index f32d0b266fb..00000000000
Binary files a/res/drawable/widget_btn_bluetooth.png and /dev/null differ
diff --git a/res/drawable/widget_btn_bluetooth_gray.png b/res/drawable/widget_btn_bluetooth_gray.png
deleted file mode 100644
index a633554d667..00000000000
Binary files a/res/drawable/widget_btn_bluetooth_gray.png and /dev/null differ
diff --git a/res/drawable/widget_btn_bluetooth_off.png b/res/drawable/widget_btn_bluetooth_off.png
deleted file mode 100644
index c0ef641ed15..00000000000
Binary files a/res/drawable/widget_btn_bluetooth_off.png and /dev/null differ
diff --git a/res/drawable/widget_btn_brightness.png b/res/drawable/widget_btn_brightness.png
deleted file mode 100644
index 9a7c7b91965..00000000000
Binary files a/res/drawable/widget_btn_brightness.png and /dev/null differ
diff --git a/res/drawable/widget_btn_brightness_off.png b/res/drawable/widget_btn_brightness_off.png
deleted file mode 100644
index 46dc508ac9e..00000000000
Binary files a/res/drawable/widget_btn_brightness_off.png and /dev/null differ
diff --git a/res/drawable/widget_btn_gps.png b/res/drawable/widget_btn_gps.png
deleted file mode 100644
index b21e8c8bff1..00000000000
Binary files a/res/drawable/widget_btn_gps.png and /dev/null differ
diff --git a/res/drawable/widget_btn_gps_off.png b/res/drawable/widget_btn_gps_off.png
deleted file mode 100644
index 042fefb0e65..00000000000
Binary files a/res/drawable/widget_btn_gps_off.png and /dev/null differ
diff --git a/res/drawable/widget_btn_sync.png b/res/drawable/widget_btn_sync.png
deleted file mode 100644
index 6133233d372..00000000000
Binary files a/res/drawable/widget_btn_sync.png and /dev/null differ
diff --git a/res/drawable/widget_btn_sync_off.png b/res/drawable/widget_btn_sync_off.png
deleted file mode 100644
index 192cad88d73..00000000000
Binary files a/res/drawable/widget_btn_sync_off.png and /dev/null differ
diff --git a/res/drawable/widget_btn_wifi.png b/res/drawable/widget_btn_wifi.png
deleted file mode 100644
index 2d396810bd2..00000000000
Binary files a/res/drawable/widget_btn_wifi.png and /dev/null differ
diff --git a/res/drawable/widget_btn_wifi_gray.png b/res/drawable/widget_btn_wifi_gray.png
deleted file mode 100644
index 76f36e84de8..00000000000
Binary files a/res/drawable/widget_btn_wifi_gray.png and /dev/null differ
diff --git a/res/drawable/widget_btn_wifi_off.png b/res/drawable/widget_btn_wifi_off.png
deleted file mode 100644
index 9b70cf1e215..00000000000
Binary files a/res/drawable/widget_btn_wifi_off.png and /dev/null differ
diff --git a/res/layout-land/widget.xml b/res/layout-land/widget.xml
deleted file mode 100644
index fdafd7d405e..00000000000
--- a/res/layout-land/widget.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/battery_info.xml b/res/layout/battery_info.xml
index 62f5d691048..1016ad18ccb 100644
--- a/res/layout/battery_info.xml
+++ b/res/layout/battery_info.xml
@@ -26,6 +26,12 @@
+
+
+
+
+
+
diff --git a/res/layout/bluetooth_discoverable.xml b/res/layout/bluetooth_discoverable.xml
new file mode 100644
index 00000000000..3673774a994
--- /dev/null
+++ b/res/layout/bluetooth_discoverable.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/res/layout/choose_lock_pattern.xml b/res/layout/choose_lock_pattern.xml
index b4472ba65d8..78ab8b4e474 100644
--- a/res/layout/choose_lock_pattern.xml
+++ b/res/layout/choose_lock_pattern.xml
@@ -21,39 +21,49 @@
android:layout_height="fill_parent"
android:background="@color/black">
-
+
+ android:layout_weight="1">
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+ android:text="@string/credentials_first_time_hint"
+ android:layout_marginBottom="10sp"
+ android:visibility="gone"/>
-
+ android:visibility="gone"/>
-
+
-
-
-
+ android:layout_height="wrap_content"
+ android:password="True"
+ android:singleLine="True"
+ android:visibility="gone"/>
-
+
-
+
-
+ android:text="@string/credentials_unlock_hint"
+ android:layout_marginBottom="10sp"
+ android:visibility="gone"/>
-
+ android:textStyle="bold"
+ android:visibility="gone"/>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/dialog_edittext.xml b/res/layout/dialog_edittext.xml
index 9ef1205a8aa..0dcf673f2ed 100644
--- a/res/layout/dialog_edittext.xml
+++ b/res/layout/dialog_edittext.xml
@@ -24,6 +24,7 @@
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
+ android:maxLength="50"
/>
-
\ No newline at end of file
+
diff --git a/res/layout/installed_app_details.xml b/res/layout/installed_app_details.xml
index 13d3b1006d5..2810604fffc 100644
--- a/res/layout/installed_app_details.xml
+++ b/res/layout/installed_app_details.xml
@@ -304,7 +304,7 @@
android:layout_centerHorizontal="true"
android:layout_width="150dip"
android:text="@string/clear_activities"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content" />
@@ -320,6 +320,7 @@
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
+ android:paddingTop="6dip"
android:layout_width="150dip"
android:text="@string/force_stop"
android:layout_height="wrap_content" />
diff --git a/res/layout/preference_dialog_brightness.xml b/res/layout/preference_dialog_brightness.xml
new file mode 100644
index 00000000000..071beed475e
--- /dev/null
+++ b/res/layout/preference_dialog_brightness.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/preference_icon.xml b/res/layout/preference_icon.xml
new file mode 100644
index 00000000000..03f4e709268
--- /dev/null
+++ b/res/layout/preference_icon.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/running_services.xml b/res/layout/running_services.xml
new file mode 100644
index 00000000000..120a1135bed
--- /dev/null
+++ b/res/layout/running_services.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/running_services_item.xml b/res/layout/running_services_item.xml
new file mode 100644
index 00000000000..2728c76f433
--- /dev/null
+++ b/res/layout/running_services_item.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/widget.xml b/res/layout/widget.xml
index dc404695464..1e22dbe1c1b 100644
--- a/res/layout/widget.xml
+++ b/res/layout/widget.xml
@@ -14,51 +14,166 @@
limitations under the License.
-->
-
+
-
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout/wifi_ap_configure.xml b/res/layout/wifi_ap_configure.xml
index f8eb39a62bd..f816ae5b4ac 100644
--- a/res/layout/wifi_ap_configure.xml
+++ b/res/layout/wifi_ap_configure.xml
@@ -39,14 +39,13 @@
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/wifi_type_ssid" />
-
+
-
-
+ android:singleLine="true"
+ android:inputType="textNoSuggestions" />
@@ -105,17 +104,6 @@
-
-
+ android:singleLine="true"
+ android:inputType="textNoSuggestions" />
"Tichomoří"
"Všechny"
+
+ "Žádné animace"
+ "Některé animace"
+ "Všechny animace"
+
+
+ "Nezobrazují se žádné animace oken"
+ "Zobrazují se některé animace oken"
+ "Zobrazují se všechny animace oken"
+ "15 sekund""30 sekund""1 minuta""2 minuty""10 minut"
- "Nevypínat"
+ "30 min.""Velmi pomalá"
@@ -58,18 +68,14 @@
"Automaticky""Žádné""WEP"
- "WPA personal"
- "WPA2 personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Žádné""WEP"
- "WPA personal"
- "WPA2 personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automaticky"
@@ -108,7 +114,7 @@
"Žádné""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Výstraha""Vibrace"
+
+ "Žádné"
+ "PAP"
+ "CHAP"
+ "PAP nebo CHAP"
+
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 8b364b0ee61..fe0c73d59c0 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ano"
+ "Ne""Neznámé""Zapnout rádio""Vypnout rádio"
@@ -56,6 +58,7 @@
"OK""Karta SD""Stav baterie:"
+ "Napájecí konektor:""Měřítko baterie:""Stav baterie:""Zdraví baterie:"
@@ -75,6 +78,11 @@
"Vybíjení""Nenabíjí se""Plná"
+ "Odpojeno"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Neznámé""Neznámé""Dobrá""Přehřátá"
@@ -104,6 +112,12 @@
"Požadavek na párování zařízení Bluetooth""Požadavek na párování""Povolit párování se zařízením "
+ "Výběr zařízení Bluetooth"
+ "Požadavek na povolení zařízení Bluetooth"
+ "Aplikace v telefonu požaduje povolení zapnout připojení Bluetooth. Chcete toto povolení udělit?"
+ "Aplikace v telefonu požaduje povolení nastavit telefon do viditelného režimu na %1$d s. Chcete toto povolení udělit?"
+ "Aplikace v telefonu požaduje povolení zapnout připojení Bluetooth a nastavit telefonu do viditelného režimu na %1$d s. Chcete toto povolení udělit?"
+ "Zapínání zařízení Bluetooth...""Nastavení data a času""13:00""13:00"
@@ -196,7 +210,8 @@
"Vypne všechna bezdrátová připojení""Vypínání bezdrátových připojení...""Povolování bezdrátových připojení..."
- "Bezdrátové sítě"
+ "Bezdrátová připojení a sítě"
+ "Nastavení bezdrátového připojení a sítě""Spravovat Wi-Fi, Bluetooth, režim V letadle, mobilní sítě a sítě VPN""Datové služby při roamingu""Datové služby se mohou připojovat při roamingu"
@@ -219,20 +234,29 @@
"Formát data""Řadit abecedně""Řadit podle časového pásma"
- "Zabezpečení a poloha"
+ "Poloha a zabezpečení"
+ "Nastavení polohy a zabezpečení""Moje poloha, odemknutí obrazovky, zámek SIM, zámek úložiště pověření"
+ "Nastavení funkce Moje poloha, odemknutí obrazovky a zamknutí úložiště pověření""Hesla""Bluetooth""Zapnout Bluetooth""Nastavení Bluetooth""Nastavení Bluetooth""Umožňuje spravovat připojení, nastavit název zařízení a viditelnost"
- "Požadavek na párování zařízení Bluetooth"
+ "Požadavek na párování zařízení Bluetooth""Info o zařízení Bluetooth"
- "%1$s"\n\n"Párování začnete zadáním kódu PIN."\n"(Zkuste 0000 nebo 1234.)"
+ \n"Párování se zařízením %1$s zahájíte zadáním kódu PIN (zkuste kód 0000 nebo 1234)."
+ \n"Zadejte přístupový klíč pro párování se zařízením %1$s."
+ "Chcete-li provést párování se zařízením %1$s, zkontrolujte, zda je zobrazen přístupový klíč: %2$s."
+ "Zařízení %1$s"\n"žádá o párování."
+ "Zadáním přístupového klíče %2$s do zařízení %1$s zahájíte párování."
+ "Párovat"
+ "Nepárovat"
+ "zařízení Bluetooth""Upozornění""Při párování se zařízením %1$s došlo k potížím."
- "Při párování se zařízením %1$s došlo k potížím. Zadaný kód PIN je nesprávný."
+ "Při párování se zařízením %1$s došlo k potížím. Kód PIN nebo přístupový klíč je nesprávný.""Nelze navázat komunikaci se zařízením %1$s.""Párování odmítnuto zařízením %1$s.""Při připojování k zařízení %1$s došlo k potížím."
@@ -246,6 +270,7 @@
"Připojit k síti…""Média""Telefon"
+ "Přenos""Připojeno ke zvukovému médiu""Připojeno k náhlavní soupravě""Připojeno k náhlavní soupravě a zvukovému médiu"
@@ -255,8 +280,11 @@
"Profily""Připojeno ke zvukovému médiu""Připojeno k náhlavní soupravě"
+ "Připojeno k serveru pro přenos dat"
+ "Nepřipojeno k serveru pro přenos souborů""Umožňuje připojení zvukového média""Umožňuje připojení náhlavní soupravy"
+ "Použít pro přenos souborů""WiFi""WiFi""Zapnout WiFi"
@@ -273,17 +301,13 @@
"Zabezpečení""Nezabezpečená""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Neznámé""nezabezpečená síť""zabezpečení WEP"
- "zabezpečení WPA"
- "zabezpečení WPA2"
- "zabezpečení WPA-EAP"
- "zabezpečení IEEE 802.1x"
+ "zabezpečeno pomocí protokolu WPA/WPA2 PSK"
+ "zabezpečeno pomocí protokolu 802.1x EAP""Adresa IP""Síla signálu""Zapínání WiFi..."
@@ -302,14 +326,13 @@
"Anonymní identita""Certifikát klienta""Certifikát CA"
- "Soukromý klíč""Heslo bezdrátové sítě""Hexadecimální klíč WEP (0-9, A-F)""Zobrazovat heslo.""Vyhledávání""Mimo dosah""uložené nastavení"
- "Připojení se nezdařilo, zkuste to znovu."
+ "Připojení se nezdařilo, dotkněte se a zkuste to znovu.""Sítě WiFi""Identifikátor SSID sítě""Zabezpečení"
@@ -360,6 +383,7 @@
"Odpojeno""Připojení se nezdařilo.""Obraz a zvuk"
+ "Nastavení obrazu a zvuku""Nastavení zvuku""Umožňuje nastavit vyzváněcí tón, oznámení a jas obrazovky""Tichý režim"
@@ -385,11 +409,14 @@
"Výběr se zvuky""Výběr na obrazovce je provázen zvuky""Výběr na obrazovce je provázen zvuky"
+ "Hmatová odezva"
+ "Vibrovat při stisku softwarových kláves a při některých událostech uživatelského rozhraní"
+ "Vibrovat při stisku softwarových kláves a při některých událostech uživatelského rozhraní""Oznámení karty SD""Přehrát zvuk při oznámení karty SD""Přehrát zvuk při oznámení karty SD"
- "Synchronizace dat"
- "Umožňuje vybrat aplikace pro synchronizaci"
+ "Účty a synchronizace"
+ "Umožňuje přidat nebo odebrat účty a změnit jejich nastavení""Vyhledávání""Správa nastavení a historie vyhledávání""Nastavení zobrazení"
@@ -403,6 +430,7 @@
"Nastavení jasu displeje""Interval vypnutí obrazovky""Nastavení prodlevy, po které se obrazovka automaticky vypne"
+ "Automatický jas""Nastavení zámku karty SIM""Nastavení zámku karty SIM""Zámek karty SIM"
@@ -436,7 +464,8 @@
"Stav""Stav""Telefonní číslo, signál, atd."
- "Karta SD a paměť telefonu"
+ "Karta SD a paměť telefonu"
+ "Nastavení karty SD a paměti telefonu""Umožňuje odpojit kartu SD a zobrazit dostupnou paměť""Moje telefonní číslo""MIN"
@@ -480,6 +509,11 @@
"Port systému MMS""MCC""MNC"
+ "Typ ověření"
+ "Žádné"
+ "PAP"
+ "CHAP"
+ "PAP nebo CHAP""typ APN""Smazat APN""Nový APN"
@@ -518,12 +552,15 @@
"Zaměření přes bezdrátové sítě""Zobrazuje polohu v aplikacích (jako Mapy) pomocí bezdrátových sítí""Poloha je zaměřena pomocí WiFi nebo mobilních sítí"
- "Zapnout GPS"
- "Zaměření je s přesností na úrovni ulic (zrušením této volby lze šetřit baterii)"
+ "Použít satelity GPS"
+ "Zaměření je s přesností na úrovni ulic (zrušením této volby lze šetřit baterii)""Umožňuje zaměřit na úrovni ulic (vetší spotřeba baterie a nutný výhled na oblohu)"
- "Sdílet se společností Google"
- "Povolit Googlu používat polohu k zlepšení vyhledávání a dalších služeb"
- "Povolit Googlu, aby informace o poloze používal k poskytování přesnějších výsledků vyhledávání a dalších služeb"
+ "Použít systém A-GPS"
+ "Vylepšit funkčnost GPS pomocí serveru (deaktivací této funkce snížíte využití sítě)"
+ "Vylepšit funkčnost GPS pomocí serveru (zrušením této funkce zvýšíte výkon GPS)"
+ "Používat funkci Moje poloha"
+ "Používat funkci Moje poloha pro výsledky vyhledávání a další služby Google"
+ "Chcete Googlu umožnit využívat informace o poloze k poskytování přesnějších výsledků vyhledávání a dalších služeb?""Souhlasím""Nesouhlasím""Info o telefonu"
@@ -538,6 +575,10 @@
"Licence open source""Při načítání licencí došlo k chybě.""Načítání..."
+ "Bezpečnostní informace"
+ "Bezpečnostní informace"
+ "Telefon není připojen k datové službě. Chcete-li tyto informace zobrazit nyní, přejděte na stránku %s z libovolného počítače připojeného k internetu."
+ "Načítání...""Gesto pro odemknutí obrazovky""Změna bezpečnostního gesta""Potvrďte uložené gesto"
@@ -566,9 +607,9 @@
"Zrušit""Další""Zabezpečení telefonu"
- "Chraňte svůj telefon před nepovoleným použitím vytvořením osobního bezpečnostního gesta. "\n\n"1"" Příklad takového gesta uvidíte na dalším snímku. "\n\n"2"" Až budete připraveni, nakreslete své osobní bezpečnostní gesto. Vyzkoušejte více gest, ale vždy spojte alespoň čtyři tečky. "\n\n"3"" Chcete-li gesto potvrdit, zopakujte je. "\n\n"Jste připraveni začít? Zvolte tlačítko Další "". "\n\n"Chcete-li ponechat telefon nezabezpečený, zvolte tlačítko Zrušit."
+ "Vytvořte si osobní gesto odemknutí a chraňte tak svůj telefon před nepovoleným použitím. "\n\n"1"" Na dalším snímku uvidíte příklad takového gesta. "\n\n"2"" Až budete připraveni, proveďte své osobní gesto odemknutí. Vyzkoušejte více gest, ale vždy spojte alespoň čtyři tečky. "\n\n"3"" Opakujte gesto a tím jej potvrďte. "\n\n"Jste připraveni začít? Dotkněte se tlačítka Další "". "\n\n"Chcete-li ponechat telefon nezabezpečený, dotkněte se tlačítka Storno.""Příklad gesta"
- "Spojte alespoň čtyři tečky."\n" "\n"Až budete připraveni nakreslit vlastní gesto, zvolte tlačítko Další."
+ "Spojte alespoň čtyři tečky."\n" "\n"Až budete připraveni provést vlastní gesto, dotkněte se tlačítka Další.""Správa aplikací""Umožňuje spravovat a odebírat instalované aplikace""Aplikace"
@@ -602,12 +643,12 @@
"Filtrovat""Vyberte možnosti filtru""Všechny"
- "Aplikace třetích stran"
+ "Stažené""Spuštěné""Načítání...""Přepočítávání velikosti...""Smazat"
- "Všechny informace, které jste v této aplikaci uložili, budou trvale smazány."
+ "Veškerá data (všechny soubory, nastavení, účty, databáze apod.) této aplikace budou trvale vymazána.""OK""Zrušit""Aplikace nebyla nalezena"
@@ -620,9 +661,23 @@
"Tato aplikace má přístup k následujícím funkcím telefonu:""Probíhá výpočet…""Nepodařilo se určit velikost balíčku"
- "Žádné aplikace třetích stran nejsou nainstalovány."
+ "Žádné aplikace třetích stran nejsou nainstalovány.""verze %1$s"
- "Národní prostředí a text"
+ "Spuštěné služby"
+ "Zobrazit a ovládat aktuálně spuštěné služby"
+ "Probíhá restartování"
+ "Žádné spuštěné služby"
+ "Zastavit službu?"
+ "Služba vypnuta, dokud nebude znovu spuštěna. To může mít nežádoucí vliv na chování aplikace %1$s."
+ "Zastavit"
+ "Zrušit"
+ "Spuštěno aplikací, zastavte dotykem"
+ "%1$s: spravovat dotykem"
+ "K dispozici: %2$s + %3$s v %1$d"
+ "Ostatní: %2$s v %1$d"
+ "Proces: %1$s"
+ "Jazyk a klávesnice"
+ "Nastavení jazyka a klávesnice""Nastavení jazyka a oblasti, způsobu zadávání textu a automatických oprav""Nastavení národního prostředí""Nastavení textu"
@@ -637,7 +692,7 @@
"Znak „.“ lze vložit dvojím stisknutím klávesy Mezerník.""Zobrazování hesel""Zadávané heslo je zobrazováno"
- "Prostřednictví této metody zadávání dat lze shromažďovat zadaný text včetně osobních údajů, jako jsou hesla a čísla kreditních karet. Metoda je součástí aplikace %1$s. Chcete povolit tuto metodu zadávání dat?"
+ "Prostřednictvím této metody zadávání dat lze shromažďovat zadaný text včetně osobních údajů, jako jsou hesla a čísla kreditních karet. Metoda je součástí aplikace %1$s. Chcete tuto metodu zadávání dat použít?""Uživatelský slovník""Uživatelský slovník""Přidat nebo odebrat slova z uživatelského slovníku"
@@ -665,7 +720,7 @@
"Zadávání textu""Správa možností zadávání textu""Nastavení metody %1$s"
- "Nastavení klávesnice na obrazovce"
+ "Nastavení klávesnice na obrazovce""Klávesnice zařízení""Nastavení vestavěné klávesnice""Vývoj"
@@ -676,11 +731,11 @@
"Obrazovka se při nabíjení nepřepne do režimu spánku""Povolit simulované polohy""Povolit simulované polohy"
- "Aktivovat ladění USB?"
+ "Povolit ladění USB?""Ladění USB je určeno pouze pro účely vývoje. Lze pomocí něho kopírovat data mezi počítačem a zařízením, instalovat aplikace do zařízení bez upozornění a číst data protokolů.""Zvolte gadget""Zvolte widget"
- "Podrobnosti pro UID %d"
+ "Podrobnosti pro UID %d""UID %1$d""Podrobnosti o používání sítě aplikací %1$s:""Přijato bytů: %1$d"
@@ -716,12 +771,13 @@
"Aplikace""Počet""Doba použití"
- "Usnadnění"
+ "Usnadnění"
+ "Nastavení usnadnění""Možnosti správy usnadnění""Usnadnění""Služby usnadnění""Žádné nainstalované služby usnadnění."
- "Tato služba usnadnění může shromažďovat veškerý text, který napíšete, včetně osobních údajů a čísel kreditních karet, ne však hesla. Může také ukládat do protokolů vaše interakce s uživatelským rozhraním. Služba pochází z aplikace %1$s. Chcete tuto službu usnadnění aktivovat?"
+ "Tato služba usnadnění může shromažďovat veškerý text, který napíšete, včetně osobních údajů a čísel kreditních karet, nikoli však hesla. Může také protokolovat vaše interakce s uživatelským rozhraním. Služba pochází z aplikace %1$s. Chcete tuto službu usnadnění použít?""Deaktivovat usnadnění?""Využití baterie""Co využívá baterii"
@@ -733,7 +789,7 @@
"Doba provozu zařízení""Doba provozu sítě WiFi""Doba provozu sítě WiFi"
- "%1$s – %2$s %%"
+ "%1$s – %2$s%%""Podrobnosti využití baterie""Podrobnosti používání""Upravit spotřebu energie"
@@ -769,7 +825,7 @@
"Využití baterie sítí WiFi""Pokud síť WiFi nepoužíváte nebo na daném místě není k dispozici, vypněte ji.""Využití baterie technologií Bluetooth"
- "Vypněte technologii Bluetooth, když ji nepoužíváte"
+ "Vypněte technologii Bluetooth, když ji nepoužíváte.""Zkuste se připojit k jinému zařízení bluetooth""Využití baterie spuštěnými aplikacemi""Ukončete aplikaci nebo ji odinstalujte"
@@ -781,9 +837,9 @@
"Obnovit""OS Android""Mediaserver"
- "Syntéza řeči"
+ "Převod textu na řeč""Nastavit možnosti syntézy řeči"
- "Ovládací prvky syntezátoru řeči"
+ "Nastavení převodu textu na řeč""Vždy používat moje nastavení""Výchozí nastavení níže přepíše nastavení jednotlivých aplikací""Výchozí nastavení"
@@ -801,8 +857,11 @@
"Toto je příklad syntézy řeči.""Nastavení se změnilo. Toto je příklad současného znění.""Ovládací prvek napájení"
+ "Probíhá aktualizace nastavení Wi-Fi"
+ "Probíhá aktualizace nastavení Bluetooth"
+ "Program na instalaci pověření""Nastavení sítě VPN"
- "Připojit k %s"
+ "Připojit k síti %s""Uživatelské jméno:""Heslo:""uživatelské jméno"
@@ -820,9 +879,9 @@
"Odpojit od sítě""Upravit síť""Smazat síť"
- "Je nutné zadat %s."
- "Musíte vybrat %s."
- "Název sítě VPN %s již existuje. Zvolte jiný název."
+ "Je nutné zadat %s."
+ "Musíte vybrat možnost %s."
+ "Název sítě VPN „%s“ již existuje. Zvolte jiný název.""Opravdu chcete smazat tuto síť VPN?""Opravdu nechcete vytvořit tento profil?""Opravdu chcete zrušit změny provedené v tomto profilu?"
@@ -833,10 +892,12 @@
"V konfiguraci této sítě VPN chybí několik tajných nastavení. Chcete své tajné nastavení zkontrolovat?""Zadané uživatelské jméno nebo heslo je nesprávné. Chcete to zkusit znovu?""Server zavěsil. Zadané uživatelské jméno nebo heslo je možná nesprávné. Chcete to zkusit znovu?"
+ "Server zavěsil. Je možné, že máte spuštěný firewall, který brání připojení k serveru. Chcete to zkusit znovu?"
+ "Vyjednávání se serverem se nezdařilo. Server možná nedokáže pracovat s nastavenou možností šifrování. Chcete zkontrolovat nastavení šifrování?""Přidat síť VPN""Přidat síť VPN"
- "Přidat síť VPN %s"
- "%s – podrobnosti"
+ "Přidat síť VPN %s"
+ "%s – podrobnosti""Sítě VPN""Připojování...""Odpojování..."
@@ -844,8 +905,8 @@
"Připojit k síti""Název sítě VPN""název sítě VPN"
- "Položka %s je přidána"
- "Změny probíhají v %"
+ "Položka „%s“ je přidána"
+ "V profilu %s probíhají změny""Nastavit certifikát uživatele""Certifikát uživatele""certifikát uživatele"
@@ -866,53 +927,53 @@
"Název serveru sítě VPN""Domény vyhledávání DNS""Domény vyhledávání DNS"
- "%s je nastaveno"
- "%s není nastaveno"
- "%s není nastaveno (nepovinné)"
- "Aktivovat %s"
- "Deaktivovat %s"
- "%s je aktivováno"
- "%s je deaktivováno"
+ "Hodnota %s je nastavena"
+ "Hodnota %s není nastavena"
+ "Hodnota %s není nastavena (nepovinné)"
+ "Povolit možnost %s"
+ "Deaktivovat %s"
+ "Položka %s je aktivována"
+ "Možnost %s je deaktivována""Nastavení sítě VPN""Nastavit a spravovat sítě VPN""(nezměněno)""(není nastaveno)"
- "Úložiště pověření"
- "Použít zabezpečená pověření"
- "Povolit aplikacím přístup k zabezpečeným certifikátům a pověřením"
- "Zadejte heslo"
- "Zadejte heslo úložiště pověření."
- "Nastavit heslo"
- "Nastavení nebo změna hesla úložiště pověření"
- "Nastavit heslo"
- "Vymazat úložiště"
- "Vymazat veškerý obsah úložiště pověření a resetovat heslo"
- "Opravdu chcete smazat veškerá pověření a resetovat heslo úložiště pověření?"
- "Zadat název certifikátu"
- "Název certifikátu:"
- "Heslo pro extrakci certifikátu:"
- "Podrobnosti certifikátu:"
- "Název může obsahovat pouze písmena a čísla."
- "Aktuální heslo:"
- "Nové heslo:"
- "Potvrďte nové heslo:"
- "Nastavte heslo pro úložiště pověření."
- "Nastavte heslo pro úložiště pověření."
- "Zadejte správné heslo."
- "Zadejte prosím správné heslo. Máte ještě jeden pokus na zadání správného hesla, jinak bude úložiště pověření vymazáno."
- "Zadejte prosím správné heslo. Počet zbývajících pokusů na zadání správného hesla: %d. Po vyčerpání všech pokusů bude úložiště pověření vymazáno."
- "Hesla se neshodují."
- "Musíte zadat a potvrdit heslo."
- "Zadejte heslo."
- "Zadejte heslo znovu. Heslo musí mít alespoň 8 znaků a nesmí obsahovat mezery."
- "Zadejte prosím jméno."
- "Zadejte název obsahující pouze písmena a čísla."
- "Nelze uložit certifikát. Kliknutím na tlačítko OK to zkuste znovu."
- "Certifikát nelze uložit. Úložiště pověření není aktivováno nebo není správně inicializováno."
- "Certifikát není uložen."
- "Úložiště pověření je vymazáno."
- "Úložiště pověření je aktivováno."
- "Položka %s je přidána."
+ "Úložiště pověření"
+ "Použít zabezpečená pověření"
+ "Povolit aplikacím přístup k zabezpečeným certifikátům a dalším pověřením"
+ "Zadejte heslo"
+ "Zadejte heslo úložiště pověření."
+ "Instalace z karty SD"
+ "Nainstalovat šifrované certifikáty z karty SD"
+ "Nastavit heslo"
+ "Nastavení nebo změna hesla úložiště pověření"
+ "Vymazat úložiště"
+ "Vymazat veškerý obsah úložiště pověření a resetovat heslo"
+ "Opravdu chcete smazat veškerá pověření a resetovat heslo úložiště pověření?"
+ "Aktuální heslo:"
+ "Nové heslo:"
+ "Potvrďte nové heslo:"
+ "Nastavte heslo pro úložiště pověření (nejméně 8 znaků)."
+ "Zadejte správné heslo."
+ "Zadejte prosím správné heslo. Máte ještě jeden pokus na zadání správného hesla, poté bude úložiště pověření vymazáno."
+ "Zadejte prosím správné heslo. Počet zbývajících pokusů o zadání správného hesla: %1$d. Po vyčerpání všech pokusů bude úložiště pověření vymazáno."
+ "Hesla se neshodují."
+ "Musíte zadat a potvrdit heslo."
+ "Zadejte heslo."
+ "Heslo musí mít alespoň 8 znaků."
+ "Úložiště pověření je vymazáno."
+ "Úložiště pověření je aktivováno."
+ "Úložiště pověření je deaktivováno.""Tísňové vyzvánění""Nastavit chování při tísňovém volání"
+ "Ochrana osobních údajů"
+ "Nastavení ochrany osobních údajů"
+ "Poloha"
+ "Nastavení"
+ "Osobní údaje"
+ "Zálohovat moje nastavení"
+ "Zálohování nastavení"
+ "Opravdu chcete zastavit zálohování svých nastavení a vymazat všechny kopie na serverech Google?"
+
+
diff --git a/res/values-da/arrays.xml b/res/values-da/arrays.xml
index d58b27eee39..7427f2b9ddf 100644
--- a/res/values-da/arrays.xml
+++ b/res/values-da/arrays.xml
@@ -24,38 +24,59 @@
"Pacific""Alle"
+
+ "Ingen animationer"
+ "Nogle animationer"
+ "Alle animationer"
+
+
+ "Der vises ingen vinduesanimationer"
+ "Der vises nogle vinduesanimationer"
+ "Alle vinduesanimationer vises"
+ "15 sekunder""30 sekunder""1 minut""2 minutter""10 minutter"
- "Lad der aldrig opstå timeout"
+ "30 minutter"
+
+
+ "Meget langsomt"
+ "Langsom"
+ "Normal"
+ "Hurtig"
+ "Meget hurtig"
+
+
+ "Meget lav"
+ "Lav"
+ "Normal"
+ "Høj"
+ "Meget høj"
+
+
+ "Amerikansk engelsk"
+ "Britisk engelsk"
+ "Fransk"
+ "Tysk"
+ "Italiensk"
+ "Spansk"
+
+
+ "Automatisk"
+ "Ingen"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Ingen"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automatisk""WEP ASCII"
@@ -84,15 +105,27 @@
"Start optælling""Programnavn"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Ingen"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Fra"
+ "Underretning"
+ "Vibrer"
+
+
+ "Ingen"
+ "PAP"
+ "CHAP"
+ "PAP eller CHAP"
+
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index fef35f0d695..231884188b5 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ja"
+ "Nej""Ukendt""Slå radio til""Slå radio fra"
@@ -56,6 +58,7 @@
"OK""SD-kort""Batteristatus:"
+ "Strømstik:""Batteriskala:""Batteriniveau:""Batterihelbred:"
@@ -75,6 +78,11 @@
"Aflader""Oplader ikke""Fuld"
+ "Ikke sluttet til"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Ukendte""Ukendt""God""Overophed"
@@ -104,14 +112,19 @@
"Anmodning om Bluetooth-parring""Parringsanmodning""Vælg for at parre med "
+ "Bluetooth-enhedssamler"
+ "Anmodning om Bluetooth-tilladelse"
+ "Et program på din telefon kræver tilladelse til at aktivere Bluetooth. Ønsker du at gøre dette?"
+ "Et program på din telefon kræver tilladelse til, at din telefon er synlig for andre Bluetooth-enheder i %1$d sekunder. Ønsker du at gøre dette?"
+ "Et program på din telefon anmoder om tilladelse til at aktivere Bluetooth, så din telefon er synlig for andre enheder i %1$d sekunder. Ønsker du at gøre dette?"
+ "Aktiverer Bluetooth …""Dato- og tidsindstillinger""1:00 pm""13:00""Skift tid""Dato""Vælg tidszone"
-
-
+ "Normal (%s)""Eksempelvisning:""Skrifttypestørrelse:"
@@ -192,33 +205,23 @@
"Proxyindstillinger""Annuller""Indstillinger"
-
-
+ "Indstillinger""Flytilstand""Deaktiver alle trådløse forbindelser""Deaktiverer trådløse forbindelser ...""Aktiverer trådløse forbindelser ..."
- "Trådl. kontrolelementer"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Trådløst og netværk"
+ "Indstillinger for trådløs og netværk"
+ "Administrer Wi-Fi, Bluetooth, flytilstand, mobile netværker og VPN\'er"
+ "Dataroaming"
+ "Opret forbindelse til datatjenester under roaming"
+ "Opret forbindelse til datatjenester under roaming"
+ "Du har mistet dataforbindelsen, fordi du har forladt dit hjemmenetværk med dataroaming slået fra."
+ "Slå det til"
+ "Tillad dataroaming? Du kan komme ud for væsentlige gebyrer for roaming."
+ "Bemærk"
+ "Udbydervalg"
+ "Vælg en netværksudbyder""Dato og tid""Indstil dato, tid, tidszone og formater""Automatisk"
@@ -231,25 +234,31 @@
"Vælg datoformat""Sorter alfabetisk""Sorter efter tidszone"
- "Sikkerhed og placering"
-
-
+ "Placering og sikkerhed"
+ "Indstillinger for placering og sikkerhed"
+ "Indstil Min placering, oplåsning af skærmen, SIM-kortlås, oplysningslagringslås"
+ "Indstil Min placering, oplåsning af skærmen, oplysningslagringslås""Adgangskoder""Bluetooth""Slå Bluetooth til""Bluetooth-indstillinger""Bluetooth-indstillinger""Administrer forbindelser, indstil enhedsnavn og søgbarhed"
- "Anmodning om Bluetooth-parring"
+ "Anmodning om Bluetooth-parring""Oplysninger om Bluetooth-enhed"
- "%1$s"\n\n"Indtast PIN-kode for at parre."\n"(Prøv 0000 eller 1234)."
+ \n"Indtast PIN-kode for at forbinde med \"%1$s\". (Prøv 0000 eller 1234)."
+ \n"Indtast adgangsnøgle for at forbinde med \"%1$s\"."
+ "For at parre med \"%1$s\" skal du bekræfte, at den viser adgangsnøglen: %2$s."
+ "%1$s"\n"ønsker at forbinde."
+ "Indtast %2$s på \"%1$s\" for at forbinde."
+ "Par"
+ "Undlad at parre"
+ "Bluetooth-enhed""Bemærk""Der var problemer med at parre med %1$s"
- "Der var problemer med at parre med %1$s, fordi den indtastede PIN-kode er forkert."
-
-
-
-
+ "Der var problemer med at forbinde med %1$s, fordi PIN-koden eller adgangsnøglen er forkert."
+ "Der kan ikke etableres kommunikation med %1$s."
+ "Parring afvist af %1$s.""Der var problemer med at oprette forbindelse til %1$s.""Scan efter enheder""Forbind"
@@ -261,6 +270,7 @@
"Opret forbindelse til ...""Medier""Telefon"
+ "Overfør""Forbundet til medielyd""Forbundet til telefonlyd""Forbundet til telefon- og medielyd"
@@ -270,8 +280,11 @@
"Profiler""Forbundet til medielyd""Forbundet til telefonlyd"
+ "Forbundet til filoverførselsserver"
+ "Ikke forbundet til filoverførselsserver""Brug medielyd""Brug til telefonlyd"
+ "Brug til filoverførsel""Wi-Fi""Wi-Fi""Slå Wi-Fi til"
@@ -288,25 +301,13 @@
"Sikkerhed""Åbn""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Ukendt"
-
-
-
-
-
-
-
-
-
-
-
-
+ "åbent netværk"
+ "sikret med WEP"
+ "sikret med WPA/WPA2 PSK"
+ "sikret med 802.1x EAP""IP-adresse""Signalstyrke""Tænder ..."
@@ -319,28 +320,19 @@
"Netværket kunne ikke gemmes""Forbind""Opret forbindelse til %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "EAP-metode"
+ "Fase 2-godkendelse"
+ "Identitet"
+ "Anonym identitet"
+ "Klientcertifikat"
+ "CA-certifikat""Adgangskode til trådløs""tast til \"WEP-heksadecimal\" (0-9, A-F)""Vis adgangskode.""Scan""Ikke inden for rækkevidde"
-
-
- "Forbindelsen mislykkedes. Vælg for at prøve igen"
+ "husket"
+ "Forbindelsen mislykkedes. Tryk for at prøve igen""Wi-Fi-netværk""Netværk-SSID""Sikkerhed"
@@ -391,6 +383,7 @@
"Afbrudt""Mislykkedes""Lyd og visning"
+ "Indstillinger for lyd og visning""Lydindstillinger""Indstil ringetoner, meddelelser, skærmlysstyrke""Lydløs"
@@ -416,17 +409,16 @@
"Lydudvalg""Afspil lyd, når der foretages skærmvalg""Afspil lyd, når der foretages skærmvalg"
+ "Feedback ved berøring"
+ "Vibrerer, når der trykkes på funktionstaster og ved visse interaktioner med brugergrænsefladen"
+ "Vibrerer, når der trykkes på funktionstaster og ved visse interaktioner med brugergrænsefladen""SD-kortmeddelelser"
-
-
-
-
- "Datasynkronisering"
- "Vælg, hvilke programmer der skal synkroniseres"
-
-
-
-
+ "Afspil lyd for SD-kortmeddelelser"
+ "Afspil lyd for SD-kortmeddelelser"
+ "Konti og synkronisering"
+ "Tilføj eller fjern konti, og skift kontoindstillinger"
+ "Søg"
+ "Administrer søgeindstillinger og oversigt""Visningsindstillinger""Animation""Vis animationer, når der åbnes og lukkes for vinduer"
@@ -438,6 +430,7 @@
"Juster skærmens lysstyrke""Timeout for skærmen""Juster forsinkelsen, inden skærmen slukkes automatisk"
+ "Automatisk lysstyrke""Indstillinger for lås af SIM-kort""Opsæt SIM-kortlås""SIM-kortlås"
@@ -470,18 +463,14 @@
"Ikke tilgængelig""Status""Status"
-
-
- "SD-kort og tlf.lag.plads"
+ "Telefonnummer, signal osv."
+ "SD-kort og tlf.lag.plads"
+ "Indstillinger for lagerplads på SD-kort og telefon""Demonter SD-kort, vis ledig lagerplads"
-
-
-
-
-
-
-
-
+ "Mit telefonnummer"
+ "MIN"
+ "PRL-version"
+ "MEID""Mobil netværkstype""Mobil netværkstilstand""Servicetilstand"
@@ -520,6 +509,11 @@
"MMS-port""MCC""MNC"
+ "Godkendelsestype"
+ "Ingen"
+ "PAP"
+ "CHAP"
+ "PAP eller CHAP""APN-type""Slet APN""Ny APN"
@@ -535,11 +529,9 @@
"Nulstilling af APN-standardindstillinger afsluttet""Nulstilling af fabriksdata""Sletter alle data på telefonen"
-
-
+ "Dette sletter alle data fra din telefon, inklusive :"\n
"Din Google-konto"
\n
"System- og programdata samt indstillinger"
\n
"Downloadede programmer"
\n"Det sletter ikke:"\n
"Nuværende systemsoftware og programbundter"
\n
"SD-kortfiler, som f.eks. musik og fotos"
"Nulstil telefon"
-
-
+ "Slet alle dine personlige oplysninger og downloadede programmer? Denne handling kan ikke omstødes?""Slet alting""Tegn dit mønster til at låse op""Du skal tegne dit mønster til at låse op for at bekræfte nulstilling af telefonen."
@@ -556,20 +548,19 @@
"Opsæt voicemail, viderestilling af opkald, ventende opkald, opkalds-id""Mobilnetværk""Indstil valgmuligheder for roaming, netværk, APN\'er"
-
-
+ "Min placering""Brug trådløse netværk""Se placering i programmer (som f.eks. Maps) ved hjælp af trådløse netværk""Placering er afgjort af Wi-Fi og/eller mobile netværk"
- "Aktiver GPS-satelliter"
- "Find præcise placeringer på gadeniveau (fravælg for at spare på batteriet)"
+ "Brug GPS-satellitter"
+ "Find præcise placeringer på gadeniveau (fjern markering for at spare på batteriet)""Gå til gadeniveau (kræver mere batteri plus visning af himmel)"
-
-
-
-
-
-
+ "Brug assisteret GPS"
+ "Brug server til at assistere GPS (fjern markering for at mindske netværksforbrug)"
+ "Brug server til at assistere GPS (fjern markering for at forbedre GPS-ydelsen)"
+ "Brug Min placering"
+ "Brug Min placering til Google-søgeresultater og andre Google-tjenester"
+ "Tillad Google at bruge placering til forbedrede søgeresultater og andre tjenester?""Enig""Ikke enig""Om telefon"
@@ -579,12 +570,15 @@
"Ophavsret""Licens""Vilkår og betingelser"
-
-
+ "Systemselvstudie""Lær, hvordan du bruger din telefon""Open source-licenser""Der er problemer med at indlæse licenserne.""Indlæser ..."
+ "Sikkerhedsoplysninger"
+ "Sikkerhedsoplysninger"
+ "Din telefon er ikke tilsluttet en datatjeneste. For at se disse oplysninger nu skal du gå til %s fra en hvilken som helst computer, der er forbundet til internettet."
+ "Indlæser ...""Mønster til at låse skærmen op""Skift oplåsningsmønster""Bekræft gemt mønster"
@@ -613,9 +607,9 @@
"Annuller""Næste""Sikring af din telefon"
- "Beskyt din telefon mod uautoriseret brug ved at oprette et personligt mønster til at låse skærmen op. "\n\n"1"" På den næste skærm kan du se et eksempel på, hvordan mønsteret tegnes. "\n\n"2"" Når du er klar, kan du tegne dit eget personlige mønster til at låse op. Eksperimenter med forskellige mønstre, men forbind mindst fire punkter. "\n\n"3"" Tegn dit mønster igen for at bekræfte. "\n\n"Er du klar? Vælg \"Næste\""". "\n\n"Du kan efterlade din telefon ubeskyttet ved at vælge \"Annuller\"."
+ "Beskyt din telefon mod uautoriseret brug ved at oprette et personligt mønster til at låse skærmen op. "\n\n"1"" På næste skærm kan du se et eksempel på, hvordan mønsteret tegnes. "\n\n"2"" Når du er klar, kan du tegne dit eget personlige mønster til at låse op. Eksperimenter med forskellige mønstre, men forbind mindst fire punkter. "\n\n"3"" Tegn dit mønster igen for at bekræfte. "\n\n"Er du klar? Tryk på \"Næste\""". "\n\n"Du kan lade din telefon være ubeskyttet ved at trykke på \"Annuller\".""Eksempelmønster"
- "Forbind mindst fire punkter."\n" "\n"Vælg \"Næste\", når du er klar til at tegne dit eget mønster."
+ "Forbind mindst fire punkter."\n" "\n"Tryk på \"Næste\", når du er klar til at tegne dit eget mønster.""Administ. programmer""Administrer og fjern installerede programmer""Programmer"
@@ -638,8 +632,7 @@
"Data""Afinstaller""Ryd data"
-
-
+ "Afinstaller opdateringer""Du har valgt at starte dette program som standard for nogle handlinger.""Der er ikke indstillet nogen standarder.""Ryd standarder"
@@ -650,32 +643,41 @@
"Filter""Vælg filtervalgmuligheder""Alle"
- "Tredjeparts"
+ "Overført""Kørende""Indlæser ...""Beregner størrelse igen ...""Slet"
- "Alle de oplysninger, du har gemt i dette program, slettes permanent."
+ "Alle dette programs data slettes permanent. Det omfatter alle filer, indstillinger, konti, databaser osv.""OK""Annuller""Programmet blev ikke fundet""Programmet blev ikke fundet på listen over installerede programmer.""Programdata kunne ikke ryddes."
-
-
-
-
-
-
-
-
+ "Afinstaller opdateringer"
+ "Ønsker du at afinstallere alle opdateringer til dette Android-systemprogram?"
+ "Ryd data"
+ "Rydning af data til programmet mislykkedes""Dette program kan få adgang til følgende på din telefon:""Beregner ...""Pakkestørrelse kunne ikke beregnes"
- "Du har ikke installeret nogen tredjepartsprogrammer."
-
-
- "Landestandard og tekst"
+ "Du har ikke installeret nogen tredjepartsprogrammer."
+ "version %1$s"
+ "Kørende tjenester"
+ "Vis og kontroller igangværende tjenester"
+ "Genstarter"
+ "Der er ingen kørende tjenester"
+ "Stop tjeneste?"
+ "Denne tjeneste kører ikke, før den startes igen. Det kan have uønskede konsekvenser for programmet %1$s."
+ "Stop"
+ "Annuller"
+ "Startet af program: tryk for at stoppe"
+ "%1$s: tryk for at administrere"
+ "Ledig: %2$s+%3$s i %1$d"
+ "Andre: %2$s i %1$d"
+ "Proces: %1$s"
+ "Sprog og tastatur"
+ "Sprog- og tastaturindstillinger""Indstil landestandard (land og område), tekstinput…""Landestandardindstilling""Tekstindstillinger"
@@ -690,7 +692,7 @@
"Tryk på mellemrumstasten to gange for at indsætte \".\"""Synlig adgangskode""Vis adgangskode, mens du indtaster"
- "Inputmetoden vil muligvis være i stand til at indsamle al den tekst, du indtaster, inklusive personlige data som adgangskoder og kreditkortnumre. Den kommer fra programmet %1$s. Aktiver denne inputmetode?"
+ "Denne indtastningsmetode vil muligvis være i stand til at indsamle al den tekst, du indtaster, herunder personlige data som adgangskoder og kreditkortnumre. Den kommer fra programmet %1$s. Vil du bruge denne indtastningsmetode?""Brugerordbog""Brugerordbog""Tilføj og fjern ord fra brugerordbogen"
@@ -718,7 +720,7 @@
"Tekstinput""Administrer valgmuligheder for tekstinput""%1$s indstillinger"
- "Indstillinger for skærmtastatur"
+ "Indstillinger for skærmens tastatur""Enhedstastatur""Indstillinger for indbygget tastatur""Udvikling"
@@ -729,13 +731,11 @@
"Skærmen går aldrig i dvale, når der lades op""Tillad imiterede placer.""Tillad imiterede placer."
-
-
-
-
+ "Vil du tillade USB-fejlretning?"
+ "USB-fejlretning er kun beregnet til udviklingsformål. Det kan bruges til at kopiere data mellem din computer og din enhed, installere programmer på din enhed uden underretning og læse logdata.""Vælg gadget""Vælg widget"
- "Detaljer for UID %d"
+ "Detaljer for UID %d""UID %1$d""Netværksbrugsdetaljer for %1$s:""Modtagne bytes: %1$d"
@@ -746,14 +746,10 @@
"Systemtid:""Tid i alt:""Start: %1$d"
-
-
-
-
-
-
-
-
+ "%1$dd %2$dt %3$dm %4$ds"
+ "%1$dt %2$dm %3$ds"
+ "%1$dm %2$ds"
+ "%1$dS""Pakker, der deler denne UID:""Der er ingen tilgængelige batteribrugsdata""Sensor:"
@@ -775,400 +771,209 @@
"Program""Optælling""Brugstid"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Tilgængelighed"
+ "Indstillinger for tilgængelighed"
+ "Administrer tilgængelighedsvalgmuligheder"
+ "Tilgængelighed"
+ "Tilgængelighedstjenester"
+ "Der er ingen installerede tilgængelighedstjenester."
+ "Denne tilgængelighedstjeneste vil muligvis være i stand til at indsamle al den tekst, du indtaster, inklusive personlige data, kreditkortoplysninger undtagen adgangskoder. Den kan også registrere dine brugergrænsefladeinteraktioner. Den kommer fra programmet %1$s. Vil du aktivere denne tilgængelighedstjeneste?"
+ "Deaktiver tilgængelighed?"
+ "Batteriforbrug"
+ "Hvad, der har brugt batteriet"
+ "Batteriforbrug siden afbrydelse"
+ "Batteriforbrug siden nulstilling"
+ "%1$s siden afbrydelse"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Enhedsopvågningstid"
+ "Wi-Fi til tiden"
+ "Wi-Fi til tiden"
+ "%1$s - %2$s%%"
+ "Batteriforbrugsoplysninger"
+ "Brugsdetaljer"
+ "Juster strømforbrug"
+ "Inkluderede pakker"
+ "Visning"
+ "Wi-Fi"
+ "Bluetooth"
+ "Cellestandby"
+ "Stemmeopkald"
+ "Telefon er ikke aktiv"
+ "CPU i alt"
+ "CPU forgrund"
+ "GPS"
+ "Telefon"
+ "Data sendt"
+ "Data modtaget"
+ "Lyd"
+ "Video"
+ "Tid til"
+ "Tid uden signal"
+ "Tving til at standse"
+ "Programoplysninger"
+ "Programindstillinger"
+ "Visningsindstillinger"
+ "Wi-Fi-indstillinger"
+ "Bluetooth-indstillinger"
+ "Batteri brugt af stemmeopkald"
+ "Batteri brugt, når telefon ikke er aktiv"
+ "Batteri brugt af celleradio"
+ "Skift til flytilstand for at spare på strømmen i områder uden celledækning."
+ "Batteri brugt af skærmen og baglyset."
+ "Reducer skærmens lysstyrke og/eller skærmens timeout"
+ "Batteri brugt af Wi-Fi"
+ "Slå Wi-Fi fra, når det ikke er i brug eller tilgængeligt"
+ "Batteri brugt af Bluetooth"
+ "Slå Bluetooth fra, når du ikke bruger det"
+ "Prøv at oprette forbindelse til en anden Bluetooth-enhed"
+ "Batteri brugt af programmer, når de kører"
+ "Stop eller afinstaller programmet"
+ "Slå GPS fra, når den ikke bruges"
+ "Dette program kan muligvis tilbyde indstillinger, der mindsker batteriforbruget"
+ "%1$s siden afbrydelse"
+ "Siden sidste afbrydelse for %1$s"
+ "Brugstotal"
+ "Opdater"
+ "Android OS"
+ "Medieserver"
+ "Tekst-til-tale"
+ "Indstil valgmuligheder for tekst-til-tale"
+ "Indstillinger for tekst-til-tale"
+ "Brug altid mine indstil."
+ "Nedenstående standardindstillinger tilsidesætter programindstillinger"
+ "Standardindstillinger"
+ "Talefrekvens"
+ "Hastighed hvormed tekst udtales"
+ "Tonehøjde"
+ "Påvirker tonen af den talte tekst"
+ "Sprog"
+ "Indstiller den sprogspecifikke stemme til talt tekst"
+ "Lyt til et eksempel"
+ "Afspil en kort demonstration af talesyntese"
+ "Installer stemmedata"
+ "Installer de påkrævede stemmedata for talesyntese"
+ "De påkrævede stemmer til talesyntese er allerede installeret korrekt"
+ "Dette er et eksempel på talesyntese."
+ "Dine indstillinger er blevet ændret. Dette er et eksempel på, hvordan de lyder."
+ "Strømkontrol"
+ "Opdaterer Wi-Fi-indstilling"
+ "Opdaterer Bluetooth-indstilling"
+ "Installationsprogram til oplysninger"
+ "VPN-indstillinger"
+ "Opret forbindelse til %s"
+ "Brugernavn:"
+ "Adgangskode:"
+ "et brugernavn"
+ "en adgangskode"
+ "Husk brugernavn"
+ "Forbind"
+ "Ja"
+ "Nej"
+ "Tilbage"
+ "Nej"
+ "Gem"
+ "Annuller"
+ "Vend tilbage"
+ "Opret forbindelse til netværk"
+ "Afbryd forbindelsen til netværk"
+ "Rediger netværk"
+ "Slet netværk"
+ "Du skal indtaste %s."
+ "Du skal vælge %s."
+ "VPN-navnet \'%s\' eksisterer allerede. Find et andet navn."
+ "Er du sikker på, at du ønsker at slette dette VPN?"
+ "Er du sikker på, du ikke ønsker at oprette denne profil?"
+ "Er du sikker på, at du ønsker at kassere de ændringer, der er foretaget til denne profil?"
+ "Der kunne ikke oprettes forbindelse til netværket. Ønsker du at prøve igen?"
+ "Forbindelsen er mistet. Ønsker du at oprette forbindelse igen?"
+ "Servernavnet kan ikke løses. Ønsker du at kontrollere dine servernavneindstillinger?"
+ "Udfordringsfejl. Ønsker du at kontrollere din hemmelige indstilling?"
+ "Der mangler en eller flere hemmeligheder i denne VPN-konfiguration. Ønsker du at kontrollere din hemmelige indstilling."
+ "Det/den indtastede brugernavn eller adgangskode er forkert. Ønsker du at prøve igen?"
+ "Serverophængning. Brugernavnet eller adgangskoden, du indtastede, kan være forkerte. Ønsker du at prøve igen?"
+ "Serveren afbrød. Du er muligvis bag en firewall, der forhindrer dig i at oprette forbindelse til serveren. Vil du prøve igen?"
+ "Serverkommunikationen mislykkedes. Serveren er muligvis ikke enig i dine krypteringsindstillinger. Vil du kontrollere dine krypteringsindstillinger?"
+ "Tilføj VPN"
+ "Tilføj VPN"
+ "Tilføj %s VPN"
+ "%s detaljer"
+ "VPN\'er"
+ "Opretter forbindelse ..."
+ "Afbryder ..."
+ "Forbundet"
+ "Opret forbindelse til netværk"
+ "VPN-navn"
+ "et VPN-navn"
+ "\'%s\' er tilføjet"
+ "Der er foretaget ændringer af \'%s\'"
+ "Indstil brugercertifikat"
+ "Brugercertifikat"
+ "et brugercertifikat"
+ "Indstil CA-certifikat"
+ "Certifikat fra certifikatleverandør (CA)"
+ "et CA-certifikat"
+ "Indstil L2TP-hemmelighed"
+ "L2TP-hemmelighed"
+ "en L2TP-hemmelighed"
+ "kryptering"
+ "PPTP-kryptering"
+ "Indstil IPsec-forhåndsdelt nøglekodning"
+ "IPsec-forhåndsdelt nøglekodning"
+ "en IPsec-forhåndsdelt nøglekodning"
+ "Indstil VPN-server"
+ "VPN-server"
+ "en VPN-server"
+ "VPN-servernavn"
+ "DNS-søgedomæner"
+ "DNS-søgedomæner"
+ "%s er indstillet"
+ "%s ikke indstillet"
+ "%s ikke indstillet (valgfrit)"
+ "Aktiver%s"
+ "Deaktiver%s"
+ "%s er aktiveret"
+ "%s er deaktiveret"
+ "VPN-indstillinger"
+ "Indstil og administrer Virtuelle Private Netværk (VPN\'er)"
+ "(uændret)"
+ "(ikke indstillet)"
+ "Oplysningslagring"
+ "Brug sikre oplysninger"
+ "Tillad programmer at få adgang til sikre certifikater og andre oplysninger"
+ "Indtast adgangskode"
+ "Indtast adgangskoden til oplysningslagring."
+ "Installer fra SD-kort"
+ "Installer krypterede certifikater fra SD-kortet"
+ "Indstil adgangskode"
+ "Indstil eller skift adgangskode til oplysningslagring"
+ "Ryd lager"
+ "Ryd oplysningslagring af alt indhold, og nulstil dens adgangskode"
+ "Er du sikker på, at du ønsker at slette alle oplysninger og nulstille adgangskoden til oplysningslagringen?"
+ "Nuværende adgangskode:"
+ "Ny adgangskode:"
+ "Bekræft ny adgangskode:"
+ "Indstil en adgangskode til oplysningslagring (mindst 8 tegn)."
+ "Indtast den rigtige adgangskode."
+ "Indtast den rigtige adgangskode. Du har et forsøg mere til at indtaste den rigtige adgangskode, inden oplysningslagringen slettes."
+ "Indtast den rigtige adgangskode. Du har %1$d forsøg mere til at indtaste den rigtige adgangskode, inden oplysningslagringen slettes."
+ "Adgangskoder stemmer ikke overens."
+ "Du skal indtaste og bekræfte en adgangskode."
+ "Indtast adgangskoden."
+ "Adgangskoden skal indeholde mindst 8 tegn."
+ "Oplysningslagringen er slettet."
+ "Oplysningslagring er aktiveret."
+ "Oplysningslagring er deaktiveret."
+ "Nødtone"
+ "Indstil adfærd, når der foretages et nødopkald"
+ "Fortrolighed"
+ "Fortrolighedsindstillinger"
+ "Placering"
+ "Indstillinger"
+ "Personlige data"
+ "Sikkerhedskopier mine indstillinger"
+ "Sikkerhedskopi af indstillinger"
+ "Er du sikker på, at du vil holde op med at sikkerhedskopiere dine indstillinger og slette alle kopier på Googles servere?"
+
diff --git a/res/values-de/arrays.xml b/res/values-de/arrays.xml
index 8fea7f0ae82..15e24d4afa6 100644
--- a/res/values-de/arrays.xml
+++ b/res/values-de/arrays.xml
@@ -24,13 +24,23 @@
"Pacific""Alle"
+
+ "Keine Animationen"
+ "Einige Animationen"
+ "Alle Animationen"
+
+
+ "Es werden keine Fensteranimationen angezeigt."
+ "Einige Fensteranimationen werden angezeigt."
+ "Alle Fensteranimationen werden angezeigt."
+ "15 Sekunden""30 Sekunden""1 Minute""2 Minuten""10 Minuten"
- "Kein Timeout"
+ "30 Minuten""Sehr langsam"
@@ -58,18 +68,14 @@
"Autom.""Keine""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2-PSK"
+ "802.1x Enterprise""Keine""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2-PSK"
+ "802.1x Enterprise""Autom."
@@ -108,7 +114,7 @@
"Keine""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Benachrichtigung""Vibration"
+
+ "Keine"
+ "PAP"
+ "CHAP"
+ "PAP oder CHAP"
+
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 64caf020932..ad02d08cd41 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ja"
+ "Nein""Unbekannt""Mobilfunkverbindung aktivieren""Mobilfunkverbindung deaktivieren"
@@ -56,6 +58,7 @@
"OK""SD-Karte""Akkustatus:"
+ "Stromanschluss:""Akkuanzeige:""Akkuladung:""Akkuzustand:"
@@ -75,6 +78,11 @@
"Entladung""Wird nicht geladen""Voll"
+ "Nicht angeschlossen"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Unbekannt""Unbekannt""OK""Überhitzung"
@@ -104,6 +112,12 @@
"Bluetooth-Pairing-Anfrage""Pairing-Anfrage""Zum Pairing auswählen "
+ "Bluetooth-Geräteauswahl"
+ "Bluetooth-Berechtigungsanfrage"
+ "Eine Anwendung auf Ihrem Telefon beantragt eine Berechtigung zum Aktivieren von Bluetooth. Möchten Sie dies tun?"
+ "Eine Anwendung auf Ihrem Telefon beantragt die Berechtigung, Ihr Telefon für %1$d Sekunden für andere Bluethooth-Geräte sichtbar zu machen. Möchten Sie dies tun?"
+ "Eine Anwendung auf Ihrem Telefon beantragt die Berechtigung, Bluetooth zu aktivieren und Ihr Telefon für %1$d Sekunden für andere Telefone sichtbar zu machen. Möchten Sie dies tun?"
+ "Bluetooth wird aktiviert...""Einstellungen""1:00""13:00"
@@ -196,7 +210,8 @@
"Alle drahtlosen Verbindungen deaktivieren""Wireless-Verbindungen werden deaktiviert...""Wireless-Verbindungen werden aktiviert..."
- "Wireless"
+ "Drahtlos und Netzwerke"
+ "Einstellungen für Drahtlosnetzwerke""Wi-Fi, Bluetooth, Flugmodus, mobile Netzwerke und VPNs verwalten""Daten-Roaming""Bei Roaming mit Datendienst verbinden"
@@ -219,20 +234,29 @@
"Datumsformat auswählen""Alphabetisch sortieren""Nach Zeitzone sortieren"
- "Sicherheit und Standort"
+ "Standort und Sicherheit"
+ "Einstellungen für Standort & Sicherheit""Meinen Standort, Display-Entsperrung, SIM-Kartensperrung und Sperrung des Anmeldeinformationsspeichers festlegen"
+ "Meinen Standort festlegen, Bildschirm entsperren, Sperren des Speichers für Anmeldeinformationen""Passwörter""Bluetooth""Bluetooth aktivieren""Bluetooth-Einstellungen""Bluetooth-Einstellungen""Verbindungen, Gerätenamen und Erkennbarkeit verwalten"
- "Bluetooth-Pairing-Anfrage"
+ "Bluetooth-Pairing-Anfrage""Bluetooth-Geräteinfo"
- "%1$s"\n\n"PIN für Pairing eingeben."\n"(Versuchen Sie 0000 oder 1234.)"
+ \n"PIN für Pairing mit \"%1$s\" eingeben. Versuchen Sie 0000 oder 1234."
+ \n"Schlüssel zum Pairing mit \"%1$s\" eingeben."
+ "Bestätigen Sie zum Paaren mit \"%1$s\", dass der folgende Schlüssel angezeigt wird: %2$s."
+ "%1$s"\n"möchte sich paaren."
+ "Geben Sie zum Pairing %2$s in \"%1$s\" ein."
+ "Paaren"
+ "Nicht paaren"
+ "Bluetooth-Gerät""Achtung""Beim Pairing mit %1$s ist ein Problem aufgetreten."
- "Beim Pairing mit %1$s ist ein Problem aufgetreten, da die eingegebene PIN falsch ist."
+ "Beim Pairing mit %1$s ist ein Problem aufgetreten, da die eingegebene PIN oder der Schlüssel falsch ist.""Verbindung mit %1$s kann nicht hergestellt werden.""Verbindung wurde von %1$s abgelehnt.""Beim Verbindungsaufbau mit %1$s ist ein Problem aufgetreten."
@@ -246,6 +270,7 @@
"Verbinden mit...""Medien""Telefon"
+ "Übertragung""Verbunden mit Audiosystem von Medien""Verbunden mit Audiosystem des Telefons""Verbunden mit Audiosystem von Telefon und Medien"
@@ -255,8 +280,11 @@
"Profile""Verbunden mit Audiosystem von Medien""Verbunden mit Audiosystem des Telefons"
+ "Mit Dateiübertragungsserver verbunden"
+ "Nicht mit Dateiübertragungsserver verbunden""Für Audiosystem von Medien verwenden""Für Audiosystem des Telefons verwenden"
+ "Für Dateiübertragung verwenden""WLAN""WLAN""WLAN aktivieren"
@@ -273,17 +301,13 @@
"Sicherheit""Öffnen""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2-PSK"
+ "Enterprise(802.1x)""Unbekannt""offenes Netzwerk""gesichert mit WEP"
- "gesichert mit WPA"
- "gesichert mit WPA2"
- "gesichert mit WPA-EAP"
- "gesichert mit IEEE 802.1x"
+ "gesichert mit WPA/WPA2-PSK"
+ "gesichert mit 802.1x EAP""IP-Adresse""Signalstärke""Aktivierung..."
@@ -302,14 +326,13 @@
"Anonyme Identität""Client-Zertifikat""CA-Zertifikat"
- "Passwort für den privaten Schlüssel""Passwort für Wireless-Zugang""WEP Hexadezimalschlüssel (0-9, A-F)""Passwort anzeigen""Scannen""Nicht in Reichweite""gespeichert"
- "Verbindung fehlgeschlagen, versuchen Sie es erneut."
+ "Verbindung fehlgeschlagen, versuchen Sie es erneut.""WLAN-Netzwerke""Netzwerk-SSID""Sicherheit"
@@ -360,6 +383,7 @@
"Nicht verbunden""Fehlgeschlagen""Sound und Display"
+ "Einstellungen für Sound & Display""Toneinstellungen""Klingeltöne, Benachrichtigungen und Helligkeit festlegen""Lautlosmodus"
@@ -385,11 +409,14 @@
"Akustische Auswahl""Ton bei Auswahl auf Display""Ton bei Auswahl auf Display"
+ "Haptisches Feedback"
+ "Vibration beim Drücken von Softkeys und bei bestimmten UI-Interaktionen"
+ "Vibration beim Drücken von Softkeys und bei bestimmten UI-Interaktionen""SD-Karten-Nachricht""Ton bei SD-Karten-Benachrichtigungen""Ton bei SD-Karten-Benachrichtigungen"
- "Datensynchronisierung"
- "Auswählen, welche Anwendungen synchronisiert werden"
+ "Konten und Synchronisierung"
+ "Konten hinzufügen und entfernen und Kontoeinstellungen ändern""Suchen""Sucheinstellungen und Suchverlauf verwalten""Display-Einstellungen"
@@ -403,6 +430,7 @@
"Helligkeit des Bildschirms anpassen""Display-Timeout""Verzögerung vor automatischer Bildschirmabschaltung anpassen"
+ "Automatische Helligkeit""Einstellungen""SIM-Sperrung einrichten""SIM-Kartensperrung"
@@ -436,7 +464,8 @@
"Status""Status""Telefonnummer, Signal usw."
- "SD-Karte und Speicher"
+ "SD-Karte & Telefonspeicher"
+ "Einstellungen für SD-Karte & Telefonspeicher""SD-Karte entnehmen, verfügbaren Speicher anzeigen""Meine Telefonnummer""MIN"
@@ -480,6 +509,11 @@
"MMS-Port""MCC""MNC"
+ "Authentifizierungstyp"
+ "Keine"
+ "PAP"
+ "CHAP"
+ "PAP oder CHAP""APN-Typ""APN löschen""Neuer APN"
@@ -518,12 +552,15 @@
"Wireless nutzen""Standort über Wireless-Netzwerke anzeigen (z.B. in Google Maps)""Standort bestimmt von WLAN und/oder mobilen Netzwerken"
- "GPS-Satelliten aktivieren"
- "Auf Straßenebene lokalisieren (deaktivieren, um Akku zu sparen)"
+ "GPS-Satelliten verwenden"
+ "Auf Straßenebene lokalisieren (deaktivieren, um Akku zu sparen)""Auf Straßenebene lokalisieren (höherer Akkuverbrauch, im Freien)"
- "Für Google freigeben"
- "Google erlauben, den Standort für verbesserte Suchergebnisse und andere Dienste zu verwenden"
- "Google erlauben, den Standort für verbesserte Suchergebnisse und andere Dienste zu verwenden"
+ "Unterstütztes GPS verwenden"
+ "Server zur Unterstützung von GPS verwenden (zur Verringerung der Netzwerkauslastung nicht auswählen)"
+ "Server zur Unterstützung von GPS verwenden (zur Verbesserung der GPS-Leistung deaktivieren)"
+ "Mein Standort verwenden"
+ "Meinen Standort für Google-Suchergebnisse und andere Google-Services verwenden"
+ "Soll Google bessere Suchergebnisse und weitere Dienste anhand Ihres Standorts anbieten?""Zustimmen""Ablehnen""Telefoninfo"
@@ -538,6 +575,10 @@
"Open Source-Lizenzen""Beim Laden der Lizenzen ist ein Problem aufgetreten.""Wird geladen..."
+ "Sicherheitsinformationen"
+ "Sicherheitsinformationen"
+ "Ihr Telefon ist mit keinem Datendienst verbunden. Um diese Informationen jetzt anzuzeigen, rufen Sie %s von einem beliebigen, mit dem Internet verbundenen Computer auf."
+ "Ladevorgang läuft...""Display-Entsperrungsmuster""Entsperrungsmuster ändern""Gespeichertes Muster bestätigen"
@@ -566,9 +607,9 @@
"Abbrechen""Weiter""Sichern Ihres Telefons"
- "Schützen Sie Ihr Telefon vor unerlaubter Verwendung, indem Sie ein persönliches Entsperrungsmuster erstellen. "\n\n"1"" Auf dem nächsten Bildschirm sehen Sie, wie ein Beispielmuster gezeichnet wird. "\n\n"2"" Anschließend können Sie Ihr eigenes Entsperrungsmuster aufzeichnen. Sie können verschiedene Muster ausprobieren, müssen jedoch immer mindestens vier Punkte miteinander verbinden. "\n\n"3"" Zeichnen Sie Ihr Muster zur Bestätigung erneut. "\n\n"Bereit? Wählen Sie “Weiter”"". "\n\n"Wählen Sie “Abbrechen”, wenn Sie Ihr Telefon nicht schützen möchten."
+ "Schützen Sie Ihr Telefon vor unerlaubter Verwendung, indem Sie ein persönliches Entsperrungsmuster erstellen. "\n\n"1"" Auf dem nächsten Bildschirm sehen Sie, wie ein Beispielmuster gezeichnet wird. "\n\n"2"" Anschließend können Sie Ihr eigenes Entsperrungsmuster zeichnen. Sie können verschiedene Muster ausprobieren, müssen jedoch immer mindestens vier Punkte miteinander verbinden. "\n\n"3"" Zeichnen Sie Ihr Muster zur Bestätigung erneut. "\n\n"Bereit? Wählen Sie “Weiter”"". "\n\n"Wählen Sie “Abbrechen”, wenn Sie Ihr Telefon nicht schützen möchten.""Beispielmuster"
- "Verbinden Sie mindestens vier Punkte."\n" "\n"Wählen Sie \"Weiter\", um ein eigenes Muster aufzuzeichnen."
+ "Verbinden Sie mindestens vier Punkte."\n" "\n"Wählen Sie “Weiter”, um ein eigenes Schema zu zeichnen.""Anwendungen verwalten""Installierte Anwendungen verwalten und entfernen""Anwendungen"
@@ -602,12 +643,12 @@
"Filter""Filteroptionen auswählen""Alle"
- "Drittanbieter"
+ "Heruntergeladen""Wird ausgeführt""Wird geladen...""Größe wird neu berechnet...""Löschen"
- "Alle in dieser Anwendung gespeicherten Informationen werden endgültig gelöscht."
+ "All diese Anwendungsdaten werden dauerhaft gelöscht. Dazu zählen alle Dateien, Einstellungen, Konten, Datenbanken und so weiter.""OK""Abbrechen""Anwendung nicht gefunden"
@@ -620,9 +661,23 @@
"Diese Anwendung kann auf die folgenden Funktionen Ihres Telefons zugreifen:""Berechnung...""Paketgröße kann nicht berechnet werden"
- "Sie haben keine Anwendungen von Drittanbietern installiert."
+ "Sie haben keine Anwendungen von Drittanbietern installiert.""Version %1$s"
- "Gebietsschema und Text"
+ "Ausgeführte Dienste"
+ "Derzeit ausgeführte Dienste anzeigen und steuern"
+ "Neustart wird durchgeführt."
+ "Es werden keine Dienste ausgeführt."
+ "Dienst anhalten?"
+ "Der Service wird erst wieder bei einem Neustart ausgeführt. Dies kann unerwünschte Auswirkungen auf die Anwendung %1$s haben."
+ "Anhalten"
+ "Abbrechen"
+ "Von der Anwendung gestartet: Zum Beenden berühren"
+ "%1$s: Zum Verwalten berühren"
+ "Verfügbar: %2$s+%3$s in %1$d"
+ "Sonstige: %2$s in %1$d"
+ "Prozess: %1$s"
+ "Sprache und Tastatur"
+ "Einstellungen für Sprache & Tastatur""Optionen für Sprache und Region, Texteingabe und Autokorrektur festlegen""Ländereinstellung""Texteinstellungen"
@@ -637,7 +692,7 @@
"Leertaste zweimal drücken, um \".\" hinzuzufügen""Sichtbare Passwörter""Passwort bei der Eingabe anzeigen"
- "Diese Eingabemethode kann den gesamten von Ihnen eingegebenen Text erfassen, einschließlich persönlicher Daten wie Passwörter und Kreditkartennummern. Sie ist Teil der Anwendung %1$s. Soll diese Eingabemethode aktiviert werden?"
+ "Diese Eingabemethode kann den gesamten von Ihnen eingegebenen Text erfassen, einschließlich persönlicher Daten wie Passwörter und Kreditkartennummern. Sie ist Teil der Anwendung %1$s. Möchten diese Eingabemethode verwenden?""Wörterbuch des Nutzers""Wörterbuch des Nutzers""Hinzufügen & Entfernen von Wörtern im Wörterbuch des Nutzers"
@@ -665,7 +720,7 @@
"Texteingabe""Optionen für Texteingabe verwalten""%1$s-Einstellungen"
- "Einstellungen für Bildschirmtastatur"
+ "Einstellungen der Bildschirmtastatur""Tastatur des Geräts""Einstellungen für eingebaute Tastatur""Entwicklung"
@@ -676,11 +731,11 @@
"Display wird beim Laden nie in den Ruhezustand versetzt""Falsche Standorte""Falsche Standorte zulassen"
- "USB-Debugging aktivieren?"
+ "USB-Debugging zulassen?""USB-Debugging ist nur für Entwicklungszwecke vorgesehen. Damit können Sie Daten zwischen Ihrem Computer und Ihrem Gerät kopieren, Anwendungen auf Ihrem Gerät ohne Benachrichtigung installieren und Protokolldaten lesen.""Gadget auswählen""Widget auswählen"
- "Details für UID %d"
+ "Details für UID %d""UID %1$d""Netzwerk-Nutzungsdetails für %1$s:""Empfangene Bytes: %1$d"
@@ -716,12 +771,13 @@
"Anwendung""Anzahl""Nutzungszeit"
- "Eingabehilfe"
+ "Eingabehilfen"
+ "Einstellungen für Eingabehilfe""Optionen für Eingabehilfe verwalten""Eingabehilfen""Eingabehilfendienste""Keine Eingabehilfen installiert"
- "Diese Eingabehilfe kann den gesamten von Ihnen eingegebenen Text erfassen, einschließlich persönlicher Daten wie Kreditkartennummern, jedoch keine Passwörter. Sie kann auch Ihre Interaktionen auf der Benutzeroberfläche protokollieren. Sie ist Teil der Anwendung %1$s. Soll diese Eingabehilfe aktiviert werden?"
+ "Diese Eingabehilfe kann den gesamten von Ihnen eingegebenen Text erfassen, einschließlich persönlicher Daten wie Kreditkartennummern, jedoch keine Passwörter. Sie kann auch Ihre Interaktionen auf der Benutzeroberfläche protokollieren. Sie ist Teil der Anwendung %1$s. Soll diese Eingabehilfe aktiviert werden?""Eingabehilfe deaktivieren?""Akkuverbrauch""Akkuverbraucher"
@@ -733,7 +789,7 @@
"Aktivzeit des Geräts""WLAN-Aktivzeit""WLAN-Aktivzeit"
- "%1$s - %2$s %%"
+ "%1$s - %2$s%%""Akkuverbrauch - Details""Details verwenden""Energieverbrauch anpassen"
@@ -769,7 +825,7 @@
"Akkuverbrauch durch WLAN""WLAN bei Nichtverwendung oder Nichtverfügbarkeit deaktivieren""Akkuverbrauch durch Bluetooth"
- "Bluetooth bei Nichtverwendung deaktivieren"
+ "Bluetooth bei Nichtverwendung deaktivieren""Mit einem anderen Bluetooth-Gerät verbinden""Akkuverbrauch bei ausgeführten Anwendungen""Anwendung beenden oder deinstallieren"
@@ -781,9 +837,9 @@
"Aktualisieren""Android OS""Mediaserver"
- "Sprachsynthese"
+ "Text-in-Sprache""Text-in-Sprache einrichten"
- "Sprachsynthese-Steuerung"
+ "Text-in-Sprache-Einstellungen""Immer meine Einst. verwenden""Standardeinstellungen überschreiben Anwendungseinstellungen""Standardeinstellungen"
@@ -801,8 +857,11 @@
"Dies ist ein Beispiel für Sprachsynthese.""Ihre Einstellungen wurden geändert. Dies ist ein Klangbeispiel.""Energiesteuerung"
+ "Aktualisieren der WLAN-Einstellung"
+ "Aktualisieren der Bluetooth-Einstellung"
+ "Installation der Zugangsdaten""VPN-Einstellungen"
- "Mit %s verbinden"
+ "Mit %s verbinden""Nutzername:""Passwort:""ein Nutzername"
@@ -820,9 +879,9 @@
"Netzwerkverbindung trennen""Netzwerk bearbeiten""Netzwerk löschen"
- "Geben Sie %s ein."
- "Wählen Sie %s aus."
- "Der VPN-Name \"%s\" ist bereits vorhanden. Wählen Sie einen anderen Namen."
+ "Geben Sie %s ein."
+ "Wählen Sie %s aus."
+ "Der VPN-Name \"%s\" ist bereits vorhanden. Wählen Sie einen anderen Namen.""Möchten Sie dieses VPN wirklich nicht löschen?""Möchten Sie dieses Profil wirklich nicht erstellen?""Möchten Sie die Änderungen an diesem Profil wirklich verwerfen?"
@@ -833,10 +892,12 @@
"Eine oder mehrere geheime Informationen scheinen in dieser VPN-Konfiguration zu fehlen. Möchten Sie Ihre geheimen Einstellungen prüfen?""Der eingegebene Nutzername oder das Passwort ist falsch. Möchten Sie es erneut versuchen?""Der Server hat ein Problem. Möglicherweise sind der von Ihnen eingegebene Nutzername und das Passwort falsch. Möchten Sie es erneut versuchen?"
+ "Der Server reagiert nicht. Möglicherweise befinden Sie sich hinter einer Firewall, die eine Verbindung mit dem Server verhindert. Möchten Sie es erneut versuchen?"
+ "Bei der Serververhandlung ist ein Fehler aufgetreten. Der Server stimmt möglicherweise nicht mit Ihrer Verschlüsselungsoption überein. Möchten Sie die Einstellungen Ihrer Verschlüsselung überprüfen?""VPN hinzufügen""VPN hinzufügen"
- "VPN \"%s\" hinzufügen"
- "Details zu %s"
+ "%s-VPN hinzufügen"
+ "Details zu %s""VPNs""Verbindung wird hergestellt...""Verbindung wird getrennt..."
@@ -844,8 +905,8 @@
"Mit Netzwerk verbinden""VPN-Name""ein VPN-Name"
- "%s wurde hinzugefügt."
- "Änderungen werden an %s vorgenommen."
+ "\"%s\" wurde hinzugefügt."
+ "Änderungen wurden an \"%s\" vorgenommen.""Nutzerzertifikat festlegen""Nutzerzertifikat""ein Nutzerzertifikat"
@@ -866,53 +927,53 @@
"VPN-Servername""DNS-Suchdomains""DNS-Suchdomains"
- "%s ist festgelegt"
- "%s nicht festgelegt"
- "%s nicht festgelegt (optional)"
- "%s aktivieren"
- "%s deaktivieren"
- "%s ist aktiviert."
- "%s ist deaktiviert."
+ "%s ist festgelegt."
+ "%s nicht festgelegt"
+ "%s nicht festgelegt (optional)"
+ "%s aktivieren"
+ "%s deaktivieren"
+ "%s ist aktiviert."
+ "%s ist deaktiviert.""VPN-Einstellungen""Virtual Private Networks (VPNs) einrichten und verwalten""(nicht geändert)""(nicht festgelegt)"
- "Anmeldeinformationsspeicher"
- "Sichere Anmeldeinf. verwenden"
- "Anwendungen den Zugriff auf sichere Zertifikate und andere Anmeldeinformationen ermöglichen"
- "Passwort eingeben"
- "Geben Sie das Passwort für den Anmeldeinformationsspeicher ein."
- "Passwort festlegen"
- "Passwort für Anmeldeinformationsspeicher festlegen oder ändern"
- "Passwort festlegen"
- "Speicherinhalt löschen"
- "Inhalt des Anmeldeinformationsspeichers löschen und Passwort zurücksetzen"
- "Möchten Sie wirklich alle Anmeldeinformationen löschen und das Passwort für den Anmeldeinformationsspeicher zurücksetzen?"
- "Zertifikat benennen"
- "Zertifikatname:"
- "Passwort zum Extrahieren des Zertifikats:"
- "Zertifikatdetails:"
- "Der Name darf nur Buchstaben und Zahlen enthalten."
- "Aktuelles Passwort:"
- "Neues Passwort:"
- "Neues Passwort bestätigen:"
- "Legen Sie ein Passwort für den Anmeldeinformationsspeicher fest."
- "Legen Sie ein Passwort für den Anmeldeinformationsspeicher fest."
- "Geben Sie das richtige Passwort ein."
- "Geben Sie das richtige Passwort ein. Sie haben noch einen Versuch, das richtige Passwort einzugeben. Anschließend wird der Anmeldeinformationsspeicher gelöscht."
- "Geben Sie das richtige Passwort ein. Sie haben noch %d weitere Versuche, das richtige Passwort einzugeben. Anschließend wird der Anmeldeinformationsspeicher gelöscht."
- "Die Passwörter stimmen nicht überein."
- "Sie müssen ein Passwort eingeben und bestätigen."
- "Geben Sie das Passwort ein."
- "Geben Sie das Passwort erneut ein. Das Passwort muss mindestens acht Zeichen lang sein und darf keine Leerzeichen enthalten."
- "Geben Sie einen Namen ein."
- "Geben Sie einen Namen ein, der ausschließlich aus Buchstaben und Zahlen besteht."
- "Das Zertifikat kann nicht gespeichert werden. Klicken Sie auf \"OK\", um es erneut zu versuchen."
- "Das Zertifikat kann nicht gespeichert werden. Der Speicher für die Anmeldeinformationen ist nicht aktiviert oder falsch initialisiert."
- "Das Zertifikat wurde nicht gespeichert."
- "Der Speicher für die Anmeldeinformationen wurde gelöscht."
- "Der Anmeldeinformationsspeicher ist aktiviert."
- "%s wurde hinzugefügt."
+ "Anmeldeinformationsspeicher"
+ "Sichere Anmeldeinformationen verwenden"
+ "Anwendungen den Zugriff auf sichere Zertifikate und andere Anmeldeinformationen ermöglichen"
+ "Passwort eingeben"
+ "Geben Sie das Passwort für den Anmeldeinformationsspeicher ein."
+ "Von SD-Karte installieren"
+ "Verschlüsselte Zertifikate von SD-Karte installieren"
+ "Passwort festlegen"
+ "Passwort für Anmeldeinformationsspeicher festlegen oder ändern"
+ "Speicherinhalt löschen"
+ "Inhalt des Anmeldeinformationsspeichers löschen und Passwort zurücksetzen"
+ "Möchten Sie wirklich alle Anmeldeinformationen löschen und das Passwort für den Anmeldeinformationsspeicher zurücksetzen?"
+ "Aktuelles Passwort:"
+ "Neues Passwort:"
+ "Neues Passwort bestätigen:"
+ "Legen Sie ein mindestens acht Zeichen langes Passwort für den Anmeldeinformationsspeicher fest."
+ "Geben Sie das richtige Passwort ein."
+ "Geben Sie das richtige Passwort ein. Sie haben noch einen Versuch, das richtige Passwort einzugeben. Anschließend wird der Anmeldeinformationsspeicher gelöscht."
+ "Geben Sie das richtige Passwort ein. Sie haben noch %1$d Versuche, das richtige Passwort einzugeben. Anschließend wird der Anmeldeinformationsspeicher gelöscht."
+ "Die Passwörter stimmen nicht überein."
+ "Sie müssen ein Passwort eingeben und bestätigen."
+ "Geben Sie das Passwort ein."
+ "Das Passwort muss mindestens acht Zeichen lang sein."
+ "Der Speicher für die Anmeldeinformationen wurde gelöscht."
+ "Der Anmeldeinformationsspeicher ist aktiviert."
+ "Der Anmeldeinformationsspeicher ist deaktiviert.""Notfallsignal""Verhalten bei einem Notruf festlegen"
+ "Datenschutz"
+ "Datenschutzeinstellungen"
+ "Standort"
+ "Einstellungen"
+ "Persönliche Daten"
+ "Meine Einstellungen sichern"
+ "Sicherung der Einstellungen"
+ "Möchten Sie wirklich die Sicherung Ihrer Einstellungen beenden und alle Kopien auf den Google-Servern löschen?"
+
+
diff --git a/res/values-el/arrays.xml b/res/values-el/arrays.xml
index 911386f4f37..6ae357bd0c6 100644
--- a/res/values-el/arrays.xml
+++ b/res/values-el/arrays.xml
@@ -24,38 +24,52 @@
"Ειρηνικός""Όλα"
-
- "15 δευτερόλεπτα"
- "30 δευτερόλεπτα"
- "1 λεπτό"
- "2 λεπτά"
- "10 λεπτά"
- "Να μην λήγει ποτέ ο χρόνος σύνδεσης"
+
+ "Χωρίς κινούμενες εικόνες"
+ "Ορισμένες κινούμενες εικόνες"
+ "Όλες οι κινούμενες εικόνες"
+
+
+ "Δεν εμφανίζονται εφέ κίνησης παραθύρων"
+ "Εμφάνιση ορισμένων εφέ κίνησης παραθύρων"
+ "Εμφανίζονται όλα τα εφέ κίνησης παραθύρων"
+
+
+
+ "Πολύ αργός"
+ "Αργός"
+ "Κανονική"
+ "Γρήγορη"
+ "Πολύ γρήγορος"
+
+
+ "Πολύ χαμηλός"
+ "Χαμηλή"
+ "Κανονική"
+ "Υψηλή"
+ "Πολύ υψηλός"
+
+
+ "Αγγλικά Αμερικής"
+ "Αγγλικά Βρετανίας"
+ "Γαλλικά"
+ "Γερμανικά"
+ "Ιταλικά"
+ "Ισπανικά"
+
+
+ "Αυτόματο"
+ "Κανένα"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Εταιρικό"
+
+
+ "Κανένα"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Εταιρικό"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Αυτόματο""WEP ASCII"
@@ -84,15 +98,25 @@
"Εκκίνηση καταμέτρησης""Όνομα εφαρμογής"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Κανένα"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Απενεργοποιημένο"
+ "Προειδοποίηση"
+ "Δόνηση"
+
+
+
+
+
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 2326c5450bf..e95d7b6d9c4 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ναι"
+ "Όχι""Άγνωστο""Ενεργοποίηση πομπού""Απενεργοποίηση πομπού"
@@ -45,7 +47,7 @@
"pkts""bytes""dBm"
- "asu"
+ "αρχ.""LAC""CID""Αφαίρεση κάρτας SD"
@@ -56,6 +58,7 @@
"OK""Κάρτα SD""Κατάσταση μπαταρίας:"
+ "Τροφοδοσία ρεύματος:""Κλίμακα μπαταρίας:""Επίπεδο μπαταρίας:""Κατάσταση μπαταρίας:"
@@ -75,6 +78,11 @@
"Αποφόρτιση""Δεν φορτίζει""Πλήρης"
+ "Αποσυνδέθηκε"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Άγνωστος""Άγνωστο""Καλό""Υπερθέρμανση"
@@ -104,14 +112,19 @@
"Αίτημα σύζευξης Bluetooth""Αίτημα σύζευξης""Επιλογή για σύζευξη με "
+ "Επιλογή συσκευής Bluetooth"
+ "Αίτημα άδειας Bluetooth"
+ "Μια εφαρμογή στο τηλέφωνό σας ζητά δικαίωμα ενεργοποίησης του Bluetooth. Θέλετε να το επιτρέψετε;"
+ "Μια εφαρμογή στο τηλέφωνό σας ζητά άδεια για καταστήσει τη συσκευή σας ορατή από άλλες συσκευές Bluetooth για %1$d δευτερόλεπτα. Θέλετε να τη χορηγήσετε;"
+ "Μια εφαρμογή στο τηλέφωνό σας ζητά άδεια να ενεργοποιήσει το Bluetooth και να καταστήσει τη συσκευή σας ορατή από άλλες συσκευές για %1$d δευτερόλεπτα. Θέλετε να τη χορηγήσετε;"
+ "Ενεργοποίηση Bluetooth…""Ρυθμίσεις ημερομηνίας & ώρας""1:00 μμ""13:00""Αλλαγή ώρας""Ημερομηνία""Επιλογή ζώνης ώρας"
-
-
+ "Κανονική (%s)""Προεπισκόπηση:""Μέγεθος γραμματοσειράς:"
@@ -192,33 +205,23 @@
"Ρυθμίσεις διακομιστή μεσολάβησης""Ακύρωση""Ρυθμίσεις"
-
-
+ "Ρυθμίσεις""Λειτουργία πτήσης""Απενεργοποίηση όλων των ασύρματων συνδέσεων""Απενεργοποίηση ασύρματων συνδέσεων...""Ενεργοποίηση ασύρματων συνδέσεων..."
- "Στοιχεία ελέγχου ασύρματου"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Ασύρματο και δίκτυα"
+ "Ρυθμίσεις ασύρματου & δικτύου"
+ "Διαχείριση Wi-Fi, Bluetooth, λειτουργίας πτήσης, δικτύων κινητής τηλεφωνίας και VPN"
+ "Περιαγωγή δεδομένων"
+ "Σύνδεση στις υπηρεσίες δεδομένων κατά την περιαγωγή"
+ "Σύνδεση στις υπηρεσίες δεδομένων κατά την περιαγωγή"
+ "Χάσατε τη σύνδεση δεδομένων επειδή φύγατε από το οικείο δίκτυο έχοντας την περιαγωγή δεδομένων απενεργοποιημένη."
+ "Ενεργοποίηση"
+ "Να επιτρέπεται η περιαγωγή δεδομένων; Ενδέχεται να επιβαρυνθείτε με σημαντικά έξοδα περιαγωγής!"
+ "Προσοχή"
+ "Επιλογή παρόχου"
+ "Επιλέξτε εταιρεία δικτύου""Ημερομηνία & ώρα""Ορισμός ημερομηνίας, ώρας, ζώνης ώρας & μορφές""Αυτόματο"
@@ -231,25 +234,31 @@
"Επιλογή μορφής ημερομηνίας""Ταξινόμηση με βάση αλφαβητική σειρά""Ταξινόμηση με βάση ζώνη ώρας"
- "Ασφάλεια & τοποθεσία"
-
-
+ "Τοποθεσία και ασφάλεια"
+ "Ρυθμίσεις τοποθεσίας και ασφάλειας"
+ "Ορισμός του \"Η τοποθεσία μου\", ξεκλειδώματος οθόνης, κλειδώματος κάρτας SIM, κλειδώματος αποθηκευτικού χώρου διαπιστευτηρίων"
+ "Ορισμός του \"Η τοποθεσία μου\", του ξεκλειδώματος οθόνης και του κλειδώματος αποθηκευτικού χώρου διαπιστευτηρίων""Κωδικοί πρόσβασης""Bluetooth""Ενεργοποίηση Bluetooth""Ρυθμίσεις Bluetooth""Ρυθμίσεις Bluetooth""Διαχείριση συνδέσεων, ορισμός ονόματος συσκευής & ανιχνευσιμότητα"
- "Αίτημα σύζευξης Bluetooth"
+ "Αίτημα σύζευξης Bluetooth""Πληροφορίες συσκευής Bluetooth"
- "%1$s"\n\n"Πληκτρολογήστε τον αριθμό PIN για σύζευξη."\n"(Δοκιμάστε 0000 ή 1234)."
+ \n"Πληκτρολογήστε τον αριθμό PIN για σύζευξη με \"%1$s\". (Δοκιμάστε 0000 ή 1234.)"
+ \n"Πληκτρολογήστε κλειδί πρόσβασης για ζεύξη με \"%1$s\"."
+ "Για ζεύξη με τη συσκευή \"%1$s\", βεβαιωθείτε ότι προβάλλεται το κλειδί πρόσβασης: %2$s."
+ "%1$s"\n"επιθυμεί σύζευξη."
+ "Εισαγάγετε %2$s στο \"%1$s\" για ζεύξη."
+ "Ζεύγος"
+ "Χωρίς ζεύξη"
+ "συσκευή bluetooth""Προσοχή""Παρουσιάστηκε ένα πρόβλημα κατά τη σύζευξη με %1$s."
- "Παρουσιάστηκε ένα πρόβλημα κατά τη σύζευξη με το %1$s επειδή ο αριθμός PIN που πληκτρολογήσατε είναι εσφαλμένος."
-
-
-
-
+ "Παρουσιάστηκε ένα πρόβλημα κατά τη ζεύξη με το %1$s επειδή ο αριθμός PIN ή το κλειδί πρόσβασης είναι εσφαλμένο."
+ "Δεν είναι δυνατή η δημιουργία σύνδεσης με τη συσκευή %1$s."
+ "Η ζεύξη απορρίφθηκε από τη συσκευή %1$s.""Παρουσιάστηκε ένα πρόβλημα κατά τη σύνδεση σε %1$s.""Ανίχνευση για συσκευές""Σύνδεση"
@@ -261,6 +270,7 @@
"Σύνδεση σε...""Πολυμέσα""Τηλέφωνο"
+ "Μεταφορά""Συνδέθηκε σε ήχο πολυμέσων""Συνδεδεμένο στον ήχο τηλεφώνου""Σύνδεση στο τηλέφωνο και στον ήχο πολυμέσων"
@@ -270,8 +280,11 @@
"Προφίλ""Συνδέθηκε σε ήχο πολυμέσων""Συνδεδεμένο στον ήχο τηλεφώνου"
+ "Συνδεδεμένο σε διακομιστή μεταφοράς αρχείων"
+ "Δεν έχει συνδεθεί σε διακομιστή μεταφοράς αρχείων""Χρήση για ήχο πολυμέσων""Χρήση για ήχο τηλεφώνου"
+ "Χρήση για τη μεταφορά αρχείων""Wi-Fi""Wi-Fi""Ενεργοποίηση Wi-Fi"
@@ -288,25 +301,13 @@
"Ασφάλεια""Άνοιγμα""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Εταιρία(802.1x)""Άγνωστο"
-
-
-
-
-
-
-
-
-
-
-
-
+ "ανοικτό δίκτυο"
+ "ασφαλισμένο με WEP"
+ "ασφαλισμένο με WPA/WPA2 PSK"
+ "ασφαλισμένο με 802.1x EAP""Διεύθυνση IP""Ισχύς σήματος""Ενεργοποίηση..."
@@ -319,28 +320,19 @@
"Δεν είναι δυνατή η αποθήκευση του δικτύου""Σύνδεση""Σύνδεση σε %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Μέθοδος EAP"
+ "2η φάση ελέγχου ταυτότητας"
+ "Ταυτότητα"
+ "Ανώνυμη ταυτότητα"
+ "Πιστοποιητικό πελάτη"
+ "Πιστοποιητικό CA""Κωδικός πρόσβασης ασύρματου""Δεκαεξαδικό κλειδί WEP (0-9, A-F)""Εμφάνιση κωδικού πρόσβασης.""Σάρωση""Εκτός εμβέλειας"
-
-
- "Η σύνδεση δεν ήταν επιτυχής, επιλέξτε για να προσπαθήσετε ξανά"
+ "διατηρήθηκε"
+ "Η σύνδεση δεν ήταν επιτυχής, αγγίξτε για να προσπαθήσετε ξανά""Δίκτυα Wi-Fi""Δίκτυο SSID""Ασφάλεια"
@@ -391,6 +383,7 @@
"Αποσυνδέθηκε""Ανεπιτυχής""Ήχος και εικόνα"
+ "Ρυθμίσεις ήχου & προβολής""Ρυθμίσεις ήχου""Ρύθμιση ήχων κλήσης, ειδοποιήσεων, φωτεινότητας οθόνης""Λειτουργία σίγασης"
@@ -410,23 +403,22 @@
"Επιλογή ήχου κλήσης ειδοποίησης""Ένταση ήχου πολυμέσων""Ορισμός έντασης ήχου για μουσική και βίντεο"
- "Ήχοι ηχητικής αφής"
+ "Ήχοι αγγίγματος οθόνης""Αναπαραγωγή ήχων κατά τη χρήση του πληκτρολογίου κλήσης""Αναπαραγωγή ήχων κατά τη χρήση του πληκτρολογίου κλήσης""Ηχητική επιλογή""Αναπαραγωγή ήχου κατά την πραγματοποίηση επιλογής στην οθόνη""Αναπαραγωγή ήχου κατά την πραγματοποίηση επιλογής στην οθόνη"
+ "Απτικά σχόλια"
+ "Δόνηση κατά το πάτημα μαλακών πλήκτρων και σε συγκεκριμένες αλληλεπιδράσεις της επιφάνειας UI"
+ "Δόνηση κατά το πάτημα μαλακών πλήκτρων και σε συγκεκριμένες αλληλεπιδράσεις της επιφάνειας UI""Ειδοποιήσεις κάρτας SD"
-
-
-
-
- "Συγχρονισμός δεδομένων"
- "Επιλογή εφαρμογών που θέλετε να συγχρονιστούν"
-
-
-
-
+ "Αναπαραγωγή ήχου για τις προειδοποιήσεις κάρτας SD"
+ "Αναπαραγωγή ήχου για τις προειδοποιήσεις κάρτας SD"
+ "Λογαριασμοί & συγχρονισμός"
+ "Προσθήκη ή κατάργηση λογαριασμών και αλλαγή ρυθμίσεων λογαριασμού"
+ "Αναζήτηση"
+ "Διαχείριση ρυθμίσεων αναζήτησης και ιστορικού""Ρυθμίσεις προβολής""Κίνηση""Προβολή κινούμενης εικόνας κατά το άνοιγμα & κλείσιμο παραθύρων"
@@ -438,6 +430,7 @@
"Ρύθμιση της φωτεινότητας της οθόνης""Λήξη ορίου χρόνου οθόνης""Προσαρμόστε το χρόνο που πρέπει να παρέλθει πριν από την αυτόματη απενεργοποίηση της οθόνης."
+ "Αυτόματη φωτεινότητα""Ρυθμίσεις κλειδώματος κάρτας SIM""Ορισμός κλειδώματος κάρτας SIM""Κλείδωμα κάρτας SIM"
@@ -470,18 +463,14 @@
"Δεν είναι διαθέσιμο""Κατάσταση""Κατάσταση"
-
-
- "Κάρτα SD & αποθηκευτικός χώρος τηλεφώνου"
+ "Τηλεφωνικός αριθμός, σήμα κ.λπ."
+ "Κάρτα SD & αποθηκευτικός χώρος τηλεφώνου"
+ "Ρυθμίσεις κάρτας SD & αποθηκευτικού χώρου τηλεφώνου""Αφαίρεση κάρτας SD, προβολή διαθέσιμου αποθηκευτικού χώρου"
-
-
-
-
-
-
-
-
+ "Ο τηλεφωνικός αριθμός μου"
+ "ΛΕΠΤΟ"
+ "Έκδοση PRL"
+ "MEID""Τύπος δικτύου κινητής τηλεφωνίας""Κατάστ.δικτ.κιν.τηλ.""Κατάσταση υπηρεσίας"
@@ -520,6 +509,11 @@
"Θύρα MMS""MCC""MNC"
+ "Τύπος ελέγχου ταυτότητας"
+ "Κανένας"
+ "PAP"
+ "CHAP"
+ "PAP ή CHAP""Τύπος APN""Διαγραφή APN""Νέο APN"
@@ -535,11 +529,9 @@
"Η επαναφορά των εργοστασιακών ρυθμίσεων APN ολοκληρώθηκε""Επαναφορά εργοστασιακών δεδομένων""Διαγραφή όλων των δεδομένων στο τηλέφωνο"
-
-
+ "Αυτή η ενέργεια θα διαγράψει όλα τα δεδομένα από το τηλέφωνό σας, συμπεριλαμβανομένων:"\n
"του Λογαριασμού Google"
\n
"των δεδομένων και εφαρμογών συστήματος και εφαρμογών"
\n
"των εφαρμογών από λήψη"
\n"Δεν θα διαγράψει:"\n
"το τρέχον λογισμικό και τις ομαδοποιημένες εφαρμογές συστήματος"
\n
"τα αρχεία κάρτας SD, όπως μουσική ή φωτογραφίες"
"Επαναφορά τηλεφώνου"
-
-
+ "Να πραγματοποιηθεί διαγραφή όλων των προσωπικών στοιχείων και τυχόν εφαρμογών από λήψη; Αυτή η ενέργεια δεν είναι αναστρέψιμη!""Διαγραφή όλων""Σχεδιάστε το μοτίβο ξεκλειδώματος""Πρέπει να σχεδιάσετε το μοτίβο ξεκλειδώματος για επιβεβαίωση επαναφοράς τηλεφώνου."
@@ -556,20 +548,19 @@
"Ορισμ.αυτόμ.τηλεφ., προώθ.κλήσης, αναμ.κλήσης, αναγν.κλήσ.""Δίκτυα κινητής τηλεφωνίας""Ορισμός επιλογών για περιαγωγή, δίκτυα, APN"
-
-
+ "Η τοποθεσία μου""Χρήση ασύρματων δικτύων""Προβ.τοποθ.σε εφαρμ.(όπως π.χ. στους Χάρτες) με χρήση ασύρ.δικτ.""Η τοποθ.προσδ.από δίκτ.Wi-Fi και/ή δίκτ.κινητ.τηλεφ."
- "Ενεργοποίηση δορυφόρων GPS"
- "Κατά την εύρ.τοποθ., η ακρίβ.είναι σε επίπ.δρόμ.(αποεπιλ.το για εξοικ.μπατ.)"
+ "Χρήση δορυφόρων GPS"
+ "Κατά την εύρεση τοποθεσίας, η ακρίβεια είναι σε επίπεδο δρόμου (αποεπιλογή για εξοικονόμηση μπαταρίας)""Εντοπ.σε επίπ.δρόμου (απαιτ.μεγ.καταν.μπαταρ.και μετάβ.σε ανοικτό χώρο)"
-
-
-
-
-
-
+ "Χρήση υποβοηθούμενου GPS"
+ "Χρήση διακομιστή για βοήθεια GPS (αποεπιλογή για να μειώσετε τη χρήση του δικτύου)"
+ "Χρήση διακομιστή για βοήθεια του GPS (αποεπιλογή για βελτίωση της απόδοσης του GPS)"
+ "Χρήση της τοποθεσίας μου"
+ "Χρήση της Τοποθεσίας μου για τα αποτελέσματα αναζήτησης Google και τις υπόλοιπες υπηρεσίες Google"
+ "Θέλετε να επιτρέψετε στο Google να χρησιμοποιήσει πληροφορίες τοποθεσίας για καλύτερα αποτελέσματα αναζήτησης και άλλες υπηρεσίες;""Συμφωνώ""Διαφωνώ""Σχετικά με το τηλέφωνο"
@@ -579,12 +570,15 @@
"Πνευματικά δικαιώματα""Άδεια""Όροι και προϋποθέσεις"
-
-
+ "Εκπαιδευτικό κείμενο συστήματος""Μάθετε πώς να χρησιμοποιείτε το τηλέφωνό σας""Άδειες λογισμ.ανοικτ.κώδ.""Παρουσιάστηκε ένα πρόβλημα κατά τη φόρτωση των αδειών.""Φόρτωση..."
+ "Πληροφορίες ασφάλειας"
+ "Πληροφορίες ασφάλειας"
+ "Το τηλέφωνό σας δεν είναι συνδεδεμένο σε υπηρεσία δεδομένων. Για να προβάλετε αυτές τις πληροφορίες τώρα, μεταβείτε στο %s από οποιονδήποτε υπολογιστή με σύνδεση στο Διαδίκτυο."
+ "Φόρτωση...""Μοτίβο ξεκλειδώματος οθόνης""Αλλαγή μοτίβου ξεκλειδώματος""Επιβεβαίωση αποθηκευμένου μοτίβου"
@@ -613,9 +607,9 @@
"Ακύρωση""Επόμενο""Ασφάλιση του τηλεφώνου σας"
- "Προστατέψτε το τηλέφωνό σας από μη εξουσιοδοτημένη χρήση δημιουργώντας ένα προσωπικό μοτίβο ξεκλειδώματος οθόνης. "\n\n"1"" Στην επόμενη οθόνη παρακολουθήστε ένα παράδειγμα σχεδίασης μοτίβου. "\n\n"2"" Όταν είστε έτοιμοι, σχεδιάστε το προσωπικό σας μοτίβο ξεκλειδώματος. Πειραματιστείτε με διάφορα μοτίβα, αλλά συνδέστε τουλάχιστον τέσσερα σημεία. "\n\n"3"" Ξανασχεδιάστε το μοτίβο σας για επιβεβαίωση. "\n\n"Είστε έτοιμοι να ξεκινήσετε; Πατήστε \"Επόμενο\""". "\n\n"Εάν δεν θέλετε να προστατεύσετε το τηλέφωνό σας, επιλέξτε “Ακύρωση”."
+ "Προστατέψτε το τηλέφωνό σας από μη εξουσιοδοτημένη χρήση δημιουργώντας ένα προσωπικό μοτίβο ξεκλειδώματος οθόνης. "\n\n"1"" Στην επόμενη οθόνη παρακολουθήστε ένα παράδειγμα σχεδίασης μοτίβου. "\n\n"2"" Όταν είστε έτοιμοι, σχεδιάστε το προσωπικό σας μοτίβο ξεκλειδώματος. Πειραματιστείτε με διάφορα μοτίβα αλλά συνδέστε τουλάχιστον τέσσερα σημεία. "\n\n"3"" Ξανασχεδιάστε το μοτίβο σας για επιβεβαίωση. "\n\n"Είστε έτοιμοι να ξεκινήσετε; Πατήστε “Επόμενο”"". "\n\n"Εάν δεν θέλετε να προστατεύσετε το τηλέφωνό σας, επιλέξτε “Ακύρωση”.""Παράδειγμα μοτίβου"
- "Συνδέστε τουλάχιστον τέσσερις τελείες."\n" "\n"Επιλέξτε \"Επόμενο\" όταν είστε έτοιμοι να σχεδιάσετε το δικό σας μοτίβο."
+ "Συνδέστε τουλάχιστον τέσσερις τελείες."\n" "\n"Αγγίξτε την επιλογή “Επόμενο” όταν είστε έτοιμοι να σχεδιάσετε το δικό σας μοτίβο.""Διαχείριση εφαρμογών""Διαχείριση και κατάργηση εγκατεστημένων εφαρμογών""Εφαρμογές"
@@ -638,8 +632,7 @@
"Δεδομένα""Κατάργηση εγκατάστασης""Εκκαθάριση δεδομένων"
-
-
+ "Κατάργηση εγκατάστασης ενημερώσεων""Επιλέξατε την εκτέλεση αυτής της εφαρμογής από προεπιλογή για ορισμένες ενέργειες.""Δεν έχουν οριστεί προεπιλογές.""Εκκαθάριση προεπιλογών"
@@ -650,32 +643,41 @@
"Φίλτρο""Επιλογές φίλτρου""Όλα"
- "Τρίτο μέρος"
+ "Η λήψη ολοκληρώθηκε""Εκτελείται""Φόρτωση...""Εκ νέου υπολογισμός μεγέθους...""Διαγραφή"
- "Όλες οι πληροφορίες που αποθηκεύσατε σε αυτήν την εφαρμογή θα διαγραφούν οριστικά."
+ "Όλα τα δεδομένα της εφαρμογής θα διαγραφούν μόνιμα. Αυτό περιλαμβάνει όλα τα αρχεία, τις ρυθμίσεις, τους λογαριασμούς, τις βάσεις δεδομένων και τα λοιπά.""OK""Ακύρωση""Η εφαρμογή δεν βρέθηκε""Η εφαρμογή δεν βρέθηκε στη λίστα των εγκατεστημένων εφαρμογών.""Δεν είναι δυνατή η εκκαθάριση δεδομένων εφαρμογής."
-
-
-
-
-
-
-
-
+ "Κατάργηση εγκατάστασης ενημερώσεων"
+ "Θέλετε να απεγκαταστήσετε όλες τις ενημερώσεις σε αυτήν την εφαρμογή συστήματος Android;"
+ "Εκκαθάριση δεδομένων"
+ "Απέτυχε η εκκαθάριση δεδομένων για την εφαρμογή""Αυτή η εφαρμογή μπορεί να αποκτήσει πρόσβαση στα ακόλουθα στο τηλέφωνό σας:""Υπολογισμός...""Δεν είναι δυνατός ο υπολογισμός του μεγέθους του πακέτου"
- "Δεν έχετε εγκαταστήσει εφαρμογές τρίτων μερών."
-
-
- "Τοπικές ρυθμίσεις & κείμενο"
+ "Δεν έχετε εγκαταστήσει εφαρμογές τρίτων μερών."
+ "έκδοση %1$s"
+ "Υπηρεσίες που εκτελούνται"
+ "Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"
+ "Γίνεται επανεκκίνηση"
+ "Δεν εκτελούνται υπηρεσίες"
+ "Διακοπή υπηρεσίας;"
+ "Η υπηρεσία δεν θα εκτελείται έως ότου επανεκκινηθεί. Αυτό ενδέχεται να έχει μη επιθυμητά αποτελέσματα στην εφαρμογή %1$s."
+ "Διακοπή"
+ "Άκυρο"
+ "Έγινε εκκίνηση από εφαρμογή: άγγιγμα για παύση"
+ "%1$s: αγγίξτε για διαχείριση"
+ "Διαθ.: %2$s+%3$s στα %1$d"
+ "Άλλο: %2$s στα %1$d"
+ "Διεργασία: %1$s"
+ "Γλώσσα και πληκτρολόγιο"
+ "Ρυθμίσεις γλώσσας και πληκτρολογίου""Ορισμ.τοπ.ρυθμ.(γλώσσα και περιοχή), είσ.κειμ.και επιλ.αυτόμ.διόρθ.""Τοπικές ρυθμίσεις""Ρυθμίσεις κειμένου"
@@ -690,7 +692,7 @@
"Πατήστε το πλήκτρο Space δύο φορές για να εισαγάγετε \".\"""Εμφανιζόμενοι κωδικοί πρόσβασης""Εμφάνιση κωδικού πρόσβασης κατά την πληκτρολόγηση"
- "Η μέθοδος εισόδου ενδέχεται να έχει τη δυνατότητα συλλογής όλων των κειμένων που πληκτρολογείτε, συμπεριλαμβανομένων προσωπικών δεδομένων όπως κωδικοί πρόσβασης και αριθμοί πιστωτικής κάρτας. Προέρχεται από την εφαρμογή %1$s. Ενεργοποίηση αυτής της μεθόδου εισόδου;"
+ "Η μέθοδος εισόδου ενδέχεται να έχει τη δυνατότητα συλλογής όλων των κειμένων που πληκτρολογείτε, συμπεριλαμβανομένων προσωπικών δεδομένων όπως κωδικοί πρόσβασης και αριθμοί πιστωτικής κάρτας. Προέρχεται από την εφαρμογή %1$s. Να γίνει χρήση αυτής της μεθόδου εισόδου;""Λεξικό χρήστη""Λεξικό χρήστη""Προσθήκη & κατάργηση λέξεων από το λεξικό χρήστη"
@@ -718,7 +720,7 @@
"Είσοδος κειμένου""Διαχείριση επιλογών εισόδου κειμένου""%1$s ρυθμίσεις"
- "Ρυθμίσεις πληκτρολογίου οθόνης"
+ "Ρυθμίσεις πληκτρολογίου οθόνης""Πληκτρολόγιο συσκευής""Ενσωματωμένες ρυθμίσεις πληκτρολογίου""Ανάπτυξη"
@@ -729,13 +731,11 @@
"Η οθόνη δεν θα μεταβαίνει ποτέ σε κατάσταση αδράνειας κατά τη φόρτιση""Να επιτρέπονται ψευδείς τοποθεσίες""Να επιτρέπονται ψευδείς τοποθεσίες"
-
-
-
-
+ "Να επιτρέπεται ο εντοπισμός σφαλμάτων USB;"
+ "Ο εντοπισμός σφαλμάτων USB προορίζεται μόνο για σκοπούς προγραμματισμού. Μπορεί να χρησιμοποιηθεί για αντιγραφή δεδομένων μεταξύ του υπολογιστή και της συσκευής σας, για την εγκατάσταση εφαρμογών στη συσκευή σας χωρίς προειδοποίηση και για την ανάγνωση δεδομένων καταγραφής.""Επιλογή gadget""Επιλογή γραφικού στοιχείου"
- "Λεπτομέρειες για UID %d"
+ "Λεπτομέρειες για UID %d""UID %1$d""Λεπτομέρειες χρήσης δικτύου για %1$s:""Αριθμός byte που ελήφθησαν: %1$d"
@@ -746,14 +746,10 @@
"Ώρα συστήματος:""Συνολικός χρόνος:""Ξεκινά: %1$d"
-
-
-
-
-
-
-
-
+ "%1$dη %2$dω %3$dλ %4$dδ"
+ "%1$dω %2$dλ %3$dδ"
+ "%1$dλ %2$dδ"
+ "%1$dδ""Πακέτα που μοιράζονται αυτό το UID:""Δεν υπάρχουν διαθέσιμα δεδομένα χρήσης μπαταρίας""Αισθητήρας:"
@@ -775,400 +771,209 @@
"Εφαρμογή""Μέτρηση""Χρόνος χρήσης"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Προσβασιμότητα"
+ "Ρυθμίσεις προσβασιμότητας"
+ "Διαχείριση επιλογών προσβασιμότητας"
+ "Προσβασιμότητα"
+ "Υπηρεσίες προσβασιμότητας"
+ "Καμία εγκατεστημένη υπηρεσία προσβασιμότητας."
+ "Αυτή η υπηρεσία προσβασιμότητας ενδέχεται να έχει τη δυνατότητα συλλογής όλων των κειμένων που πληκτρολογείτε, συμπεριλαμβανομένων των προσωπικών δεδομένων και των αριθμών πιστωτικών καρτών εκτός των κωδικών πρόσβασης. Ενδέχεται επίσης να καταγράφει τις δραστηριότητες της επιφάνειας χρήστη. Αυτή η λειτουργία προέρχεται από την εφαρμογή %1$s. Να χρησιμοποιηθεί αυτή η υπηρεσία προσβασιμότητας;"
+ "Να απενεργοποιηθεί η προσβασιμότητα;"
+ "Χρήση μπαταρίας"
+ "Τι χρησιμοποιούσε την μπαταρία"
+ "Χρήση μπαταρίας από τη στιγμή της αποσύνδεσης από την τροφοδοσία"
+ "Χρήση μπαταρίας από τη στιγμή της επαναφοράς"
+ "%1$s από την αποσύνδεση"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Χρόνος ενεργοποίησης της συσκευής"
+ "Ώρα ενεργοποίησης WiFi"
+ "Ώρα ενεργοποίησης WiFi"
+ "%1$s - %2$s%%"
+ "Λεπτομέρειες από τη χρήση της μπαταρίας"
+ "Λεπτομέρειες χρήσης"
+ "Προσαρμογή χρήσης ισχύος"
+ "Συμπεριλαμβανόμενα πακέτα"
+ "Προβολή"
+ "Wi-Fi"
+ "Bluetooth"
+ "Ετοιμότητα κυψέλης"
+ "Φωνητικές κλήσεις"
+ "Το τηλέφωνο είναι αδρανές"
+ "Συνολικός χρόνος CPU"
+ "Προσκήνιο CPU"
+ "GPS"
+ "Τηλέφωνο"
+ "Τα δεδομένα εστάλησαν"
+ "Τα δεδομένα ελήφθησαν"
+ "Ήχος"
+ "Βίντεο"
+ "Η ώρα είναι ενεργοποιημένη"
+ "Ώρα κατά τη μη κάλυψη σήματος"
+ "Αναγκαστική διακοπή"
+ "Πληροφορίες εφαρμογής"
+ "Ρυθμίσεις εφαρμογών"
+ "Ρυθμίσεις προβολής"
+ "Ρυθμίσεις WiFi"
+ "Ρυθμίσεις Bluetooth"
+ "Μπαταρία που χρησιμοποιείται από φωνητικές κλήσεις"
+ "Χρήση μπαταρίας όταν το τηλέφωνο είναι αδρανές"
+ "Μπαταρία που χρησιμοποιείται από πομπό κυψέλης"
+ "Μετάβαση στη λειτουργία πτήσης για εξοικονόμηση ενέργειας σε περιοχές που προσφέρουν κάλυψη κυψέλης"
+ "Μπαταρία που χρησιμοποιείται από την προβολή και το φωτισμό φόντου"
+ "Μείωση φωτεινότητας οθόνης και/ή χρονικού ορίου οθόνης"
+ "Μπαταρία που χρησιμοποιείται από το Wi-Fi"
+ "Απενεργοποίηση του Wi-Fi όταν δεν χρησιμοποιείται ή όταν δεν είναι διαθέσιμο"
+ "Μπαταρία που χρησιμοποιείται από το Bluetooth"
+ "Απενεργοποίηση του Bluetooth όταν δεν το χρησιμοποιείτε"
+ "Δοκιμή σύνδεσης σε διαφορετική συσκευή bluetooth"
+ "Χρήση μπαταρίας κατά την εκτέλεση των εφαρμογών"
+ "Τερματισμός ή κατάργηση εγκατάστασης της εφαρμογής"
+ "Απενεργοποίηση του GPS όταν δεν χρησιμοποιείται"
+ "Η εφαρμογή ενδέχεται να προσφέρει ρυθμίσεις που θα μειώσουν τη χρήση της μπαταρίας"
+ "%1$s από την αποσύνδεση"
+ "Από την τελευταία αποσύνδεση για %1$s"
+ "Συνολικές τιμές χρήσης"
+ "Ανανέωση"
+ "Λειτουργικό σύστημα Android"
+ "Mediaserver"
+ "Κείμενο σε λόγο"
+ "Ορισμός επιλογών κειμένου σε λόγο"
+ "Ρυθμίσεις κειμένου σε λόγο"
+ "Χρήση των ρυθμίσεών μου πάντα"
+ "Οι παρακάτω προεπιλεγμένες ρυθμίσεις αντιγράφουν τις ρυθμίσεις της εφαρμογής"
+ "Προεπιλεγμένες ρυθμίσεις"
+ "Ταχύτητα λόγου"
+ "Ταχύτητα με την οποία εκφωνείται το κείμενο"
+ "Τόνος"
+ "Επηρεάζει τον τόνο του προφορικού κειμένου"
+ "Γλώσσα"
+ "Ορίζει τη φωνή που σχετίζεται με τη γλώσσα για το κείμενο ομιλίας"
+ "Ακούστε ένα παράδειγμα"
+ "Αναπαραγωγή μιας σύντομης αναπαράστασης σύνθεσης λόγου"
+ "Εγκατάσταση δεδομένων φωνής"
+ "Εγκατάσταση δεδομένων ήχου που απαιτούνται για τη σύνθεση ήχου"
+ "Οι φωνές που απαιτούνται για τη σύνθεση λόγου έχουν ήδη εγκατασταθεί σωστά"
+ "Αυτό είναι ένα παράδειγμα σύνθεσης λόγου."
+ "Οι ρυθμίσεις σας άλλαξαν. Το παρόν είναι ένα παράδειγμα του ήχου τους."
+ "Έλεγχος ισχύος"
+ "Ενημέρωση ρύθμισης Wi-Fi"
+ "Ενημέρωση ρύθμισης Bluetooth"
+ "Πρόγραμμα εγκατάστασης διαπιστευτηρίων"
+ "Ρυθμίσεις VPN"
+ "Σύνδεση στο %s"
+ "Όνομα χρήστη:"
+ "Κωδικός πρόσβασης:"
+ "ένα όνομα χρήστη"
+ "ένας κωδικός πρόσβασης"
+ "Διατήρηση ονόματος χρήστη"
+ "Σύνδεση"
+ "Ναι"
+ "Όχι"
+ "Πίσω"
+ "Όχι"
+ "Αποθήκευση"
+ "Ακύρωση"
+ "Επαναφορά"
+ "Σύνδεση στο δίκτυο"
+ "Αποσύνδεση από το δίκτυο"
+ "Επεξεργασία δικτύου"
+ "Διαγραφή δικτύου"
+ "Πρέπει να καταχωρίσετε %s."
+ "Πρέπει να επιλέξετε %s."
+ "Το όνομα VPN \"%s\" υπάρχει ήδη. Βρείτε άλλο όνομα."
+ "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το VPN;"
+ "Είστε βέβαιοι ότι δεν θέλετε να δημιουργήσετε αυτό το προφίλ;"
+ "Είστε βέβαιοι ότι θέλετε να απορρίψετε τις αλλαγές που πραγματοποιήθηκαν σε αυτό το προφίλ;"
+ "Δεν είναι δυνατή η σύνδεση στο δίκτυο. Θέλετε να δοκιμάσετε ξανά;"
+ "Η σύνδεση διακόπηκε. Θέλετε να συνδεθείτε ξανά;"
+ "Δεν είναι δυνατή η επίλυση του ονόματος διακομιστή. Θέλετε να ελέγξετε τη ρύθμιση του ονόματος του διακομιστή σας;"
+ "Σφάλμα πρόκλησης. Θέλετε να ελέγξετε τη μυστική ρυθμισή σας;"
+ "Από αυτήν τη διαμόρφωση VPN απουσιάζει ένα ή περισσότερα μυστικά. Θέλετε να ελέγξετε τις μυστικές ρυθμίσεις σας;"
+ "Το όνομα χρήστη ή ο κωδικός πρόσβασης που καταχωρίστηκε δεν είναι σωστός. Θέλετε να δοκιμάσετε ξανά;"
+ "Αποκλεισμός από το διακομιστή. Το όνομα χρήστη ή ο κωδικός πρόσβασης που καταχωρίσατε ενδέχεται να είναι εσφαλμένα. Θέλετε να δοκιμάσετε ξανά;"
+ "Διακόπηκε η σύνδεση με τον διακομιστή. Είναι πιθανό να βρίσκεστε πίσω από τείχος προστασίας που εμποδίζει τη σύνδεσή σας με τον διακομιστή. Θέλετε να δοκιμάσετε ξανά;"
+ "Η διαπραγμάτευση διακομιστή απέτυχε. Ο διακομιστής μπορεί να μη δέχεται την επιλογή κρυπτογράφησής που έχετε κάνει. Θέλετε να ελέγξετε τη ρύθμιση κρυπτογράφησης;"
+ "Προσθήκη VPN"
+ "Προσθήκη VPN"
+ "Προσθήκη VPN %s"
+ "Λεπτομέρειες %s"
+ "VPN"
+ "Σύνδεση..."
+ "Αποσύνδεση..."
+ "Συνδεδεμένο"
+ "Σύνδεση στο δίκτυο"
+ "Όνομα VPN"
+ "ένα όνομα VPN"
+ "Προστέθηκε το προφίλ \"%s\""
+ "Έγιναν οι αλλαγές στο προφίλ \"%s\""
+ "Ορισμός πιστοποιητικού χρήστη"
+ "Πιστοποιητικό χρήστη"
+ "ένα πιστοποιητικό χρήστη"
+ "Ορισμός πιστοποιητικού CA"
+ "Πιστοποιητικό αρχής έκδοσης πιστοποιητικών (CA)"
+ "Πιστοποιητικό CA"
+ "Ορισμός μυστικού L2TP"
+ "Μυστικό L2TP"
+ "ένα μυστικό L2TP"
+ "κρυπτογράφηση"
+ "Κρυπτογράφηση PPTP"
+ "Ορισμός ήδη κοινόχρηστου κλειδιού IPSec"
+ "Ήδη κοινόχρηστο κλειδί IPSec"
+ "ένα ήδη κοινόχρηστο κλειδί IPSec"
+ "Ορισμός διακομιστή VPN"
+ "Διακομιστής VPN"
+ "ένας διακομιστής VPN"
+ "Όνομα διακομιστή VPN"
+ "Τομείς αναζήτησης DNS"
+ "Τομείς αναζήτησης DNS"
+ "Ορίστηκε η τιμή %s"
+ "Η τιμή %s δεν ορίστηκε"
+ "Η τιμή %s δεν ορίστηκε (προαιρετικό)"
+ "Ενεργοποίηση %s"
+ "Απενεργοποίηση επιλογής %s"
+ "Η επιλογή %s είναι ενεργοποιημένη"
+ "Η επιλογή %s είναι απενεργοποιημένη"
+ "Ρυθμίσεις VPN"
+ "Εγκατάσταση και διαχείριση Εικονικών Ιδιωτικών Δικτύων (VPN)"
+ "(δεν έγινε αλλαγή)"
+ "(δεν ορίστηκε)"
+ "Χώρος αποθήκευσης διαπιστευτηρίων"
+ "Χρήση ασφαλών διαπιστευτηρίων"
+ "Να επιτρέπεται στις εφαρμογές η πρόσβαση σε ασφαλή πιστοποιητικά και άλλα διαπιστευτήρια"
+ "Εισαγωγή κωδικού πρόσβασης"
+ "Εισαγάγετε τον κωδικό πρόσβασης του χώρου αποθήκευσης διαπιστευτηρίων."
+ "Εγκατάσταση από κάρτα SD"
+ "Εγκατάσταση κρυπτογραφημένων πιστοποιητικών από την κάρτα SD"
+ "Ορισμός κωδικού πρόσβασης"
+ "Ορισμός ή αλλαγή κωδικού πρόσβασης χώρου αποθήκευσης διαπιστευτηρίων"
+ "Εκκαθάριση χώρου αποθήκευσης"
+ "Εκκαθάριση χώρου αποθήκευσης διαπιστευτηρίων όλων των περιεχομένων και επαναφορά του κωδικού πρόσβασής του"
+ "Είστε βέβαιοι ότι θέλετε να διαγράψετε όλα τα διαπιστευτήρια και να επαναφέρετε τον κωδικό πρόσβασης του χώρου αποθήκευσης διαπιστευτηρίων;"
+ "Τρέχον κωδικός πρόσβασης:"
+ "Νέος κωδικός πρόσβασης:"
+ "Επιβεβαίωση νέου κωδικού πρόσβασης:"
+ "Ορίστε έναν κωδικό πρόσβασης για την αποθήκευση των διαπιστευτηρίων (τουλάχιστον 8 χαρακτήρες)."
+ "Εισαγάγετε το σωστό κωδικό πρόσβασης."
+ "Εισαγάγετε το σωστό κωδικό πρόσβασης. Σας απομένει άλλη μία προσπάθεια για τη σωστή καταχώριση του κωδικού πρόσβασης πριν τη διαγραφή του χώρου αποθήκευσης διαπιστευτηρίων."
+ "Εισαγάγετε το σωστό κωδικό πρόσβασης. Σας απομένουν ακόμη %1$d προσπάθειες για τη σωστή καταχώριση του κωδικού πρόσβασης πριν τη διαγραφή του χώρου αποθήκευσης διαπιστευτηρίων."
+ "Οι κωδικοί πρόσβασης δεν συμφωνούν."
+ "Πρέπει να καταχωρίσετε και να επιβεβαιώσετε έναν κωδικό πρόσβασης."
+ "Εισαγάγετε τον κωδικό πρόσβασης."
+ "Ο κωδικός πρόσβασης θα πρέπει να αποτελείται από τουλάχιστον 8 χαρακτήρες."
+ "Αυτός ο χώρος αποθήκευσης διαπιστευτηρίων διαγράφτηκε."
+ "Ο χώρος αποθήκευσης διαπιστευτηρίων ενεργοποιήθηκε."
+ "Ο χώρος αποθήκευσης διαπιστευτηρίων απενεργοποιήθηκε."
+ "Τόνος επείγουσας ανάγκης"
+ "Ορισμός συμπεριφοράς κατά την πραγματοποίηση κλήσης επείγουσας ανάγκης"
+ "Απόρρητο"
+ "Ρυθμίσεις απορρήτου"
+ "Τοποθεσία"
+ "Ρυθμίσεις"
+ "Προσωπικά δεδομένα"
+ "Δημιουργία αντιγράφων ασφαλείας για τις ρυθμίσεις μου"
+ "Αντίγραφο ασφαλείας ρυθμίσεων"
+ "Είστε βέβαιοι ότι θέλετε να διακόψετε τη δημιουργία αντιγράφων ασφαλείας των ρυθμίσεών σας και να διαγράψετε όλα τα αντίγραφα από τους διακομιστές του Google;"
+
diff --git a/res/values-es-rUS/arrays.xml b/res/values-es-rUS/arrays.xml
index 8e965056e37..61337e5c039 100644
--- a/res/values-es-rUS/arrays.xml
+++ b/res/values-es-rUS/arrays.xml
@@ -24,38 +24,59 @@
"Pacífico""Todos"
+
+ "No hay animaciones"
+ "Algunas animaciones"
+ "Todas las animaciones"
+
+
+ "No se muestran animaciones de ventana"
+ "Se muestran algunas animaciones de ventana"
+ "Se muestran todas las animaciones de ventana"
+ "15 segundos""30 segundos""1 minuto""2 minutos""10 minutos"
- "Nunca se debe agotar el tiempo de espera"
+ "30 minutos"
+
+
+ "Muy lento"
+ "Lento"
+ "Normal"
+ "Rápido"
+ "Muy rápido"
+
+
+ "Muy bajo"
+ "Bajo"
+ "Normal"
+ "Alta"
+ "Muy alto"
+
+
+ "Inglés americano"
+ "Inglés británico"
+ "Francés"
+ "Alemán"
+ "Italiano"
+ "Español"
+
+
+ "Automáticamente"
+ "Ninguno"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "Empresa 802.1x"
+
+
+ "Ninguno"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "Empresa 802.1x"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automáticamente""WEP ASCII"
@@ -84,15 +105,27 @@
"Lanzar recuento""Nombre de la aplicación"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Ninguno"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Apagado"
+ "Alerta"
+ "Vibrar"
+
+
+ "Ninguno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP"
+
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 1f1e9f4db99..e8b696bd01d 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Sí"
+ "No""Desconocido""Encender la radio""Apagar la radio"
@@ -56,6 +58,7 @@
"Aceptar""Tarjeta SD""Estado de batería:"
+ "Enchufe:""Escala de batería:""Nivel de la batería:""Estado de la batería:"
@@ -75,6 +78,11 @@
"Descargando""No se realiza la carga""Total"
+ "Desconectado"
+ "CA"
+ "USB"
+ "CA+USB"
+ "Desconocido""Desconocido""Bueno""Recalentar"
@@ -104,14 +112,19 @@
"Solicitud de vinculación de Bluetooth""Vinculando solicitud""Seleccionar para vincularse con "
+ "Selector de dispositivo Bluetooth"
+ "Solicitud de permiso de Bluetooth"
+ "Una aplicación de tu teléfono solicita permiso para activar Bluetooth. ¿Deseas activarlo?"
+ "Una aplicación de tu teléfono solicita permiso para hacer que tu teléfono pueda ser detectable por otros dispositivos de Bluetooth durante %1$d segundos. ¿Deseas activarlo?"
+ "Una aplicación de tu teléfono solicita permiso para activar Bluetooth y hacer que tu teléfono pueda ser detectable por otros dispositivos durante %1$d segundos. ¿Deseas activarlo?"
+ "Activando Bluetooth…""Configuración de fecha y hora""1:00 p. m.""13:00""Cambiar hora""Fecha""Seleccionar zona horaria"
-
-
+ "Normal (%s)""Vista previa:""Tamaño de fuente:"
@@ -192,33 +205,23 @@
"Configuración de proxy""Cancelar""Configuración"
-
-
+ "Configurac.""Modo avión""Desactivar todas las conexiones inalámbricas""Desactivando conexiones inalámbricas…""Activando conexiones inalámbricas…"
- "Controles de tel. inalám."
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Redes & inalámbricas"
+ "Configuración inalámbrica y de red"
+ "Administrar Wi-Fi, Bluetooth, modo de avión, redes, móviles, & VPN"
+ "Roaming de datos"
+ "Conectarse a servicios de datos en el roaming"
+ "Conectarse a servicios de datos en el roaming"
+ "Has perdido la conectividad de los datos porque has dejado la red doméstica con roaming de datos desactivado."
+ "Enciéndelo"
+ "¿Deseas permitir el roaming de datos? Ten en cuenta que podrás incurrir en gastos significativos."
+ "Atención"
+ "Selección de operador"
+ "Seleccionar un operador de red""Fecha y hora""Establecer fecha, hora, zona horaria y formatos""Automático"
@@ -231,25 +234,31 @@
"Selecc. el formato de fecha""Ordenar alfabéticamente""Ordenar por zona horaria"
- "Seguridad y ubicación"
-
-
+ "Seguridad de la & ubicación"
+ "Configuración de ubicación y seguridad"
+ "Establecer Mi ubicación, desbloqueo de pantalla, bloqueo de la tarjeta SIM, bloqueo de almacenamiento de la credencial"
+ "Establecer Mi ubicación, desbloqueo de pantalla, bloqueo de almacenamiento de credencial""Contraseñas""Bluetooth""Activar Bluetooth""Configuración de Bluetooth""Config. de Bluetooth""Administrar conexiones, establecer nombre y detección del dispositivo"
- "Solicitud de vinculación de Bluetooth"
+ "Solicitud de vinculación de Bluetooth""Información del dispositivo Bluetooth"
- "%1$s"\n\n"Escribe el PIN para poder vincular."\n"(prueba con 0000 ó 1234)."
+ \n"Escribe el PIN para poder vincular con \"%1$s\". (prueba con 0000 ó 1234)."
+ \n"Escribe la llave maestra para vincular con \"%1$s\"."
+ "Para vincular con \"%1$s\", confirma que muestra la llave maestra: %2$s."
+ "%1$s"\n"desea vincularse."
+ "Ingresa %2$s en \"%1$s\" para vincular."
+ "Vincular"
+ "No vincular"
+ "dispositivo bluetooth""Atención""Se ha producido un problema al vincular con %1$s."
- "Se ha producido un problema al vincular %1$s debido a que el PIN que has escrito es incorrecto."
-
-
-
-
+ "Se ha producido un problema al vincular con %1$s debido a que el PIN o la llave maestra es incorrecta."
+ "No es posible establecer la comunicación con %1$s."
+ "Vínculo rechazado por %1$s""Se ha producido un problema al conectarse con %1$s.""Explorar dispositivos""Conectar"
@@ -261,6 +270,7 @@
"Conectar a...""Medios""Teléfono"
+ "Transferir""Conectado al audio de medios""Conectado al audio del teléfono""Conectado al audio del teléfono y los medios"
@@ -270,8 +280,11 @@
"Perfiles""Conectado al audio de medios""Conectado al audio del teléfono"
+ "Conectado al servidor de transferencia de archivo"
+ "No conectado al servidor de transferencia de archivo""Utilizar para el audio de medios""Utilizar para el audio del teléfono"
+ "Utilizar para la transferencia de archivos""Wi-Fi""Wi-Fi""Encender Wi-Fi"
@@ -288,25 +301,13 @@
"Seguridad""Abrir""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Empresa(802.1x)""Desconocido"
-
-
-
-
-
-
-
-
-
-
-
-
+ "abrir red"
+ "asegurado con WEP"
+ "asegurado con WPA/WPA2 PSK"
+ "asegurado con 802.1x EAP""Dirección IP""Potencia de la señal""Encendiendo..."
@@ -319,28 +320,19 @@
"No se ha podido guardar la red""Conectar""Conectar a %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Método de EAP"
+ "Autenticación de fase 2"
+ "Identidad"
+ "Identidad anónima"
+ "Certificado de cliente"
+ "Certificado de CA""Contraseña de teléfono inalámbrico""Clave hexadecimal WEP (0-9, A-F)""Mostrar contraseña.""Explorar""Fuera del alcance"
-
-
- "La conexión no se ha realizado correctamente, selecciona para volver a intentarlo"
+ "recordado"
+ "La conexión no se ha realizado correctamente, toca para volver a intentarlo""Redes de Wi-Fi""SSID de red""Seguridad"
@@ -391,6 +383,7 @@
"Desconectado""Incorrecto""Sonido y visualización"
+ "Configuración de sonido y visualización""Configuración de sonido""Establecer tonos de llamada, notificaciones, brillo de pantalla""Modo silencioso"
@@ -416,17 +409,16 @@
"Selección audible""Reproducir el sonido al realizar la selección de pantalla""Reproducir el sonido al realizar la selección de pantalla"
+ "Comentarios hápticos"
+ "Vibrar al presionar teclas programables y ciertas interacciones de interfaz de usuario"
+ "Vibrar al presionar teclas programables y ciertas interacciones de interfaz de usuario""Notificac. de tarjeta SD"
-
-
-
-
- "Sincronización de datos"
- "Seleccionar las aplicaciones que se sincronizan"
-
-
-
-
+ "Reproducir el sonido para los avisos de la tarjeta SD"
+ "Reproducir el sonido para los avisos de la tarjeta SD"
+ "Cuentas y sincronización"
+ "Agregar o eliminar cuentas, y cambiar la configuración de la cuenta"
+ "Buscar"
+ "Administrar la configuración y el historial de búsqueda""Configuración de visualización""Animación""Mostrar animación al abrir y cerrar ventanas"
@@ -438,6 +430,7 @@
"Ajustar el brillo de la pantalla""Tiempo de espera de la pant.""Ajustar el tiempo de demora para que la pantalla se apague automáticamente"
+ "Brillo automático""Configuración de bloqueo de la tarjeta SIM""Conf. bloqueo de tarj. SIM""Bloqueo de la tarjeta SIM"
@@ -470,18 +463,14 @@
"No disponible""Estado""Estado"
-
-
- "Tarjeta SD y almac. del tel."
+ "número de teléfono, señal, etc."
+ "Tarjeta SD y almacenamiento del teléfono"
+ "Configuración de la tarjeta SD y del almacenamiento del teléfono""Desmontar tarjeta SD, ver espacio de almacenamiento disponible"
-
-
-
-
-
-
-
-
+ "Mi número de teléfono"
+ "MIN"
+ "Versión de PRL"
+ "MEID""Tipo de red de celulares""Estado de red de celulares""Estado del servicio"
@@ -520,6 +509,11 @@
"Puerto MMS""MCC""MNC"
+ "Tipo de autenticación"
+ "Ninguno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP""Tipo de APN""Eliminar APN""APN nuevo"
@@ -535,11 +529,9 @@
"Restablecimiento completado de configuración de APN predeterminada""Restablecim. de los datos de fábrica""Borra todos los datos del teléfono"
-
-
+ "Todos los datos de tu teléfono serán eliminados, incluidos:"\n
"tu cuenta de Google"
\n
"la configuración y los datos de la aplicación y el sistema"
\n
"las aplicaciones descargadas"
\n"No se eliminarán:"\n
"el software del sistema actual y las aplicaciones en lote"
\n
"archivos de tarjeta SD, como por ejemplo, música o fotos"
"Restablecer el teléfono"
-
-
+ "¿Deseas borrar toda tu información personal y cualquier aplicación descargada?""Borrar todo""Extrae tu patrón de desbloqueo""Debes extraer tu patrón de desbloqueo para confirmar el restablecimiento de un teléfono."
@@ -556,20 +548,19 @@
"Establecer correo de voz, desvío de llamadas, llamada en espera, identificador de llamadas""Redes de celulares""Establecer opciones para roaming, redes, APN"
-
-
+ "Mi ubicación""Utilizar redes inalám.""Ver ubicación en las aplicaciones (como Mapas) mediante redes inalámbricas""Ubicación determinada por Wi-Fi o redes de celulares"
- "Activar satélites de GPS"
- "Localiz. con una precisión del nivel de calle (deselecc. para conservar la batería)"
+ "Utilizar satélites de GPS"
+ "Localizar con una precisión del nivel de calle (anular la selección para ahorrar batería)""Localiz. a nivel de calle (nec. más batería además de la vista del cielo)"
-
-
-
-
-
-
+ "Utilizar GPS asistido"
+ "Utilizar el servidor para asistir el GPS (anular la selección para reducir el uso de la red)"
+ "Utilizar el servidor para asistir el GPS (anula la selección para mejorar el rendimiento del GPS)"
+ "Utilizar Mi ubicación"
+ "Utilizar Mi ubicación para los resultados de búsqueda de Google y otros servicios de Google"
+ "¿Deseas permitir que Google utilice la ubicación para los resultados de búsqueda mejorada y otros servicios?""Acepto""No acepto""Acerca del teléfono"
@@ -579,12 +570,15 @@
"Derechos de autor""Licencia""Términos y condiciones"
-
-
+ "Tutorial del sistema""Aprende cómo utilizar tu teléfono""Abrir licencias de origen""Hay un problema para cargar las licencias.""Cargando…"
+ "Información de seguridad"
+ "Información de seguridad"
+ "Tu teléfono no está conectado al servicio de datos. Para ver esta información ahora, visita %s desde cualquier computadora conectada a Internet."
+ "Cargando…""Patrón de desbloqueo de la pantalla""Cambiar patrón de desbloqueo""Confirmar el patrón guardado"
@@ -613,9 +607,9 @@
"Cancelar""Siguiente""Asegurando tu teléfono"
- "Protege a tu teléfono de usos no autorizados al crear un patrón de desbloqueo en la pantalla personal. "\n\n"1"" En la pantalla siguiente, observa cómo se extrae un patrón de ejemplo. "\n\n"2"" Cuando estés listo, extrae tu propio patrón de desbloqueo personal. Experimenta con diferentes patrones pero conecta al menos cuatro puntos. "\n\n"3"" Revisa tu patrón para confirmar. "\n\n"¿Estás listo para comenzar? Selecciona \"Siguiente\""". "\n\n"Si deseas dejar sin protección a tu teléfono, selecciona \"Cancelar\"."
+ "Protege a tu teléfono de usos no autorizados al crear un patrón de desbloqueo en la pantalla personal. "\n\n"1"" En la pantalla siguiente, observa cómo se extrae un patrón de ejemplo. "\n\n"2"" Cuando estés listo, extrae tu propio patrón de desbloqueo personal. Experimenta con diferentes patrones pero conecta al menos cuatro puntos. "\n\n"3"" Revisa tu patrón para confirmar. "\n\n"¿Estás listo para comenzar? Toca \"Siguiente\""". "\n\n"Si deseas dejar sin protección a tu teléfono, toca \"Cancelar\".""Patrón de ejemplo"
- "Conecta al menos cuatro puntos."\n" "\n"Selecciona \"Siguiente\" cuando estés listo para extraer tu propio patrón."
+ "Conecta al menos cuatro puntos."\n" "\n"Toca \"Siguiente\" cuando estés listo para extraer tu propio patrón.""Administrar aplicaciones""Administrar y eliminar aplicaciones instaladas""Aplicaciones"
@@ -638,8 +632,7 @@
"Datos""Desinstalar...""Borrar datos"
-
-
+ "Desinstalar las actualizaciones""Has elegido lanzar esta aplicación de manera predeterminada para algunas acciones.""No hay configuraciones predeterminadas establecidas.""Borrar configuraciones predeterminadas"
@@ -650,32 +643,41 @@
"Filtro""Seleccionar opciones de filtro""Todos"
- "Tercero"
+ "Descargado""En ejecución""Cargando…""Recalculando el tamaño…""Eliminar"
- "Toda la información que has guardado en esta aplicación se eliminará de manera permanente."
+ "Todos los datos de esta aplicación se suprimirán de forma permanente. Esto incluye todos los archivos, las configuraciones, las cuentas, las bases de datos, etc.""Aceptar""Cancelar""No se ha encontrado la aplicación""No se ha encontrado la aplicación en la lista de aplicaciones instaladas.""No se han podido borrar los datos de la aplicación."
-
-
-
-
-
-
-
-
+ "Desinstalar las actualizaciones"
+ "¿Deseas desinstalar todas las actualizaciones a esta aplicación del sistema Android?"
+ "Borrar datos"
+ "Error al borrar los datos de la aplicación""Esta aplicación puede acceder a lo siguiente en tu teléfono:""Calculando...""No se ha podido calcular el tamaño del paquete"
- "No tienes instalada ninguna aplicación de terceros."
-
-
- "País y texto"
+ "No tienes instalada ninguna aplicación de terceros."
+ "versión %1$s"
+ "Servicios en ejecución"
+ "Ver y controlar servicios actuales en ejecución"
+ "Volver a comenzar"
+ "Sin servicios en ejecución"
+ "¿Deseas detener el servicio?"
+ "El servicio no ejecutará más hasta que comience de nuevo. Esto puede tener consecuencias no deseadas en la aplicación %1$s."
+ "Detener"
+ "Cancelar"
+ "Comenzado por aplicación: tocar para detener"
+ "%1$s: tocar para administrar"
+ "Disp.:%2$s+%3$s en %1$d"
+ "Otro: %2$s en %1$d"
+ "Proceso: %1$s"
+ "Idioma & del teclado"
+ "Idioma y Configuración del teclado""Establecer opciones de país (idioma y región), ingreso de texto y corrección automática""Configuración de país""Configuración de texto"
@@ -690,7 +692,7 @@
"Presionar la tecla de espacio dos veces para insertar \".\"""Contraseñas visibles""Mostrar contraseña mientras escribe"
- "El método de entrada puede recopilar todo el texto que escribas, incluidos los datos personales como contraseñas y números de tarjetas de crédito. Proviene de la aplicación %1$s. ¿Deseas activar este método de entrada?"
+ "El método de entrada puede recopilar todo el texto que escribas, incluidos los datos personales como contraseñas y números de tarjetas de crédito. Proviene de la aplicación %1$s. ¿Deseas utilizar este método de entrada?""Diccionario del usuario""Diccionario del usuario""Agregar y eliminar palabras del diccionario del usuario"
@@ -718,7 +720,7 @@
"Ingreso de texto""Administrar opciones de ingreso de texto""Configuración de %1$s"
- "Configuración de teclado en la pantalla"
+ "Configuración del teclado en pantalla""Teclado del dispositivo""Configuración de teclado integrado""Desarrollo"
@@ -729,13 +731,11 @@
"La pantalla nunca quedará inactiva mientras se realiza la carga""Permitir ubicac. de prueba""Permitir la creación de ubicaciones de prueba"
-
-
-
-
+ "¿Permite la depuración de USB?"
+ "La depuración de USB está prevista sólo con fines de desarrollo. Se puede utilizar para copiar datos entre tu computadora y tu dispositivo, instalar aplicaciones en tu dispositivo sin aviso y leer los datos de registro.""Elegir gadget""Elegir control"
- "Detalles de %d de UID"
+ "Detalles de UID %d""ID de usuario %1$d""Detalles de uso de la red para %1$s""Bytes recibidos: %1$d"
@@ -746,14 +746,10 @@
"Hora del sistema:""Tiempo total:""Comienza: %1$d"
-
-
-
-
-
-
-
-
+ "%1$ddías %2$dh %3$dmin %4$dseg"
+ "%1$dh %2$dmin %3$dseg"
+ "%1$d min %2$d seg"
+ "%1$d seg""Paquetes que comparten esta UID:""No hay datos disponibles del uso de la batería""Sensor:"
@@ -775,400 +771,209 @@
"Aplicación""Contar""Hora de uso"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Accesibilidad"
+ "Configuración de accesibilidad"
+ "Administrar opciones de accesibilidad"
+ "Accesibilidad"
+ "Servicios de accesibilidad"
+ "No se han instalado servicios de accesibilidad"
+ "Este servicio de accesibilidad podrá recopilar todo el texto que escribas, incluido los números de tarjeta de crédito de tus datos personales, excepto las contraseñas. También podrá registrar las interacciones de tu interfaz de usuario. Proviene de la aplicación %1$s. ¿Deseas utilizar este servicio de accesibilidad?"
+ "¿Deseas desactivar la accesibilidad?"
+ "Uso de la batería"
+ "Lo que ha utilizado la batería"
+ "Uso de la batería desde que se desconectó"
+ "Uso de la batería desde que se restableció"
+ "%1$s desde que se desconectó"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Hora de activación del dispositivo"
+ "WiFi a tiempo"
+ "WiFi a tiempo"
+ "%1$s - %2$s%%"
+ "Detalles de uso de la batería"
+ "Utilizar detalles"
+ "Ajustar el uso de energía"
+ "Paquetes incluidos"
+ "Mostrar"
+ "Wi-Fi"
+ "Bluetooth"
+ "Célula pendiente"
+ "Llamadas de voz"
+ "Teléfono inactivo"
+ "CPU total"
+ "Primer plano de la CPU"
+ "GPS"
+ "Teléfono"
+ "Datos enviados"
+ "Datos recibidos"
+ "Audio"
+ "Video"
+ "Hora de encendido"
+ "Hora sin una señal"
+ "Provocar la detención"
+ "Información de aplicación"
+ "Configuración de aplicación"
+ "Configuración de visualización"
+ "Configuración de WiFi"
+ "Config. de Bluetooth"
+ "La batería está siendo utilizada por llamadas de voz"
+ "La batería se utiliza cuando el teléfono está inactivo"
+ "La batería está siendo utilizada por la radio celular"
+ "Cambiar a modo de avión para ahorrar energía en áreas sin cobertura celular"
+ "La batería está siendo utilizada por la pantalla y la luz de fondo"
+ "Reducir el brillo y el tiempo muerto de la pantalla"
+ "La batería está siendo utilizada por Wi-Fi"
+ "Desactivar Wi-Fi cuando no se utiliza o cuando no está disponible"
+ "La batería está siendo utilizada por bluetooth"
+ "Desactiva Bluetooth cuando no lo utilizas"
+ "Intentar conectarse a un dispositivo Bluetooth diferente"
+ "La batería es utilizada por las aplicaciones durante el roaming"
+ "Detener o desinstalar la aplicación"
+ "Desactivar el GPS cuando no lo utilizas"
+ "La aplicación podrá ofrecer una configuración para reducir el uso de la batería"
+ "%1$s desde que se desconectó"
+ "Durante la última desconexión para %1$s"
+ "Total de usos"
+ "Actualizar"
+ "SO Android"
+ "Servidor de medios"
+ "Texto a voz"
+ "Establecer opciones de texto a voz"
+ "Configuración de texto a voz"
+ "Usar siempre mi config."
+ "Config. predet. debajo de la config. superpuesta de la aplicación"
+ "Configuración predeterminada"
+ "Índice de voz"
+ "Velocidad en la que se habla el texto"
+ "Sonido"
+ "Afecta el tono del texto hablado"
+ "Idioma"
+ "Establece la voz específica de un idioma para el texto hablado"
+ "Escucha un ejemplo:"
+ "Reproducir una pequeña demostración de síntesis de voz"
+ "Instalar datos de voz"
+ "Instalar los datos de voz necesarios para la síntesis de voz"
+ "Las voces necesarias para la síntesis de voz ya han sido instaladas correctamente"
+ "Éste es un ejemplo de síntesis de voz"
+ "Tu configuración ha cambiado. Éste es un ejemplo de cómo suenan."
+ "Control de energía"
+ "Actualizando configuración de Wi-Fi"
+ "Actualización de la configuración de Bluetooth"
+ "Programa de instalación de la credencial"
+ "Configuración de VPN"
+ "Conectar a %s"
+ "Nombre de usuario:"
+ "Contraseña:"
+ "un nombre de usuario"
+ "una contraseña"
+ "Recordar nombre de usuario"
+ "Conectar"
+ "Sí"
+ "No"
+ "Atrás"
+ "No"
+ "Guardar"
+ "Cancelar"
+ "Revertir"
+ "Conectar a la red"
+ "Desconectar de la red"
+ "Editar red"
+ "Suprimir red"
+ "Debes ingresar %s."
+ "Debes seleccionar %s."
+ "El nombre de la VPN \"%s\" ya existe. Busca otro nombre."
+ "¿Estás seguro de que deseas eliminar esta VPN?"
+ "¿Estás seguro de que no deseas crear este perfil?"
+ "¿Estás seguro de que deseas descartar los cambios realizados a este perfil?"
+ "No se puede conectar a la red. ¿Deseas volver a intentarlo?"
+ "Conexión perdida. ¿Deseas volver a establecer la conexión?"
+ "El nombre del servidor no se ha podido resolver. ¿Deseas verificar la configuración del nombre el servidor?"
+ "Error de desafío. ¿Deseas verificar tu configuración de secretos?"
+ "Faltan uno o más secretos en esta configuración de VPN. ¿Deseas verificar tu configuración de secretos?"
+ "El nombre de usuario o la contraseña que has ingresado es incorrecto. ¿Deseas volver a intentarlo?"
+ "Servidor en suspenso. El nombre de usuario o la contraseña que has ingresado pueden ser incorrectos. ¿Deseas volver a intentarlo?"
+ "Servidor en suspenso. Es posible que te encuentres detrás de un cortafuegos que te impide conectarte con el servidor. ¿Deseas volver a intentarlo?"
+ "Hubo un error en la negociación del servidor. Es posible que el servidor no acuerde con tu opción de encriptación. ¿Deseas revisar tu configuración de encriptación?"
+ "Agregar VPN"
+ "Agregar VPN"
+ "Agregar %s VPN"
+ "%s detalles"
+ "VPN"
+ "Conectando..."
+ "Desconectando..."
+ "Conectado"
+ "Conectar a la red"
+ "Nombre de VPN"
+ "un nombre de VPN"
+ "\"%s\" se ha agregado"
+ "Se han realizado cambios a \'%s\'"
+ "Establecer certificado de usuario"
+ "Certificado del usuario"
+ "un certificado de usuario"
+ "Establecer certificado de CA"
+ "Certificado de autoridad (CA) certificado"
+ "un certificado de CA"
+ "Establecer secreto de L2TP"
+ "Secreto de L2TP"
+ "un secreto de L2TP"
+ "encriptación"
+ "Encriptación de PPTP"
+ "Establecer clave precompartida de IPSec"
+ "Clave precompartida de IPSec"
+ "una clave precompartida de IPSec"
+ "Establecer servidor de VPN"
+ "Servidor de VPN"
+ "un servidor de VPN"
+ "Nombre del servidor de VPN"
+ "Dominios de búsqueda de DNS"
+ "Dominios de búsqueda de DNS"
+ "%s se ha establecido"
+ "%s no establecido"
+ "%s no establecido (opcional)"
+ "Activar%s"
+ "Desactivar %s"
+ "%s está habilitado"
+ "%s está inhabilitada"
+ "Configuración de VPN"
+ "Establecer & administrar Redes privadas virtuales (VPN)"
+ "(sin cambios)"
+ "(no establecido)"
+ "Almacenamiento de la credencial"
+ "Utilizar credenciales seguras"
+ "Permitir a las aplicaciones acceder a certificados seguros y otras credenciales"
+ "Ingresar contraseña"
+ "Ingresar la contraseña de almacenamiento de la credencial"
+ "Instalar de la tarjeta SD"
+ "Instalar certificados encriptados de la tarjeta SD"
+ "Establecer contraseña"
+ "Establecer o cambiar la contraseña de almacenamiento de la credencial"
+ "Borrar almacenamiento"
+ "Borrar el almacenamiento de la credencial de todo el contenido y restablecer su contraseña"
+ "¿Estás seguro de que deseas eliminar todas las credenciales y restablecer la contraseña de almacenamiento de la credencial?"
+ "Contraseña actual:"
+ "Nueva contraseña:"
+ "Confirmar contraseña nueva:"
+ "Configurar una contraseña para el almacenamiento de la credencial (mínimo 8 caracteres)."
+ "Ingresa la contraseña correcta."
+ "Ingresa la contraseña correcta. Tienes una oportunidad más para ingresar la contraseña correcta antes de que el almacenamiento de la credencial se borre."
+ "Ingresa la contraseña correcta. Tienes %1$d oportunidades más para ingresar la contraseña correcta antes de que el almacenamiento de la credencial se borre."
+ "Las contraseñas no coinciden."
+ "Debes ingresar y confirmar una contraseña."
+ "Ingresa la contraseña."
+ "La contraseña debe tener 8 caracteres como mínimo."
+ "El almacenamiento de la credencial se ha borrado."
+ "El almacenamiento de la credencial está activado."
+ "El almacenamiento de la credencial está inhabilitado."
+ "Tono de emergencia"
+ "Establecer el comportamiento cuando se establece una llamada de emergencia"
+ "Privacidad"
+ "Configuración de privacidad"
+ "Ubicación"
+ "Configuración"
+ "Datos personales"
+ "Hacer una copia de seguridad de mi configuración"
+ "Copia de seguridad de configuración"
+ "¿Estás seguro de que deseas dejar de hacer copias de seguridad de tu configuración y borrar todas las copias de los servidores de Google?"
+
diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml
index d49a5eade52..2059391856e 100644
--- a/res/values-es/arrays.xml
+++ b/res/values-es/arrays.xml
@@ -24,13 +24,23 @@
"Pacífico""Todas"
+
+ "Sin animaciones"
+ "Algunas animaciones"
+ "Todas las animaciones"
+
+
+ "No aparecen animaciones de ventana."
+ "Aparecen algunas animaciones de ventana."
+ "Aparecen todas las animaciones de ventana."
+ "15 segundos""30 segundos""1 minuto""2 minutos""10 minutos"
- "Tiempo de espera ilimitado"
+ "30 minutos""Muy lenta"
@@ -58,18 +68,14 @@
"Automática""Ninguna""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Ninguna""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automáticamente"
@@ -108,7 +114,7 @@
"Ninguno""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Alerta""Vibración"
+
+ "Ninguno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP"
+
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 1cba638c730..1ffcee889da 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Sí"
+ "No""Desconocido""Activar señal móvil""Desactivar señal móvil"
@@ -56,6 +58,7 @@
"Aceptar""Tarjeta SD""Estado de la batería:"
+ "Cargar batería:""Nivel de batería:""Nivel de batería:""Estado de la batería:"
@@ -75,6 +78,11 @@
"Descargando...""No se está cargando.""Completa"
+ "Sin conexión"
+ "CA"
+ "USB"
+ "AC+USB"
+ "Desconocido""Desconocido""Buena""Sobrecalentamiento"
@@ -104,6 +112,12 @@
"Solicitud de sincronización de Bluetooth""Solicitud de sincronización""Seleccionar dispositivo para sincronización "
+ "Selector del dispositivo Bluetooth"
+ "Solicitud de permiso de Bluetooth"
+ "Una aplicación del teléfono está solicitando permiso para activar la función Bluetooth. ¿Quieres realizar esta acción?"
+ "Una aplicación del teléfono está solicitando permiso para hacer visible el teléfono para otros dispositivos Bluetooth durante %1$d segundos. ¿Quieres realizar esta acción?"
+ "Una aplicación del teléfono está solicitando permiso para activar la función Bluetooth y hacer visible el teléfono para otros dispositivos durante %1$d segundos. ¿Quieres realizar esta acción?"
+ "Activando Bluetooth...""Configuración de fecha y hora""1:00 p.m.""13:00"
@@ -196,7 +210,8 @@
"Inhabilitar todas las conexiones inalámbricas""Inhabilitando conexiones inalámbricas...""Habilitando conexiones inalámbricas..."
- "Conexiones inalámbricas"
+ "Conexiones inalámbricas y redes"
+ "Configuración de red e inalámbrica""Administrar Wi-Fi, Bluetooth, modo avión, redes móviles y VPN""Itinerancia de datos""Establecer conexión con servicios de datos en itinerancia"
@@ -219,20 +234,29 @@
"Seleccionar formato de fecha""Ordenar alfabéticamente""Ordenar por zona horaria"
- "Seguridad y ubicación"
+ "Ubicación y seguridad"
+ "Configuración de seguridad y de ubicación""Establecer Mi ubicación, bloqueo de pantalla, bloqueo de tarjeta SIM y bloqueo de almacenamiento de credenciales"
+ "Establecer ubicación, bloqueo de pantalla y bloqueo de almacenamiento de credenciales""Contraseñas""Bluetooth""Activar Bluetooth""Bluetooth""Ajustes de Bluetooth""Administrar conexiones, establecer el nombre del dispositivo y la visibilidad"
- "Solicitud de sincronización de Bluetooth"
+ "Solicitud de sincronización de Bluetooth""Información de dispositivo Bluetooth"
- "%1$s"\n\n"Introduce el PIN para la sincronización."\n"(Prueba con 0000 ó 1234)."
+ \n"Introduce el PIN para la sincronización con \"%1$s\". (Prueba con 0000 o con 1234)."
+ \n"Introduce la clave de acceso para la sincronización con \"%1$s\"."
+ "Para realizar la sincronización con \"%1$s\", confirma que muestre la clave de acceso %2$s."
+ "%1$s"\n"solicita la sincronización."
+ "Introduce %2$s en \"%1$s\" para realizar la sincronización."
+ "Sincronizar"
+ "No sincronizar"
+ "dispositivo Bluetooth""Atención""Se ha producido un problema al realizar la sincronización con %1$s."
- "Se ha producido un problema al realizar la sincronización con %1$s, porque el PIN introducido es incorrecto."
+ "Se ha producido un problema al realizar la sincronización con %1$s porque la clave de acceso o el PIN son incorrectos.""No se puede establecer comunicación con %1$s.""Sincronización rechazada por %1$s""Se ha producido un problema al establecer conexión con %1$s."
@@ -246,6 +270,7 @@
"Establecer conexión con…""Multimedia""Teléfono"
+ "Transferencia""Conectado al audio del medio""Conectado al audio del teléfono""Conectado a audio de medio y del teléfono"
@@ -255,8 +280,11 @@
"Perfiles""Conectado al audio del medio""Conectado al audio del teléfono"
+ "Con conexión al servidor de transferencia de archivos"
+ "Sin conexión al servidor de transferencia de archivos""Utilizar para audio de medio""Utilizar para audio del teléfono"
+ "Uso de la transferencia de archivos""Wi-Fi""Wi-Fi""Activar Wi-Fi"
@@ -273,17 +301,13 @@
"Seguridad""Abierta""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Desconocida""red abierta""protegida con WEP"
- "protegida con WPA"
- "protegida con WPA2"
- "protegida con WPA-EAP"
- "protegida con IEEE 802.1x"
+ "protegida con WPA/WPA2 PSK"
+ "protegida con 802.1x EAP""Dirección IP""Intensidad de la señal""Activando..."
@@ -302,14 +326,13 @@
"Identidad anónima""Certificado de cliente""Certificado de autenticación"
- "Contraseña de clave privada""Contraseña de red inalámbrica""Clave hex. WEP (0-9, A-F)""Mostrar contraseña""Buscar""Fuera de rango""recordada"
- "La conexión no se ha realizado correctamente; selecciónala para volver a intentarlo."
+ "La conexión no se ha realizado correctamente; toca para volver a intentarlo.""Redes Wi-Fi""SSID de red""Seguridad"
@@ -360,6 +383,7 @@
"Desconectada""Con error""Sonido y pantalla"
+ "Configuración de sonido y de pantalla""Configuración de sonido""Establecer tonos, notificaciones, brillo de la pantalla""Modo silencio"
@@ -385,11 +409,14 @@
"Selección sonora""Reproducir sonido cuando se realiza una selección de pantalla""Reproducir sonido cuando se realiza una selección de pantalla"
+ "Respuesta táctil"
+ "Vibrar al pulsar teclas programables o durante ciertas interacciones con la interfaz de usuario"
+ "Vibrar al pulsar teclas programables o durante ciertas interacciones con la interfaz de usuario""Notificaciones tarjeta SD""Reproducir sonido para notificaciones de la tarjeta SD""Reproducir sonido para notificaciones de la tarjeta SD"
- "Sincronización de datos"
- "Seleccionar las aplicaciones que están sincronizadas"
+ "Cuentas y sincronización"
+ "Añadir o eliminar cuentas y modificar la configuración de las cuentas""Buscar""Administrar historial y configuración de búsqueda""Configuración de pantalla"
@@ -403,6 +430,7 @@
"Ajustar el brillo de la pantalla""Tiempo espera pantalla""Ajustar el tiempo de retraso antes de que la pantalla se apague automáticamente"
+ "Brillo automático""Configuración de bloqueo de tarjeta SIM""Bloqueo de tarjeta SIM""Bloqueo de tarjeta SIM"
@@ -436,7 +464,8 @@
"Estado""Estado""Número de teléfono, señal, etc."
- "Almacenamiento"
+ "Almacenamiento en teléfono y en tarjeta SD"
+ "Configuración de almacenamiento en teléfono y en tarjeta SD""Desactivar tarjeta SD, ver almacenamiento disponible.""Mi número de teléfono""MIN"
@@ -480,6 +509,11 @@
"Puerto de MMS""MCC""MNC"
+ "Tipo de autenticación"
+ "Ninguno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP""Tipo de APN""Eliminar APN""APN nuevo"
@@ -518,12 +552,15 @@
"Usar redes inalámbricas""Para ver una ubicación en aplicaciones (por ejemplo, Google Maps)""Ubicación determinada por redes móviles o Wi-Fi"
- "Habilitar satélites GPS"
- "Preciso en el nivel de calle (anula la selección para ahorrar batería)"
+ "Utilizar satélites GPS"
+ "Durante la localización, preciso en el nivel de calle (desactivar para ahorrar batería)""Localizar en nivel de calle (requiere más batería además de la vista aérea)"
- "Compartir con Google"
- "Permitir que Google utilice tu ubicación para mejorar las búsquedas y otros servicios"
- "Permitir que Google utilice tu ubicación para mejorar los resultados de búsqueda y otros servicios"
+ "Utilizar GPS asistido"
+ "Utilizar el servidor para asistir al GPS (desactivar para reducir el uso de la red)"
+ "Utilizar el servidor para asistir al GPS (desactivar para mejorar el rendimiento del GPS)"
+ "Utilizar Mi ubicación"
+ "Utilizar Mi ubicación para los resultados de búsqueda de Google y otros servicios de Google"
+ "¿Quieres que Google pueda utilizar tu ubicación para mejorar los resultados de búsqueda y otros servicios?""Acepto""No acepto""Acerca del teléfono"
@@ -538,6 +575,10 @@
"Licencias de SW libre""Se ha producido un problema al intentar cargar las licencias.""Cargando..."
+ "Información de seguridad"
+ "Información de seguridad"
+ "El teléfono no está conectado a un servicio de datos. Para ver esta información, accede a %s desde cualquier equipo conectado a Internet."
+ "Cargando...""Patrón de desbloqueo de pantalla""Cambiar patrón de desbloqueo""Confirmar patrón guardado"
@@ -566,9 +607,9 @@
"Cancelar""Seguir""Protección del teléfono"
- "Protege el teléfono de usos no autorizados mediante la creación de un patrón de desbloqueo de pantalla personal. "\n\n"1"" En la siguiente pantalla, puedes observar cómo se crea un patrón de ejemplo. "\n\n"2"" Cuando estés preparado, crea tu propio patrón de desbloqueo personal. Puedes experimentar con distintos patrones, pero recuerda que debes conectar al menos cuatro puntos. "\n\n"3"" Vuelve a dibujar el patrón para confirmarlo. "\n\n"Si estás preparado para comenzar, selecciona \"Seguir\""". "\n\n"Para dejar el teléfono desprotegido, selecciona \"Cancelar\"."
+ "Protege el teléfono de usos no autorizados mediante la creación de un patrón de desbloqueo de pantalla personal. "\n\n"1"" En la siguiente pantalla, puedes observar cómo se crea un patrón de ejemplo. "\n\n"2"" Cuando estés preparado, crea tu propio patrón de desbloqueo personal. Puedes experimentar con distintos patrones, pero recuerda que debes conectar al menos cuatro puntos. "\n\n"3"" Vuelve a dibujar el patrón para confirmarlo. "\n\n"Si estás preparado para comenzar, toca en \"Siguiente\""". "\n\n"Para dejar el teléfono desprotegido, toca en \"Cancelar\".""Patrón de ejemplo"
- "Une al menos cuatro puntos."\n" "\n"Selecciona \"Seguir\" cuando estés preparado para crear tu propio patrón."
+ "Une al menos cuatro puntos."\n" "\n"Toca en \"Siguiente\" cuando estés preparado para crear tu propio patrón.""Administrar aplicaciones""Administrar y eliminar aplicaciones instaladas""Aplicaciones"
@@ -602,12 +643,12 @@
"Filtrar""Seleccionar opciones de filtrado""Todas"
- "Externas"
+ "Descargada""En ejecución""Cargando...""Recalculando tamaño...""Suprimir"
- "Toda la información que hayas guardado en la aplicación se eliminará permanentemente."
+ "Todos los datos de la aplicación se eliminarán de forma permanente, incluidos todos los archivos, la configuración, las cuentas, las bases de datos, etc.""Aceptar""Cancelar""No se ha encontrado la aplicación."
@@ -620,9 +661,23 @@
"Esta aplicación puede acceder a los siguientes elementos del teléfono:""Calculando…""No se ha podido calcular el tamaño del paquete."
- "No tienes instalada ninguna aplicación externa."
+ "No tienes instalada ninguna aplicación externa.""versión %1$s"
- "Idioma y país"
+ "Servicios en ejecución"
+ "Ver y controlar los servicios en ejecución"
+ "Reiniciando"
+ "No hay servicios en ejecución."
+ "¿Quieres detener el servicio?"
+ "El servicio no se ejecutará hasta que se vuelva a iniciar, lo que puede provocar consecuencias no deseadas en la aplicación %1$s."
+ "Detener"
+ "Cancelar"
+ "Iniciado por la aplicación: tocar para detener"
+ "%1$s: tocar para administrar"
+ "Disp.: %2$s+%3$s en %1$d"
+ "Otros: %2$s en %1$d"
+ "Proceso: %1$s"
+ "Idioma y teclado"
+ "Configuración de teclado y de idioma""Configuración local, opciones de autocorrección e introducción de texto""Configuración local""Configuración de texto"
@@ -637,7 +692,7 @@
"Pulsa la barra espaciadora dos veces para insertar el carácter \".\"""Contraseñas visibles""Mostrar contraseña mientras se escribe"
- "Este método de introducción de texto puede registrar todo lo que escribas, incluidos datos personales como las contraseñas y los números de las tarjetas de crédito. Procede de la aplicación %1$s. ¿Deseas habilitar este método de introducción?"
+ "Este método de introducción de texto puede registrar todo lo que escribas, incluidos datos personales, como las contraseñas y los números de las tarjetas de crédito. Procede de la aplicación %1$s. ¿Deseas utilizar este método de introducción de texto?""Diccionario del usuario""Diccionario del usuario""Añadir y eliminar palabras del diccionario del usuario"
@@ -665,7 +720,7 @@
"Introducción de texto""Administrar opciones de introducción de texto""Configuración de %1$s"
- "Configuración del teclado en pantalla"
+ "Configuración de teclado en pantalla""Teclado del dispositivo""Configuración del teclado integrado""Desarrollo"
@@ -676,11 +731,11 @@
"La pantalla nunca entra en modo de suspensión durante la carga""Ubicaciones simuladas""Permitir ubicaciones simuladas"
- "¿Quieres habilitar la depuración USB?"
+ "¿Permitir depuración USB?""La depuración USB sólo está indicada para actividades de desarrollo. Se puede utilizar para intercambiar datos entre el equipo y el dispositivo, para instalar aplicaciones en el dispositivo sin recibir notificaciones y para leer datos de registro.""Seleccionar gadget""Seleccionar widget"
- "Detalles del ID único %d"
+ "Detalles del ID único %d""ID único %1$d""Detalles de uso de red para %1$s:""Bytes recibidos: %1$d"
@@ -716,12 +771,13 @@
"Aplicación""Número""Tiempo de uso"
- "Accesibilidad"
+ "Accesibilidad"
+ "Configuración de accesibilidad""Administrar opciones de accesibilidad""Accesibilidad""Servicios de accesibilidad""No hay instalado ningún servicio de accesibilidad."
- "Este servicio de accesibilidad puede recopilar todo el texto que escribas, desde datos personales hasta números de tarjetas de crédito, a excepción de las contraseñas. También puede registrar las interacciones con la interfaz de usuario. Procede de la aplicación %1$s. ¿Quieres habilitar ese servicio de accesibilidad?"
+ "Este servicio de accesibilidad puede recopilar todo lo que escribas, desde datos personales hasta números de tarjetas de crédito, a excepción de las contraseñas. También puede registrar las interacciones con la interfaz de usuario. Procede de la aplicación %1$s. ¿Quieres utilizar este servicio de accesibilidad?""¿Quieres inhabilitar la accesibilidad?""Uso de la batería""Qué ha estado utilizando la batería"
@@ -733,7 +789,7 @@
"Tiempo de actividad del dispositivo""Tiempo de conexión WiFi""Tiempo de conexión WiFi"
- "%1$s - %2$s%%"
+ "%1$s: %2$s%%""Detalles de uso de la batería""Detalles de uso""Ajustar uso de la batería"
@@ -769,7 +825,7 @@
"Batería utilizada por la conexión Wi-Fi""Desactiva la conexión Wi-Fi cuando no la estés utilizando o cuando no esté disponible.""Batería utilizada por Bluetooth"
- "Desactiva el Bluetooth cuando no lo estés utilizando."
+ "Desactiva el Bluetooth cuando no lo estés utilizando.""Intenta conectarte a un dispositivo Bluetooth diferente.""Batería utilizada por aplicaciones en ejecución""Detener o desinstalar la aplicación"
@@ -781,9 +837,9 @@
"Actualizar""Sistema operativo de Android""Servidor multimedia"
- "Síntesis de voz"
+ "Síntesis de voz""Establecer opciones de síntesis de voz"
- "Controles del sintetizador de voz"
+ "Configuración de síntesis de voz""Utilizar siempre mi configuración""La configuración predeterminada que aparece a continuación anula la configuración de la aplicación.""Configuración predeterminada"
@@ -801,8 +857,11 @@
"Este es un ejemplo de síntesis de voz.""Tu configuración ha cambiado. Este es un ejemplo de cómo suena.""Control de energía"
+ "Actualización de la configuración de la conexión Wi-Fi"
+ "Actualización de la configuración de la conexión Bluetooth"
+ "Instalador de credenciales""Configuración de red VPN"
- "Establecer conexión con %s"
+ "Establecer conexión con %s""Nombre de usuario:""Contraseña:""un nombre de usuario"
@@ -820,9 +879,9 @@
"Desconectar de la red""Editar red""Eliminar red"
- "Debes introducir %s."
- "Debes seleccionar %s."
- "El nombre de la red VPN \"%s\" ya existe. Utiliza otro."
+ "Debes introducir %s."
+ "Debes seleccionar %s."
+ "El nombre de red VPN \"%s\" ya existe. Utiliza otro.""¿Estás seguro de que quieres eliminar esta red VPN?""¿Estás seguro de que no quieres crear este perfil?""¿Estás seguro de que quieres descartar los cambios realizados en este perfil?"
@@ -833,10 +892,12 @@
"Faltan uno o varios secretos en la configuración de esta VPN. ¿Deseas comprobar tu configuración secreta?""El nombre de usuario o la contraseña introducidos no son correctos. ¿Quieres intentarlo de nuevo?""El servidor se ha bloqueado. Es posible que la contraseña o el nombre de usuario introducidos sean incorrectos. ¿Deseas volver a intentarlo?"
+ "El servidor se ha bloqueado. Es posible que tengas activado un cortafuegos que impide la conexión al servidor. ¿Quieres volver a intentarlo?"
+ "Error de negociación con el servidor. Es posible que el servidor no acepte tu opción de encriptación. ¿Quieres comprobar tus valores de configuración de la encriptación?""Añadir VPN""Añadir VPN"
- "Añadir VPN %s"
- "Detalles de %s"
+ "Añadir red VPN \"%s\""
+ "Detalles de %s""Redes VPN""Estableciendo conexión...""Desconectando..."
@@ -844,8 +905,8 @@
"Establecer conexión con red""Nombre de VPN""un nombre de VPN"
- "%s añadido"
- "Los cambios se han aplicado en %s."
+ "Se ha añadido \"%s\"."
+ "Los cambios se han aplicado a \"%s\".""Establecer certificado de usuario""Certificado de usuario""un certificado de usuario"
@@ -866,53 +927,53 @@
"Nombre de servidor VPN""Dominios de búsqueda DNS""Dominios de búsqueda de DNS"
- "%s se ha establecido."
- "%s no se ha definido."
- "No se ha establecido %s (opcional)."
- "Habilitar %s"
- "Inhabilitar %s"
- "%s se ha habilitado."
- "%s se ha inhabilitado."
+ "Se ha establecido el valor \"%s\"."
+ "No se ha establecido el valor \"%s\"."
+ "No se ha establecido el valor \"%s\" (opcional)."
+ "Habilitar %s"
+ "Inhabilitar %s"
+ "Se ha habilitado %s."
+ "Se ha inhabilitado %s.""Configuración de red VPN""Configurar y administrar redes privadas virtuales (VPN)""(sin modificar)""(sin definir)"
- "Almacenamiento de credenciales"
- "Utilizar credenciales seguras"
- "Permitir que las aplicaciones accedan a los certificados seguros y a otras credenciales"
- "Introducir contraseña"
- "Introduce la contraseña de almacenamiento de credenciales."
- "Establecer contraseña"
- "Establecer o cambiar la contraseña de almacenamiento de credenciales"
- "Establecer contraseña"
- "Borrar almacenamiento"
- "Borrar almacenamiento de credenciales de todo el contenido y restablecer su contraseña"
- "¿Estás seguro de que quieres eliminar todas las credenciales y restablecer la contraseña de almacenamiento de credenciales?"
- "Nombre del certificado"
- "Nombre del certificado:"
- "Contraseña para extraer el certificado:"
- "Detalles del certificado:"
- "El nombre sólo puede contener letras y números."
- "Contraseña actual:"
- "Contraseña nueva:"
- "Confirmar contraseña nueva:"
- "Establece una contraseña para el almacenamiento de credenciales."
- "Establece una contraseña para el almacenamiento de credenciales."
- "Introduce la contraseña correcta."
- "Introduce la contraseña correcta. Dispones de un intento más para introducir la contraseña antes de que se borre el almacenamiento de credenciales."
- "Introduce la contraseña correcta. Dispones de %d intentos más para introducir la contraseña antes de que se borre el almacenamiento de credenciales."
- "Las contraseñas no coinciden."
- "Debes introducir una contraseña y confirmarla."
- "Introduce la contraseña."
- "Introduce la contraseña de nuevo. La contraseña debe tener al menos 8 caracteres y no debe contener espacios."
- "Introduce un nombre."
- "Introduce un nombre que contenga sólo letras y números."
- "No es posible guardar el certificado. Haz clic en \"Aceptar\" para intentarlo de nuevo."
- "No se ha podido guardar el certificado. El almacenamiento de credenciales no está permitido o no se ha inicializado correctamente."
- "No se ha guardado el certificado."
- "Se ha borrado el almacenamiento de credenciales."
- "El almacenamiento de credenciales está habilitado."
- "Se ha añadido %s."
+ "Almacenamiento de credenciales"
+ "Utilizar credenciales seguras"
+ "Permitir que las aplicaciones accedan a los certificados seguros y a otras credenciales"
+ "Introducir contraseña"
+ "Introduce la contraseña de almacenamiento de credenciales."
+ "Instalar desde la tarjeta SD"
+ "Instalar certificados encriptados de tarjeta SD"
+ "Establecer contraseña"
+ "Establecer o cambiar la contraseña de almacenamiento de credenciales"
+ "Borrar almacenamiento"
+ "Borrar almacenamiento de credenciales de todo el contenido y restablecer su contraseña"
+ "¿Estás seguro de que quieres eliminar todas las credenciales y restablecer la contraseña de almacenamiento de credenciales?"
+ "Contraseña actual:"
+ "Contraseña nueva:"
+ "Confirmar contraseña nueva:"
+ "Establece una contraseña para el almacenamiento de credenciales (ocho caracteres como mínimo)."
+ "Introduce la contraseña correcta."
+ "Introduce la contraseña correcta. Dispones de un intento más para introducir la contraseña antes de que se borre el almacenamiento de credenciales."
+ "Introduce la contraseña correcta. Dispones de %1$d intentos más para introducir la contraseña antes de que se borre el almacenamiento de credenciales."
+ "Las contraseñas no coinciden."
+ "Debes introducir una contraseña y confirmarla."
+ "Introduce la contraseña."
+ "La contraseña debe tener un mínimo de ocho caracteres."
+ "Se ha borrado el almacenamiento de credenciales."
+ "Almacenamiento de credenciales habilitado"
+ "Almacenamiento de credenciales inhabilitado""Tono de emergencia""Establecer comportamiento al realizar una llamada de emergencia"
+ "Privacidad"
+ "Configuración de privacidad"
+ "Ubicación"
+ "Configuración"
+ "Datos personales"
+ "Realizar copia de seguridad de mi configuración"
+ "Copia de seguridad de la configuración"
+ "¿Estás seguro de que quieres detener la copia de seguridad de tu configuración y borrar todas las copias de los servidores de Google?"
+
+
diff --git a/res/values-fr/arrays.xml b/res/values-fr/arrays.xml
index 7f99702d9d9..123bf2bd9ea 100644
--- a/res/values-fr/arrays.xml
+++ b/res/values-fr/arrays.xml
@@ -24,13 +24,23 @@
"Pacifique""Tous"
+
+ "Aucune animation"
+ "Quelques animations"
+ "Toutes les animations"
+
+
+ "Aucune animation n\'est affichée."
+ "Certaines animations sont affichées."
+ "Toutes les animations sont affichées."
+ "15 secondes""30 secondes""1 minute""2 minutes""10 minutes"
- "Ne jamais désactiver"
+ "30 minutes""Très lente"
@@ -58,18 +68,14 @@
"Automatique""Aucune""WEP"
- "WPA-PSK"
- "WPA2-PSK"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Aucun""WEP"
- "WPA-PSK"
- "WPA2-PSK"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automatique"
@@ -108,7 +114,7 @@
"Aucun""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Alerte""Vibreur"
+
+ "Aucune"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP"
+
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 016298aab4a..daafb843fb2 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Oui"
+ "Non""Inconnu""Allumer le signal radio""Éteindre le signal radio"
@@ -56,6 +58,7 @@
"OK""Carte SD""État de la batterie :"
+ "Prise électrique :""Batterie :""Niveau de la batterie :""État de la batterie :"
@@ -75,6 +78,11 @@
"Baisse du niveau de charge""Débranchée""Chargée"
+ "Débranché"
+ "CA"
+ "USB"
+ "CA + USB"
+ "Inconnu""Inconnu""Bon""Surchauffe"
@@ -104,6 +112,12 @@
"Demande d\'association Bluetooth""Demande d\'association""Sélectionner pour associer à "
+ "Sélecteur de périphérique Bluetooth"
+ "Demande d\'autorisation Bluetooth"
+ "Une application sur votre téléphone demande l\'autorisation d\'activer Bluetooth. Voulez-vous l\'activer ?"
+ "Une application sur votre téléphone demande l\'autorisation d\'activer la fonction de détection de votre téléphone par d\'autres appareils Bluetooth pendant %1$d secondes. Voulez-vous l\'activer ?"
+ "Une application sur votre téléphone demande l\'autorisation d\'activer Bluetooth et de permettre à d\'autres appareils de détecter votre téléphone pendant %1$d secondes. Voulez-vous l\'activer ?"
+ "Activation de Bluetooth…""Paramètres d\'heure et de date""13:00 h""13:00"
@@ -196,7 +210,8 @@
"Désactiver toutes les connexions sans fil""Désactivation des connexions sans fil…""Activation des connexions sans fil…"
- "Connexions sans fil"
+ "Sans fil et réseaux"
+ "Paramètres sans fil et réseau""Configurer le Wi-Fi, le mode Bluetooth, le mode Avion, les réseaux mobiles et le VPN""Itinérance des données""Se connecter aux services de données lors de l\'itinérance"
@@ -219,20 +234,29 @@
"Sélectionner format de date""Trier par ordre alphabétique""Trier par fuseau horaire"
- "Sécurité et localisation"
+ "Lieu et sécurité"
+ "Paramètres de sécurité et localisation""Définir les paramètres de l\'option Ma position et de verrouillage"
+ "Définir Ma position, le déverrouillage de l\'écran et le blocage des informations d\'identification stockées""Mots de passe""Bluetooth""Activer Bluetooth""Paramètres Bluetooth""Paramètres Bluetooth""Gérer les connexions, configurer le nom et l\'identification de l\'appareil"
- "Demande d\'association Bluetooth"
+ "Demande d\'association Bluetooth""Informations sur l\'appareil Bluetooth"
- "%1$s"\n\n"Saisissez le code PIN pour associer l\'appareil."\n"(Essayez avec 0000 ou 1234.)"
+ \n"Saisissez le code PIN pour associer l\'appareil à \"%1$s\". (Essayez avec 0000 ou 1234.)"
+ \n"Saisissez la clé d\'accès pour effectuer l\'association avec \"%1$s\"."
+ "Avant de se connecter à %1$s, vérifier qu\'il affiche la clé d\'accès : %2$s."
+ "%1$s"\n"souhaite effectuer l\'association."
+ "Entrez %2$s sur \"%1$s\" pour effectuer l\'association."
+ "Se connecter"
+ "Ne pas se connecter"
+ "Périphérique Bluetooth""Attention""Un problème est survenu lors de l\'association à %1$s."
- "Un problème est survenu lors de l\'association à %1$s, car le PIN saisi est incorrect."
+ "Un problème est survenu lors de l\'association à %1$s, car la clé d\'accès ou le code secret saisi est incorrect.""Impossible d\'établir la communication avec %1$s.""Association refusée par %1$s""Un problème est survenu lors de la connexion à %1$s."
@@ -246,6 +270,7 @@
"Se connecter à…""Multimédia""Téléphone"
+ "Transfert""Connecté aux paramètres audio du média""Connecté aux paramètres audio du téléphone""Connecté aux paramètres audio du téléphone et du média"
@@ -255,8 +280,11 @@
"Profils""Connecté aux paramètres audio du média""Connecté aux paramètres audio du téléphone"
+ "Connexion au serveur de transfert de fichiers"
+ "Connexion au serveur de transfert de fichiers non établie""Utiliser pour les paramètres audio du média""Utiliser pour les paramètres audio du téléphone"
+ "Utiliser pour le transfert de fichiers""Wi-Fi""Wi-Fi""Activer le Wi-Fi"
@@ -273,17 +301,13 @@
"Sécurité""Ouvrir""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Entreprise (802.1x)""Inconnu""réseau ouvert""sécurisé par clé WEP"
- "sécurisé par WPA"
- "sécurisé par WPA2"
- "sécurisé par WPA-EAP"
- "sécurisé par IEEE 802.1x"
+ "sécurisé via WPA/WPA2 PSK"
+ "sécurisé par 802.1x EAP""Adresse IP""Intensité du signal""Activation…"
@@ -302,14 +326,13 @@
"Anonyme""Certificat client""Certificat CA"
- "Mot de passe de clé privée""Mot de passe sans fil""Touche hex WEP (0-9, A-F)""Afficher le mot de passe""Rechercher""Hors de portée""enregistré"
- "Échec de la connexion. Sélectionnez cette option pour réessayer."
+ "Échec de la connexion. Appuyez dessus pour réessayer.""Réseaux Wi-Fi""SSID du réseau""Sécurité"
@@ -360,6 +383,7 @@
"Déconnecté""Échec""Sons et affichage"
+ "Paramètres des sons et affichages""Paramètres sonores""Configurer les sonneries, les notifications et la luminosité""Mode silencieux"
@@ -385,11 +409,14 @@
"Sélections audibles""Jouer un son lors des sélections à l\'écran""Jouer un son lors des sélections à l\'écran"
+ "Commentaire haptique"
+ "Vibrer lors de la sélection des touches programmables et lors de certaines interactions avec l\'interface utilisateur"
+ "Vibrer lors de la sélection des touches programmables et lors de certaines interactions avec l\'interface utilisateur""Notifications carte SD""Émettre un son pour les notifications de la carte SD""Émettre un son pour les notifications de la carte SD"
- "Synchro. des données"
- "Sélectionner les applications à synchroniser"
+ "Comptes et synchronisation"
+ "Ajouter ou supprimer des comptes et modifier leurs paramètres""Recherche""Configurer les paramètres et l\'historique de recherche""Paramètres d\'affichage"
@@ -403,6 +430,7 @@
"Régler la luminosité de l\'écran""Mise en veille de l\'écran""Définir le délai avant la mise hors tension automatique de l\'écran"
+ "Ajuster automatiquement la luminosité""Paramètres de blocage carte SIM""Configurer blocage SIM""Blocage de la carte SIM"
@@ -436,7 +464,8 @@
"État""État""Numéro de téléphone, signal, etc."
- "Carte SD et mémoire"
+ "Carte SD et mémoire"
+ "Carte SD et paramètres de mémoire du téléphone""Retirer la carte SD, afficher la mémoire disponible""Mon numéro de téléphone""MIN"
@@ -480,6 +509,11 @@
"Port MMS""MCC""MNC"
+ "Type d\'authentification"
+ "Aucune"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP""Type d\'APN (nom du point d\'accès)""Supprimer l\'APN""Nouvel APN"
@@ -518,12 +552,15 @@
"Utiliser réseaux sans fil""Afficher position dans les applications (comme Google Maps)""Position géographique déterminée par réseaux Wi-Fi et/ou mobile"
- "Activer les satellites GPS"
- "Localisation précise au niveau de la rue lors du positionnement géographique (désélectionner pour économiser la batterie)"
+ "Utiliser les satellites GPS"
+ "Localisation précise au niveau de la rue lors du positionnement géographique (désélectionner pour économiser la batterie)""Localiser au niveau rue (requiert + de batterie et une vue dégagée)"
- "Partager avec Google"
- "Autoriser Google à utiliser vos informations de localisation pour améliorer l\'efficacité des recherches et des autres services Google"
- "Autoriser Google à utiliser vos informations de localisation pour améliorer l\'efficacité des recherches et des autres services Google"
+ "Utiliser le GPS assisté"
+ "Utiliser le serveur pour assister le GPS (désactiver pour réduire l\'utilisation du réseau)"
+ "Utiliser le serveur pour assister le GPS (désactiver pour améliorer les performances du GPS)"
+ "Utiliser ma position"
+ "Utiliser mes informations de localisation pour améliorer l\'efficacité des recherches et des autres services Google"
+ "Souhaitez-vous autoriser Google à utiliser vos informations de localisation pour améliorer l\'efficacité des recherches et des autres services ?""Accepter""Refuser""À propos du téléphone"
@@ -538,6 +575,10 @@
"Licences open source""Un problème est survenu lors du chargement des licences.""Chargement..."
+ "Informations de sécurité"
+ "Informations de sécurité"
+ "Votre téléphone n\'est connecté à aucun service de données. Pour consulter ces informations maintenant, accédez à %s depuis un ordinateur connecté à Internet."
+ "Chargement…""Schéma de déverrouillage de l\'écran""Modifier le schéma de déverrouillage""Confirmer le schéma enregistré"
@@ -566,9 +607,9 @@
"Annuler""Suivant""Sécurisation de votre téléphone"
- "Protégez votre téléphone contre toute utilisation non autorisée en créant un schéma personnel de déverrouillage de l\'écran."\n\n"1"" L\'écran suivant vous présente un exemple de schéma "\n\n"2"" Lorsque vous êtes prêt, dessinez votre propre schéma de déverrouillage. Essayez différents schémas, mais reliez au moins quatre points."\n\n"Reproduisez votre schéma pour confirmer."\n\n"Pour commencer, sélectionnez \"Suivant\"."\n\n"Si vous ne souhaitez pas activer cette protection, sélectionnez \"Annuler\"."
+ "Protégez votre téléphone contre toute utilisation non autorisée en créant un schéma personnel de déverrouillage de l\'écran. "\n\n"1"" L\'écran suivant vous présente un exemple de schéma. "\n\n"2"" Lorsque vous êtes prêt, dessinez votre propre schéma de déverrouillage. Essayez-en plusieurs, mais veillez à relier au moins quatre points. "\n\n"3"" Reproduisez votre schéma pour confirmer votre choix. "\n\n"Pour commencer, appuyez sur \"Suivant\""". "\n\n"Si vous ne souhaitez pas activer la protection, appuyez sur \"Annuler\".""Exemple de schéma"
- "Reliez au moins quatre points."\n" "\n"Sélectionnez \"Suivant\" pour créer votre propre schéma."
+ "Reliez au moins quatre points."\n" "\n"Sélectionnez \"Suivant\" pour créer votre propre schéma.""Gérer les applications""Gérer et supprimer les applications installées""Applications"
@@ -602,12 +643,12 @@
"Filtrer""Options du filtre""Tous"
- "Tiers"
+ "Téléchargées""En cours d\'exécution""Chargement...""Calcul de la taille...""Supprimer"
- "Toutes les informations enregistrées dans cette application seront définitivement supprimées."
+ "Toutes les données de cette application vont être définitivement supprimées, y compris tous les fichiers, les paramètres, les comptes, les bases de données, etc.""OK""Annuler""L\'application n\'a pas été trouvée."
@@ -620,9 +661,23 @@
"Cette application peut accéder aux applications suivantes de votre téléphone :""Traitement...""Impossible de calculer la taille du paquet."
- "Aucune application tierce n\'est installée sur votre téléphone."
+ "Aucune application tierce n\'est installée.""version %1$s"
- "Par. régionaux et texte"
+ "Services en cours d\'exécution"
+ "Afficher et contrôler les services en cours d\'exécution"
+ "Redémarrage en cours"
+ "Aucun service en cours d\'exécution"
+ "Arrêter le service ?"
+ "Le service ne sera plus exécuté tant qu\'il ne sera pas relancé. Cette configuration peut avoir des conséquences gênantes sur l\'application %1$s."
+ "Arrêter"
+ "Annuler"
+ "Service démarré par l\'application : appuyez dessus pour l\'arrêter."
+ "%1$s : appuyez dessus pour gérer le service."
+ "Disponible : %2$s+%3$s dans %1$d"
+ "Autres : %2$s dans %1$d"
+ "Processus : %1$s"
+ "Langue et clavier"
+ "Paramètres de langue et clavier""Définir la langue et la région, la saisie de texte et la correction automatique""Paramètres régionaux""Paramètres du texte"
@@ -637,7 +692,7 @@
"Appuyez deux fois sur la touche Espace pour insérer \".\"""Mots de passe visibles""Afficher le mot de passe lors de la saisie"
- "Ce mode de saisie pourrait collecter le texte que vous saisissez, y compris vos données personnelles telles que les mots de passe et les numéros de carte de crédit. Ce mode est propre à l\'application %1$s. Voulez-vous vraiment activer ce mode de saisie ?"
+ "Ce mode de saisie pourrait collecter le texte que vous saisissez, y compris vos données personnelles telles que les mots de passe et les numéros de carte de crédit. Il provient de l\'application %1$s. Voulez-vous vraiment activer ce mode de saisie ?""Dictionnaire personnel""Dictionnaire personnel""Ajouter et retirer des mots du dictionnaire personnel"
@@ -665,7 +720,7 @@
"Saisie de texte""Gérer les options de saisie de texte""Paramètres %1$s"
- "Paramètres du clavier à l\'écran"
+ "Paramètres du clavier intégré""Clavier de l\'appareil""Paramètres du clavier intégré""Développement"
@@ -676,11 +731,11 @@
"L\'écran ne se met jamais en veille lors du chargement""Positions fictives""Autoriser les positions fictives"
- "Activer le débogage USB ?"
+ "Autoriser le débogage USB ?""Le débogage USB est conçu à des fins de développement uniquement. Il peut servir à copier des données entre votre ordinateur et votre appareil, à installer des applications sur votre appareil sans notification et à lire les données de journal.""Choisir un gadget""Choisir un widget"
- "Détails de l\'UID %d"
+ "Détails de l\'UID %d""UID %1$d""Données d\'utilisation du réseau pour %1$s :""Octets reçus : %1$d"
@@ -716,12 +771,13 @@
"Application""Nombre""Temps d\'utilisation"
- "Accessibilité"
+ "Accessibilité"
+ "Paramètres d\'accessibilité""Gérer les options d\'accessibilité""Accessibilité""Services d\'accessibilité""Aucun service d\'accessibilité installé"
- "Il est possible que ce service d\'accessibilité puisse recueillir tout le texte que vous saisissez, y compris les données personnelles et les numéros de cartes de crédit, mais pas les mots de passe. Il est également possible qu\'il enregistre vos interactions avec l\'interface utilisateur. Il provient de l\'application %1$s. Activer ce service d\'accessibilité ?"
+ "Ce service d\'accessibilité est susceptible de recueillir tout le texte que vous saisissez, y compris les données personnelles et les numéros de cartes de crédit, mais pas les mots de passe. Il est également possible qu\'il enregistre vos interactions avec l\'interface utilisateur. Il provient de l\'application %1$s. Utiliser ce service d\'accessibilité ?""Désactiver les services d\'accessibilité ?""Utilisation de la batterie""Répartition·de·l\'utilisation·de·la·batterie"
@@ -733,7 +789,7 @@
"Durée de fonctionnement de l\'appareil""Temps de fonctionnement du Wi-Fi""Temps de fonctionnement du Wi-Fi"
- "%1$s - %2$s %%"
+ "%1$s - %2$s%%""Infos détaillées sur l\'utilisation de la batterie""Détails d\'utilisation""Ajuster la consommation"
@@ -769,7 +825,7 @@
"Batterie utilisée par le Wi-Fi""Désactiver la fonctionnalité Wi-Fi lorsque vous ne l\'utilisez pas ou lorsqu\'elle n\'est pas disponible""Batterie utilisée par Bluetooth"
- "Désactiver Bluetooth lorsque vous ne l\'utilisez pas"
+ "Désactivez Bluetooth lorsque vous ne l\'utilisez pas.""Essayez·de·vous·connecter·à·un·autre·appareil·Bluetooth""Batterie utilisée par les applications en cours d\'exécution""Arrêter ou désinstaller l\'application"
@@ -781,9 +837,9 @@
"Actualiser""Système d\'exploitation Android""Serveur multimédia"
- "Synthèse vocale"
+ "SMS vocaux""Définir les options de synthèse vocale"
- "Contrôles du synthétiseur vocal"
+ "Paramètres de la synthèse vocale""Toujours utiliser mes paramètres""Les paramètres par défaut ci-dessous remplacent les paramètres de l\'application.""Paramètres par défaut"
@@ -801,8 +857,11 @@
"Voici un échantillon de synthèse vocale.""Vos paramètres ont été modifiés. Voici un échantillon illustrant les nouveaux paramètres.""Contrôle de l\'alimentation"
+ "Mise à jour des paramètres Wi-Fi"
+ "Mise à jour des paramètres Bluetooth"
+ "Programme d\'installation des identifiants""Paramètres de VPN"
- "Se connecter à %s"
+ "Connexion à \"%s\"""Nom d\'utilisateur :""Mot de passe :""un nom d\'utilisateur"
@@ -820,9 +879,9 @@
"Se déconnecter du réseau""Modifier le réseau""Supprimer un réseau"
- "Vous devez entrer %s."
- "Vous devez sélectionner %s."
- "Le nom de VPN \"%s\" existe déjà. Veuillez choisir un autre nom."
+ "Vous devez entrer \"%s\"."
+ "Vous devez sélectionner \"%s\"."
+ "Le nom de VPN \"%s\" existe déjà. Veuillez choisir un autre nom.""Voulez-vous vraiment supprimer ce VPN ?""Êtes-vous sûr de ne pas vouloir créer ce profil ?""Voulez-vous vraiment annuler les modifications apportées à ce profil ?"
@@ -833,10 +892,12 @@
"Un ou plusieurs secrets sont manquants dans cette configuration VPN. Voulez-vous contrôler les paramètres de vos secrets ?""Le nom d\'utilisateur ou le mot de passe entré est incorrect. Voulez-vous réessayer ?""Le serveur a raccroché. Le nom d\'utilisateur et le mot de passe que vous avez saisis sont peut-être incorrects. Voulez-vous réessayer ?"
+ "Le serveur a raccroché. Il est possible que vous soyez protégé par un pare-feu qui empêche toute connexion au serveur. Souhaitez-vous réessayer ?"
+ "Échec de la négociation avec le serveur. Le serveur n\'est peut-être pas conforme au paramètre de cryptage. Voulez-vous vérifier le paramètre de cryptage ?""Ajouter un VPN""Ajouter un VPN"
- "Ajouter un VPN %s"
- "Détails de %s"
+ "Ajouter le VPN \"%s\""
+ "Détails du profil \"%s\"""VPN""Connexion en cours…""Déconnexion en cours…"
@@ -844,8 +905,8 @@
"Se connecter au réseau""Nom du VPN""un nom de VPN"
- "Ajout de %s"
- "Modifications appliquées à %s"
+ "\"%s\" a été ajouté."
+ "Modifications appliquées à \"%s\"""Définir le certificat utilisateur""Certificat utilisateur""un certificat utilisateur"
@@ -866,53 +927,53 @@
"Nom du serveur VPN""Domaines de recherche DNS""Domaines de recherche DNS"
- "%s défini"
- "%s non défini"
- "%s non défini (facultatif)"
- "Activer %s"
- "Désactiver %s"
- "%s activé"
- "%s désactivé"
+ "Valeur \"%s\" définie"
+ "Valeur \"%s\" non définie"
+ "Valeur \"%s\" non définie (facultatif)"
+ "Activer \"%s\""
+ "Désactiver \"%s\""
+ "L\'option \"%s\" est activée."
+ "L\'option \"%s\" est désactivée.""Paramètres de VPN""Configurer et gérer les réseaux privés virtuels (VPN)""(aucune modification)""(non défini)"
- "Stockage des identifiants"
- "Utiliser des identifiants sécurisés"
- "Autoriser l\'accès des applications aux certificats sécurisés et identifiants"
- "Saisir le mot de passe"
- "Saisissez le mot de passe du stockage des identifiants."
- "Définir le mot de passe"
- "Définir/modifier le mot de passe du stockage des identifiants"
- "Définir le mot de passe"
- "Effacer le stockage"
- "Effacer le contenu du stockage des identifiants et réinitialiser le mot de passe"
- "Voulez-vous vraiment supprimer tous les identifiants et réinitialiser le mot de passe du stockage des identifiants ?"
- "Attribuer un nom au certificat"
- "Nom du certificat :"
- "Mot de passe d\'extraction du certificat :"
- "Détails du certificat :"
- "Le nom ne peut contenir que des lettres et des chiffres."
- "Mot de passe actuel :"
- "Nouveau mot de passe :"
- "Confirmer le nouveau mot de passe :"
- "Définissez le mot de passe du stockage des identifiants."
- "Définissez le mot de passe du stockage des identifiants."
- "Veuillez entrer le mot de passe approprié."
- "Entrez le mot de passe approprié. Il vous reste un essai avant que le stockage des identifiants ne soit effacé."
- "Entrez le mot de passe approprié. Il vous reste %d essais avant que le stockage d\'identifiants ne soit effacé."
- "Les mots de passe ne concordent pas."
- "Vous devez entrer un mot de passe et le confirmer."
- "Veuillez entrer le mot de passe."
- "Veuillez ressaisir le mot de passe. Il doit contenir au moins 8 caractères sans espace."
- "Veuillez entrer un nom."
- "Entrez un nom ne contenant que des lettres et des chiffres."
- "Impossible d\'enregistrer le certificat. Cliquez sur OK pour réessayer."
- "Impossible d\'enregistrer le certificat. Le stockage des informations d\'identification n\'est pas activé ou initialisé correctement."
- "Le certificat n\'est pas enregistré."
- "Les informations d\'identification stockées sont effacées."
- "Stockage des identifiants activé."
- "%s ajouté"
+ "Stockage des identifiants"
+ "Utiliser des identifiants sécurisés"
+ "Autoriser l\'accès des applications aux certificats sécurisés et aux identifiants"
+ "Saisir le mot de passe"
+ "Saisissez le mot de passe du stockage des identifiants."
+ "Installer depuis la carte SD"
+ "Installer les certificats cryptés depuis la carte SD"
+ "Définir le mot de passe"
+ "Définir/modifier le mot de passe de stockage des identifiants"
+ "Effacer le stockage"
+ "Effacer le contenu du stockage des identifiants et réinitialiser le mot de passe"
+ "Voulez-vous vraiment supprimer tous les identifiants et réinitialiser le mot de passe du stockage des identifiants ?"
+ "Mot de passe actuel :"
+ "Nouveau mot de passe :"
+ "Confirmer le nouveau mot de passe :"
+ "Définissez un mot de passe pour le stockage des identifiants (au moins 8 caractères)."
+ "Veuillez entrer le mot de passe approprié."
+ "Entrez le mot de passe approprié. Il vous reste un essai avant que le stockage des identifiants ne soit effacé."
+ "Entrez le mot de passe approprié. Il vous reste %1$d essais avant que les identifiants stockés ne soient effacés."
+ "Les mots de passe ne concordent pas."
+ "Vous devez entrer un mot de passe et le confirmer."
+ "Veuillez entrer le mot de passe."
+ "Le mot de passe doit contenir au moins 8 caractères."
+ "Le stockage des identifiants est effacé."
+ "Stockage des identifiants activé"
+ "Stockage des identifiants désactivé""Sonnerie d\'urgence""Définir le comportement en cas d\'appel d\'urgence"
+ "Confidentialité"
+ "Paramètres de confidentialité"
+ "Localisation"
+ "Paramètres"
+ "Données personnelles"
+ "Sauvegarder mes paramètres"
+ "Sauvegarde des paramètres"
+ "Voulez-vous vraiment arrêter de sauvegarder vos paramètres et supprimer toutes les copies des serveurs Google ?"
+
+
diff --git a/res/values-it/arrays.xml b/res/values-it/arrays.xml
index 7fadeaef09e..47d2c7c7a9f 100644
--- a/res/values-it/arrays.xml
+++ b/res/values-it/arrays.xml
@@ -24,13 +24,23 @@
"Pacifico""Tutte"
+
+ "Nessuna animazione"
+ "Alcune animazioni"
+ "Tutte le animazioni"
+
+
+ "Non viene visualizzata alcuna animazione delle finestre"
+ "Vengono visualizzate alcune animazioni delle finestre"
+ "Vengono visualizzate tutte le animazioni delle finestre"
+ "15 secondi""30 secondi""1 minuto""2 minuti""10 minuti"
- "Mai timeout"
+ "30 minuti""Molto lenta"
@@ -58,18 +68,14 @@
"Automatico""Nessuna""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Nessuna""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automatico"
@@ -108,7 +114,7 @@
"Nessuna""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Avviso""Vibrazione"
+
+ "Nessuno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP"
+
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index e5a743d804a..51f9afc8353 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Sì"
+ "No""Sconosciuto""Attiva segnale cellulare""Disattiva segnale cellulare"
@@ -56,6 +58,7 @@
"OK""Scheda SD""Stato batteria:"
+ "Presa di corrente:""Scala batteria:""Livello batteria:""Condizioni batteria:"
@@ -75,6 +78,11 @@
"Quasi scarica""Non in carica""Carica"
+ "Non collegato"
+ "CA"
+ "USB"
+ "CA+USB"
+ "Sconosciuto""Sconosciuto""Buono""Surriscaldamento"
@@ -104,6 +112,12 @@
"Richiesta accoppiamento Bluetooth""Richiesta accoppiamento""Seleziona per accoppiare "
+ "Selettore dispositivo Bluetooth"
+ "Richiesta autorizzazione Bluetooth"
+ "Un\'applicazione sul tuo telefono chiede l\'autorizzazione per attivare Bluetooth. Procedere?"
+ "Un\'applicazione sul tuo telefono chiede l\'autorizzazione per rendere il tuo telefono rilevabile da altri dispositivi Bluetooth per %1$d secondi. Procedere?"
+ "Un\'applicazione sul tuo telefono chiede l\'autorizzazione per attivare Bluetooth e rendere il tuo telefono rilevabile da altri dispositivi per %1$d secondi. Procedere?"
+ "Attivazione Bluetooth in corso…""Impostazioni data e ora""1:00 pm""13:00"
@@ -196,7 +210,8 @@
"Disattiva tutte le connessioni wireless""Disattivazione connessioni wireless...""Attivazione connessioni wireless..."
- "Controlli wireless"
+ "Wireless e reti"
+ "Impostazioni wireless e reti""Gestisci Wi-Fi, Bluetooth, modalità aereo, reti mobili e VPN""Roaming dati""Connessione a servizi di dati in roaming"
@@ -219,20 +234,29 @@
"Seleziona formato data""Ordine alfabetico""Ordina per fuso orario"
- "Protezione e posizione"
+ "Posizione e protezione"
+ "Impostazioni di posizione e protezione""Imposta La mia posizione, sblocco schermo, blocco SIM, blocco cred."
+ "Imposta La mia posizione, sblocco schermo, blocco archivio credenziali""Password""Bluetooth""Attiva Bluetooth""Impostazioni Bluetooth""Impostazioni Bluetooth""Gestisci le connessioni, imposta il nome e la rilevabilità del dispositivo"
- "Richiesta accoppiamento Bluetooth"
+ "Richiesta accoppiamento Bluetooth""Info dispositivo Bluetooth"
- "%1$s"\n\n"Digita il PIN per l\'accoppiamento."\n"Prova a usare 0000 o 1234."
+ \n"Digita il PIN per l\'accoppiamento con \"%1$s\". Prova a utilizzare 0000 o 1234."
+ \n"Digita passkey per eseguire accoppiamento con \"%1$s\"."
+ "Per eseguire l\'accoppiamento con \"%1$s\", conferma che è visualizzata la passkey: %2$s."
+ "%1$s"\n"chiede di eseguire l\'accoppiamento."
+ "Inserisci %2$s in \"%1$s\" per eseguire l\'accoppiamento."
+ "Accoppia"
+ "Non accoppiare"
+ "dispositivo Bluetooth""Attenzione""Errore durante l\'accoppiamento con %1$s."
- "Errore durante l\'accoppiamento con %1$s. Il PIN digitato è errato."
+ "Errore durante l\'accoppiamento con %1$s. La passkey o il PIN è errato.""Impossibile stabilire la comunicazione con %1$s.""Accoppiamento rifiutato da %1$s.""Errore durante la connessione a %1$s."
@@ -246,6 +270,7 @@
"Connessione a…""Media""Telefono"
+ "Trasferisci""Collegato ad audio media""Collegato ad audio telefono""Collegato ad audio telefono e media"
@@ -255,8 +280,11 @@
"Profili""Collegato ad audio media""Collegato ad audio telefono"
+ "Collegato al server di trasferimento file"
+ "Non collegato al server di trasferimento file""Usa per audio media""Usa per audio telefono"
+ "Usa per trasferimento file""Wi-Fi""Wi-Fi""Attiva Wi-Fi"
@@ -273,17 +301,13 @@
"Protezione""Apri""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Sconosciuta""rete aperta""protetta con WEP"
- "protetta con WPA"
- "protetta con WPA2"
- "protetta con WPA-EAP"
- "protetta con IEEE 802.1x"
+ "protetta con WPA/WPA2 PSK"
+ "protetta con 802.1x EAP""Indirizzo IP""Intensità segnale""Attivazione..."
@@ -302,14 +326,13 @@
"Identità anonima""Certificato client""Certificato CA"
- "Password chiave privata""Password wireless""Chiave esadecimale WEP (0-9, A-F)""Mostra password.""Scansione""Fuori portata""memorizzata"
- "Connessione non riuscita. Seleziona per riprovare"
+ "Connessione non riuscita. Tocca per riprovare""Reti Wi-Fi""SSID rete""Protezione"
@@ -360,6 +383,7 @@
"Disconnesso""Non riuscita""Audio e display"
+ "Impostazioni audio e display""Impostazioni audio""Imposta suonerie, notifiche e luminosità dello schermo""Modalità silenziosa"
@@ -385,11 +409,14 @@
"Selezione sonora""Riproduci toni durante una selezione sullo schermo""Riproduci toni durante una selezione sullo schermo"
+ "Feedback aptico"
+ "Vibrazione alla pressione di un tasto softkey e durante certe interazioni con l\'interfaccia utente"
+ "Vibrazione alla pressione di un tasto softkey e durante certe interazioni con l\'interfaccia utente""Notifiche scheda SD""Riproduci suono per notifiche scheda SD""Riproduci suono per notifiche scheda SD"
- "Sincronizzazione dati"
- "Seleziona le applicazioni da sincronizzare"
+ "Account e sincronizzazione"
+ "Aggiungi o rimuovi account e modifica impostazioni account""Ricerca""Gestisci le impostazioni e la cronologia delle ricerche""Impostazioni display"
@@ -403,6 +430,7 @@
"Regola la luminosità dello schermo""Timeout schermo""Regola il tempo che deve trascorrere prima che lo schermo si spenga automaticamente"
+ "Luminosità automatica""Impostazioni blocco SIM""Impostazioni blocco SIM""Blocco della SIM"
@@ -436,7 +464,8 @@
"Stato""Stato""Numero di telefono, segnale ecc."
- "Scheda SD e memoria"
+ "Scheda SD e memoria"
+ "Impostazioni scheda SD e memoria""Smonta la scheda SD, visualizza spazio di archiviazione disponibile""Il mio numero di telefono""MIN"
@@ -480,6 +509,11 @@
"Porta MMS""MCC""MNC"
+ "Tipo di autenticazione"
+ "Nessuno"
+ "PAP"
+ "CHAP"
+ "PAP o CHAP""Tipo APN""Elimina APN""Nuovo APN"
@@ -518,12 +552,15 @@
"Usa reti wireless""Visualizza la posizione nelle applicazioni (ad esempio Maps) utilizzando le reti wireless""Posizione determinata dalle reti mobili e/o Wi-Fi"
- "Attiva satelliti GPS"
- "Accuratezza a livello stradale (deseleziona per risparmiare batteria)"
+ "Utilizza satelliti GPS"
+ "Accuratezza a livello stradale (deseleziona per risparmiare batteria)""Localizza a livello stradale (richiede più batteria e la vista del cielo)"
- "Condividi con Google"
- "Consenti utilizzo posizione per migliorare ricerca e altri servizi"
- "Consenti a Google di utilizzare la posizione per migliorare i tuoi risultati di ricerca e altri servizi"
+ "Utilizza GPS assistito"
+ "Utilizza il server per assistere il GPS (deseleziona per ridurre l\'utilizzo della rete)"
+ "Utilizza il server per assistere il GPS (deseleziona per migliorare le prestazioni GPS)"
+ "Utilizza La mia posizione"
+ "Utilizza \"La mia posizione\" per i risultati di ricerca di Google e altri servizi Google"
+ "Consentire a Google di utilizzare la posizione per migliorare i risultati di ricerca e altri servizi?""Accetto""Non accetto""Info sul telefono"
@@ -538,6 +575,10 @@
"Licenze open source""Errore durante il caricamento delle licenze.""Caricamento..."
+ "Informazioni sulla sicurezza"
+ "Informazioni sulla sicurezza"
+ "Il telefono non è collegato a un servizio dati. Per visualizzare ora le informazioni, accedi a %s da qualsiasi computer collegato a Internet."
+ "Caricamento in corso...""Sequenza di sblocco schermo""Cambia sequenza sblocco""Conferma sequenza salvata"
@@ -566,9 +607,9 @@
"Annulla""Avanti""Protezione del telefono"
- "Proteggi il telefono dall\'uso non autorizzato creando una sequenza di sblocco dello schermo personalizzata. "\n\n"1"" Nella prossima schermata, osserva la creazione di una sequenza di esempio. "\n\n"2"" Quando sei pronto, crea la tua sequenza di sblocco personale. Prova diverse sequenze collegando sempre almeno quattro punti. "\n\n"3"" Inserisci di nuovo la sequenza per confermare. "\n\n"Pronto per iniziare? Seleziona “Avanti”"". "\n\n"Se non desideri proteggere il telefono, seleziona “Annulla”."
+ "Proteggi il telefono dall\'uso non autorizzato creando una sequenza di sblocco dello schermo personale. "\n\n"1"" Nella schermata successiva, osserva la creazione di una sequenza di esempio. "\n\n"2"" Quando sei pronto, crea la tua sequenza di sblocco personale. Prova diverse sequenze collegando sempre almeno quattro punti. "\n\n"3"" Inserisci di nuovo la sequenza per confermare. "\n\n"Pronto per iniziare? Tocca \"Avanti\""". "\n\n"Se non desideri proteggere il telefono, tocca \"Annulla\".""Sequenza di esempio"
- "Collega almeno quattro punti."\n" "\n"Seleziona \"Avanti\" quando sei pronto a creare la tua sequenza."
+ "Collega almeno quattro punti."\n" "\n"Tocca \"Avanti\" quando sei pronto a creare la tua sequenza.""Gestisci applicazioni""Gestisci e rimuovi applicazioni installate""Applicazioni"
@@ -602,12 +643,12 @@
"Filtra""Seleziona opzioni di filtro""Tutte"
- "Terze parti"
+ "Scaricate""In esecuzione""Caricamento...""Ricalcolo dimensioni...""Elimina"
- "Tutte le informazioni salvate nell\'applicazione verranno eliminate definitivamente."
+ "Tutti i dati dell\'applicazione verranno eliminati definitivamente, inclusi tutti i file, le impostazioni, gli account, i database e così via.""OK""Annulla""Applicazione non trovata"
@@ -620,9 +661,23 @@
"Contenuti a cui può accedere l\'applicazione sul telefono:""Elaborazione...""Impossibile stabilire le dimensioni del pacchetto"
- "Nessuna applicazione di terze parti installata."
+ "Nessuna applicazione di terze parti installata.""versione %1$s"
- "Lingua e testo"
+ "Servizi in esecuzione"
+ "Visualizza e controlla i servizi attualmente in esecuzione"
+ "In fase di riavvio"
+ "Nessun servizio in esecuzione"
+ "Interrompere il servizio?"
+ "Il servizio non verrà più eseguito fino al riavvio. Questa operazione potrebbe avere conseguenze indesiderate sull\'applicazione %1$s."
+ "Interrompi"
+ "Annulla"
+ "Avviato dall\'applicazione: tocca per interrompere"
+ "%1$s: tocca per la gestione"
+ "Disponibile: %2$s+%3$s in %1$d"
+ "Altro: %2$s in %1$d"
+ "Processo: %1$s"
+ "Lingua e tastiera"
+ "Impostazioni lingua e tastiera""Impostazioni internazionali (lingua e regione), di inserimento e correzione automatica del testo""Impostazioni lingua""Impostazioni testo"
@@ -637,7 +692,7 @@
"Premi due volte la barra spaziatrice per inserire \".\"""Password visibili""Mostra la password durante la digitazione"
- "Questo metodo di inserimento potrebbe riuscire a raccogliere tutto il testo digitato, compresi i dati personali come password e numeri di carte di credito. Si tratta del metodo dell\'applicazione %1$s. Attivare questo metodo di inserimento?"
+ "Questo metodo di inserimento potrebbe riuscire a raccogliere tutto il testo digitato, compresi i dati personali come password e numeri di carte di credito. Deriva dall\'applicazione %1$s. Utilizzare questo metodo di inserimento?""Dizionario utente""Dizionario utente""Aggiungi e rimuovi parole dal dizionario utente"
@@ -665,7 +720,7 @@
"Inserimento testo""Gestisci opzioni inserimento testo""Impostazioni di %1$s"
- "Impostazioni tastiera sullo schermo"
+ "Impostazioni tastiera sullo schermo""Tastiera dispositivo""Impostazioni tastiera incorporate""Sviluppo"
@@ -676,11 +731,11 @@
"Lo schermo non va mai in stand-by se sotto carica""Posizioni fittizie""Consenti posizioni fittizie"
- "Attivare debug USB?"
+ "Consentire debug USB?""Il debug USB è solo a scopo di sviluppo. Può servire per copiare dati tra il computer e il dispositivo, per installare applicazioni sul tuo dispositivo senza notifica e per leggere i dati dei log.""Scegli gadget""Scegli widget"
- "Dettagli per UID %d"
+ "Dettagli per UID %d""UID %1$d""Dettagli di utilizzo della rete per %1$s:""Byte ricevuti: %1$d"
@@ -716,12 +771,13 @@
"Applicazione""Conteggio""Tempo di utilizzo"
- "Accesso facilitato"
+ "Accesso facilitato"
+ "Impostazioni di accesso facilitato""Gestisci opzioni di accesso facilitato""Accesso facilitato""Servizi di accesso facilitato""Nessun servizio di accesso facilitato installato."
- "Questo servizio di accesso facilitato potrebbe riuscire a raccogliere tutto il testo digitato, compresi i numeri di carte di credito ma eccetto le password. Potrebbe anche registrare le tue interazioni con l\'interfaccia utente. Deriva dall\'applicazione %1$s. Attivare questo servizio di accesso facilitato?"
+ "Questo servizio di accesso facilitato potrebbe riuscire a raccogliere tutto il testo digitato, compresi i numeri di carte di credito ma eccetto le password. Potrebbe anche registrare le tue interazioni con l\'interfaccia utente. Deriva dall\'applicazione %1$s. Utilizzare questo servizio di accesso facilitato?""Disattivare accesso facilitato?""Utilizzo batteria""Consumo batteria"
@@ -733,7 +789,7 @@
"Tempo di attività dispositivo""Tempo accensione Wi-Fi""Tempo accensione Wi-Fi"
- "%1$s - %2$s%%"
+ "%1$s - %2$s%%""Dettagli utilizzo batteria""Dettagli di utilizzo""Regola consumo alimentazione"
@@ -769,7 +825,7 @@
"Batteria utilizzata da Wi-Fi""Disattiva Wi-Fi quando non è in uso o dove non è disponibile""Batteria utilizzata da Bluetooth"
- "Disattiva Bluetooth quando non è in uso"
+ "Disattiva Bluetooth quando non è in uso""Prova a connetterti a un altro dispositivo Bluetooth""Batteria utilizzata dalle applicazioni in esecuzione""Interrompi o disinstalla l\'applicazione"
@@ -781,9 +837,9 @@
"Aggiorna""Sistema operativo Android""MediaServer"
- "Sintesi vocale"
+ "Sintesi vocale""Imposta opzioni testo-voce"
- "Controlli sintetizzatore vocale"
+ "Impostazioni di sintesi vocale""Usa sempre le mie impostazioni""Le seguenti impostazioni predefinite hanno la priorità sulle impostazioni dell\'applicazione""Impostazioni predefinite"
@@ -801,8 +857,11 @@
"Questo è un esempio di sintesi vocale.""Le tue impostazioni sono cambiate. Ecco un esempio di come possono suonare.""Controllo risparmio energia"
+ "Aggiornamento impostazione Wi-Fi"
+ "Aggiornamento impostazione Bluetooth"
+ "Programma di installazione credenziali""Impostazioni VPN"
- "Connetti a %s"
+ "Connessione a %s""Nome utente:""Password:""un nome utente"
@@ -820,9 +879,9 @@
"Disconnetti dalla rete""Modifica rete""Elimina rete"
- "Inserisci %s."
- "Seleziona %s."
- "Il nome VPN \"%s\" esiste già. Trova un altro nome."
+ "Devi inserire %s."
+ "Seleziona %s."
+ "Il nome VPN \"%s\" esiste già. Trova un altro nome.""Eliminare questa VPN?""Non creare questo profilo?""Ignorare le modifiche apportate a questo profilo?"
@@ -833,10 +892,12 @@
"In questa configurazione VPN mancano uno o più segreti. Controllare la relativa impostazione?""La password o il nome utente inserito non è corretto. Riprovare?""Server bloccato. La password o il nome utente inserito potrebbe non essere corretto. Riprovare?"
+ "Server bloccato. È possibile che un firewall ti impedisca di collegarti al server. Riprovare?"
+ "Negoziazione con il server non riuscita. È possibile che il server non accetti la tua opzione di crittografia. Controllare l\'impostazione di crittografia?""Aggiungi VPN""Aggiungi VPN"
- "Aggiungi VPN %s"
- "Dettagli di %s"
+ "Aggiungi VPN %s"
+ "Dettagli %s""VPN""Connessione...""Disconnessione..."
@@ -844,8 +905,8 @@
"Connetti alla rete""Nome VPN""un nome VPN"
- "%s è stato aggiunto"
- "Le modifiche vengono apportate a %s"
+ "\"%s\" è stato aggiunto"
+ "Le modifiche vengono apportate a \"%s\"""Imposta certificato utente""Certificato utente""un certificato utente"
@@ -866,53 +927,53 @@
"Nome server VPN""Domini di ricerca DNS""Domini di ricerca DNS"
- "%s impostato"
- "%s non impostato"
- "%s non impostato (facoltativo)"
- "Attiva %s"
- "Disattiva %s"
- "%s è attivo"
- "%s non è attivo"
+ "%s impostato"
+ "%s non impostato"
+ "%s non impostato (facoltativo)"
+ "Attiva %s"
+ "Disattiva %s"
+ "%s è attiva"
+ "%s non è attiva""Impostazioni VPN""Configura e gestisci le reti private virtuali (VPN)""(invariato)""(non impostato)"
- "Archivio credenziali"
- "Usa credenziali protez."
- "Consenti accesso applicazioni a certificati protezione e altre credenziali"
- "Inserisci password"
- "Inserisci la password dell\'archivio di credenziali."
- "Imposta password"
- "Imposta o modifica la password dell\'archivio di credenziali"
- "Imposta password"
- "Cancella archivio"
- "Cancella l\'archivio di credenziali di tutti i contenuti e reimposta la relativa password"
- "Eliminare tutte le credenziali e reimpostare la password dell\'archivio di credenziali?"
- "Specifica un nome per il certificato"
- "Nome certificato:"
- "Password per l\'estrazione del certificato:"
- "Dettagli certificato:"
- "Il nome può contenere soltanto lettere e numeri."
- "Password attuale:"
- "Nuova password:"
- "Conferma nuova password:"
- "Imposta una password per l\'archivio di credenziali."
- "Imposta una password per l\'archivio di credenziali."
- "Inserisci la password corretta."
- "Inserisci la password corretta. Hai a disposizione un altro tentativo per inserirla, dopodiché l\'archivio di credenziali verrà cancellato."
- "Inserisci la password corretta. Hai a disposizione altri %d tentativi per inserirla, dopodiché l\'archivio di credenziali verrà cancellato."
- "Le password non corrispondono."
- "Inserisci una password e confermala."
- "Inserisci la password."
- "Inserisci di nuovo la password. La password deve essere formata da almeno 8 caratteri e non deve contenere spazi."
- "Inserisci un nome."
- "Inserisci un nome contenente soltanto lettere e numeri."
- "Impossibile salvare il certificato. Fai clic su OK per riprovare."
- "Impossibile salvare il certificato. L\'archivio di credenziali non è abilitato o inizializzato in modo appropriato."
- "Il certificato non è stato salvato."
- "L\'archivio di credenziali è cancellato."
- "L\'archivio di credenziali è attivo."
- "%s è stato aggiunto."
+ "Archivio credenziali"
+ "Usa credenziali protezione"
+ "Consenti accesso applicazioni a certificati protezione e altre credenziali"
+ "Inserisci password"
+ "Inserisci la password dell\'archivio di credenziali."
+ "Installa da scheda SD"
+ "Installa certificati crittografati da scheda SD"
+ "Imposta password"
+ "Imposta o modifica la password dell\'archivio di credenziali"
+ "Cancella archivio"
+ "Cancella·tutti·i·contenuti·dall\'archivio·di·credenziali·e·reimposta·la·relativa·password"
+ "Eliminare tutte le credenziali e reimpostare la password dell\'archivio di credenziali?"
+ "Password attuale:"
+ "Nuova password:"
+ "Conferma nuova password:"
+ "Imposta una password per l\'archivio di credenziali (almeno 8 caratteri)."
+ "Inserisci la password corretta."
+ "Inserisci la password corretta. Hai a disposizione un altro tentativo per inserirla, dopodiché l\'archivio di credenziali verrà cancellato."
+ "Inserisci la password corretta. Hai a disposizione altri %1$d tentativi per inserirla, dopodiché l\'archivio di credenziali verrà cancellato."
+ "Le password non corrispondono."
+ "Devi inserire una password e confermarla."
+ "Inserisci la password."
+ "La password deve essere formata da almeno 8 caratteri."
+ "L\'archivio di credenziali è cancellato."
+ "L\'archivio di credenziali è attivo."
+ "L\'archivio di credenziali non è attivo.""Tono chiamate di emergenza""Imposta il comportamento in caso di chiamata di emergenza"
+ "Privacy"
+ "Impostazioni privacy"
+ "Posizione"
+ "Impostazioni"
+ "Dati personali"
+ "Backup delle mie impostazioni"
+ "Backup impostazioni"
+ "Interrompere il backup delle impostazioni e cancellare tutte le copie sui server Google?"
+
+
diff --git a/res/values-ja/arrays.xml b/res/values-ja/arrays.xml
index 8db484ff71b..02436dff9d2 100644
--- a/res/values-ja/arrays.xml
+++ b/res/values-ja/arrays.xml
@@ -24,13 +24,23 @@
"太平洋""すべて"
+
+ "アニメーションなし"
+ "一部のアニメーション"
+ "すべてのアニメーション"
+
+
+ "ウィンドウアニメーションを表示しない"
+ "ウィンドウアニメーションの一部を表示"
+ "ウィンドウアニメーションをすべて表示"
+ "15秒""30秒""1分""2分""10分"
- "常時点灯"
+ "30分""非常に遅い"
@@ -58,18 +68,14 @@
"自動""なし""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""なし""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""自動"
@@ -108,7 +114,7 @@
"なし""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"アラート""バイブレーション"
+
+ "なし"
+ "PAP"
+ "CHAP"
+ "PAPまたはCHAP"
+
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 1baf6bca7cf..7d382f013b9 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -15,6 +15,8 @@
-->
+ "はい"
+ "いいえ""不明""無線通信をオン""無線通信をオフ"
@@ -56,6 +58,7 @@
"OK""SDカード""充電状況"
+ "電源:""電池の残量表示:""電池残量:""電池の状態:"
@@ -75,6 +78,11 @@
"放電中""充電していません""満充電"
+ "電池使用時間:"
+ "AC"
+ "USB"
+ "AC+USB"
+ "不明""不明""半分以上残っています""加熱状態"
@@ -104,6 +112,12 @@
"Bluetoothペア設定リクエスト""ペア設定リクエスト""ペアとして設定 "
+ "Bluetooth端末の選択"
+ "Bluetooth許可リクエスト"
+ "アプリケーションがBluetoothをONにする許可をリクエストしています。許可しますか?"
+ "アプリケーションが、この端末を%1$d秒間他のBluetooth端末から検出できるようにする許可をリクエストしています。許可しますか?"
+ "アプリケーションが、BluetoothをONにしてこの端末を%1$d秒間他の端末から検出できるようにする許可をリクエストしています。許可しますか?"
+ "BluetoothをONにしています...""日付と時刻""1:00 PM""13:00"
@@ -196,7 +210,8 @@
"ワイヤレス接続をすべて無効にする""ワイヤレス接続を無効にしています...""ワイヤレス接続を有効にしています..."
- "ワイヤレス設定"
+ "無線とネットワーク"
+ "ワイヤレスとネットワークの設定""Wi-Fi、Bluetooth、機内モード、モバイルネットワーク、VPNの設定""データローミング""ローミング中にデータサービスに接続します"
@@ -219,20 +234,29 @@
"日付形式""アルファベット順""タイムゾーン順"
- "セキュリティ & 位置情報"
+ "現在地情報とセキュリティ"
+ "位置情報とセキュリティの設定""現在地、画面のロック解除、SIMカードのロック、認証情報ストレージのロックの設定"
+ "現在地、画面のロック解除、認証情報ストレージのロックを設定します""パスワード""Bluetooth""BluetoothをONにする""Bluetooth設定""Bluetooth設定""端末の名前、接続や検出設定"
- "Bluetoothペア設定リクエスト"
+ "Bluetoothのペア設定リクエスト""Bluetooth端末情報"
- "%1$s"\n\n"ペアにするPINを入力してください。"\n"(0000か1234を試してください)"
+ \n"「%1$s」とペア設定するためのPINを入力してください(0000か1234を試してください)。"
+ \n"「%1$s」とペア設定するためのパスキーを入力してください。"
+ "「%1$s」とペア設定するには、パスキー:%2$sが表示されていることを確認してください。"
+ "%1$s"\n"がペア設定をリクエストしています。"
+ "ペア設定のため%2$sを「%1$s」に入力してください。"
+ "ペア設定する"
+ "ペア設定しない"
+ "Bluetooth端末""注意""%1$sとのペアリングで問題が発生しました。"
- "入力されたPINが正しくないため、%1$sとのペアリングで問題が発生しました。"
+ "入力されたPINまたはパスキーが正しくないため、%1$sとのペア設定で問題が発生しました。""%1$sとの通信を確立できません。""ペア設定が%1$sに拒否されました。""%1$sへの接続で問題が発生しました。"
@@ -246,6 +270,7 @@
"接続先...""メディア""電話"
+ "転送""メディアの音声に接続""携帯電話の音声に接続""携帯電話とメディアの音声に接続"
@@ -255,8 +280,11 @@
"プロフィール""メディアの音声に接続""携帯電話の音声に接続"
+ "ファイル転送サーバーに接続"
+ "ファイル転送サーバーに接続しない""メディアの音声に使用""携帯電話の音声に使用"
+ "ファイル転送に使用""Wi-Fi""Wi-Fi""Wi-FiをONにする"
@@ -273,17 +301,13 @@
"セキュリティ""オープン""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""不明""オープンネットワーク""WEPで保護"
- "WPAで保護"
- "WPA2で保護"
- "WPA-EAPで保護"
- "IEEE 802.1xで保護"
+ "WPA/WPA2 PSKで保護"
+ "802.1x EAPで保護""IPアドレス""電波強度""ONにしています..."
@@ -302,14 +326,13 @@
"匿名ID""クライアント証明書""CA証明書"
- "秘密鍵のパスワード""ワイヤレス接続パスワード""WEPの16進キー (0~9、A~F)""パスワードを表示""スキャン""圏外""接続履歴あり"
- "接続できませんでした。選択すると再試行します。"
+ "接続できませんでした。タップすると再試行します。""Wi-Fiネットワーク""ネットワークSSID""セキュリティ"
@@ -360,6 +383,7 @@
"切断""失敗""サウンド & 画面設定"
+ "音と表示の設定""音の設定""着信音、操作音、画面の明るさなど""マナーモード"
@@ -385,11 +409,14 @@
"選択時の操作音""メニュー選択時の操作音をONにする""メニュー選択時の操作音をONにする"
+ "入力時のバイブレーション"
+ "ソフトキーを押したときおよび特定のUI操作が発生したときにバイブレーションさせます"
+ "ソフトキーを押したときおよび特定のUI操作が発生したときにバイブレーションさせます""SDカードの通知""SDカード通知時に音を鳴らします""SDカード通知時に音を鳴らします"
- "データの同期"
- "同期するアプリケーションの選択"
+ "アカウントと同期"
+ "アカウントの追加や削除、アカウント設定の変更を行います""検索""検索設定と履歴の管理""画面設定"
@@ -403,6 +430,7 @@
"画面の明るさを調整する""バックライト消灯""画面バックライトを自動消灯するまでの時間"
+ "明るさを自動調整""SIMカードロック設定""SIMカードロック設定""SIMカードロック"
@@ -436,7 +464,8 @@
"端末の状態""端末の状態""電話番号、電波状態など"
- "SDカード & 端末容量"
+ "SDカードと端末容量"
+ "SDカードと端末容量の設定""SDカードの取り外し、空き容量の表示""電話番号""MIN"
@@ -480,6 +509,11 @@
"MMSポート""MCC""MNC"
+ "認証タイプ"
+ "なし"
+ "PAP"
+ "CHAP"
+ "PAPまたはCHAP""APNタイプ""APNを削除""新しいAPN"
@@ -518,12 +552,15 @@
"ワイヤレスネットワークを使用""無線ネットワークを使用するアプリケーション(地図など)で位置を表示する""Wi-Fi/モバイルネットワークで位置を検出する"
- "GPS機能をONにする"
- "高精度測位(電池の消費を節約する場合はOFFにしてください)"
+ "GPS機能を使用"
+ "高精度測位(電池の消費を節約する場合はOFFにしてください)""高精度測位(電池消費増、電波が良好な場所で使用)"
- "Googleと共有する"
- "検索やサービスの品質向上にGoogleが位置情報を使用することを許可しますか?"
- "検索結果やサービスの品質向上にGoogleが位置情報を使用することを許可しますか?"
+ "A-GPSを使用"
+ "サーバーでGPSを補助します(OFFにするとネットワーク使用率が減少します)"
+ "サーバーでGPSを補助します(OFFにするとGPS性能が向上します)"
+ "現在地情報を使用"
+ "現在地情報をGoogleの検索結果やサービスで利用する"
+ "検索結果やサービスの品質向上にGoogleが位置情報を使用することを許可しますか?""同意する""同意しない""端末情報"
@@ -538,6 +575,10 @@
"オープンソースライセンス""ライセンスの読み込み中に問題が発生しました。""読み込み中..."
+ "安全に関する情報"
+ "安全に関する情報"
+ "この電話はデータサービスに接続されていません。この情報を表示するにはインターネットに接続されたコンピュータから%sにアクセスしてください。"
+ "読み込み中...""画面ロックの解除パターン""パターンを変更する""現在のパターンを入力"
@@ -566,9 +607,9 @@
"キャンセル""次へ""携帯電話の保護"
- "画面ロックの解除パターンを作成して携帯電話の不正使用を防ぐことができます。"\n\n"1"" 次の画面でパターン作成の例を参考にしてください。"\n\n"2"" ロック解除パターンを決めたら、そのパターンを指でなぞって描きます。さまざまなパターンを作成できますが、最低4つの点を結んでください。"\n\n"3"" 確認のためもう一度そのパターンを入力します。"\n\n"[次へ]を押すと次に進みます""。"\n\n"パターンロックを設定しない場合は[キャンセル]を選択してください。"
+ "画面ロックの解除パターンを作成して携帯電話の不正使用を防ぐことができます。 "\n\n"1"" 次の画面に示すパターン作成の例を参考にしてください。"\n\n"2"" ロック解除パターンを決めたら、そのパターンを指でなぞって描きます。さまざまなパターンを作成できますが、最低4つの点を結んでください。"\n\n"3"" 確認のためもう一度そのパターンを入力します。"\n\n"[次へ]をタップすると次に進みます""。"\n\n"パターンロックを設定しない場合は[キャンセル]を選択してください。""パターン例"
- "少なくとも4つの点を結んで下さい。"\n" "\n"パターンを決めたら[次へ]を選択して進みます。"
+ "最低4つの点を結んでください。"\n" "\n"パターンを決めたら[次へ]をタップしてパターンを描画します。""アプリケーションの管理""インストール済みアプリケーションを管理/削除します""アプリケーション"
@@ -602,12 +643,12 @@
"フィルタ""フィルタオプションを選択""すべて"
- "サードパーティ"
+ "ダウンロード済み""実行中""読み込み中...""サイズを再計算中...""削除"
- "このアプリケーションで保存したすべての情報が完全に削除されます。"
+ "このアプリケーションのすべてのデータ(ファイル、設定、アカウント、データベースを含む)が完全に削除されます。""OK""キャンセル""アプリケーションが見つかりません"
@@ -620,9 +661,23 @@
"このアプリケーションは下記にアクセスできます:""計算中...""パッケージのサイズを計算できません"
- "サードパーティ製のアプリケーションはインストールされていません。"
+ "サードパーティ製アプリケーションはインストールされていません。""バージョン%1$s"
- "地域/言語 & 文字入力"
+ "実行中のサービス"
+ "現在実行中のサービスを表示して制御"
+ "再起動中"
+ "実行中のサービスはありません"
+ "サービスを停止しますか?"
+ "このサービスは、再起動するまで実行されません。アプリケーション%1$sにとって望ましくない結果になることがあります。"
+ "停止"
+ "キャンセル"
+ "アプリケーションから起動: 停止するにはタップしてください"
+ "%1$s: タップして管理"
+ "使用可能: %2$s+%3$s(%1$d内)"
+ "その他: %2$s(%1$d内)"
+ "プロセス: %1$s"
+ "言語とキーボード"
+ "言語とキーボードの設定""言語と地域、文字入力の設定""地域/言語設定""文字入力設定"
@@ -637,7 +692,7 @@
"英語: Spaceキー2回でピリオド(.)を挿入""パスワードを表示""入力時にパスワードを表示する"
- "この入力方法では入力したすべてのテキストの収集を許可します。収集されるテキストには個人情報データやクレジットカード番号などが含まれます。これはアプリケーション%1$sによるものです。この入力方法を有効にしますか?"
+ "この入力方法を選択すると、入力する全文字列の収集をアプリケーション(%1$s)に許可することになります。これにはパスワードやクレジットカード番号などの個人情報も含まれます。この入力方法を使用しますか?""ユーザー辞書""ユーザー辞書""ユーザー辞書に単語を登録/削除する"
@@ -665,7 +720,7 @@
"文字入力""テキスト入力オプションを管理""%1$sの設定"
- "画面キーボードの設定"
+ "画面キーボードの設定""端末内蔵キーボード""端末内蔵キーボードの設定""開発"
@@ -676,11 +731,11 @@
"充電中に画面をスリープにしない""擬似ロケーションを許可""擬似ロケーションを許可"
- "USBデバッグを有効にしますか?"
+ "USBデバッグを許可しますか?""USBデバッグは開発専用に設計されています。コンピュータと端末の間でデータをコピーする場合、アプリケーションを通知なしで端末にインストールする場合、ログ データを読み取る場合に使用できます。""ガジェットを選択""ウィジェットを選択"
- "UID %dの詳細"
+ "UID %dの詳細""UID %1$d""%1$sのネットワーク使用詳細:""受信バイト数:%1$d"
@@ -716,12 +771,13 @@
"アプリケーション""回数""使用時間"
- "ユーザー補助"
+ "ユーザー補助"
+ "ユーザー補助の設定""ユーザー補助オプションの管理""ユーザー補助""ユーザー補助サービス""ユーザー補助サービスがインストールされていません。"
- "このユーザー補助サービスを選択すると、入力する全テキストの収集をアプリケーション(%1$s)に許可することになります。これにはクレジットカード番号などの個人情報(パスワードを除く)も含まれます。また、ユーザーインターフェースでのやり取りも記録されます。このユーザー補助サービスを有効にしますか?"
+ "このユーザー補助サービスを選択すると、入力する全テキストの収集をアプリケーション(%1$s)に許可することになります。これにはクレジットカード番号などの個人情報(パスワードを除く)も含まれます。また、ユーザーインターフェースでのやり取りも記録されます。このユーザー補助サービスを使用しますか?""ユーザー補助サービスを無効にしますか?""電池使用量""電池を使用している操作"
@@ -733,7 +789,7 @@
"端末使用時間""WiFiをONにしている時間""BluetoothをONにしている時間"
- "%1$s - %2$s%%"
+ "%1$s - %2$s%%""電池使用量の詳細""詳細を使用""消費電力の調整"
@@ -769,7 +825,7 @@
"Wi-Fiの電池使用量""未使用時または電波が届かないときはWi-FiをOFFにします""Bluetoothの電池使用量"
- "未使用時はBluetoothをOFFにします"
+ "未使用時はBluetoothをOFFにします""別のBluetooth端末に接続してみてください""アプリケーションの実行時の電池使用量""アプリケーションを停止またはアンインストールします"
@@ -781,9 +837,9 @@
"更新""Android OS""メディアサーバー"
- "音声合成"
+ "テキスト読み上げ""テキストから音声への変換オプションの設定"
- "音声合成の制御"
+ "テキスト読み上げの設定""常に自分の設定を使用する""アプリケーション設定を下のデフォルト設定で上書きします""デフォルト設定"
@@ -801,8 +857,11 @@
"これは音声合成のサンプルです。""設定が変更されました。これがサンプル音です。""電源管理"
+ "Wi-Fi設定の更新"
+ "Bluetooth設定の更新"
+ "認証情報インストーラ""VPN設定"
- "%sに接続"
+ "%sに接続""ユーザー名:""パスワード:""ユーザー名"
@@ -820,9 +879,9 @@
"ネットワークから切断""ネットワークの編集""ネットワークを削除"
- "%sを入力する必要があります。"
- "%sを選択する必要があります。"
- "VPN名「%s」は既に存在します。別の名前にしてください。"
+ "%sを入力する必要があります。"
+ "%sを選択する必要があります。"
+ "VPN名「%s」は既に存在します。別の名前にしてください。""このVPNを削除してもよろしいですか?""このプロフィールの作成を中止してもよろしいですか?""このプロフィールに加えた変更を破棄してもよろしいですか?"
@@ -833,10 +892,12 @@
"このVPN設定には未設定のシークレット設定があります。シークレット設定を確認しますか?""入力したユーザー名またはパスワードが正しくありません。もう一度入力し直しますか?""サーバーから切断されました。入力したユーザー名またはパスワードが間違っている可能性があります。もう一度入力し直しますか?"
+ "サーバーから切断されました。ファイアウォールの背後にいるためにサーバーに接続できない可能性があります。もう一度接続しますか?"
+ "サーバーとのネゴシエーションに失敗しました。サーバーが暗号化オプションに同意しない場合があります。暗号化設定を確認しますか?""VPNの追加""VPNの追加"
- "%s VPNの追加"
- "%sの詳細"
+ "%s VPNを追加"
+ "%sの詳細""VPN""接続しています...""切断しています..."
@@ -844,8 +905,8 @@
"ネットワークに接続します""VPN名""VPN名"
- "%sが追加されました"
- "%sが変更されました"
+ "「%s」を追加しました"
+ "「%s」を変更しました""証明書を設定する""ユーザー証明書""ユーザー証明書"
@@ -866,53 +927,53 @@
"VPNサーバー名""DNS検索ドメイン""DNS検索ドメイン"
- "%sが設定されました"
- "%sは設定されていません"
- "%sは設定されていません(省略可)"
- "%sを有効にする"
- "%sを無効にする"
- "%sは有効になっています"
- "%sは無効になっています"
+ "%sが設定されました"
+ "%sは設定されていません"
+ "%sは設定されていません(省略可)"
+ "%sを有効にする"
+ "%sを無効にする"
+ "%sは有効です"
+ "%sは無効です""VPN設定""VPNを設定および管理します""(変更なし)""(未設定)"
- "認証情報ストレージ"
- "安全な認証情報を使用する"
- "安全な証明書とその他の認証情報へのアクセスをアプリケーションに許可する"
- "パスワードを入力する"
- "認証情報ストレージパスワードを入力します。"
- "パスワードの設定"
- "認証情報ストレージパスワードを設定または変更する"
- "パスワードの設定"
- "ストレージをクリアする"
- "認証情報ストレージのすべてのコンテンツをクリアしてパスワードをリセットする"
- "すべての認証情報を削除して認証情報ストレージパスワードをリセットしてもよろしいですか?"
- "証明書の名前を指定する"
- "証明書名:"
- "証明書を抽出するためのパスワード:"
- "証明書の詳細:"
- "名前には文字と数字以外を使用することはできません。"
- "現在のパスワード:"
- "新しいパスワード:"
- "新しいパスワードの確認:"
- "認証情報ストレージのパスワードを設定します。"
- "認証情報ストレージのパスワードを設定します。"
- "正しいパスワードを入力してください。"
- "正しいパスワードを入力してください。パスワードの入力にもう1回失敗すると、認証情報ストレージが削除されます。"
- "正しいパスワードを入力してください。パスワードの入力にあと%d回失敗すると、認証情報ストレージが削除されます。"
- "パスワードが一致しません。"
- "パスワードを入力して確認する必要があります。"
- "パスワードを入力してください。"
- "パスワードを再入力してください。パスワードは8文字以上である必要があり、スペースを含めることはできません。"
- "名前を入力してください。"
- "文字と数字だけを含んだ名前を入力してください。"
- "証明書を保存できません。[OK]をタップしてやり直してください。"
- "証明書を保存できません。認証情報ストレージが無効か、適切に初期化されていません。"
- "証明書は保存されていません。"
- "認証情報ストレージが消去されました。"
- "認証情報ストレージが有効になりました。"
- "%sが追加されました。"
+ "認証情報ストレージ"
+ "安全な認証情報の使用"
+ "安全な証明書とその他の認証情報へのアクセスをアプリケーションに許可する"
+ "パスワードを入力する"
+ "認証情報ストレージパスワードを入力します。"
+ "SDカードからインストール"
+ "暗号化された証明書をSDカードからインストールする"
+ "パスワードの設定"
+ "認証情報ストレージパスワードを設定または変更する"
+ "ストレージの消去"
+ "認証情報ストレージのすべてのコンテンツを消去してパスワードをリセットする"
+ "すべての認証情報を削除して認証情報ストレージパスワードをリセットしてもよろしいですか?"
+ "現在のパスワード:"
+ "新しいパスワード:"
+ "新しいパスワードの確認:"
+ "認証情報ストレージのパスワードを設定します(8文字以上)。"
+ "正しいパスワードを入力してください。"
+ "正しいパスワードを入力してください。パスワードの入力にもう1回失敗すると、認証情報ストレージが消去されます。"
+ "正しいパスワードを入力してください。パスワードの入力にあと%1$d回失敗すると、認証情報ストレージが消去されます。"
+ "パスワードが一致しません。"
+ "パスワードを入力して確認する必要があります。"
+ "パスワードを入力してください。"
+ "パスワードを8文字以上で入力してください。"
+ "認証情報ストレージが消去されました。"
+ "認証情報ストレージが有効になりました。"
+ "認証情報ストレージが無効になりました。""緊急時の音""緊急通報時の動作を設定します"
+ "プライバシー"
+ "プライバシーの設定"
+ "位置情報"
+ "設定"
+ "個人データ"
+ "設定のバックアップ"
+ "バックアップの設定"
+ "設定のバックアップを停止し、Googleサーバー上のすべてのコピーを消去してもよろしいですか?"
+
+
diff --git a/res/values-ko/arrays.xml b/res/values-ko/arrays.xml
index b376d77225b..645d8d53671 100644
--- a/res/values-ko/arrays.xml
+++ b/res/values-ko/arrays.xml
@@ -24,38 +24,59 @@
"태평양""모두"
+
+ "애니메이션 없음"
+ "일부 애니메이션"
+ "전체 애니메이션"
+
+
+ "창 애니메이션이 표시되지 않습니다."
+ "일부 창 애니메이션이 표시됩니다."
+ "모든 창 애니메이션이 표시됩니다."
+ "15초""30초""1분""2분""10분"
- "시간제한 없음"
+ "30분"
+
+
+ "매우 느림"
+ "느림"
+ "보통"
+ "빠름"
+ "매우 빠름"
+
+
+ "매우 낮음"
+ "낮음"
+ "보통"
+ "높음"
+ "매우 높음"
+
+
+ "미국식 영어"
+ "영국 영어"
+ "프랑스어"
+ "독일어"
+ "이탈리아어"
+ "스페인어"
+
+
+ "자동"
+ "없음"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x 엔터프라이즈"
+
+
+ "없음"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x 엔터프라이즈"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"자동""WEP ASCII"
@@ -64,14 +85,14 @@
"화면이 꺼질 때""전원에 연결되었을 때는 절전 모드로 전환되지 않음"
- "안함"
+ "절전 모드로 전환 안함""CPU 사용량""네트워크 사용량""GPS 사용량""센서 사용량"
- "부분적 가동 사용량"
+ "부분 가동 사용량""기타 사용량"
@@ -84,15 +105,27 @@
"계수 시작""응용프로그램 이름"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "없음"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "사용 안함"
+ "알리미"
+ "진동"
+
+
+ "없음"
+ "PAP"
+ "CHAP"
+ "PAP 또는 CHAP"
+
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 5bb4269bf67..d0553e0671b 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -15,6 +15,8 @@
-->
+ "예"
+ "아니요""알 수 없음""무선 켜기""무선 끄기"
@@ -56,6 +58,7 @@
"확인""SD 카드""배터리 상태:"
+ "전원 플러그:""배터리 충전 상태:""배터리 수준:""배터리 상태:"
@@ -75,6 +78,11 @@
"방전 중""충전 안함""충전 완료"
+ "전원연결되지 않음"
+ "AC"
+ "USB"
+ "AC+USB"
+ "알 수 없음""알 수 없음""좋음""과열"
@@ -104,14 +112,19 @@
"Bluetooth 페어링 요청""페어링 요청""페어링하려면 선택합니다. "
+ "Bluetooth 장치 선택기"
+ "블루투스 권한 요청"
+ "휴대전화의 응용프로그램에서 블루투스 사용 권한을 요청하고 있습니다. 사용하시겠습니까?"
+ "휴대전화의 응용프로그램에서 %1$d초 동안 다른 블루투스 장치에서 사용자의 휴대전화를 찾을 수 있는 권한을 요청하고 있습니다. 사용하시겠습니까?"
+ "휴대전화의 응용프로그램에서 블루투스 사용 및 %1$d초 동안 다른 장치에서 사용자의 휴대전화를 찾을 수 있는 권한을 요청하고 있습니다. 사용하시겠습니까?"
+ "블루투스 켜는 중...""날짜 및 시간 설정""1:00 PM""13:00""시간 변경""날짜""표준시간대 선택"
-
-
+ "보통(%s)""미리보기:""글꼴 크기:"
@@ -192,33 +205,23 @@
"프록시 설정""취소""설정"
-
-
+ "설정""비행 모드""모든 무선 연결 사용 안함""무선 연결을 끊는 중...""무선 연결 사용 중..."
- "무선 제어"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "무선 및 네트워크"
+ "무선 및 네트워크 설정"
+ "Wi-Fi, 블루투스, 비행 모드, 모바일 네트워크 및 VPN 관리"
+ "데이터 로밍"
+ "로밍 시 데이터 서비스에 연결"
+ "로밍 시 데이터 서비스에 연결"
+ "데이터 로밍을 사용 중지한 상태에서 홈 네트워크를 벗어났으므로 데이터 연결이 끊어졌습니다."
+ "사용"
+ "데이터 로밍을 허용하시겠습니까? 높은 로밍 요금이 부과될 수 있습니다."
+ "주의"
+ "운영자 선택"
+ "네트워크 운영자 선택""날짜 및 시간""날짜, 시간, 표준시간대 및 형식 설정""자동"
@@ -231,25 +234,31 @@
"날짜형식 선택""사전순으로 정렬""시간대별 정렬"
- "보안 및 위치"
-
-
+ "장소 및 보안"
+ "장소 및 보안 설정"
+ "내 위치, 화면 잠금해제, SIM 카드 잠금, 자격증명 저장소 잠금 설정"
+ "내 위치, 화면 잠금해제, 자격증명 저장소 잠금 설정""비밀번호""Bluetooth""Bluetooth 켜기""Bluetooth 설정""Bluetooth 설정""연결 관리, 장치이름 및 검색가능 여부 설정"
- "Bluetooth 페어링 요청"
+ "Bluetooth 페어링 요청""Bluetooth 장치 정보"
- "%1$s"\n\n"페어링을 위해 PIN 입력"\n"(0000 또는 1234를 입력하세요.)"
+ \n"\'%1$s\'와(과) 페어링하기 위해 PIN을 입력(0000 또는 1234)하세요."
+ \n"\'%1$s\'와(과) 페어링하려면 패스키를 입력하세요."
+ "\'%1$s\'와(과) 페어링하려면 다음 패스키가 표시 중인지 확인합니다. %2$s"
+ "%1$s"\n"에서 페어링하고자 합니다."
+ "페어링하려면 \'%1$s\'에서 %2$s을(를) 입력합니다."
+ "페어링"
+ "페어링 안함"
+ "블루투스 장치""주의""%1$s와(과) 페어링하는 동안 문제가 발생했습니다."
- "입력한 PIN이 올바르지 않기 때문에 %1$s와(과) 페어링하는 동안 문제가 발생했습니다."
-
-
-
-
+ "PIN 또는 패스키가 올바르지 않기 때문에 %1$s와(과) 페어링하는 동안 문제가 발생했습니다."
+ "%1$s와(과) 통화할 수 없습니다."
+ "%1$s에서 페어링을 거부했습니다.""%1$s에 연결하는 동안 문제가 발생했습니다.""장치 검색""연결"
@@ -261,6 +270,7 @@
"연결...""미디어""휴대폰"
+ "전송""미디어 오디오에 연결됨""휴대폰 오디오에 연결됨""휴대폰 및 미디어 오디오에 연결됨"
@@ -270,8 +280,11 @@
"프로필""미디어 오디오에 연결됨""휴대폰 오디오에 연결됨"
+ "파일 전송 서버에 연결됨"
+ "파일 전송 서버에 연결되지 않았습니다.""미디어 오디오에 사용""휴대폰 오디오에 사용"
+ "파일 전송에 사용""Wi-Fi""Wi-Fi""Wi-Fi 켜기"
@@ -288,25 +301,13 @@
"보안""열기""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "엔터프라이즈(802.1x)""알 수 없음"
-
-
-
-
-
-
-
-
-
-
-
-
+ "개방형 네트워크"
+ "WEP로 보안"
+ "WPA/WPA2 PSK로 보안됨"
+ "802.1x EAP로 보안""IP 주소""신호 강도""켜는 중..."
@@ -319,28 +320,19 @@
"네트워크를 저장할 수 없음""연결""%1$s에 연결"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "EAP 방식"
+ "단계 2 인증"
+ "ID"
+ "익명 ID"
+ "클라이언트 인증서"
+ "CA 인증서""무선 비밀번호""WEP 16진수 키(0-9, A-F)""비밀번호를 표시합니다.""검색""범위 내에 없음"
-
-
- "연결하지 못했습니다. 다시 시도하세요."
+ "저장됨"
+ "연결하지 못했습니다. 다시 시도하려면 터치하세요.""Wi-Fi 네트워크""네트워크 SSID""보안"
@@ -391,10 +383,11 @@
"연결 끊김""실패""소리 및 디스플레이"
+ "소리 및 디스플레이 설정""소리 설정""벨소리, 알림, 화면 밝기 설정""무음 모드"
- "미디어 및 알람을 제외하고 모두 무음 모드로 전환됩니다."
+ "미디어 및 알람을 제외하고 모두 무음 모드로 전환""미디어를 제외하고 모두 무음 모드로 전환됩니다.""전화 벨소리""수신전화 기본 벨소리 설정"
@@ -416,17 +409,16 @@
"선택항목 듣기""화면 선택 시 소리 재생""화면 선택 시 소리 재생"
+ "햅틱 반응"
+ "소프트키를 누르거나 특정 UI 사용 시 진동"
+ "소프트키를 누르거나 특정 UI 사용 시 진동""SD 카드 알림"
-
-
-
-
- "데이터 동기화"
- "동기화할 응용프로그램 선택"
-
-
-
-
+ "SD 카드 알림 시 사운드 재생"
+ "SD 카드 알림 시 사운드 재생"
+ "계정 및 동기화"
+ "계정 추가 또는 삭제 및 계정 설정 변경"
+ "검색"
+ "검색 설정 및 기록 관리""디스플레이 설정""애니메이션""창을 열고 닫을 때 애니메이션 표시"
@@ -438,6 +430,7 @@
"화면 밝기 조정""화면 시간제한""화면 자동 꺼짐 시간 간격 조정"
+ "자동 밝기""SIM 카드 잠금 설정""SIM 카드 잠금 설정""SIM 카드 잠금"
@@ -470,18 +463,14 @@
"표시할 수 없음""상태""상태"
-
-
- "SD 카드 및 휴대폰 저장공간"
+ "전화번호, 신호 등"
+ "SD 카드 및 휴대전화 저장공간"
+ "SD 카드 및 휴대전화 저장공간 설정""SD 카드 마운트 해제, 사용가능한 저장공간 보기"
-
-
-
-
-
-
-
-
+ "내 휴대전화 번호"
+ "MIN"
+ "PRL 버전"
+ "MEID""모바일 네트워크 유형""모바일 네트워크 상태""서비스 상태"
@@ -520,6 +509,11 @@
"MMS 포트""MCC""MNC"
+ "인증 유형"
+ "없음"
+ "PAP"
+ "CHAP"
+ "PAP 또는 CHAP""APN 유형""APN 삭제""새 APN"
@@ -535,11 +529,9 @@
"기본 APN 설정을 재설정했습니다.""기본값 데이터 재설정""휴대폰의 모든 데이터 지우기"
-
-
+ "휴대전화에서 다음 모든 데이터가 지워집니다."\n
"Google 계정"
\n
"시스템과 응용프로그램 데이터 및 설정"
\n
"다운로드한 응용프로그램"
\n"삭제되지 않는 항목은 다음과 같습니다. "\n
"현재 시스템 소프트웨어 및 번들 응용프로그램"
\n
"음악 또는 사진 등의 SD 카드 파일"
"휴대폰 재설정"
-
-
+ "모든 개인 정보와 다운로드한 응용프로그램을 삭제하시겠습니까? 수행한 작업은 취소할 수 없습니다.""모두 지우기""잠금해제 패턴을 그리세요.""휴대폰 재설정을 확인하려면 잠금해제 패턴을 그려야 합니다."
@@ -556,22 +548,21 @@
"음성메일, 착신전환, 통화중 대기, 발신자 번호 설정""모바일 네트워크""로밍, 네트워크, APN에 대한 옵션 설정"
-
-
+ "내 위치""무선 네트워크 사용""무선 네트워크를 사용하는 응용프로그램(예: 지도)에서 위치 보기""Wi-Fi 및/또는 모바일 네트워크에서 측정된 위치"
- "GPS 위성 사용"
- "도로 수준으로 정확하게 탐색(배터리를 절약하려면 선택 취소)"
+ "GPS 위성 사용"
+ "도로 수준으로 정확하게 탐색(배터리를 절약하려면 선택 취소)""도로 수준으로 탐색(항공사진이 더해져 배터리 추가로 필요)"
-
-
-
-
-
-
+ "GPS 도우미 사용"
+ "서버를 사용하여 GPS 보조(네트워크 사용량을 줄이려면 선택 취소)"
+ "서버를 사용하여 GPS 보조(GPS 성능을 개선하려면 선택 취소)"
+ "내 위치 사용"
+ "Google 검색결과 및 다른 Google 서비스에 내 위치 사용"
+ "검색결과 및 기타 서비스 향상을 위해 Google에 위치 정보를 제공하시겠습니까?""동의함"
- "동의하지 않음"
+ "동의 안함""휴대폰 정보""법률 정보, 휴대폰 상태, 소프트웨어 버전 보기""법률정보"
@@ -579,12 +570,15 @@
"저작권""라이센스""약관"
-
-
+ "시스템 안내서""휴대전화 사용법 알아보기""오픈소스 라이센스""라이센스를 로드하는 동안 문제가 발생했습니다.""로드 중..."
+ "안전 정보"
+ "안전 정보"
+ "휴대전화가 데이터 서비스에 연결되어 있지 않습니다. 지금 정보를 보려면 인터넷에 연결된 컴퓨터에서 %s(으)로 이동하세요."
+ "로드 중...""화면 잠금해제 패턴""잠금해제 패턴 변경""저장된 패턴 확인"
@@ -613,9 +607,9 @@
"취소""다음""휴대폰 보안 설정"
- "자신만의 화면 잠금해제 패턴을 만들어서 인증되지 않은 사람이 전화를 사용하지 못하게 하세요. "\n\n"1"" 다음 화면에서 패턴 예가 그려지는 것을 보세요. "\n\n"2"" 준비가 되었으면 자신의 잠금해제 패턴을 그리세요. 다른 패턴으로 실험해 볼 수 있습니다. 그러나 최소한 4개의 점을 연결해야 합니다. "\n\n"3"" 확인을 위해 자신의 패턴을 다시 그립니다. "\n\n"시작할 준비가 되었으면 \'다음\'을 선택합니다"". "\n\n"인증되지 않은 사람도 전화를 사용할 수 있게 하려면 \'취소\'를 선택하세요."
+ "나만의 화면 잠금해제 패턴을 만들어서 인증되지 않은 사람이 전화를 사용하지 못하게 하세요. "\n\n"1"" 다음 화면에서 패턴 예가 그려지는 것을 보세요. "\n\n"2"" 준비가 되었으면 나만의 잠금해제 패턴을 그리세요. 다른 패턴으로 실험해 볼 수 있으나 최소한 4개의 점을 연결해야 합니다. "\n\n"3"" 확인을 위해 패턴을 다시 그립니다. "\n\n"시작할 준비가 되었으면 \'다음\'을 터치합니다"". "\n\n"인증되지 않은 사람도 전화를 사용할 수 있게 하려면 \'취소\'를 터치하세요.""패턴 예"
- "4개 이상의 점을 연결합니다. "\n" "\n"고유한 패턴을 그릴 준비가 되면 \'다음\'을 선택합니다."
+ "4개 이상의 점을 연결합니다. "\n" "\n"나만의 패턴을 그릴 준비가 되면 \'다음\'을 터치합니다.""응용프로그램 관리""설치된 응용프로그램 관리 및 제거""응용프로그램"
@@ -638,8 +632,7 @@
"데이터""제거""데이터 지우기"
-
-
+ "업데이트 제거""이 응용프로그램을 해당 작업에 대한 기본 프로그램으로 실행하도록 선택했습니다.""기본값이 설정되지 않았습니다.""기본 작업 지우기"
@@ -650,32 +643,41 @@
"필터""필터 옵션 선택""모두"
- "제3자"
+ "다운로드됨""실행 중""로드 중...""크기 다시 계산 중...""삭제"
- "응용프로그램에 저장한 모든 정보가 영구적으로 삭제됩니다."
+ "응용프로그램의 전체 데이터가 영구적으로 삭제됩니다. 여기에는 모든 파일, 설정, 계정, 데이터베이스 등이 포함됩니다.""확인""취소""응용프로그램을 찾지 못했습니다.""응용프로그램이 설치된 응용프로그램 목록에 없습니다.""응용프로그램 데이터를 지울 수 없습니다."
-
-
-
-
-
-
-
-
+ "업데이트 제거"
+ "Android 시스템 응용프로그램에 대한 모든 업데이트를 제거하시겠습니까?"
+ "데이터 지우기"
+ "응용프로그램 데이터를 삭제하지 못했습니다.""이 응용프로그램은 휴대폰의 다음 항목에 액세스할 수 있습니다.""계산 중...""패키지 크기를 계산할 수 없습니다."
- "타사 응용프로그램이 설치되지 않습니다."
-
-
- "로케일 및 텍스트"
+ "타사 응용프로그램을 설치하지 않았습니다."
+ "버전 %1$s"
+ "실행 중인 서비스"
+ "현재 실행 중인 서비스 보기 및 제어"
+ "다시 시작하는 중"
+ "실행 중인 서비스 없음"
+ "서비스를 중지할까요?"
+ "다시 시작할 때까지 서비스가 더 이상 실행되지 않습니다. 이로 인해 %1$s 응용프로그램에서 원하지 않는 결과가 초래될 수 있습니다."
+ "중지"
+ "취소"
+ "응용프로그램에서 시작: 중지하려면 터치"
+ "%1$s: 관리하려면 터치"
+ "사용: %2$s+%3$s(%1$d개 프로세스)"
+ "기타: %2$s(%1$d개 프로세스)"
+ "프로세스: %1$s"
+ "언어 및 키보드"
+ "언어 및 키보드 설정""로케일(언어 및 지역), 텍스트 입력 및 자동 수정 옵션 설정""로케일 설정""텍스트 설정"
@@ -690,7 +692,7 @@
"스페이스바를 두 번 눌러 \'.\' 삽입""비밀번호 표시""입력 시 비밀번호 표시"
- "%1$s 응용프로그램에서 지원하는 이 입력 방법을 사용하면 비밀번호 및 신용카드 번호와 같은 개인 정보를 비롯하여 입력한 모든 텍스트가 수집될 수 있습니다. 사용하시겠습니까?"
+ "%1$s 응용프로그램에서 지원하는 이 입력 방법을 사용하면 비밀번호 및 신용카드 번호와 같은 개인 정보를 비롯하여 입력한 모든 텍스트가 수집될 수 있습니다. 사용하시겠습니까?""사용자 사전""사용자 사전""사용자 사전에서 단어 추가 및 삭제"
@@ -718,7 +720,7 @@
"텍스트 입력""텍스트 입력 옵션 관리""%1$s 설정"
- "화면 키보드 설정"
+ "화면 키보드 설정""기기 키보드""내장 키보드 설정""개발"
@@ -729,13 +731,11 @@
"충전하는 동안 화면이 꺼지지 않음""모의 위치 허용""모의 위치 허용"
-
-
-
-
+ "USB 디버깅을 허용하시겠습니까?"
+ "USB 디버깅은 개발용으로만 설계되었습니다. 이 기능을 사용하면 컴퓨터와 장치 간에 데이터를 복사하고 알림 없이 장치에 응용프로그램을 설치하며 로그 데이터를 읽을 수 있습니다.""가젯 선택""위젯 선택"
- "UID %d의 세부정보"
+ "UID %d의 세부정보""UID %1$d""%1$s의 네트워크 사용 세부정보""받은 바이트 수: %1$d"
@@ -746,14 +746,10 @@
"시스템 시간:""시간 합계:""시작: %1$d번"
-
-
-
-
-
-
-
-
+ "%1$d일 %2$d시간 %3$d분 %4$d초"
+ "%1$d시간 %2$d분 %3$d초"
+ "%1$d분 %2$d초"
+ "%1$d초""이 UID를 공유하는 패키지""배터리 사용 데이터가 없습니다.""센서:"
@@ -775,400 +771,209 @@
"응용프로그램""계수""사용 시간"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "접근성"
+ "접근성 설정"
+ "접근성 옵션 관리"
+ "접근성"
+ "접근성 서비스"
+ "설치한 접근성 서비스가 없습니다."
+ "접근성 서비스는 비밀번호를 제외한 개인 데이터 신용카드 번호 등과 같이 사용자가 입력한 모든 텍스트를 수집할 수 있습니다. 또한 사용자 인터페이스 상호 작용을 기록할 수도 있습니다. 이 서비스는 %1$s 응용프로그램에서 제공합니다. 접근성 서비스를 사용하시겠습니까?"
+ "접근성 서비스를 사용 중지하시겠습니까?"
+ "배터리 사용"
+ "배터리를 사용한 항목"
+ "플러그를 뽑은 이후 배터리 전원 사용"
+ "재설정 이후 배터리 사용"
+ "플러그를 뽑은 후 %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "장치 무중단 가동 시간"
+ "WiFi 사용 시간"
+ "WiFi 사용 시간"
+ "%1$s - %2$s%%"
+ "배터리 사용 세부정보"
+ "사용 세부정보"
+ "전원 사용 조절"
+ "포함된 패키지"
+ "디스플레이"
+ "Wi-Fi"
+ "Bluetooth"
+ "대기 소모 전력"
+ "음성 통화"
+ "휴대전화 유휴 상태"
+ "총 CPU"
+ "CPU 포그라운드"
+ "GPS"
+ "휴대전화"
+ "보낸 데이터"
+ "수신된 데이터"
+ "오디오"
+ "동영상"
+ "사용 시간"
+ "통화 불가능 시간"
+ "강제 종료"
+ "응용프로그램 정보"
+ "응용프로그램 설정"
+ "디스플레이 설정"
+ "WiFi 설정"
+ "Bluetooth 설정"
+ "음성 통화에서 배터리 사용"
+ "휴대전화가 유휴 상태일 때 배터리 사용"
+ "무선 라디오에서 배터리 사용"
+ "통화 불가능 지역에서는 전원을 절약하도록 비행 모드로 전환"
+ "디스플레이 및 백라이트에서 배터리 사용"
+ "화면 밝기 및/또는 화면 시간제한 줄이기"
+ "Wi-Fi에서 배터리 사용"
+ "사용 중이 아니거나 사용할 수 없을 때 Wi-Fi 사용 안함"
+ "블루투스에서 배터리 사용"
+ "사용 중이 아닐 때에는 Bluetooth 끄기"
+ "다른 블루투스 장치로 연결 시도"
+ "실행 중에 응용프로그램에서 배터리 사용"
+ "응용프로그램 중지 또는 제거"
+ "사용 중이 아닌 경우 GPS 사용 안함"
+ "응용프로그램에서 배터리 사용을 줄일 수 있는 설정을 제공할 수 있습니다."
+ "플러그를 뽑은 후 %1$s"
+ "마지막으로 플러그를 뽑은 이후 %1$s 동안"
+ "총 사용량"
+ "새로고침"
+ "Android OS"
+ "미디어 서버"
+ "텍스트를 음성으로 변환"
+ "TTS(text-to-speech) 옵션 설정"
+ "TTS(text-to-speech) 설정"
+ "항상 내 설정 사용"
+ "아래 기본 설정으로 응용프로그램 설정 덮어쓰기"
+ "기본 설정"
+ "말하는 속도"
+ "텍스트를 발음하는 속도"
+ "피치"
+ "발음된 텍스트의 톤에 적용"
+ "언어"
+ "발음된 텍스트에 대해 언어별로 음성을 설정합니다."
+ "예제 듣기"
+ "음성 합성 데모 짧게 재생"
+ "음성 데이터 설치"
+ "음성 합성을 사용하려면 음성 데이터를 설치해야 합니다."
+ "음성 합성에 필요한 음성이 이미 설치되어 있습니다."
+ "음성 합성의 예입니다."
+ "설정이 변경되었습니다. 다음은 소리나는 방식에 대한 예입니다."
+ "전원 컨트롤"
+ "Wi-Fi 설정 업데이트"
+ "블루투스 설정 업데이트"
+ "자격증명 설치 프로그램"
+ "VPN 설정"
+ "%s에 연결"
+ "사용자 이름:"
+ "비밀번호:"
+ "사용자 이름"
+ "비밀번호"
+ "사용자 이름 저장"
+ "연결"
+ "예"
+ "아니요"
+ "뒤로"
+ "아니요"
+ "저장"
+ "취소"
+ "되돌리기"
+ "네트워크 연결"
+ "네트워크에서 연결 해제"
+ "네트워크 수정"
+ "네트워크 삭제"
+ "%s을(를) 입력해야 합니다."
+ "%s을(를) 선택해야 합니다."
+ "VPN 이름(\'%s\')이 이미 있습니다. 다른 이름을 찾아보세요."
+ "VPN을 삭제하시겠습니까?"
+ "프로필을 만들지 않으시겠습니까?"
+ "프로필에 대한 변경을 취소하시겠습니까?"
+ "네트워크에 연결할 수 없습니다. 다시 시도하시겠습니까?"
+ "연결이 끊겼습니다. 다시 연결하시겠습니까?"
+ "서버 이름을 확인할 수 없습니다. 서버 이름 설정을 확인하시겠습니까?"
+ "자격 확인 오류입니다. 보안 설정을 확인하시겠습니까?"
+ "VPN 구성에서 하나 이상의 보안이 누락되었습니다. 보안 설정을 확인하시겠습니까?"
+ "입력한 사용자 이름 및 비밀번호가 올바르지 않습니다. 다시 시도하시겠습니까?"
+ "서버가 중단되었습니다. 입력한 사용자 이름 또는 비밀번호가 올바르지 않을 수 있습니다. 다시 시도하시겠습니까?"
+ "서버와의 연결이 끊겼습니다. 서버에 연결하지 못하게 하는 방화벽에 막혔을 수 있습니다. 다시 시도하시겠습니까?"
+ "서버 교섭에 실패했습니다. 서버가 암호화 옵션에 동의하지 않기 때문인 것 같습니다. 암호화 설정을 확인하시겠습니까?"
+ "VPN 추가"
+ "VPN 추가"
+ "%s VPN 추가"
+ "%s 세부정보"
+ "VPN"
+ "연결 중..."
+ "연결을 끊는 중..."
+ "연결됨"
+ "네트워크 연결"
+ "VPN 이름"
+ "VPN 이름"
+ "\'%s\'님이 추가되었습니다."
+ "\'%s\'을(를) 변경했습니다."
+ "사용자 인증서 설정"
+ "사용자 인증서"
+ "사용자 인증서"
+ "CA 인증서 설정"
+ "인증기관(CA) 인증서"
+ "CA 인증서"
+ "L2TP 보안 설정"
+ "L2TP 보안"
+ "L2TP 보안"
+ "암호화"
+ "PPTP 암호화"
+ "IPSec 사전 공유 키 설정"
+ "IPSec 사전 공유 키"
+ "IPSec 사전 공유 키"
+ "VPN 서버 설정"
+ "VPN 서버"
+ "VPN 서버"
+ "VPN 서버 이름"
+ "DNS 검색 도메인"
+ "DNS 검색 도메인"
+ "%s 설정됨"
+ "%s 설정 안함"
+ "%s 설정되지 않음(선택 사항)"
+ "%s 사용"
+ "%s 사용 안함"
+ "%s 사용"
+ "%s 사용 중지됨"
+ "VPN 설정"
+ "VPN 설정 및 관리"
+ "(변경 안함)"
+ "(설정 안함)"
+ "자격증명 저장소"
+ "보안 자격증명 사용"
+ "응용프로그램이 보안 인증서 및 다른 자격증명에 액세스할 수 있도록 합니다."
+ "비밀번호 입력"
+ "자격증명 저장소 비밀번호를 입력하세요."
+ "SD 카드에서 설치"
+ "SD 카드에서 암호화된 인증서 설치"
+ "비밀번호 설정"
+ "자격증명 저장소 비밀번호를 설정하거나 변경"
+ "저장소 삭제"
+ "모든 콘텐츠의 자격증명 저장소 삭제 및 비밀번호 재설정"
+ "모든 자격증명을 삭제하고 자격증명 저장소 비밀번호를 재설정하시겠습니까?"
+ "현재 비밀번호:"
+ "새 비밀번호:"
+ "새 비밀번호 확인:"
+ "자격증명 저장소를 위한 비밀번호(8자 이상)를 설정합니다."
+ "정확한 비밀번호를 입력하세요."
+ "정확한 비밀번호를 입력하세요. 한 번 더 비밀번호를 잘못 입력하면 자격증명 저장 내용이 삭제됩니다"
+ "정확한 비밀번호를 입력하세요. 앞으로 %1$d회 이상 비밀번호를 잘못 입력하면 자격증명 저장 내용이 삭제됩니다."
+ "비밀번호가 일치하지 않습니다."
+ "비밀번호를 입력하고 확인해야 합니다."
+ "비밀번호를 입력하세요."
+ "비밀번호는 8자 이상이어야 합니다."
+ "자격증명 저장소가 삭제되었습니다."
+ "자격증명 저장소를 사용합니다."
+ "자격증명 저장소를 사용 중지했습니다."
+ "긴급 신호음"
+ "긴급 통화 중 동작 설정"
+ "개인정보 보호"
+ "개인정보 설정"
+ "위치"
+ "설정"
+ "개인 데이터"
+ "내 설정 백업"
+ "설정 백업"
+ "설정 백업을 중지하고 Google 서버에 있는 사본을 모두 삭제하시겠습니까?"
+
diff --git a/res/values-nb/arrays.xml b/res/values-nb/arrays.xml
index 0d59474a2be..e759d4bf4e4 100644
--- a/res/values-nb/arrays.xml
+++ b/res/values-nb/arrays.xml
@@ -24,67 +24,108 @@
"Stillehavet""Alle"
+
+ "Ingen animasjoner"
+ "Enkelte animasjoner"
+ "Alle animasjoner"
+
+
+ "Ingen vindusanimasjoner vises"
+ "Noen vindusanimasjoner vises"
+ "Alle vindusanimasjoner vises"
+ "15 sekunder""30 sekunder""1 minutt""2 minutter""10 minutter"
- "Aldri slå av"
+ "30 minutter"
+
+
+ "Svært langsom"
+ "Langsom"
+ "Vanlig"
+ "Rask"
+ "Svært raskt"
+
+
+ "Svært lav"
+ "Lav"
+ "Vanlig"
+ "Høy"
+ "Svært høy"
+
+
+ "Engelsk (Amerika)"
+ "Engelsk (Storbritannia)"
+ "Fransk"
+ "Tysk"
+ "Italiensk"
+ "Spansk"
+
+
+ "Automatisk"
+ "Ingen"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Ingen"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automatisk""WEP ASCII""WEP heksadesimal"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ "Når skjermen slås av"
+ "Aldri når tilkoblet"
+ "Aldri"
+
+
+ "CPU-bruk"
+ "Nettverksbruk"
+ "GPS-bruk"
+ "Sensorbruk"
+ "Delvis våken bruk"
+ "Annen bruk"
+
+
+ "Siden sist uten strøm"
+ "Totalt siden oppstart"
+ "Totalt hele tiden"
+
+
+ "Brukstid"
+ "Start telling"
+ "Navn på program"
+
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Ingen"
+ "PAP"
+ "MSCHAP"
+ "MSCHAP2"
+ "GTC"
+
+
+ "Av"
+ "Varsel"
+ "Vibrering"
+
+
+ "Ingen"
+ "PAP"
+ "CHAP"
+ "PAP eller CHAP"
+
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 57bd4de1e94..d86f069199e 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -15,15 +15,17 @@
-->
+ "Ja"
+ "Nei""Ukjent""Slå på radio""Slå av radio""Slå på QXDM-minnekortlogg""Slå av QXDM-minnekortlogg""Se SIM-adressebok"
- "View Fixed Dialing Numbers"
- "View Service Dialing Numbers"
- "Get PDP list"
+ "Vis faste nummer"
+ "Vis tjenestenummer"
+ "Hent PDP-liste""Slå på datatilkobling""Slå av datatilkobling""Slå på data ved oppstart"
@@ -31,7 +33,7 @@
"I serviceperiode""Ute av serviceperiode""Kun nødsamtaler"
- "Radio off"
+ "Radio av""Roamer""Roamer ikke""Ledig"
@@ -56,6 +58,7 @@
"OK""Minnekort""Batteristatus:"
+ "Strømplugg:""Batteriskala:""Batterinivå:""Batterihelse:"
@@ -75,6 +78,11 @@
"Lader ut""Lader ikke""Full"
+ "Ikke plugget i"
+ "Nettstrøm"
+ "USB"
+ "Nettstrøm+USB"
+ "Ukjent""Ukjent""OK""For varmt"
@@ -104,8 +112,14 @@
"Paringsforespørsel for Bluetooth""Paringsforespørsel""Velg å pare med "
+ "Bluetooths enhetsvelger"
+ "Bluetooth-tillatelse"
+ "En applikasjon på telefonen spør om tillatelse til å slå på Bluetooth. Ønsker du å gjøre dette?"
+ "En applikasjon på telefonen spør om tillatelse for å gjøre telefonen synlig for andre Bluetooth-enheter i %1$d sekunder. Ønsker du å gjøre dette?"
+ "En applikasjon på telefonen spør om tillatelse til å slå på Bluetooth og gjøre telefonen synlig for andre enheter i %1$d sekunder. Ønsker du å gjøre dette?"
+ "Aktiverer Bluetooth…""Innstillinger for dato og tid"
- "1:00 pm"
+ "1:00 ettermiddag""13:00""Endre tid""Endre dato"
@@ -119,7 +133,7 @@
"Action:""Start activity""Resource:"
- "Account:"
+ "Konto:""Tøm""Port""Gjenopprett standardinnstillinger"
@@ -131,37 +145,37 @@
"Du må skrive inn et portnummer.""Feltet for portnummer må være tomt om feltet for vertsnavn er tomt.""Portnummeret er ikke gyldig."
- "Location:"
- "Neighboring CID:"
- "Data attempts:"
- "GPRS service:"
+ "Plassering:"
+ "Nabo-CID:"
+ "Dataforsøk:"
+ "GPRS-tjeneste:""Roaming:""IMEI:"
- "Call redirect:"
- "Number of PPP reset since boot:"
- "GSM disconnects:"
+ "Samtaleomdirigering:"
+ "Antall PPP-nullstillinger siden boot:"
+ "GSM-frakoblinger:""Gjeldende nettverk:"
- "Data successes:"
- "PPP received:"
- "GSM service:"
- "Signal strength:"
- "Call status:"
- "PPP sent:"
- "Radio resets:"
- "Message waiting:"
- "Phone number:"
- "Select radio band"
- "Network type:"
- "Set preferred network type:"
- "Ping IpAddr:"
- "Ping Hostname(www.google.com):"
- "HTTP Client test:"
- "Toggle ciphering"
- "Run ping test"
+ "Vellykket data:"
+ "PPP mottatt:"
+ "GSM-tjeneste:"
+ "Signalstyrke:"
+ "Samtalestatus:"
+ "PPP sendt:"
+ "Radio-nullstillinger:"
+ "Melding venter:"
+ "Telefonnummer:"
+ "Velg radiobånd"
+ "Nettverkstype:"
+ "Velg foretrukket nettverkstype:"
+ "Ping IP-adresse:"
+ "Ping vertsnavn(www.google.com):"
+ "HTTP-klienttest:"
+ "Sål av/på kryptering"
+ "Kjør ping-test""SMSC:"
- "Update"
- "Refresh"
- "Toggle DNS check"
+ "Oppdater"
+ "Last på nytt"
+ "Slå av/på DNS-sjekk""Velg GSM/UMTS-bånd""Henter båndliste…""Velg"
@@ -196,7 +210,8 @@
"Slå av alle trådløse tilkoblinger""Slår av trådløse tilkoblinger…""Slår på trådløse tilkoblinger…"
- "Trådløse nett"
+ "Trådløst og nettverk"
+ "Innstillinger for trådløst og nettverk""Trådløse nett, Bluetooth, flymodus, mobile nettverk, VPN""Dataroaming""Koble til datatjenester ved roaming"
@@ -219,20 +234,29 @@
"Datoformat""Sorter alfabetisk""Sorter etter tidssone"
- "Sikkerhet og plassering"
+ "Plassering og sikkerhet"
+ "Plassering og sikkerhet""Plassering, skjermlås, SIM-kort-lås"
+ "Angi Min posisjon, lås opp skjerm, lås påloggingsopplysninger""Passord""Bluetooth""Slå på Bluetooth""Bluetooth-innstillinger""Bluetooth-innstillinger""Tilkoblinger, enhetsnavn og synlighet"
- "Forespørsel om Bluetooth-paring"
+ "Bluetooth-paringsforespørsel""Bluetooth-enhetsinformasjon"
- "%1$s"\n\n"Skriv inn PIN-kode for å pare."\n"(Prøv 0000 eller 1234.)"
+ \n"Skriv PIN-kode for å pare med «%1$s». (Prøv 0000 eller 1234.)"
+ \n"Skriv inn passordet for å pare med «%1$s»."
+ "Hvis du vil pare med «%1$s», må du kontrollere at enheten viser passordet: %2$s"
+ "%1$s"\n"ønsker å pare."
+ "Skriv inn %2$s på «%1$s» for å pare."
+ "Paring"
+ "Ikke par"
+ "Bluetooth-enhet""NB""Det oppsto et problem under paring med %1$s."
- "Det oppsto et problem under paring med %1$s fordi PIN-koden du oppga var feil."
+ "Det oppsto et problem under paring med %1$s fordi PIN-koden eller passordet er feil.""Fikk ikke kontakt med %1$s.""%1$s avslo paring.""Kunne ikke koble til %1$s."
@@ -246,6 +270,7 @@
"Koble til…""Media""Telefon"
+ "Overfør""Koblet til medielyd""Koblet til telefonlyd""Koblet til medie- og telefonlyd"
@@ -255,8 +280,11 @@
"Profiler""Koblet til medielyd""Koblet til telefonlyd"
+ "Koblet til tjener for filoverføring"
+ "Ikke koblet til tjener for filoverføring""Bruk for medielyd""Bruk for telefonlyd"
+ "Bruk til filoverføring""Trådløst nett""Trådløst nett""Slå på trådløst nett"
@@ -273,17 +301,13 @@
"Sikkerhet""Åpen""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Ukjent""åpent nett""sikret med WEP"
- "sikret med WPA"
- "sikret med WPA2"
- "sikret med WPA-EAP"
- "sikret med IEEE 802.1x"
+ "sikret med WPA/WPA2 PSK"
+ "sikret med 802.1x EAP""IP-adresse""Signalstyrke""Slår på…"
@@ -302,14 +326,13 @@
"Anonym identitet""Klientsertifikat""CA-sertifikat"
- "Passord for privat nøkkel""Passord for trådløst nettverk""WEP-nøkkel i hex (0-9, A-F)""Vis passord.""Søk""Utenfor rekkevidde""husket"
- "Tilkoblingen mislyktes, velg for å prøve på nytt"
+ "Tilkoblingen mislyktes, velg for å prøve på nytt""Trådløse nettverk""Nettverks-SSID""Sikkerhet"
@@ -360,6 +383,7 @@
"Frakoblet""Mislykket""Lyd og skjerm"
+ "Lyd og bilde""Lydinnstillinger""Ringetoner, varsling, lysstyrke""Stillemodus"
@@ -385,13 +409,16 @@
"Hørbart valg""Lag lyd under skjermvalg""Lag lyd under skjermvalg"
+ "Vibrasjonsfeedback"
+ "Vibrer ved bruk av skjermtaster og enkelte UI-interaksjoner"
+ "Vibrer ved bruk av skjermtaster og enkelte UI-interaksjoner""Varsling for minnekort""Spill lyd for minnekortvarsler""Spill lyd for minnekortvarsler"
- "Datasynkronisering"
- "Applikasjoner som skal synkroniseres"
+ "Kontoer/synkronisering"
+ "Legge til eller fjerne kontoer og endre kontoinnstillinger""Søk"
- "Søkeinnstillinger og -historie"
+ "Søkeinnstillinger og -logg""Skjerminnstillinger""Animasjon""Vis animasjoner når vinduer åpnes og lukkes"
@@ -403,6 +430,7 @@
"Juster skjermens lysstyrke""Skjermsparer""Juster hvor lang tid som skal gå før skjermen slås av automatisk"
+ "Automatisk lysstyrke""Innstillinger for SIM-kort-lås""Sett opp SIM-kort-lås""SIM-kort-lås"
@@ -436,7 +464,8 @@
"Status""Status""Telefonnummer, signalstyrke, osv."
- "Minnekort og lagring"
+ "Minnekort og telefonlager"
+ "Minnekort og telefonlager""Avmonter minnekort, vis ledig plass""Telefonnummer""MIN"
@@ -480,6 +509,11 @@
"MMS-port""MCC""MNC"
+ "Autentiseringstype"
+ "Ingen"
+ "PAP"
+ "CHAP"
+ "CHAP""APN-type""Slett APN""Nytt APN"
@@ -495,14 +529,13 @@
"Ferdig med å gjenopprette standardvalg for APN""Fabrikkinnstillinger""Fjern alle data fra telefonen"
-
-
- "Nullstill telefonen"
+ "Dette vil fjerne alle data fra telefonen, herunder:"\n
"Google-kontoen din"
\n
"System- og programdata og -innstillinger"
\n
"Nedlastede programmer"
\n"Det vil ikke slette:"\n
"Gjeldende systemprogramvare og medfølgende programmer"
\n
"Filer på minnekortet, eksempelvis musikk eller bilder"
+ "Tilbakestill telefonen""Fjern all personlig informasjon og nedlastede applikasjoner? Dette kan ikke gjøres om!""Fjern alt""Tegn opplåsingsmønsteret"
- "Du må tegne opplåsingsmønsteret for å bekrefte nullstilling av telefonen."
- "Telefonen ble ikke nullstilt fordi nullstillingstjenesten ikke er tilgjengelig."
+ "Du må tegne opplåsingsmønsteret for å bekrefte tilbakestilling av telefonen."
+ "Telefonen ble ikke tilbakestilt fordi tilbakestillingstjenesten ikke er tilgjengelig.""Formater minnekort""Sletter alle data fra minnekortet""Dette valget vil slette alle data fra minnekortet i telefonen. Du vil miste ALLE data på kortet!"
@@ -519,12 +552,15 @@
"Bruk trådløse nettverk""Se plassering i applikasjoner (som kart) ved hjelp av trådløse nettverk""Plassering bestemmes ved hjelp av trådløse og/eller mobile nettverk"
- "Bruk GPS-satellitter"
- "Nøyaktig til gatenivå (slå av for å spare batteri)"
+ "Bruk GPS-satellitter"
+ "Nøyaktig til gatenivå (slå av for å spare batteri)""Finn plassering på gatenivå (bruker mer batteri, og trenger fri sikt til himmelen)"
- "Del med Google"
- "La Google bruke plasseringen til bedre søk og andre tjenester"
- "La Google bruke plasseringen til bedre søk og andre tjenester"
+ "Aktiver GPS med hjelp"
+ "Bruk tjener til å hjelpe GPS (opphev for å redusere nettverksbruken)"
+ "Bruk tjeneren til å hjelpe GPS (velg for å forbedre GPS-ytelsen)"
+ "Del med Google"
+ "La Google bruke plasseringen til bedre søk og andre tjenester"
+ "Vil du tillate Google å bruke din posisjon til å forbedre søkeresultatene og andre tjenester?""Godta""Avslå""Om telefonen"
@@ -539,6 +575,10 @@
"Åpen kildekode-lisenser""Kunne ikke hente lisensene.""henter…"
+ "Sikkerhetsinformasjon"
+ "Sikkerhetsinformasjon"
+ "Telefonen er ikke koblet til en datatjeneste. For å se informasjonen nå, gå til %s fra en datamaskin koblet til internett."
+ "Henter…""Opplåsingsmønster for skjerm""Opplåsingsmønster""Bekreft lagret mønster"
@@ -553,7 +593,7 @@
"Bekreft""Tegn på nytt""Prøv igjen"
- "Continue"
+ "Fortsett""Opplåsingsmønster""Krev mønster""Krev mønster for å låse opp skjermen"
@@ -567,9 +607,9 @@
"Avbryt""Neste""Sikring av telefonen"
- "Beskytt telefonen fra uautorisert bruk ved å lage et personlig opplåsingsmønster for skjermen. "\n\n"1"" På den neste skjermen, se på mens et eksempelmønster blir tegnet. "\n\n"2"" Når du er klar, tegn ditt eget personlige opplåsingsmønster. Prøv med forskjellige mønster, men tegn over minst fire prikker. "\n\n"3"" Tegn mønsteret på nytt for å bekrefte. "\n\n"Klar? Velg «neste»."" "\n\n"For å la telefonen forbli ubeskyttet, velg «Avbryt»."
+ "Beskytt telefonen fra uautorisert bruk ved å lage et personlig opplåsingsmønster for skjermen. "\n\n"1"" På den neste skjermen, se på mens et eksempelmønster blir tegnet. "\n\n"2"" Når du er klar, tegn ditt eget personlige opplåsingsmønster. Prøv med forskjellige mønster, men tegn over minst fire prikker. "\n\n"3"" Tegn mønsteret på nytt for å bekrefte. "\n\n"Klar? Velg «neste»."" "\n\n"For å la telefonen forbli ubeskyttet, velg «Avbryt».""Eksempelmønster"
- "Tegn over minst fire prikker."\n" "\n"Velg «Neste» når du er klar til å tegne ditt eget mønster."
+ "Tegn over minst fire prikker."\n" "\n"Velg «Neste» når du er klar til å tegne ditt eget mønster.""Installerte applikasjoner""Hold orden på og fjern installerte applikasjoner""Applikasjoner"
@@ -603,12 +643,12 @@
"Filter""Velg filtreringsinnstillinger""Alle"
- "Tredjeparts"
+ "Tredjeparts""Kjører""Laster…""Beregner størrelse på nytt…""Slett"
- "All informasjon du har lagret i denne applikasjonen vil bli fjernet permanent."
+ "All informasjon du har lagret i denne applikasjonen vil bli fjernet permanent.""OK""Avbryt""Fant ikke applikasjonen"
@@ -616,14 +656,28 @@
"Kunne ikke fjerne applikasjonsdata.""Avinstaller oppdateringer""Vil du avinstallere alle oppdateringer til denne Android-systemapplikasjonen?"
- "Nullstill data"
- "Kunne ikke nullstille data for applikasjonen"
+ "Tilbakestill data"
+ "Kunne ikke tilbakestille data for applikasjonen""Applikasjonen har disse rettighetene på telefonen:""Beregner fortsatt…""Kunne ikke beregne pakkestørrelse"
- "Ingen tredjepartsapplikasjoner er installert."
+ "Du har ingen tredjepartsprogrammer installert.""versjon %1$s"
- "Språk og tekst"
+ "Kjørende tjenester"
+ "Vis og kontroller tjenester som kjører for øyeblikket"
+ "Starter på nytt"
+ "Ingen kjørende tjenester"
+ "Stoppe tjenesten?"
+ "Tjenesten kjører ikke før den startes på nytt. Dette kan påvirke programmet %1$s på en negativ måte."
+ "Stopp"
+ "Avbryt"
+ "Startet av applikasjon: trykk for å avslutte"
+ "%1$s: Velg for å administrere"
+ "Tilgj.:%2$s + %3$s i %1$d"
+ "Andre: %2$s (%1$d pros.)"
+ "Prosess: %1$s"
+ "Språk og tastatur"
+ "Språk og tastatur""Innstillinger for språk, region, skriving av tekst og feilretting""Innstillinger for språk""Tekstinnstillinger"
@@ -638,7 +692,7 @@
"Trykk mellomromstasten to ganger for å skrive punktum""Synlige passord""Vis passord mens de skrives inn"
- "Inndatametoden har mulighet til å samle inn all tekst du skriver, inkludert personlige data som passord og kredittkortnummer. Den kommer fra applikasjonen %1$s. Aktiver inndatametoden?"
+ "Inndatametoden har mulighet til å samle inn all tekst du skriver, inkludert personlige data som passord og kredittkortnummer. Den kommer fra applikasjonen %1$s. Aktiver inndatametoden?""Ordliste""Ordliste""Legg til og fjern ord fra ordlisten"
@@ -666,7 +720,7 @@
"Skriving av tekst""Innstillinger for skriving av tekst""Innstillinger for %1$s"
- "Innstillinger for skjermtastatur"
+ "Innstillinger for skjermtastatur""Fysisk tastatur""Innstillinger for innebygget tastatur""Utvikling"
@@ -675,13 +729,13 @@
"Debug-modus når USB er koblet til""Forbli våken""Skjermen vil aldri blankes under lading"
- "Tillat manuell plassering"
- "Tillat manuell plassering"
- "Aktiver USB-debugging?"
+ "Tillat simulert plassering"
+ "Tillat bruk av simulerte GPS-koordinater"
+ "Aktiver USB-debugging?""USB-debugging er kun ment for utviklere. Det kan brukes for å kopiere data mellom datamaskinen og telefonen, installere applikasjoner på telefonen i det stille, og lese loggdata.""Velg gadget""Velg skrivebordselement"
- "Detaljer for UID %d"
+ "Detaljer for UID %d""UID %1$d""Nettbruk av %1$s:""Byte mottatt: %1$d"
@@ -717,26 +771,25 @@
"Applikasjon""Antall""Brukstid"
- "Tilgjengelighet"
+ "Tilgjengelighet"
+ "Tilgjengelighetsinnstillinger""Tilgjengelighetsvalg""Tilgjengelighet""Tjenester for tilgjengelighet""Ingen tilgjengelighetstjenester er installert."
-
-
+ "%1$sDenne tilgjengelighetstjenesten har tilgang til all tekst du skriver, inkludert personlig data som passord og kredittkortnummer. Den kan også loggføre alt som skjer i brukergrensesnittet. Det kommer fra programmet. Aktivere tilgjengelighetstjenesten?""Slå av tilgjengelighetsstøtten?""Batteribruk""Hva som har brukt batteri""Batteribruk siden strømmen ble trukket ut""Batteribruk siden omstart"
- "%1$s siden strømmen ble trukket ut"
+ "%1$s siden strømmen ble frakoblet""Tid enheten har vært våken""Tid trådløsnettet har vært aktivt""Tid Bluetooth har vært aktivt"
-
-
+ "%1$s – %2$s%%""Detaljert batteribrukinformasjon""Bruksdetaljer""Juster strømforbruk"
@@ -755,9 +808,8 @@
"Data mottatt""Lyd""Video"
- "TId på"
-
-
+ "Tid på"
+ "Tid uten signal""Tving avslutning""Info om applikasjon""Innstillinger for applikasjon"
@@ -771,24 +823,23 @@
"Batteri brukt av skjermen og baklyset""Skru ned lysstyrken og/eller tidsavbruddet for skjerm""Batteri brukt av trådløsnettet"
-
-
+ "Skru av trådløst nett når du ikke bruker det, eller det ikke er tilgjengelig""Batteri brukt av Bluetooth"
- "Skru av Bluetooth når det ikke er i bruk"
+ "Slå av Bluetooth når det ikke er i bruk""Prøv å koble til en annen Bluetooth-enhet""Batteri brukt av applikasjoner som ikke kjøres""Stopp eller avinstaller applikasjonen""Skru av GPS når den ikke er i bruk""Applikasjonen har muligens innstillinger som kan redusere batteribruken"
- "%1$s siden strømmen ble trukket ut"
+ "%1$s siden strømmen ble frakoblet""Siste gang uten strøm i %1$s""Total bruk""Oppdater""Android-operativsystem""Medietjener"
- "Talesyntese"
+ "Tekst til tale""Endre valg for talesyntese"
- "Talesyntese-kontroller"
+ "Talesyntese-kontroller""Overstyr innstillinger""Standardvalgene under overstyrer applikasjonsinnstillinger""Standardvalg"
@@ -806,8 +857,11 @@
"Dette er et eksempel på stemmesyntese.""Du har endret innstillingene dine. Dette er et eksempel på hvordan de høres ut.""Strømkontroll"
+ "Oppdaterer innstilling for Wi-Fi"
+ "Oppdatere Bluetooth-innstilling"
+ "Akkreditivinstallasjon""VPN-innstillinger"
- "Koble til %s"
+ "Koble til %s""Brukernavn:""Passord:""et brukernavn"
@@ -817,8 +871,7 @@
"Ja""Nei""Tilbake"
-
-
+ "Nei""Lagre""Avbryt""Tilbakestill"
@@ -826,38 +879,34 @@
"Koble fra nettverk""Rediger nettverk""Slett nettverk"
- "Du må skrive inn %s."
- "Du må velge %s."
- "VPN-navnet \'%s\' finnes allerede. Velg et annet navn."
+ "Du må skrive inn %s."
+ "Du må velge %s."
+ "VPN-navnet «%s»·finnes allerede. Velg et annet navn.""Er du sikker på at du ønsker å slette dette VPN-et?""Er du sikker på at du ikke ønsker å opprette denne profilen?""Er du sikker på at du vil forkaste endringene for denne profilen?""Kunne ikke koble til nettverket. Prøv igjen?"
-
-
-
-
-
-
-
-
-
-
-
-
+ "Mistet tilkoblingen. Koble til på nytt?"
+ "Kunne ikke slå opp tjenernavnet. Ønsker du å sjekke innstillingen for tjenernavn?"
+ "Autentiseringsfeil. Ønsker du å sjekke passordinnstillingene?"
+ "Et eller flere passord mangler i denne VPN-innstillingen. Ønsker du å sjekke passordinnstillingene?"
+ "Brukernavnet eller passordet er feil. Prøv igjen?"
+ "Tjeneren la på. Brukernavnet eller passordet kan være feil. Prøv igjen?"
+ "Tjeneren brøt forbindelsen. Det kan hende du befinner deg bak en brannmur som hindrer deg i å koble til tjeneren. Vil du prøve igjen?"
+ "Tjenerforhandling mislyktes. Det kan hende at tjeneren ikke er enig i krypteringsalternativet ditt. Vil du kontrollere krypteringsinnstillingene?""Legg til VPN""Legg til VPN"
- "Legg til %s-VPN"
- "Detaljer for %s"
+ "Legg til %s-VPN"
+ "Detaljer om %s""VPN"
- "Kobler til..."
- "Kobler fra..."
+ "Kobler til ..."
+ "Kobler fra ...""Tilkoblet""Koblet til nettverket""VPN-navn""et VPN-navn"
- "«%s» ble lagt til"
- "«%s» ble redigert"
+ "«%s» ble lagt til"
+ "«%s» ble endret""Velg klientsertifikat""Klientsertifikat""et klientsertifikat"
@@ -867,10 +916,8 @@
"Velg L2TP-passord""L2TP-passord""et L2TP-passord"
-
-
-
-
+ "kryptering"
+ "PPTP-kryptering""Velg forhåndsdelt nøkkel for IPSec""Forhåndsdelt nøkkel for IPSec""en forhåndsdelt nøkkel for IPSec"
@@ -880,60 +927,53 @@
"VPN-tjenernavn""DNS-søkesti""DNS-søkesti"
- "%s er valgt"
- "%s er ikke valgt"
- "%s er ikke valgt (frivillig)"
- "Aktiver %s"
- "Deaktiver %s"
- "%s er aktivert"
- "%s er deaktivert"
+ "%s er angitt"
+ "%s ikke angitt"
+ "%s er ikke angitt (valgfritt)"
+ "Aktiver %s"
+ "Deaktiver %s"
+ "%s er aktivert"
+ "%s er deaktivert""VPN-innstillinger""Sett opp og vedlikehold virtuelle private nettverk (VPN)"
-
-
-
-
- "Akkreditivlager"
- "Bruk sikre akkreditiver"
- "Gir applikasjoner tilgang til sikre sertifikater og andre akkreditiver"
- "Skriv inn passord"
- "Skriv inn passordet for akkreditivlager."
- "Velg passord"
- "Velg eller endre passordet for akkreditivlageret"
- "Velg passord"
- "Tøm lager"
- "Tøm akkreditivlageret for alt innhold, og nullstill passordet"
- "Er du sikker på at du ønsker å slette alle akkreditiver og nullstille passordet for akkreditivlageret?"
- "Gi sertifikatet et navn"
- "Sertifikatnavn:"
-
-
- "Detaljer for sertifikat:"
- "Navnet kan kun inneholde bokstaver og tall."
- "Nåværende passord:"
- "Nytt passord:"
- "Bekreft nytt passord:"
- "Velg et passord for akkreditivlageret."
- "Velg et passord for akkreditivlageret."
- "Skriv inn det riktige passordet."
- "Skriv inn det riktige passordet. Du har ett forsøk igjen før akkreditivlageret blir slettet."
- "Skriv inn det riktige passordet. Du har %d forsøk igjen før akkreditivlageret blir slettet."
- "Passordene stemmer ikke overens."
- "Du må skrive inn og bekrefte et passord."
- "Skriv inn et passord."
- "Skriv inn passordet på nytt. Passordet må ha minst åtte tegn, og kan ikke inneholde mellomrom."
- "Skriv inn et navn."
- "Skriv inn et navn som kun inneholder bokstaver og tall."
-
-
-
-
-
-
-
-
- "Akkreditivlagring er aktivert."
- "%s ble lagt til."
+ "(uendret)"
+ "(ikke satt)"
+ "Akkreditivlager"
+ "Bruk sikre akkreditiver"
+ "Gir applikasjoner tilgang til sikre sertifikater og andre akkreditiver"
+ "Velg passord"
+ "Skriv inn passordet for akkreditivlageret"
+ "Installer fra minnekort"
+ "Installer krypterte sertifikater fra minnekort"
+ "Velg passord"
+ "Velg eller endre passord for akkreditivlageret"
+ "Tøm lager"
+ "Tøm akkreditivlageret for alt innhold, og tilbakestill passordet"
+ "Er du sikker på at du ønsker å slette alle akkreditiver og tilbakestille passordet for akkreditivlageret?"
+ "Nåværende passord:"
+ "Nytt passord:"
+ "Bekreft nytt passord:"
+ "Velg et passord for akkreditivlageret (minst åtte tegn)"
+ "Galt passord. Prøv igjen."
+ "Skriv inn passordet. Du har ett forsøk igjen før akkreditivlageret blir tømt."
+ "Skriv inn passordet. Du har %1$d forsøk igjen før akkreditivlageret blir tømt."
+ "Passordene stemmer ikke overens."
+ "Du må skrive inn og bekrefte et passord."
+ "Skriv inn passordet."
+ "Passordet må bestå av minst åtte tegn."
+ "Akkreditivlageret ble tømt."
+ "Akkreditivlageret er aktivert."
+ "Akkreditivlageret er deaktivert.""Nødtone""Velg oppførsel når en nødsamtale opprettes"
+ "Personvern"
+ "Personverninnstillinger"
+ "Plassering"
+ "Innstillinger"
+ "Personlige data"
+ "Innstillingsbackup"
+ "Backup av innstillinger"
+ "Er du sikker på at du ønsker å slutte med backup av innstillingene og fjerne alle kopier på Googles tjenere?"
+
+
diff --git a/res/values-nl/arrays.xml b/res/values-nl/arrays.xml
index a96b716cfc7..377357d25d4 100644
--- a/res/values-nl/arrays.xml
+++ b/res/values-nl/arrays.xml
@@ -24,14 +24,17 @@
"Stille Oceaan""Alles"
-
- "15 seconden"
- "30 seconden"
- "1 minuut"
- "2 minuten"
- "10 minuten"
- "Nooit time-out"
+
+ "Geen animaties"
+ "Enkele animaties"
+ "Alle animaties"
+
+ "Er worden geen vensteranimaties weergegeven"
+ "Er worden een paar vensteranimaties weergegeven"
+ "Alle vensteranimaties worden weergegeven"
+
+
"Zeer langzaam""Langzaam"
@@ -58,18 +61,14 @@
"Automatisch""Geen""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Geen""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automatisch"
@@ -108,7 +107,7 @@
"Geen""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +115,8 @@
"Melding""Trillen"
+
+
+
+
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index fb0091019a4..6329a16fc4f 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ja"
+ "Nee""Onbekend""Radio inschakelen""Radio uitschakelen"
@@ -56,6 +58,7 @@
"OK""SD-kaart""Accustatus:"
+ "Voedingsstekker:""Accuschaal:""Accuniveau:""Accustaat:"
@@ -75,6 +78,11 @@
"Ontladen""Wordt niet opgeladen""Volledig"
+ "Niet aangesloten"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Onbekend""Onbekend""Goed""Oververhitting"
@@ -104,6 +112,12 @@
"Bluetooth-koppelingsverzoek""Koppelingsverzoek""Selecteer dit om te koppelen met "
+ "Apparaatkiezer van Bluetooth"
+ "Machtigingsverzoek voor Bluetooth"
+ "Een toepassing probeert Bluetooth in te schakelen. Wilt u dit toestaan?"
+ "Een toepassing probeert uw telefoon %1$d seconden zichtbaar te maken voor andere Bluetooth-apparaten. Wilt u dit toestaan?"
+ "Een toepassing probeert Bluetooth in te schakelen en uw telefoon %1$d seconden zichtbaar te maken voor andere apparaten. Wilt u dit toestaan?"
+ "Bluetooth inschakelen…""Datum- en tijdinstellingen""13:00 uur""01:00:00 PM"
@@ -196,7 +210,8 @@
"Alle draadloze verbindingen uitschakelen""Draadloze verbindingen uitschakelen...""Draadloze verbindingen inschakelen..."
- "Draadloze bedieningselementen"
+ "Draadloos en netwerken"
+ "Draadloze en netwerkinstellingen""Wi-Fi, Bluetooth, vliegmodus, mobiele netwerken en VPN\'s beheren""Gegevensroaming""Verbinding maken met gegevensservices tijdens roaming"
@@ -219,20 +234,29 @@
"Datumnotatie selecteren""Alfabetisch sorteren""Sorteren op tijdzone"
- "Beveiliging en locatie"
+ "Locatie en beveiliging"
+ "Locatie- en beveiligingsinstellingen""Mijn locatie\', schermontgrendeling, SIM- en referentieopslagvergrendeling instellen"
+ "\'Mijn locatie\' instellen, scherm ontgrendelen, opslag van referenties vergrendelen""Wachtwoorden""Bluetooth""Bluetooth inschakelen""Bluetooth-instellingen""Bluetooth-instellingen""Verbindingen beheren, apparaatnaam en vindbaarheid instellen"
- "Bluetooth-koppelingsverzoek"
+ "Bluetooth-koppelingsverzoek""Bluetooth-apparaatinfo"
- "%1$s"\n\n"Typ de PIN-code om te koppelen."\n"(Probeer 0000 of 1234.)"
+ \n"Typ de PIN-code om te koppelen met \'%1$s\'. (Probeer 0000 of 1234.)"
+ \n"Geef de toegangscode op om te koppelen met \'%1$s\'."
+ "Als u wilt koppelen met \'%1$s\', moet u bevestigen dat deze toegangscode wordt weergegeven: %2$s."
+ "%1$s"\n"wil koppelen."
+ "Voer %2$s in op \'%1$s\' om te koppelen."
+ "Koppelen"
+ "Niet koppelen"
+ "Bluetooth-apparaat""Let op""Er is een probleem opgetreden bij het koppelen met %1$s."
- "Er is een probleem opgetreden bij het koppelen met %1$s, omdat de opgegeven PIN-code onjuist is."
+ "Er is een probleem opgetreden bij het koppelen met %1$s, omdat de opgegeven PIN-code of toegangscode onjuist is.""Kan niet communiceren met %1$s.""Koppeling geweigerd door %1$s.""Er is een probleem opgetreden bij het verbinden met %1$s."
@@ -246,6 +270,7 @@
"Verbinding maken met…""Media""Telefoon"
+ "Overdracht""Verbonden met audio van medium""Verbonden met audio van telefoon""Verbonden met audio van telefoon en medium"
@@ -255,8 +280,11 @@
"Profielen""Verbonden met audio van medium""Verbonden met audio van telefoon"
+ "Verbonden met server voor bestandsoverdracht"
+ "Niet verbonden met server voor bestandsoverdracht""Gebruiken voor audio van medium""Gebruiken voor audio van telefoon"
+ "Gebruiken voor bestandsoverdracht""Wi-Fi""Wi-Fi""Wi-Fi inschakelen"
@@ -273,17 +301,13 @@
"Beveiliging""Open""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Onbekend""open netwerk""beveiligd met WEP"
- "beveiligd met WPA"
- "beveiligd met WPA2"
- "beveiligd met WPA-EAP"
- "beveiligd met IEEE 802.1x"
+ "beveiligd met WPA/WPA2 PSK"
+ "beveiligd met 802.1x EAP""IP-adres""Signaalsterkte""Inschakelen..."
@@ -302,14 +326,13 @@
"Anonieme identiteit""Klantcertificaat""CA-certificaat"
- "Wachtwoord voor privésleutel""Draadloos wachtwoord""Hexadecimale WEP-sleutel (0-9, A-F)""Wachtwoord weergeven.""Scannen""Niet binnen bereik""onthouden"
- "Verbinding mislukt. Selecteer dit om opnieuw te proberen."
+ "Verbinding mislukt. Raak aan om opnieuw te proberen""Wi-Fi-netwerken""SSID van netwerk""Beveiliging"
@@ -360,6 +383,7 @@
"Verbinding verbroken""Mislukt""Geluid en weergave"
+ "Geluid- en weergaveinstellingen""Geluidsinstellingen""Beltonen, meldingen, schermhelderheid instellen""Stille modus"
@@ -385,11 +409,14 @@
"Hoorbare selectie""Geluid afspelen bij schermselectie""Geluid afspelen bij schermselectie"
+ "Haptische feedback"
+ "Trillen bij indrukken van functietoetsen en bij bepaalde UI-interactie"
+ "Trillen bij indrukken van functietoetsen en bij bepaalde UI-interactie""SD-kaartmeldingen""Geluid afspelen voor SD-kaartmeldingen""Geluid afspelen voor SD-kaartmeldingen"
- "Gegevenssynchronisatie"
- "Selecteren welke toepassingen worden gesynchroniseerd"
+ "Accounts en synchronisatie"
+ "Accounts toevoegen of verwijderen en accountinstellingen wijzigen""Zoeken""Instellingen voor zoeken en zoekgeschiedenis beheren""Instellingen weergeven"
@@ -403,6 +430,7 @@
"Helderheid van het scherm aanpassen""Time-out scherm""De vertraging voor het automatisch uitschakelen van het scherm aanpassen"
+ "Automatische helderheid""Instellingen SIM-kaartvergrendeling""SIM-kaartvergrendeling instellen""SIM-kaartvergrendeling"
@@ -436,7 +464,8 @@
"Status""Status""Telefoonnummer, signaal, enzovoort"
- "SD-kaart en telefoongeheugen"
+ "SD-kaart en telefoongeheugen"
+ "Instellingen voor SD-kaart en telefoongeheugen""SD-kaart ontkoppelen, beschikbare opslagruimte weergeven""Mijn telefoonnummer""MIN"
@@ -480,6 +509,16 @@
"MMS-poort""MCC""MNC"
+
+
+
+
+
+
+
+
+
+ "APN-type""APN verwijderen""Nieuwe APN"
@@ -518,12 +557,15 @@
"Draadloze netwerken gebruiken""Locatie in toepassingen (zoals Maps) bekijken via draadloze netwerken""Locatie bepaald door Wi-Fi en/of mobiele netwerken"
- "GPS-satellieten inschakelen"
- "Locatie tot op straatniveau (uit om acculading te sparen)"
+ "GPS-satellieten gebruiken"
+ "Locatie tot op straatniveau (uitschakelen om acculading te sparen)""Locatie bepalen tot op straatniveau (meer stroom nodig en luchtweergave)"
- "Delen met Google"
- "Toestaan dat Google locatie gebruikt voor verbeterde zoekfunctie en andere services"
- "Toestaan dat Google locatie gebruikt voor verbeterde zoekresultaten en andere services"
+ "Ondersteunde GPS gebruiken"
+ "Server gebruiken ter ondersteuning van GPS (uitschakelen om het netwerkgebruik te beperken)"
+ "Server gebruiken ter ondersteuning van GPS (uitschakelen om GPS-prestaties te verbeteren)"
+ "\'Mijn locatie\' gebruiken"
+ "\'Mijn locatie\' gebruiken voor zoekresultaten en andere services van Google"
+ "Wilt u Google toestaan uw locatie te gebruiken voor verbeterde zoekresultaten en andere services?""Akkoord""Niet akkoord""Over de telefoon"
@@ -538,6 +580,10 @@
"Open-sourcelicenties""Er is een probleem bij het laden van de licenties.""Laden..."
+ "Veiligheidsinformatie"
+ "Veiligheidsinformatie"
+ "Uw telefoon heeft geen verbinding met een gegevensservice. Als u deze informatie nu wilt weergeven, gaat u op een computer met internetverbinding naar %s."
+ "Laden...""Ontgrendelingspatroon scherm""Ontgrendelingspatroon wijzigen""Opgeslagen patroon bevestigen"
@@ -566,9 +612,9 @@
"Annuleren""Volgende""Uw telefoon beveiligen"
- "Beveilig uw telefoon tegen ongeoorloofd gebruik door het instellen van een persoonlijk schermontgrendelingspatroon. "\n\n"1"" Op het volgende scherm ziet u hoe een voorbeeldpatroon wordt getekend. "\n\n"2"" Teken uw eigen persoonlijke ontgrendelingspatroon als het voorbeeld is voltooid. U kunt verschillende patronen uitproberen, maar u moet minimaal vier punten met elkaar verbinden. "\n\n"3"" Teken uw patroon nogmaals ter bevestiging. "\n\n"Bent u er klaar voor? Selecteer \'Volgende\'"". "\n\n"Als u uw telefoon niet wilt beveiligen, selecteert u \'Annuleren\'."
+ "Beveilig uw telefoon tegen ongeoorloofd gebruik door het instellen van een persoonlijk schermdeblokkeringspatroon. "\n\n"1"" Op het volgende scherm ziet u hoe een voorbeeldpatroon wordt getekend. "\n\n"2"" Teken uw eigen persoonlijke deblokkeringspatroon als het voorbeeld is voltooid. U kunt verschillende patronen uitproberen, maar u moet minimaal vier punten met elkaar verbinden. "\n\n"3"" Teken uw patroon nogmaals ter bevestiging. "\n\n"Bent u er klaar voor? Selecteer \'Volgende\'"". "\n\n"Als u uw telefoon niet wilt beveiligen, selecteert u \'Annuleren\'.""Voorbeeldpatroon"
- "Verbind minimaal vier punten. "\n" "\n"Selecteer \'Volgende\' als u klaar bent om uw eigen patroon te tekenen."
+ "Verbind minimaal vier punten. "\n" "\n"Selecteer \'Volgende\' als u klaar bent om uw eigen patroon te tekenen.""Toepassingen beheren""Geïnstalleerde toepassingen beheren en verwijderen""Toepassingen"
@@ -602,12 +648,12 @@
"Filter""Filteropties selecteren""Alles"
- "Derden"
+ "Gedownload""Wordt uitgevoerd""Laden...""Grootte opnieuw berekenen...""Verwijderen"
- "Alle informatie die u in deze toepassing heeft opgeslagen, wordt definitief verwijderd."
+ "Alle gegevens van deze toepassing worden permanent verwijderd. Dit omvat alle bestanden, instellingen, accounts, databases, enzovoort.""OK""Annuleren""Toepassing niet gevonden"
@@ -620,9 +666,25 @@
"Deze toepassing heeft toegang tot de volgende opties van uw telefoon:""Berekenen…""Kan grootte van pakket niet berekenen"
- "U heeft geen toepassingen van derden geïnstalleerd."
+ "U heeft geen toepassingen van derden geïnstalleerd.""versie %1$s"
- "Landinstelling en tekst"
+ "Actieve services"
+ "Services die momenteel actief zijn, weergeven en beheren"
+ "Opnieuw starten"
+ "Er zijn geen actieve services"
+ "Service stopzetten?"
+ "De service wordt niet langer uitgevoerd totdat deze opnieuw wordt gestart. Dit heeft mogelijk nadelige gevolgen voor de toepassing %1$s."
+ "Stoppen"
+ "Annuleren"
+ "Gestart door toepassing: aanraken om te stoppen"
+ "%1$s: aanraken om te beheren"
+
+
+
+
+ "Proces: %1$s"
+ "Taal en toetsenbord"
+ "Taal- en toetsenbordinstellingen""Instellingen voor taal en regio, tekstinvoer en autocorrectieopties opgeven""Landinstelling""Tekstinstellingen"
@@ -637,7 +699,7 @@
"Druk twee keer op de spatiebalk om een punt (.) in te voegen""Zichtbare wachtwoorden""Wachtwoord weergeven tijdens het typen"
- "Deze invoermethode verzamelt mogelijk alle tekst die u typt, inclusief persoonlijke gegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de toepassing %1$s. Deze invoermethode inschakelen?"
+ "Deze invoermethode verzamelt mogelijk alle tekst die u typt, inclusief persoonlijke gegevens zoals wachtwoorden en creditcardnummers. De methode is afkomstig uit de toepassing %1$s. Deze invoermethode inschakelen?""Gebruikerswoordenboek""Gebruikerswoordenboek""Woorden toevoegen en verwijderen"
@@ -665,7 +727,7 @@
"Tekstinvoer""Opties voor tekstinvoer beheren""Instellingen voor %1$s"
- "Instellingen voor schermtoetsenbord"
+ "Instellingen voor schermtoetsenbord""Apparaattoetsenbord""Instellingen voor ingebouwd toetsenbord""Ontwikkeling"
@@ -676,11 +738,11 @@
"Scherm gaat nooit uit tijdens het opladen""Neplocaties toestaan""Neplocaties toestaan"
- "USB-foutopsporing inschakelen?"
+ "USB-foutopsporing toestaan?""USB-foutopsporing is alleen bedoeld voor ontwikkelingsdoeleinden. Het kan worden gebruikt om gegevens te kopiëren tussen uw computer en uw apparaat, om toepassingen zonder melding op uw apparaat te installeren en om loggegevens te lezen.""Gadget kiezen""Widget kiezen"
- "Details voor UID %d"
+ "Details voor UID %d""UID %1$d""Netwerkgebruiksdetails voor %1$s:""Bytes ontvangen: %1$d"
@@ -716,12 +778,13 @@
"Toepassing""Aantal""Gebruikstijd"
- "Toegankelijkheid"
+ "Toegankelijkheid"
+ "Instellingen voor toegankelijkheid""Toegankelijkheidsopties beheren""Toegankelijkheid""Toegankelijkheidsservices""Geen geïnstalleerde toegankelijkheidsservices."
- "Deze toegankelijkheidsservice verzamelt mogelijk alle tekst die u typt, inclusief persoonlijke gegevens en creditcardnummers, maar geen wachtwoorden. De service kan ook uw interacties met de gebruikersinterface vastleggen. De service is afkomstig uit de toepassing %1$s. Deze toegankelijkheidsservice inschakelen?"
+ "Deze toegankelijkheidsservice verzamelt mogelijk alle tekst die u typt, inclusief persoonlijke gegevens en creditcardnummers, maar geen wachtwoorden. De service kan ook uw interacties met de gebruikersinterface vastleggen. De service is afkomstig uit de toepassing %1$s. Deze toegankelijkheidsservice inschakelen?""Toegankelijkheid uitschakelen?""Accugebruik""Waarvoor de accu is gebruikt"
@@ -733,7 +796,7 @@
"Stand-bytijd apparaat""Tijd Wi-Fi aan""Tijd Wi-Fi aan"
- "%1$s - %2$s%%"
+ "%1$s - %2$s%%""Details over accugebruik""Gebruiksdetails""Energieverbruik aanpassen"
@@ -769,7 +832,7 @@
"Accu gebruikt door Wi-Fi""Schakel Wi-Fi uit wanneer u dit niet gebruikt of waar dit niet beschikbaar is""Accu gebruikt door Bluetooth"
- "Schakel Bluetooth uit wanneer u dit niet gebruikt"
+ "Schakel Bluetooth uit wanneer u deze functie niet gebruikt""Probeer verbinding te maken met een ander Bluetooth-apparaat""Accu gebruikt door actieve toepassingen""De toepassing stoppen of verwijderen"
@@ -781,9 +844,9 @@
"Vernieuwen""Android-besturingssysteem""Mediaserver"
- "Spraaksynthese"
+ "Tekst-naar-spraak""Opties voor tekst-naar-spraak instellen"
- "Bedieningselementen voor spraaksynthesizer"
+ "Instellingen voor tekst-naar-spraak""Altijd mijn instellingen gebruiken""Onderstaande standaardinstellingen overschrijven toepassingsinstellingen""Standaardinstellingen"
@@ -801,8 +864,11 @@
"Dit is een voorbeeld van spraaksynthese.""Uw instellingen zijn gewijzigd. Dit is een voorbeeld van hoe ze klinken.""Energiebeheer"
+ "Wi-Fi-instelling bijwerken"
+ "Bluetooth-instelling bijwerken"
+ "Installatieprogramma voor referenties""VPN-instellingen"
- "Verbinden met %s"
+ "Verbinding maken met %s""Gebruikersnaam:""Wachtwoord:""een gebruikersnaam"
@@ -820,9 +886,9 @@
"Verbinding met netwerk verbreken""Netwerk bewerken""Netwerk verwijderen"
- "U moet \'%s\' invoeren."
- "U moet \'%s\' selecteren."
- "De VPN-naam \'%s\' bestaat al. Geef een andere naam op."
+ "U moet \'%s\' invoeren."
+ "U moet \'%s\' selecteren."
+ "De VPN-naam \'%s\' bestaat al. Geef een andere naam op.""Weet u zeker dat u dit VPN wilt verwijderen?""Weet u zeker dat u dit profiel niet wilt maken?""Weet u zeker dat u de wijzigingen in dit profiel wilt annuleren?"
@@ -833,10 +899,12 @@
"Een of meer geheimen ontbreken in deze VPN-configuratie. Wilt u uw geheime instelling controleren?""De door u ingevoerde gebruikersnaam of het door u ingevoerde wachtwoord is onjuist. Wilt u het opnieuw proberen?""Serververbinding verbroken. De gebruikersnaam of het wachtwoord dat u heeft ingevoerd, is onjuist. Wilt u het opnieuw proberen?"
+ "De server is vastgelopen. Wellicht bevindt u zich achter een firewall die een verbinding met de server blokkeert. Wilt u het opnieuw proberen?"
+ "Het contact met de server is mislukt. De server gaat wellicht niet akkoord met uw optie voor codering. Wilt u de instelling voor de codering controleren?""VPN toevoegen""VPN toevoegen"
- "VPN \'%s\' toevoegen"
- "Details voor %"
+ "VPN \'%s\' toevoegen"
+ "Details voor %s""VPN\'s""Verbinding maken...""Verbinding verbreken..."
@@ -844,8 +912,8 @@
"Verbinding maken met netwerk""VPN-naam""een VPN-naam"
- "%s is toegevoegd"
- "Er zijn wijzigingen aangebracht in %s"
+ "\'%s\' is toegevoegd"
+ "Er zijn wijzigingen aangebracht in \'%s\'""Gebruikerscertificaat instellen""Gebruikerscertificaat""een gebruikerscertificaat"
@@ -866,53 +934,79 @@
"Naam VPN-server""DNS-zoekdomeinen""DNS-zoekdomeinen"
- "%s is ingesteld"
- "%s niet ingesteld"
- "%s niet ingesteld (optioneel)"
- "%s inschakelen"
- "%s uitschakelen"
- "%s is ingeschakeld"
- "%s is uitgeschakeld"
+ "%s is ingesteld"
+ "%s is niet ingesteld"
+ "%s is niet ingesteld (optioneel)"
+ "%s inschakelen"
+ "\'%s\' uitschakelen"
+ "\'%s\' is ingeschakeld"
+ "\'%s\' is uitgeschakeld""VPN-instellingen""VPN\'s (Virtual Private Networks) instellen en beheren""(ongewijzigd)""(niet ingesteld)"
- "Opslag van referenties"
- "Beveiligingsreferenties gebruiken"
- "Toepassingen mogen veilige certificaten en andere referenties openen"
- "Voer het wachtwoord in"
- "Geef het wachtwoord voor de opslag van referenties op."
- "Wachtwoord instellen"
- "Het wachtwoord voor de opslag van referenties instellen"
- "Wachtwoord instellen"
- "Opslag wissen"
- "Referentieopslag voor inhoud wissen en wachtwoord opnieuw instellen"
- "Weet u zeker dat u alle referenties wilt verwijderen en het wachtwoord voor de opslag van referenties opnieuw wilt instellen?"
- "De naam voor het certificaat opgeven"
- "Certificaatnaam:"
- "Wachtwoord om het certificaat uit te pakken:"
- "Certificaatgegevens:"
- "De naam mag alleen letters en cijfers bevatten."
- "Huidig wachtwoord:"
- "Nieuw wachtwoord:"
- "Nieuw wachtwoord bevestigen:"
- "Stel een wachtwoord in voor de opslag van referenties."
- "Stel een wachtwoord in voor de opslag van referenties."
- "Voer het juiste wachtwoord in."
- "Voer het juiste wachtwoord in. U kunt nog één keer proberen het juiste wachtwoord in te voeren voordat de opgeslagen referenties worden verwijderd."
- "Voer het juiste wachtwoord in. U kunt nog %d keer proberen om het juiste wachtwoord in te voeren voordat de opgeslagen referenties worden verwijderd."
- "De wachtwoorden komen niet overeen."
- "U moet een wachtwoord invoeren en bevestigen."
- "Voer het wachtwoord in."
- "Voer het wachtwoord opnieuw in. Het wachtwoord moet ten minste 8 tekens bevatten en mag geen spaties bevatten."
- "Voer een naam in."
- "Voer een naam in die alleen uit letters en cijfers bestaat."
- "Kan het certificaat niet opslaan. Klik op \'OK\' om het opnieuw te proberen."
- "Kan het certificaat niet opslaan. De opslag van referenties is niet ingeschakeld of niet correct geïnitialiseerd."
- "Het certificaat is niet opgeslagen."
- "De opslag van referenties is gewist."
- "De opslag van referenties is ingeschakeld."
- "%s is toegevoegd."
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "Toon voor noodoproep""Gedrag bij noodoproepen instellen"
+ "Privacy"
+ "Privacyinstellingen"
+ "Locatie"
+ "Instellingen"
+ "Persoonlijke gegevens"
+ "Back-up maken van mijn instellingen"
+ "Back-up van instellingen"
+ "Weet u zeker dat het maken van back-ups van uw instellingen wilt stoppen en alle kopieën op Google-servers wilt wissen?"
+
+
diff --git a/res/values-pl/arrays.xml b/res/values-pl/arrays.xml
index f4c53439a9c..8b7c8d9a44a 100644
--- a/res/values-pl/arrays.xml
+++ b/res/values-pl/arrays.xml
@@ -24,13 +24,23 @@
"Pacyfik""Wszystkie"
+
+ "Brak animacji"
+ "Niektóre animacje"
+ "Wszystkie animacje"
+
+
+ "Brak wyświetlanych animacji okien"
+ "Niektóre animacje okien są wyświetlane"
+ "Wszystkie animacje okien są wyświetlane"
+ "15 sekund""30 sekund""1 minuta""2 minuty""10 minut"
- "Nigdy nie wygaszaj"
+ "30 minut""Bardzo wolno"
@@ -58,18 +68,14 @@
"Automatycznie""Brak""WEP"
- "WPA personal"
- "WPA2 personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Brak""WEP"
- "WPA personal"
- "WPA2 personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""Automatycznie"
@@ -108,7 +114,7 @@
"Brak""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"Alert""Wibracje"
+
+ "Brak"
+ "PAP"
+ "CHAP"
+ "PAP lub CHAP"
+
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 9624d6571f4..906ee611a38 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Tak"
+ "Nie""Nieznany""Włącz radio""Wyłącz radio"
@@ -56,6 +58,7 @@
"OK""Karta SD""Stan baterii:"
+ "Podłączone zasilanie:""Poziom baterii:""Poziom naładowania baterii:""Poziom baterii:"
@@ -75,6 +78,11 @@
"Rozładowywanie""Nie ładuje""Pełna"
+ "Odłączone"
+ "Zasilacz"
+ "USB"
+ "Zasilacz i USB"
+ "Nieznane""Nieznane""Dobry""Przegrzanie"
@@ -104,6 +112,12 @@
"Żądanie parowania Bluetooth""Żądanie parowania""Zaznacz, aby sparować "
+ "Selektor urządzenia Bluetooth"
+ "Prośba o pozwolenie na włączenie modułu Bluetooth"
+ "Aplikacja w telefonie prosi o pozwolenie na włączenie modułu Bluetooth. Czy chcesz na to zezwolić?"
+ "Aplikacja w telefonie prosi o pozwolenie na ustawienie telefonu jako wykrywalnego przez inne urządzenia Bluetooth na czas %1$d s. Czy chcesz na to zezwolić?"
+ "Aplikacja w telefonie prosi o pozwolenie na włączenie modułu Bluetooth i ustawienie telefonu jako wykrywalnego przez inne urządzenia na czas %1$d s. Czy chcesz na to zezwolić?"
+ "Trwa włączanie modułu Bluetooth...""Ustawienia daty i godziny""1:00 (po południu)""13:00"
@@ -196,7 +210,8 @@
"Wyłącz wszystkie połączenia bezprzewodowe""Wyłączanie połączeń bezprzewodowych...""Włączanie połączeń bezprzewodowych..."
- "Opcje bezprzewodowe"
+ "Sieci zwykłe i bezprzewodowe"
+ "Ustawienia sieci zwykłej i bezprzewodowej""Zarządzaj połączeniami Wi-Fi i Bluetooth, trybem samolotowym, sieciami komórkowymi i VPN.""Dane w roamingu""Połącz z usługami transmisji danych w roamingu"
@@ -219,20 +234,29 @@
"Wybierz format daty""Sortuj alfabetycznie""Sortuj według strefy czasowej"
- "Lokalizacja i blokady"
+ "Lokalizacja i zabezpieczenia"
+ "Ustawienia lokalizacji i zabezpieczeń""Ustaw funkcję Moja lokalizacja, odblokowywanie ekranu, blokadę karty SIM, blokadę magazynu danych logowania."
+ "Ustaw funkcję Moja lokalizacja, odblokowywanie ekranu, blokadę magazynu danych uwierzytelniania""Hasła""Bluetooth""Włącz Bluetooth""Ustawienia Bluetooth""Ustawienia Bluetooth""Zarządzaj połączeniami, ustaw nazwę urządzenia i możliwość wykrycia"
- "Żądanie parowania Bluetooth"
+ "Prośba o utworzenie powiązania Bluetooth""Informacje o urządzeniu Bluetooth"
- "%1$s"\n\n"Wpisz kod PIN, aby sparować."\n"(Spróbuj użyć kodu 0000 lub 1234.)"
+ \n"Wpisz kod PIN, aby utworzyć powiązanie z urządzeniem „%1$s”. (Spróbuj użyć kodu 0000 lub 1234)."
+ \n"Wpisz klucz, aby utworzyć powiązanie z urządzeniem „%1$s”."
+ "Aby powiązać z „%1$s”, potwierdź, że przedstawiony został klucz: %2$s."
+ "Urządzenie %1$s"\n"chce utworzyć powiązanie."
+ "Wprowadź klucz %2$s w urządzeniu „%1$s”, aby utworzyć powiązanie."
+ "Powiąż"
+ "Nie wykonuj powiązania"
+ "urządzenie Bluetooth""Uwaga""Wystąpił problem podczas parowania z urządzeniem %1$s"
- "Wystąpił problem podczas parowania z urządzeniem %1$s. Wpisany kod PIN jest nieprawidłowy."
+ "Wystąpił problem podczas tworzenia powiązania z urządzeniem %1$s, ponieważ kod PIN lub klucz jest niepoprawny.""Nie można nawiązać połączenia z urządzeniem %1$s.""Powiązanie odrzucone przez urządzenie %1$s.""Wystąpił problem podczas łączenia z urządzeniem %1$s"
@@ -246,6 +270,7 @@
"Połącz z siecią…""Multimedia""Telefon"
+ "Transfer""Połączono z funkcją audio multimediów""Połączono z funkcją audio telefonu""Połączono z funkcją audio telefonu i multimediów"
@@ -255,8 +280,11 @@
"Profile""Połączono z funkcją audio multimediów""Połączono z funkcją audio telefonu"
+ "Połączono z serwerem transferu plików"
+ "Brak połączenia z serwerem transferu plików""Użyj dla funkcji audio multimediów""Użyj dla funkcji audio telefonu"
+ "Użyj do transferu plików""Wi-Fi""Wi-Fi""Włącz Wi-Fi"
@@ -273,17 +301,13 @@
"Zabezpieczenia""Otwarta""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Nieznane""sieć otwarta""zabezpieczona protokołem WEP"
- "zabezpieczone protokołem WPA"
- "zabezpieczone protokołem WPA2"
- "zabezpieczone protokołem WPA-EAP"
- "zabezpieczone protokołem IEEE 802.1x"
+ "zabezpieczona za pomocą protokołu WPA/WPA2 PSK"
+ "zabezpieczona za pomocą protokołu 802.1x EAP""Adres IP""Siła sygnału""Włączanie..."
@@ -302,14 +326,13 @@
"Tożsamość anonimowa""Certyfikat klienta""Certyfikat urzędu certyfikacji"
- "Hasło do klucza prywatnego""Hasło sieci bezprzewodowej""Klucz szesnastkowy WEP (0–9, A–F)""Pokaż hasło.""Przeszukaj""Poza zasięgiem""zapamiętane"
- "Połączenie nieudane. Wybierz, aby spróbować ponownie"
+ "Połączenie nie powiodło się. Dotknij, aby spróbować ponownie.""Sieci Wi-Fi""Identyfikator SSID sieci""Zabezpieczenia"
@@ -360,6 +383,7 @@
"Rozłączona""Niepowodzenie""Dźwięk i wyświetlacz"
+ "Ustawienia dźwięku i wyświetlania""Ustawienia dźwięku""Ustaw dzwonki, powiadomienia, jasność ekranu""Tryb cichy"
@@ -385,11 +409,14 @@
"Dotyk ekranu""Odtwarzaj dźwięk podczas wybierania opcji na ekranie""Odtwarzaj dźwięk podczas wybierania opcji na ekranie"
+ "Dotykowe sprzężenie zwrotne"
+ "Wibracje podczas naciskania przycisków i wykonywania określonych działań w interfejsie użytkownika"
+ "Wibracje podczas naciskania przycisków i wykonywania określonych działań w interfejsie użytkownika""Powiadomienia karty SD""Odtwarzaj dźwięk dla powiadomień o karcie SD""Odtwarzaj dźwięk dla powiadomień o karcie SD"
- "Synchronizacja danych"
- "Wybierz, które aplikacje są synchronizowane"
+ "Konta i synchronizacja"
+ "Dodaj lub usuń konta i zmień ich ustawienia""Szukaj""Zarządzaj ustawieniami i historią wyszukiwania""Ustawienia wyświetlacza"
@@ -403,6 +430,7 @@
"Dostosuj jasność ekranu""Wygaszanie ekranu""Dostosuj opóźnienie automatycznego wyłączenia ekranu"
+ "Automatyczna jasność""Ustawienia blokady karty SIM""Ustaw blokadę SIM""Blokada karty SIM"
@@ -436,7 +464,8 @@
"Informacje o telefonie""Informacje o telefonie""Numer telefonu, sygnał itd."
- "Karta SD i pamięć"
+ "Karta SD i pamięć telefonu"
+ "Ustawienia karty SD i pamięci telefonu""Odłącz kartę SD, pokaż ilość dostępnej pamięci w telefonie""Mój numer telefonu""Numer MIN"
@@ -480,6 +509,11 @@
"Port MMS""MCC""MNC"
+ "Typ uwierzytelniania"
+ "Brak"
+ "PAP"
+ "CHAP"
+ "PAP lub CHAP""Typ APN""Usuń APN""Nowa nazwa APN"
@@ -518,12 +552,15 @@
"Użyj sieci Wi-Fi""Określ moją lokalizację w aplikacjach (takich jak Mapy), korzystając z sieci bezprzewodowych""Lokalizacja określana jest za pomocą Wi-Fi i/lub sieci komórkowych"
- "Użyj satelit GPS"
- "Ustalanie położenia z dokładnością do ulicy (wyłącz, aby oszczędzać baterię)"
+ "Użyj satelitów GPS"
+ "Określaj lokalizację z dokładnością do ulicy (usuń zaznaczenie, aby oszczędzać baterię)""Podaje dokładne położenie (zużywa więcej baterii, działa na zewnątrz)"
- "Udostępnij dla Google"
- "Zezwalaj Google na korzystanie z danych o lokalizacji w celu polepszenia wyszukiwania oraz innych usług"
- "Zezwalaj Google na korzystanie z danych o lokalizacji w celu polepszenia wyników wyszukiwania oraz innych usług"
+ "Użyj wspomaganego systemu GPS"
+ "Użyj serwera do wspomagania systemu GPS (usuń zaznaczenie, aby zmniejszyć ruch sieciowy)"
+ "Użyj serwera do wspomagania systemu GPS (usuń zaznaczenie, aby zwiększyć wydajność systemu GPS)"
+ "Użyj funkcji Moja lokalizacja"
+ "Użyj funkcji Moja lokalizacja na potrzeby wyników wyszukiwania Google oraz innych usług Google"
+ "Czy chcesz zezwalać Google na korzystanie z informacji o lokalizacji w celu poprawy wyników wyszukiwania oraz innych usług?""Zgadzam się""Nie zgadzam się""Informacje o telefonie"
@@ -538,6 +575,10 @@
"Licencje open source""Wystąpił problem podczas ładowania licencji.""Ładowanie..."
+ "Informacje o bezpieczeństwie"
+ "Informacje o bezpieczeństwie"
+ "Telefon nie jest połączony z usługą transmisji danych. Aby wyświetlić te informacje teraz, przejdź do strony %s na dowolnym komputerze połączonym z internetem."
+ "Trwa wczytywanie...""Wzór odblokowania ekranu""Zmień wzór odblokowania""Potwierdź zapisany wzór"
@@ -566,9 +607,9 @@
"Anuluj""Dalej""Zabezpieczanie telefonu"
- "Chroń swój telefon przed nieuprawnionym użyciem przez utworzenie osobistego wzoru odblokowania ekranu. "\n\n"1"" Obejrzyj rysowanie przykładowego wzoru na następnym ekranie. "\n\n"2"" Następnie narysuj swój własny wzór odblokowania. Eksperymentuj z różnymi wzorami, ale połącz co najmniej cztery punkty. "\n\n"3"" Narysuj swój wzór ponownie dla potwierdzenia. "\n\n"Możemy zaczynać? Wybierz „Dalej”"". "\n\n"Aby zrezygnować z ustawiania blokady, wybierz „Anuluj”."
+ "Chroń swój telefon przed nieautoryzowanym użyciem, tworząc osobisty wzorzec odblokowywania ekranu. "\n\n"1"" Na następnym ekranie obejrzyj procedurę rysowania przykładowego wzorca. "\n\n"2"" Po przygotowaniu się narysuj własny osobisty wzorzec odblokowywania. Wypróbuj różne wzorce, łącząc co najmniej cztery kropki. "\n\n"3"" Ponownie narysuj swój wzorzec, aby go potwierdzić. "\n\n"Wszystko gotowe? Dotknij przycisku „Dalej”"". "\n\n"Aby pozostawić telefon bez ochrony, dotknij przycisku „Anuluj”.""Przykładowy wzór"
- "Połącz co najmniej cztery kropki."\n" "\n"Wybierz polecenie „Dalej”, aby narysować własny wzór."
+ "Połącz co najmniej cztery kropki."\n" "\n"Dotknij przycisku „Dalej”, aby rozpocząć rysowanie własnego wzorca.""Zarządzaj aplikacjami""Zarządzaj zainstalowanymi aplikacjami oraz usuwaj je""Aplikacje"
@@ -602,12 +643,12 @@
"Filtr""Wybierz opcje filtru""Wszystkie"
- "Inne firmy"
+ "Pobrane""Uruchomione""Ładowanie...""Przeliczanie rozmiaru...""Usuń"
- "Wszystkie informacje zapisane w tej aplikacji zostaną na stałe usunięte."
+ "Wszystkie dane tej aplikacji zostaną trwale usunięte. Dotyczy to wszystkich plików, ustawień, kont, baz danych itd.""OK""Anuluj""Nie znaleziono aplikacji"
@@ -620,9 +661,23 @@
"Ta aplikacja ma dostęp do następujących funkcji telefonu:""Przetwarzanie...""Nie można obliczyć rozmiaru pakietu"
- "Nie zainstalowano żadnych aplikacji innych firm."
+ "Nie masz zainstalowanych żadnych aplikacji innych firm.""wersja %1$s"
- "Regionalne i język"
+ "Uruchomione usługi"
+ "Wyświetl i kontroluj obecnie uruchomione usługi"
+ "Ponowne uruchamianie"
+ "Brak uruchomionych usług"
+ "Zatrzymać usługę?"
+ "Usługa nie będzie działać, dopóki nie zostanie ponownie uruchomiona. Może to mieć niepożądane konsekwencje dotyczące aplikacji %1$s."
+ "Zatrzymaj"
+ "Anuluj"
+ "Uruchomiona przez aplikację: dotknij, aby zatrzymać"
+ "%1$s: dotknij, aby zarządzać"
+ "Dostępne: %2$s+%3$s w %1$d"
+ "Pozostała: %2$s w %1$d"
+ "Proces: %1$s"
+ "Język i klawiatura"
+ "Ustawienia języka i klawiatury""Określ ustawienia regionalne (język i region) oraz opcje wprowadzania tekstu i autokorekty""Ustawienia regionalne""Ustawienia tekstu"
@@ -637,7 +692,7 @@
"Naciśnij dwukrotnie klawisz spacji, aby wstawić kropkę""Widoczne hasła""Pokazuj hasło podczas wpisywania"
- "Ta metoda wprowadzania może gromadzić cały wpisywany tekst, w tym dane osobiste, takie jak hasła i numery kart kredytowych. Ta metoda pochodzi z aplikacji %1$s. Włączyć tę metodę wprowadzania?"
+ "Ta metoda wprowadzania może gromadzić cały wpisywany tekst, w tym dane osobiste w postaci haseł i numerów kart kredytowych. Metoda pochodzi z aplikacji %1$s. Czy użyć tej metody wprowadzania?""Słownik użytkownika""Słownik użytkownika""Dodaj i usuń słowa w słowniku użytkownika"
@@ -665,7 +720,7 @@
"Wprowadzanie tekstu""Zarządzaj opcjami wprowadzania tekstu""Ustawienia %1$s"
- "Ustawienia klawiatury ekranowej"
+ "Ustawienia klawiatury ekranowej""Klawiatura urządzenia""Ustawienia klawiatury wbudowanej""Dla programistów"
@@ -676,11 +731,11 @@
"Ekran nigdy nie będzie gaszony podczas ładowania""Pozorowanie położenia""Zezwalaj na pozorowane położenia"
- "Czy włączyć debugowanie USB?"
+ "Czy zezwalać na debugowanie USB?""Debugowanie USB jest przeznaczone wyłącznie do celów programistycznych. Może posłużyć do kopiowania danych między komputerem a urządzeniem, instalowania aplikacji w urządzeniu bez powiadamiania, a także odczytywania danych dziennika.""Wybierz gadżet""Wybierz widżet"
- "Szczegóły dla identyfikatora UID %d"
+ "Szczegóły dotyczące identyfikatora UID %d""Identyfikator UID %1$d""Szczegóły wykorzystania sieci dla %1$s:""Odebranych bajtów: %1$d"
@@ -716,12 +771,13 @@
"Aplikacja""Licznik""Czas użycia"
- "Ułatwienia dostępu"
+ "Ułatwienia dostępu"
+ "Ustawienia ułatwień dostępu""Zarządzaj opcjami ułatwień dostępu""Ułatwienia dostępu""Usługi ułatwień dostępu""Brak zainstalowanych usług ułatwień dostępu."
- "Ta usługa ułatwień dostępu może gromadzić cały wpisywany tekst, w tym dane osobiste w postaci numerów kart kredytowych, ale z wyłączeniem haseł. Może również śledzić działania w interfejsie użytkownika. Usługa pochodzi z aplikacji %1$s. Czy włączyć tę usługę ułatwień dostępu?"
+ "Ta usługa ułatwień dostępu może gromadzić cały wpisywany tekst, w tym dane osobiste w postaci numerów kart kredytowych, ale z wyłączeniem haseł. Może również zapisywać w dzienniku działania w interfejsie użytkownika. Usługa pochodzi z aplikacji %1$s. Czy skorzystać z tej usługi ułatwień dostępu?""Czy wyłączyć ułatwienia dostępu?""Użycie baterii""Gdzie wykorzystywana jest bateria"
@@ -733,7 +789,7 @@
"Czas aktywności urządzenia""WiFi na czas""WiFi na czas"
- "%1$s: %2$s%%"
+ "%1$s – %2$s%%""Szczegóły użycia baterii""Szczegóły użycia""Dostosuj wykorzystanie energii"
@@ -769,7 +825,7 @@
"Użycie baterii przez Wi-Fi""Wyłącz Wi-Fi, gdy nie jest używane i w miejscach, gdzie nie jest dostępne""Użycie baterii przez bluetooth"
- "Wyłącz bluetooth, gdy nie jest używany"
+ "Wyłącz moduł Bluetooth, gdy nie jest używany""Spróbuj połączyć się z innym urządzeniem bluetooth""Użycie baterii przez działające aplikacje""Zatrzymaj lub odinstaluj aplikację"
@@ -781,9 +837,9 @@
"Odśwież""System operacyjny Android""Serwer mediów"
- "Synteza mowy"
+ "Przetwarzanie tekstu na mowę""Ustaw opcje zamiany tekstu na mowę"
- "Sterowanie syntezatorem mowy"
+ "Ustawienia przetwarzania tekstu na mowę""Zawsze używaj moich ustawień""Poniższe ustawienia domyślne zastępują ustawienia aplikacji""Ustawienia domyślne"
@@ -801,8 +857,11 @@
"To jest przykład syntezy mowy.""Ustawienia zostały zmienione. Oto przykład aktualnie skonfigurowanego brzmienia.""Zarządzanie energią"
+ "Aktualizowanie ustawień Wi-Fi"
+ "Aktualizowanie ustawień Bluetooth"
+ "Program instalacyjny danych logowania""Ustawienia sieci VPN"
- "Połącz z %s"
+ "Połącz z siecią %s""Nazwa użytkownika:""Hasło:""nazwa użytkownika"
@@ -820,9 +879,9 @@
"Rozłącz z siecią""Edytuj sieć""Usuń sieć"
- "Musisz wprowadzić wartość: %s."
- "Musisz wybrać wartość: %s."
- "Nazwa sieci VPN „%s” już istnieje. Wybierz inną nazwę."
+ "Musisz wprowadzić wartość %s."
+ "Musisz wybrać opcję %s."
+ "Nazwa sieci VPN „%s” już istnieje. Wybierz inną nazwę.""Czy na pewno chcesz usunąć tę sieć VPN?""Czy na pewno nie chcesz utworzyć tego profilu?""Czy na pewno chcesz odrzucić zmiany wprowadzone w tym profilu?"
@@ -833,10 +892,12 @@
"W tej konfiguracji połączenia VPN brakuje co najmniej jednego klucza tajnego. Czy chcesz sprawdzić ustawienie klucza tajnego?""Wprowadzono nieprawidłową nazwę użytkownika lub hasło. Czy chcesz spróbować ponownie?""Serwer przerwał połączenie. Wprowadzona nazwa użytkownika lub hasło mogą być niepoprawne. Czy chcesz spróbować jeszcze raz?"
+ "Serwer przerwał połączenie. Istnieje możliwość, że używana zapora sieciowa uniemożliwia nawiązanie połączenia z serwerem. Czy chcesz spróbować ponownie?"
+ "Negocjowanie połączenia z serwerem nie powiodło się. Serwer może nie akceptować wybranej opcji szyfrowania. Czy chcesz sprawdzić ustawienie szyfrowania?""Dodaj sieć VPN""Dodaj sieć VPN"
- "Dodaj sieć VPN %s"
- "Szczegóły profilu %s"
+ "Dodaj sieć VPN %s"
+ "Szczegóły profilu %s""Sieci VPN""Łączenie...""Rozłączanie..."
@@ -844,8 +905,8 @@
"Połącz z siecią""Nazwa sieci VPN""nazwa sieci VPN"
- "Dodano: %s"
- "Wprowadzanie zmian w %s"
+ "Dodano profil „%s”"
+ "Wprowadzanie zmian w profilu „%s”""Ustaw certyfikat użytkownika""Certyfikat użytkownika""certyfikat użytkownika"
@@ -866,53 +927,53 @@
"Nazwa serwera sieci VPN""Domeny wyszukiwania DNS""Domeny wyszukiwania DNS"
- "Wartość %s jest ustawiona"
- "Wartość %s nie jest ustawiona"
- "Wartość %s (opcjonalna) nie jest ustawiona"
- "Włącz %s"
- "Wyłącz %s"
- "Opcja %s jest włączona"
- "Opcja %s jest wyłączona"
+ "Wartość %s jest ustawiona"
+ "Wartość %s nie została ustawiona"
+ "Wartość %s (opcjonalna) nie jest ustawiona"
+ "Włącz opcję %s"
+ "Wyłącz opcję %s"
+ "Opcja %s jest włączona"
+ "Opcja %s jest wyłączona""Ustawienia sieci VPN""Konfiguruj wirtualne sieci prywatne (VPN) i zarządzaj nimi""(nie zmieniono)""(nie ustawiono)"
- "Magazyn danych logowania"
- "Użyj bezpiecznych danych logowania"
- "Zezwalaj aplikacjom na dostęp do bezpiecznych certyfikatów i innych danych logowania"
- "Wprowadź hasło"
- "Wprowadź hasło magazynu danych logowania."
- "Ustaw hasło"
- "Ustaw lub zmień hasło magazynu danych logowania"
- "Ustaw hasło"
- "Wyczyść magazyn"
- "Usuń całą zawartość magazynu danych logowania i zresetuj jego hasło"
- "Czy na pewno chcesz usunąć wszystkie dane logowania i zresetować hasło magazynu danych logowania?"
- "Nadaj certyfikatowi nazwę"
- "Nazwa certyfikatu:"
- "Hasło umożliwiające wyodrębnienie certyfikatu:"
- "Szczegóły certyfikatu:"
- "Nazwa może zawierać tylko litery i cyfry."
- "Bieżące hasło:"
- "Nowe hasło:"
- "Potwierdź nowe hasło:"
- "Ustaw hasło magazynu danych logowania."
- "Ustaw hasło magazynu danych logowania."
- "Wprowadź prawidłowe hasło."
- "Wprowadź prawidłowe hasło. Pozostała jedna próba wprowadzenia prawidłowego hasła – później zawartość magazynu danych logowania zostanie wymazana."
- "Wprowadź prawidłowe hasło. Liczba pozostałych prób wprowadzenia prawidłowego hasła, zanim zawartość magazynu danych logowania zostanie wymazana: %d."
- "Hasła nie są identyczne."
- "Musisz wprowadzić i potwierdzić hasło."
- "Wprowadź hasło."
- "Wprowadź hasło ponownie. Hasło musi mieć co najmniej 8 znaków i nie może zawierać spacji."
- "Wprowadź nazwę."
- "Wprowadź nazwę, która zawiera tylko litery i cyfry."
- "Nie można zapisać certyfikatu. Kliknij przycisk OK, aby ponowić próbę."
- "Nie można zapisać certyfikatu. Magazyn danych uwierzytelniania nie został włączony lub poprawnie zainicjowany."
- "Certyfikat nie został zapisany."
- "Magazyn danych uwierzytelniania został wyczyszczony."
- "Magazyn danych logowania jest włączony."
- "Dodano: %s."
+ "Magazyn danych logowania"
+ "Użyj bezpiecznych danych logowania"
+ "Zezwalaj aplikacjom na dostęp do bezpiecznych certyfikatów i innych danych logowania"
+ "Wprowadź hasło"
+ "Wprowadź hasło magazynu danych logowania."
+ "Zainstaluj z karty SD"
+ "Zainstaluj zaszyfrowane certyfikaty z karty SD"
+ "Ustaw hasło"
+ "Ustaw lub zmień hasło magazynu danych logowania"
+ "Wyczyść magazyn"
+ "Wyczyść całą zawartość magazynu danych logowania i zresetuj jego hasło"
+ "Czy na pewno chcesz usunąć wszystkie dane logowania i zresetować hasło magazynu danych logowania?"
+ "Bieżące hasło:"
+ "Nowe hasło:"
+ "Potwierdź nowe hasło:"
+ "Ustaw hasło dla magazynu danych logowania (co najmniej 8 znaków)."
+ "Wprowadź prawidłowe hasło."
+ "Wprowadź prawidłowe hasło. Pozostała jedna próba wprowadzenia prawidłowego hasła, później zawartość magazynu danych logowania zostanie wyczyszczona."
+ "Wprowadź prawidłowe hasło. Liczba pozostałych prób wprowadzenia prawidłowego hasła, zanim zawartość magazynu danych logowania zostanie wymazana: %1$d."
+ "Hasła nie są identyczne."
+ "Musisz wprowadzić i potwierdzić hasło."
+ "Wprowadź hasło."
+ "Hasło musi mieć co najmniej 8 znaków."
+ "Magazyn danych uwierzytelniania został wyczyszczony."
+ "Magazyn danych logowania jest włączony."
+ "Magazyn danych logowania jest wyłączony.""Sygnał alarmowy""Skonfiguruj sposób działania w przypadku połączenia alarmowego"
+ "Prywatność"
+ "Ustawienia prywatności"
+ "Lokalizacja"
+ "Ustawienia"
+ "Dane osobiste"
+ "Utwórz kopię zapasową moich ustawień"
+ "Kopia zapasowa ustawień"
+ "Czy na pewno chcesz zakończyć tworzenie kopii zapasowych ustawień i usunąć wszystkie kopie z serwerów Google?"
+
+
diff --git a/res/values-pt-rPT/arrays.xml b/res/values-pt-rPT/arrays.xml
index e32c196fbd7..688011b72a0 100644
--- a/res/values-pt-rPT/arrays.xml
+++ b/res/values-pt-rPT/arrays.xml
@@ -24,38 +24,59 @@
"Pacífico""Todas"
+
+ "Sem animações"
+ "Algumas animações"
+ "Todas as animações"
+
+
+ "Não são apresentadas animações de janela"
+ "São apresentadas algumas animações de janela"
+ "São apresentadas todas as animações de janela"
+ "15 segundos""30 segundos""1 minuto""2 minutos""10 minutos"
- "Nunca esgotar tempo"
+ "30 minutos"
+
+
+ "Muito lenta"
+ "Lenta"
+ "Normal"
+ "Rápida"
+ "Muito rápida"
+
+
+ "Muito baixa"
+ "Baixa"
+ "Normal"
+ "Alta"
+ "Muito alto"
+
+
+ "Inglês americano"
+ "Inglês britânico"
+ "Francês"
+ "Alemão"
+ "Italiano"
+ "Espanhol"
+
+
+ "Automático"
+ "Nenhum"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Nenhum"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automático""WEP ASCII"
@@ -84,15 +105,27 @@
"Total de inícios""Nome da aplicação"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Nenhum"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Desactivada"
+ "Alerta"
+ "Vibrar"
+
+
+ "Nenhuma"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP"
+
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 1de8244b0a3..1672256ffe7 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Sim"
+ "Não""Desconhecido""Ligar rádio""Desligar rádio"
@@ -56,6 +58,7 @@
"OK""Cartão SD""Estado da bateria:"
+ "Ficha de alimentação:""Escala da bateria:""Nível da bateria:""Condição da bateria:"
@@ -75,6 +78,11 @@
"A descarregar""Não está a carregar""Completo"
+ "Desligado"
+ "CA"
+ "USB"
+ "CA+USB"
+ "Desconhecido""Desconhecido""Bom""Sobreaquecimento"
@@ -104,14 +112,19 @@
"Pedido de emparelhamento de Bluetooth""Pedido de emparelhamento""Seleccionar emparelhamento com "
+ "Seleccionador de dispositivo Bluetooth"
+ "Pedido de emparelhamento de Bluetooth"
+ "Uma aplicação no seu telefone está a solicitar autorização para activar o Bluetooth. Pretende fazê-lo?"
+ "Uma aplicação do seu telefone está a solicitar autorização para que o seu telefone possa ser detectado por outros dispositivos Bluetooth durante %1$d segundos. Pretende fazê-lo?"
+ "Uma aplicação do seu telefone está a solicitar autorização para activar o Bluetooth e para que o seu telefone possa ser detectado por outros dispositivos durante %1$d segundos. Pretende fazê-lo?"
+ "A ligar Bluetooth...""Definições de data e hora""1:00 pm""13:00""Mudar hora""Data""Seleccionar fuso horário"
-
-
+ "Normal (%s)""Pré-visualização:""Tamanho do tipo de letra:"
@@ -192,33 +205,23 @@
"Definições de proxy""Cancelar""Definições"
-
-
+ "Definições""Modo de voo""Desactivar todas as ligações sem fios""A desactivar ligações sem fios...""A activar ligações sem fios…"
- "Controlos sem fios"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Sem fios e redes"
+ "Definições de rede sem fios"
+ "Gerir Wi-Fi, Bluetooth, modo de avião, redes móveis e VPNs"
+ "Roaming de dados"
+ "Ligar a serviços de dados em roaming"
+ "Ligar a serviços de dados em roaming"
+ "A ligação de dados foi perdida porque saiu do alcance da sua rede e o roaming de dados estava desactivado."
+ "Ligar"
+ "Permitir roaming de dados? Os encargos de roaming podem ser significativos!"
+ "Atenção"
+ "Selecção da operadora"
+ "Seleccione um operador de rede""Data e hora""Definir data, hora, fuso horário e formatos""Automático"
@@ -231,25 +234,31 @@
"Seleccionar formato de data""Ordenar alfabeticamente""Ordenar por fuso horário"
- "Segurança e localização"
-
-
+ "Localização e segurança"
+ "Definições de localização e segurança"
+ "Definir A minha localização, desbloqueio do ecrã, bloqueio do cartão SIM, bloqueio do armazenamento de credenciais"
+ "Definir O meu local, desbloqueio do ecrã, bloqueio do armazenamento de credenciais""Palavras-passe""Bluetooth""Ligar Bluetooth""Definições de Bluetooth""Definições de Bluetooth""Gerir ligações, definir nome e detectabilidade do dispositivo"
- "Pedido de emparelhamento de Bluetooth"
+ "Pedido de emparelhamento de Bluetooth""Informações sobre dispositivo Bluetooth"
- "%1$s"\n\n"Introduza o PIN para emparelhar."\n"(Tente 0000 ou 1234.)"
+ \n"Introduza o PIN para emparelhar com \"%1$s\" (tente 0000 ou 1234)."
+ \n"Escreva a chave de acesso para emparelhar com \"%1$s\"."
+ "Para emparelhar com \"%1$s\", confirme que está a mostrar a passkey: %2$s."
+ "%1$s"\n"pretende emparelhamento."
+ "Introduza %2$s em \"%1$s\" para emparelhar."
+ "Par"
+ "Não emparelhar"
+ "dispositivo bluetooth""Atenção""Ocorreu um problema ao emparelhar com %1$s."
- "Ocorreu um problema ao emparelhar com %1$s porque o PIN introduzido não está correcto."
-
-
-
-
+ "Ocorreu um problema ao emparelhar com %1$s porque o PIN ou a Chave de acesso introduzidos não estão correctos."
+ "Não é possível estabelecer comunicação com %1$s."
+ "Emparelhamento rejeitado por %1$s.""Ocorreu um problema ao ligar a %1$s.""Procurar dispositivos""Ligar"
@@ -261,6 +270,7 @@
"Ligar a...""Multimédia""Telefone"
+ "Transferir""Ligado ao áudio de multimédia""Ligado ao áudio do telefone""Ligado ao áudio do telefone e de multimédia"
@@ -270,8 +280,11 @@
"Perfis""Ligado ao áudio de multimédia""Ligado ao áudio do telefone"
+ "Ligado ao servidor de transferência de ficheiros"
+ "Não ligado ao servidor de transferência de ficheiros""Utilizar para áudio de multimédia""Utilizar para áudio do telefone"
+ "Utilizar para transferência de ficheiros""Wi-Fi""Wi-Fi""Activar Wi-Fi"
@@ -288,25 +301,13 @@
"Segurança""Abrir""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Desconhecido"
-
-
-
-
-
-
-
-
-
-
-
-
+ "rede aberta"
+ "protegido por WEP"
+ "protegido por WPA/WPA2 PSK"
+ "protegido com 802.1x EAP""Endereço IP""Intensidade do sinal""A ligar..."
@@ -319,28 +320,19 @@
"Impossível guardar a rede""Ligar""Ligar a %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "método EAP"
+ "Autenticação da fase 2"
+ "Identidade"
+ "Identidade anónima"
+ "Certificado cliente"
+ "certificado CA""Palavra-passe de ligação sem fios""Chave WEP hexadecimal (0-9, A-F)""Mostrar palavra-passe.""Procurar""Fora do alcance"
-
-
- "A ligação falhou. Seleccione para tentar novamente"
+ "memorizado"
+ "A ligação falhou; toque para tentar novamente""Redes Wi-Fi""SSID da rede""Segurança"
@@ -391,6 +383,7 @@
"Desligado""Sem sucesso""Som e visualização"
+ "Definições de som e visualização""Definições de som""Definir toques, notificações, brilho do ecrã""Modo silencioso"
@@ -416,17 +409,16 @@
"Selecção audível""Reproduzir som ao efectuar selecção no ecrã""Reproduzir som ao efectuar selecção no ecrã"
+ "Comentário haptic"
+ "Vibrar ao premir teclas de função e em certas interacções da interface do utilizador"
+ "Vibrar ao premir teclas de função e em certas interacções da interface do utilizador""Notificações do cartão SD"
-
-
-
-
- "Sincronização de dados"
- "Seleccionar as aplicações sincronizadas"
-
-
-
-
+ "Reproduzir som para notificações do cartão SD"
+ "Reproduzir som para notificações do cartão SD"
+ "Contas e sincronização"
+ "Adicionar ou remover contas e alterar definições de contas"
+ "Pesquisar"
+ "Gerir definições e histórico de pesquisa""Definições do visor""Animação""Mostrar animação ao abrir e fechar janelas"
@@ -438,6 +430,7 @@
"Ajustar o brilho do ecrã""Tempo limite do ecrã""Ajustar o tempo limite até à desactivação automática do ecrã"
+ "Brilho automático""Definições de bloqueio do cartão SIM""Configurar bloqueio do cartão SIM""Bloqueio do cartão SIM"
@@ -470,18 +463,14 @@
"Não disponível""Estado""Estado"
-
-
- "Armazenamento do telefone e cartão SD"
+ "Número de telefone, sinal, etc."
+ "Armazenamento do telefone e cartão SD"
+ "Definições de armazenamento do telefone e cartão SD""Desmontar cartão SD, ver armazenamento disponível"
-
-
-
-
-
-
-
-
+ "O meu número de telefone"
+ "MINUTOS"
+ "Versão do PRL"
+ "MEID""Tipo de rede móvel""Estado da rede móvel""Estado do serviço"
@@ -520,6 +509,11 @@
"Porta MMS""MCC""MNC"
+ "Tipo de autenticação"
+ "Nenhuma"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP""Tipo APN""Eliminar APN""Novo APN"
@@ -535,11 +529,9 @@
"Reposição de predefinições de APN concluída""Reposição dos dados de fábrica""Apaga todos os dados do telefone"
-
-
+ "Esta operação eliminará todos os dados do telefone, incluindo:"\n
"A sua Conta Google"
\n
"Definições e dados do sistema e das aplicações"
\n
"Aplicações transferidas"
\n"Não eliminará:"\n
"Software do sistema actual e aplicações agregadas"
\n
"Ficheiros do cartão SD, tais como música ou fotografias"
"Repor telefone"
-
-
+ "Apagar todas as informações pessoais e as aplicações transferidas? Não é possível reverter esta acção!""Apagar tudo""Desenhe o seu padrão de desbloqueio""Tem de desenhar o seu padrão de desbloqueio para confirmar uma reposição do telefone."
@@ -556,20 +548,19 @@
"Configurar correio de voz, reencaminhamento de chamadas, chamada em espera, ID do autor da chamada""Redes móveis""Definir opções de roaming, redes, APNs"
-
-
+ "A minha localização""Utilizar redes sem fios""Ver localização em aplicações (como o Google Maps) utilizando redes sem fios""Localização determinada por redes Wi-Fi e/ou móveis"
- "Activar satélites de GPS"
- "Ao localizar, determinar a localização exacta ao nível da rua (anular selecção para preservar a bateria)"
+ "Utilizar satélites GPS"
+ "Ao localizar, determinar a localização exacta ao nível da rua (desmarque esta opção para preservar a bateria)""Localizar ao nível da rua (exige mais bateria e vista do céu)"
-
-
-
-
-
-
+ "Utilizar GPS assistido"
+ "Utilizar o servidor para auxiliar o GPS (desmarque esta opção para reduzir a utilização da rede)"
+ "Utilizar o servidor para auxiliar o GPS (desmarque esta opção para melhorar o desempenho do GPS)"
+ "Utilizar A minha localização"
+ "Utilizar A minha localização para resultados de pesquisa do Google e outros serviços Google"
+ "Pretende permitir que o Google utilize a localização para resultados de pesquisa melhorados e outros serviços?""Concordo""Discordar""Acerca do telefone"
@@ -579,12 +570,15 @@
"Direitos de autor""Licença""Termos e condições"
-
-
+ "Tutorial do sistema""Saiba como utilizar o seu telefone""Licenças open source""Ocorreu um problema ao carregar as licenças.""A carregar..."
+ "Informações de segurança"
+ "Informações de segurança"
+ "O seu telefone não se encontra ligado a um serviço de dados. Para ver esta informação agora, aceda a %s a partir de qualquer computador ligado à Internet."
+ "A carregar...""Padrão de desbloqueio do ecrã""Mudar padrão de desbloqueio""Confirmar padrão guardado"
@@ -613,9 +607,9 @@
"Cancelar""Seguinte""Manter o telefone seguro"
- "Proteja o seu telefone contra utilização não autorizada criando um padrão pessoal de desbloqueio do ecrã. "\n\n"1"" No ecrã seguinte, observe enquanto é desenhado um padrão exemplificativo. "\n\n"2"" Quando estiver pronto, desenhe o seu padrão pessoal de desbloqueio. Experimente diferentes padrões, mas ligue pelo menos quatro pontos. "\n\n"3"" Redesenhe o seu padrão para confirmar. "\n\n"Pronto para começar? Seleccione “Seguinte”"". "\n\n"Para deixar o seu telefone desprotegido, seleccione “Cancelar”."
+ "Proteja o seu telefone de utilização não autorizada, criando um padrão pessoal de desbloqueio do ecrã. "\n\n"1"" No ecrã seguinte, observe enquanto é desenhado um padrão exemplificativo. "\n\n"2"" Quando estiver pronto, desenhe o seu padrão pessoal de desbloqueio. Experimente diferentes padrões, mas ligue, pelo menos, quatro pontos. "\n\n"3"" Redesenhe o seu padrão para confirmar. "\n\n"Está pronto para começar? Toque em “Seguinte”"". "\n\n"Para deixar o seu telefone sem protecção, toque em “Cancelar”.""Padrão exemplificativo"
- "Ligue pelo menos quatro pontos."\n" "\n"Seleccione “Seguinte” quando estiver pronto para desenhar o seu próprio padrão."
+ "Ligue, pelo menos, quatro pontos."\n" "\n"Toque em “Seguinte” quando estiver pronto para desenhar o seu próprio padrão.""Gerir aplicações""Gerir e remover aplicações instaladas""Aplicações"
@@ -638,8 +632,7 @@
"Dados""Desinstalar""Limpar dados"
-
-
+ "Desinstalar actualizações""Optou por iniciar esta aplicação por predefinição para algumas acções.""Nenhuma predefinição definida.""Limpar predefinições"
@@ -650,32 +643,41 @@
"Filtrar""Seleccionar opções de filtro""Todas"
- "De terceiros"
+ "Transferidas""Em execução""A carregar...""A recalcular tamanho...""Eliminar"
- "Todas as informações que guardou nesta aplicação serão eliminadas de forma permanente."
+ "Todos os dados desta aplicação serão eliminados definitivamente. Isto inclui todos os ficheiros, definições, contas, bases de dados, entre outros.""OK""Cancelar""Aplicação não encontrada""Não foi possível localizar a aplicação na lista de aplicações instaladas.""Impossível limpar dados da aplicação."
-
-
-
-
-
-
-
-
+ "Desinstalar actualizações"
+ "Pretende instalar todas as actualizações para esta aplicação de sistema do Android?"
+ "Limpar dados"
+ "Falha ao limpar os dados da aplicação""Esta aplicação pode aceder aos seguintes itens no seu telefone:""A calcular...""Impossível calcular tamanho do pacote"
- "Não tem nenhuma aplicação de terceiros instalada."
-
-
- "Região e texto"
+ "Não tem nenhuma aplicação de terceiros instalada."
+ "versão %1$s"
+ "Serviços em execução"
+ "Ver e controlar os serviços actualmente em execução"
+ "A reiniciar"
+ "Não existem serviços em execução"
+ "Parar serviço?"
+ "O serviço deixará de ser executado até que seja novamente iniciado. Isto pode ter consequências indesejáveis para a aplicação %1$s."
+ "Parar"
+ "Cancelar"
+ "Iniciado pela aplicação: tocar para parar"
+ "%1$s: toque para gerir"
+ "Disp.: %2$s+%3$s em %1$d"
+ "Outro: %2$s em %1$d"
+ "Processo: %1$s"
+ "Idioma e teclado"
+ "Definições de idioma e teclado""Definir opções de região (idioma e região), entrada de texto e correcção automática""Definição de região""Definições de texto"
@@ -690,7 +692,7 @@
"Premir duas vezes a tecla Espaço para inserir \".\"""Palavras-passe visíveis""Mostrar palavra-passe ao escrever"
- "Este método de entrada pode permitir recolher todo o texto que introduzir, incluindo dados pessoais como, por exemplo, palavras-passe e números de cartão de crédito. Decorre da aplicação %1$s. Activar este método de entrada?"
+ "Este método de entrada pode permitir a recolha de todo o texto que introduzir, incluindo dados pessoais como, por exemplo, palavras-passe e números de cartão de crédito. O serviço é fornecido com a aplicação %1$s. Utilizar este método de entrada?""Dicionário do utilizador""Dicionário do utilizador""Adicionar e remover palavras do dicionário do utilizador"
@@ -718,7 +720,7 @@
"Entrada de texto""Gerir opções de entrada de texto""Definições de %1$s"
- "Definições do teclado no ecrã"
+ "Definições do teclado no ecrã""Teclado do dispositivo""Definições do teclado incorporado""Desenvolvimento"
@@ -729,13 +731,11 @@
"O ecrã nunca entrará em suspensão durante o carregamento""Permitir locais fictícios""Permitir locais fictícios"
-
-
-
-
+ "Permitir depuração USB?"
+ "A depuração USB é utilizada apenas para fins de programação. Pode ser utilizada para copiar dados entre o computador e o dispositivo, instalar aplicações no dispositivo sem notificação e ler dados do registo.""Escolher miniaplicação""Escolher widget"
- "Detalhes de UID %d"
+ "Detalhes de UID %d""UID %1$d""Detalhes de utilização de rede para %1$s:""Bytes recebidos: %1$d"
@@ -746,14 +746,10 @@
"Hora do sistema:""Tempo total:""Inícios: %1$d"
-
-
-
-
-
-
-
-
+ "%1$dd %2$dh %3$dm %4$ds"
+ "%1$dh %2$dm %3$ds"
+ "%1$dm %2$ds"
+ "%1$ds""Pacotes que partilham este UID:""Não existem dados de utilização da bateria disponíveis""Sensor:"
@@ -775,400 +771,209 @@
"Aplicação""Total""Tempo de utilização"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Acessibilidade"
+ "Definições de acessibilidade"
+ "Gerir opções de acessibilidade"
+ "Acessibilidade"
+ "Serviços de acessibilidade"
+ "Nenhum serviço de acessibilidade instalado."
+ "Este serviço de acessibilidade pode captar todo o texto que escrever, incluindo dados pessoais e números de cartões de crédito, com excepção de palavras-passe. Também pode registar as interacções com a interface do utilizador. O serviço é fornecido com a aplicação %1$s. Utilizar este serviço de acessibilidade?"
+ "Desactivar acessibilidade?"
+ "Utilização da bateria"
+ "O que tem estado a utilizar a bateria"
+ "Bateria utilizada desde que foi desligado"
+ "Bateria utilizada desde a reposição"
+ "%1$s desde que foi desligado"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Hora de activação do dispositivo"
+ "tempo de ligação WiFi"
+ "tempo de ligação WiFi"
+ "%1$s - %2$s%%"
+ "Detalhes da utilização da bateria"
+ "Utilizar detalhes"
+ "Ajustar utilização de energia"
+ "Pacotes incluídos"
+ "Visor"
+ "Wi-Fi"
+ "Bluetooth"
+ "inactividade do telefone"
+ "Chamadas de voz"
+ "Telefone inactivo"
+ "Total da CPU"
+ "primeiro plano da CPU"
+ "GPS"
+ "Telefone"
+ "Dados enviados"
+ "Dados recebidos"
+ "Áudio"
+ "Vídeo"
+ "Hora activada"
+ "Tempo sem sinal"
+ "Forçar paragem"
+ "Informações da aplicação"
+ "Definições da aplicação"
+ "Definições do visor"
+ "Definições WiFi"
+ "Definições de Bluetooth"
+ "Bateria utilizada por chamadas de voz"
+ "Bateria utilizada quando o telefone está inactivo"
+ "Bateria utilizada pelo rádio do telefone"
+ "Mudar para modo de avião para poupar energia em áreas sem cobertura de rede"
+ "Bateria utilizada pelo ecrã e pela iluminação de fundo"
+ "Reduzir o brilho do ecrã e/ou o tempo que este permanece iluminado"
+ "Bateria utilizada por Wi-Fi"
+ "Desactivar Wi-Fi quando não estiver a ser utilizado ou não estiver disponível"
+ "Bateria utilizada pelo bluetooth"
+ "Desligar o bluetooth quando não estiver a ser utilizado"
+ "Tente ligar a um dispositivo bluetooth diferente"
+ "Bateria utilizada pelas aplicações quando em execução"
+ "Parar ou desinstalar a aplicação"
+ "Desactivar o GPS quando não está a ser utilizado"
+ "A aplicação pode sugerir definições para reduzir a utilização da bateria"
+ "%1$s desde que foi desligado"
+ "Desde a última vez que foi desligado por %1$s"
+ "Totais de utilização"
+ "Actualizar"
+ "SO Android"
+ "Mediaserver"
+ "Texto para voz"
+ "Definir opções de texto para voz"
+ "Definições de texto para voz"
+ "Utilizar sempre as minhas definições"
+ "As predefinições abaixo substituem as definições da aplicação"
+ "Predefinições"
+ "Taxa de voz"
+ "Velocidade a que o texto é falado"
+ "Tonalidade"
+ "Afecta o tom do texto falado"
+ "Idioma"
+ "Define a voz do idioma específico para o texto lido"
+ "Ouvir um exemplo"
+ "Reproduzir uma breve demonstração de síntese de voz"
+ "Instalar dados de voz"
+ "Instalar os dados de voz necessários para a síntese de voz"
+ "As vozes necessárias para a síntese de voz já estão instaladas correctamente"
+ "Exemplo de síntese de voz."
+ "As suas definições foram alteradas. Segue-se um exemplo do respectivo som."
+ "Controlo de Energia"
+ "Actualizar definição de Wi-Fi"
+ "Actualizar a definição do Bluetooth"
+ "Instalador de credenciais"
+ "Definições da VPN"
+ "Ligar a %s"
+ "Nome de utilizador:"
+ "Palavra-passe:"
+ "um nome de utilizador"
+ "uma palavra-passe"
+ "Memorizar nome de utilizador"
+ "Ligar"
+ "Sim"
+ "Não"
+ "Anterior"
+ "Não"
+ "Guardar"
+ "Cancelar"
+ "Reverter"
+ "Ligar a uma rede"
+ "Desligado da rede"
+ "Editar rede"
+ "Eliminar rede"
+ "Tem de introduzir %s."
+ "É necessário seleccionar %s."
+ "O nome VPN \"%s\" já existe. Introduza outro nome."
+ "Tem a certeza de que pretende eliminar esta VPN?"
+ "Tem a certeza de que não pretende criar este perfil?"
+ "Tem a certeza de que pretende rejeitar as alterações efectuadas a este perfil?"
+ "Não foi possível estabelecer ligação à rede. Pretende tentar novamente?"
+ "Ligação perdida. Pretende ligar novamente?"
+ "Não é possível resolver o nome do servidor. Pretende verificar a definição do nome do servidor?"
+ "Erro de chamada. Pretende verificar a definição secreta?"
+ "Falta um ou vários segredos nesta configuração de VPN. Pretende verificar a definição de segredo?"
+ "O nome de utilizador ou a palavra-passe que introduziu estão incorrectos. Pretende tentar novamente?"
+ "O servidor desligou. O nome de utilizador ou a palavra-passe que introduziu podem estar incorrectos. Pretende tentar novamente?"
+ "Servidor bloqueado. É possível que esteja protegido por uma firewall que impede a ligação ao servidor. Deseja tentar novamente?"
+ "A negociação do servidor falhou. O servidor não pode concordar com a sua opção de encriptação. Deseja confirmar a sua definição de encriptação?"
+ "Adicionar VPN"
+ "Adicionar VPN"
+ "Adicionar VPN %s"
+ "Detalhes de %s"
+ "VPNs"
+ "A ligar..."
+ "A desligar..."
+ "Ligado"
+ "Ligar a uma rede"
+ "Nome VPN"
+ "um nome VPN"
+ "\"%s\" foi adicionado"
+ "Foram efectuadas alterações a \"%s\""
+ "Definir certificado do utilizador"
+ "Certificado do utilizador"
+ "um certificado de utilizador"
+ "Definir certificado CA"
+ "Certificado de autoridade de certificação (CA)"
+ "um certificado CA"
+ "Definir segredo L2TP"
+ "segredo L2TP"
+ "um segredo L2TP"
+ "encriptação"
+ "Encriptação PPTP"
+ "Definir chave IPSec pré-partilhada"
+ "chave IPSec pré-partilhada"
+ "uma chave IPSec pré-partilhada"
+ "Definir servidor VPN"
+ "servidor VPN"
+ "um servidor VPN"
+ "nome de servidor VPN"
+ "domínios de pesquisa de DNS"
+ "domínios de pesquisa de DNS"
+ "%s está definido"
+ "%s não definido"
+ "%s não definido (opcional)"
+ "Activar %s"
+ "Desactivar %s"
+ "%s está activado"
+ "%s está desactivado"
+ "Definições VPN"
+ "Configurar e gerir VPNs (Redes Privadas Virtuais)"
+ "(não alterado)"
+ "(não definido)"
+ "Armazenamento de credenciais"
+ "Utilizar credenciais seguras"
+ "Permitir que as aplicações acedam a certificados seguros e outras credenciais"
+ "Introduzir palavra-passe"
+ "Introduza a palavra-passe do armazenamento de credenciais."
+ "Instalar a partir do cartão SD"
+ "Instalar certificados encriptados a partir do cartão SD"
+ "Definir palavra-passe"
+ "Definir ou alterar a palavra-passe do armazenamento de credenciais"
+ "Limpar armazenamento"
+ "Limpar armazenamento de credenciais de todos os conteúdos e repor a respectiva palavra-passe"
+ "Tem a certeza de que pretende eliminar todas as credenciais e repor a palavra-passe do armazenamento de credenciais?"
+ "Palavra-passe actual:"
+ "Nova palavra-passe:"
+ "Confirmar nova palavra-passe:"
+ "Defina uma palavra-passe para o armazenamento de credenciais (com, pelo menos, 8 caracteres)."
+ "Introduza a palavra-passe correcta."
+ "Introduza a palavra-passe correcta. Tem mais uma tentativa para introduzir a palavra-passe correcta antes que o armazenamento de credenciais seja apagado."
+ "Introduza a palavra-passe correcta. Tem mais %1$d tentativas para introduzir a palavra-passe correcta antes que o armazenamento de credenciais seja apagado."
+ "As palavras-passe não correspondem."
+ "Tem de introduzir e confirmar uma palavra-passe."
+ "Introduza a palavra-passe."
+ "A palavra-passe deve ter, pelo menos, 8 caracteres."
+ "O armazenamento de credenciais foi apagado."
+ "O armazenamento de credenciais está activado."
+ "O armazenamento de credenciais está desactivado."
+ "Tom de emergência"
+ "Definir o comportamento quando é efectuada uma chamada de emergência"
+ "Privacidade"
+ "Definições de privacidade"
+ "Localização"
+ "Definições"
+ "Dados pessoais"
+ "Efectuar uma cópia de segurança das minhas definições"
+ "Cópia de segurança das definições"
+ "Tem a certeza de que pretende parar a cópia de segurança das suas definições e apagar todas as cópias nos servidores da Google?"
+
diff --git a/res/values-pt/arrays.xml b/res/values-pt/arrays.xml
index ac5e8e330bc..adea28cf584 100644
--- a/res/values-pt/arrays.xml
+++ b/res/values-pt/arrays.xml
@@ -24,38 +24,59 @@
"Pacífico""Todos"
+
+ "Nenhuma animação"
+ "Algumas animações"
+ "Todas as animações"
+
+
+ "Nenhuma animação de janela é exibida"
+ "Algumas animações de janela são exibidas"
+ "Todas as animações de janela são exibidas"
+ "15 segundos""30 segundos""1 minuto""2 minutos""10 minutos"
- "Nunca esgotar o tempo limite"
+ "30 minutos"
+
+
+ "Muito devagar"
+ "Devagar"
+ "Normal"
+ "Rápida"
+ "Muito rápida"
+
+
+ "Muito baixa"
+ "Baixa"
+ "Normal"
+ "Alta"
+ "Muito alta"
+
+
+ "Inglês (EUA)"
+ "Inglês (Reino Unido)"
+ "Francês"
+ "Alemão"
+ "Italiano"
+ "Espanhol"
+
+
+ "Automático"
+ "Nenhum"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Nenhum"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automático""WEP ASCII"
@@ -84,15 +105,27 @@
"Iniciar contagem""Nome do aplicativo"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Nenhuma"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Desativado"
+ "Alerta"
+ "Vibrar"
+
+
+ "Nenhum"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP"
+
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index bcb6bbe7d6c..40000375a29 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Sim"
+ "Não""Desconhecido""Ativar o rádio""Desativar o rádio"
@@ -56,6 +58,7 @@
"OK""Cartão SD""Status da bateria:"
+ "Tomada de alimentação:""Escala da bateria:""Nível da bateria:""Integridade da bateria:"
@@ -75,6 +78,11 @@
"Descarregando""Não está carregando""Cheio"
+ "Desconectado"
+ "CA"
+ "USB"
+ "CA+USB"
+ "Desconhecido""Desconhecido""Bom""Superaquecimento"
@@ -104,14 +112,19 @@
"Solicitação de pareamento Bluetooth""Solicitação de pareamento""Selecione para parear "
+ "Selecionador de dispositivo Bluetooth"
+ "Solicitação de permissão para Bluetooth"
+ "Um aplicativo no seu telefone está solicitando permissão para ativar o Bluetooth. Deseja fazer isso?"
+ "Um aplicativo no seu telefone está solicitando permissão para tornar o seu telefone detectável por outros dispositivos Bluetooth por %1$d segundos. Deseja fazer isso?"
+ "Um aplicativo no seu telefone está solicitando permissão para ativar o Bluetooth e tornar o seu telefone detectável por outros dispositivos por %1$d segundos. Deseja fazer isso?"
+ "Ativando Bluetooth…""Configurações de data e hora""1:00 pm""13:00""Alterar horário""Data""Selecionar fuso horário"
-
-
+ "Normal (%s)""Visualizar:""Tamanho da fonte:"
@@ -179,7 +192,7 @@
"Bytes usados:""Procurando mídia no cartão SD…""Cartão SD montado como somente leitura"
- "Próximo"
+ "Avançar""Local""Selecionar o seu idioma""Selecionar atividade"
@@ -192,64 +205,60 @@
"Configurações de proxy""Cancelar""Configurações"
-
-
+ "Configurações""Modo avião""Desativar todas as conexões sem fio""Desativando as conexões sem fio…""Ativando conexões sem fio…"
- "Controles sem fio"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Redes sem fio e outras"
+ "Configurações sem fio e de rede"
+ "Gerenciar rede Wi-Fi, Bluetooth, modo avião, redes e VPNs"
+ "Roaming de dados"
+ "Conectar aos serviços de dados quando estiver em roaming"
+ "Conectar aos serviços de dados quando estiver em roaming"
+ "Você perdeu a conectividade de dados porque deixou o roaming de dados da sua rede doméstica desativado."
+ "Ativar"
+ "Permitir roaming de dados? Isso pode causar cobranças significativas de roaming!"
+ "Atenção"
+ "Seleção de operador"
+ "Selecione um operador de rede""Data e hora""Definir data, hora, fuso horário e formatos""Automático""Usar valores fornecidos pela rede""Usar valores fornecidos pela rede"
- "Usar formato de 24 horas"
+ "Formato de 24 horas""Definir data e hora""Selecionar fuso horário""Definir data""Selecionar formato de data""Classificar em ordem alfabética""Classificar por fuso horário"
- "Segurança e local"
-
-
+ "Local e segurança"
+ "Configurações de Local e segurança"
+ "Definir Meu local, desbloqueio de tela, bloqueio do SIM e do armazenamento de credenciais"
+ "Definir o Meu local, o desbloqueio de tela, o bloqueio do armazenamento de credenciais""Senhas""Bluetooth""Ativar Bluetooth""Configurações de Bluetooth""Configurações de Bluetooth""Gerenciar conexões, definir o nome e detecção do dispositivo"
- "Solicitação de pareamento Bluetooth"
+ "Solicitação de pareamento Bluetooth""Informações do dispositivo Bluetooth"
- "%1$s"\n\n"Digite o PIN para parear"\n"(tente 0000 ou 1234)."
+ \n"Digite o PIN para emparelhar com \"%1$s\" (tente 0000 ou 1234.)"
+ \n"Digite a senha para emparelhar com \"%1$s\"."
+ "Para emparelhar com \"%1$s\", verifique se a senha está sendo exibida: %2$s."
+ "%1$s"\n"deseja emparelhar."
+ "Insira %2$s no \"%1$s\" para emparelhar."
+ "Emparelhar"
+ "Não emparelhar"
+ "dispositivo Bluetooth""Atenção""Houve um problema no pareamento com %1$s."
- "Houve um problema ao parear com o %1$s, porque o PIN digitado está incorreto."
-
-
-
-
+ "Houve um problema ao emparelhar com o %1$s porque o PIN ou a senha está incorreto."
+ "Não é possível estabelecer comunicação com %1$s."
+ "Emparelhamento rejeitado por %1$s.""Houve um problema na conexão com %1$s.""Procurar dispositivos""Conectar"
@@ -261,6 +270,7 @@
"Conectar-se a...""Mídia""Telefone"
+ "Transferir""Conectado ao áudio da mídia""Conectado ao áudio do telefone""Conectado ao áudio do telefone e da mídia"
@@ -270,8 +280,11 @@
"Perfis""Conectado ao áudio da mídia""Conectado ao áudio do telefone"
+ "Conectado ao servidor de transferência de arquivo"
+ "Não está conectado ao servidor de transferência de arquivo""Usar para áudio de mídia""Usar para áudio do telefone"
+ "Usado para transferência de arquivo""Wi-Fi""Wi-Fi""Ativar Wi-Fi"
@@ -288,25 +301,13 @@
"Segurança""Aberta""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Desconhecido"
-
-
-
-
-
-
-
-
-
-
-
-
+ "rede aberta"
+ "protegido por WEP"
+ "protegido com WPA/WPA2 PSK"
+ "protegido com 802.1x EAP""Endereço IP""Potência do sinal""Ativando…"
@@ -319,28 +320,19 @@
"Não é possível salvar a rede""Conectar""Conectar-se a %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Método EAP"
+ "Autenticação da Fase 2"
+ "Identidade"
+ "Identidade anônima"
+ "Certificado do cliente"
+ "Certificado de CA""Senha sem fio""Chave hexadecimal WEP (0 a 9, A a F)""Mostrar senha.""Verificar""Não está dentro do alcance"
-
-
- "Falha na conexão. Selecione para tentar novamente"
+ "lembrado"
+ "Falha na conexão. Toque para tentar novamente""Redes Wi-Fi""SSID da rede""Segurança"
@@ -391,6 +383,7 @@
"Desconectado""Falha""Som e tela"
+ "Configurações de Som e tela""Configurações de som""Definir toques, notificações, brilho da tela""Modo silencioso"
@@ -416,17 +409,16 @@
"Seleção audível""Reproduzir som ao fazer uma seleção de tela""Reproduzir som ao fazer uma seleção de tela"
+ "Retorno com vibração"
+ "Vibrar ao pressionar teclas e em algumas interações com a interface de usuário"
+ "Vibrar ao pressionar teclas e em algumas interações com a interface de usuário""Notificações do cartão SD"
-
-
-
-
- "Sincronização de dados"
- "Selecionar os aplicativos que serão sincronizados"
-
-
-
-
+ "Reproduzir som para notificações do cartão SD"
+ "Reproduzir som para notificações do cartão SD"
+ "Contas e sincronização"
+ "Adicionar ou remover contas e alterar as configurações da conta"
+ "Pesquisar"
+ "Gerenciar configurações e histórico de pesquisa""Configurações da tela""Animação""Mostrar animação ao abrir e fechar janelas"
@@ -437,9 +429,10 @@
"Brilho""Ajustar o brilho da tela""Tempo limite da tela"
- "Ajuste depois de quanto tempo a tela será desligada automaticamente"
- "Configurações de bloqueio do cartão SIM"
- "Configurar bloqueio do cartão SIM"
+ "Ajustar depois de quanto tempo a tela será desligada automaticamente"
+ "Brilho automático"
+ "Bloqueio do SIM"
+ "Conf. bloqueio do SIM""Bloqueio do cartão SIM""Bloquear cartão SIM""Exigir PIN para usar o telefone"
@@ -470,18 +463,14 @@
"Não disponível""Status""Status"
-
-
- "Cartão SD e armazenamento do telefone"
+ "Número de telefone, sinal etc."
+ "Cartão SD e armazenamento do telefone"
+ "Configurações de cartão SD e armazenamento do telefone""Desmontar o cartão SD, visualizar armazenamento disponível"
-
-
-
-
-
-
-
-
+ "Meu número de telefone"
+ "MIN"
+ "Versão PRL"
+ "MEID""Tipo de rede móvel""Estado da rede móvel""Estado do serviço"
@@ -520,6 +509,11 @@
"Porta MMS""MCC""MNC"
+ "Tipo de autenticação"
+ "Nenhum"
+ "PAP"
+ "CHAP"
+ "PAP ou CHAP""Tipo APN""Excluir APN""Novo APN"
@@ -533,13 +527,11 @@
"Restaurando as configurações APN padrão""Redefinir para o padrão""Redefinição das configurações padrão do APN concluída"
- "Redefinir configuração original"
+ "Configuração original""Apaga todos os dados no telefone"
-
-
+ "Todos os dados do seu telefone serão apagados, incluindo:"\n
"Sua conta do Google"
\n
"Configurações e dados de aplicativos e do sistema"
\n
"Aplicativos que você fez download"
\n"Não serão apagados:"\n
"Aplicativos fornecidos e o software atual do sistema"
\n
"Arquivos do cartão SD, como música ou fotos"
"Redefinir telefone"
-
-
+ "Apagar todas as informações pessoais e os aplicativos que você fez download? É impossível reverter essa ação.""Apagar tudo""Desenhe o seu padrão de desbloqueio""Você precisa desenhar o seu padrão de desbloqueio para confirmar uma redefinição de telefone."
@@ -552,24 +544,23 @@
"Apagar tudo""Desenhe o seu padrão de desbloqueio""Você deve desenhar o seu padrão de desbloqueio para confirmar a formatação de um cartão SD."
- "Configurações de chamada"
+ "Conf. De chamada""Configurar correio voz, encaminhamento, espera etc.""Redes móveis""Definir opções para roaming, redes, APNs"
-
-
+ "Meu Local""Usar redes sem fio""Veja o local nos aplicativos (como o Google Maps) usando redes sem fio""Local determinado pela rede Wi-Fi e/ou pelas redes móveis"
- "Ativar satélites GPS"
- "Durante a localização, a precisão chega no nível de rua (desmarque a seleção para conservar a bateria)"
+ "Usar satélites GPS"
+ "Durante a localização, a precisão chega no nível de rua (desmarque para conservar a bateria)""Localizar no nível da rua (exige mais bateria e visão do céu)"
-
-
-
-
-
-
+ "Usar GPS associado"
+ "Usar servidor para auxiliar GPS (desmarque para reduzir o uso da rede)"
+ "Usar servidor para auxiliar GPS (desmarque para aprimorar o desempenho do GPS)"
+ "Usar Meu Local"
+ "Usar Meu local para os resultados da pesquisa do Google e outros serviços do Google"
+ "Deseja permitir que o Google use o local para resultados de pesquisa aprimorados e outros serviços?""Concordo""Não concordo""Sobre o telefone"
@@ -579,12 +570,15 @@
"Direitos autorais""Licença""Termos e Condições"
-
-
+ "Tutorial do sistema""Aprenda a usar o seu telefone"
- "Licenças de código aberto"
+ "Licenças código aberto""Há um problema ao carregar as licenças.""Carregando..."
+ "Informações de segurança"
+ "Informações de segurança"
+ "O telefone não está conectado ao serviço de dados. Para visualizar estas informações agora, acesse %s em qualquer computador conectado à internet."
+ "Carregando...""Padrão de desbloqueio da tela""Alterar padrão de desbloqueio""Confirmar padrão salvo"
@@ -605,17 +599,17 @@
"É necessário desenhar o padrão para desbloquear a tela""Usar padrão visível""Usar feedback táctil"
- "Definir padrão de desbloqueio"
- "Alterar padrão de desbloqueio"
+ "Padrão de desbloqueio"
+ "Alterar padrão""Como desenhar um padrão de desbloqueio""Muitas tentativas incorretas!""Tente novamente em %d segundos.""Cancelar"
- "Próximo"
+ "Avançar""Protegendo o seu telefone"
- "Proteja o seu telefone contra o uso não autorizado criando um padrão de desbloqueio de tela pessoal. "\n\n"1"" Na próxima tela, observe enquanto um exemplo de padrão é desenhado. "\n\n"2"" Quando estiver pronto, desenhe o seu próprio padrão de desbloqueio pessoal. Experimente padrões diferentes, mas conecte no mínimo quatro pontos. "\n\n"3"" Desenhe novamente o seu padrão para confirmar. "\n\n"Pronto para começar? Selecione “Próximo”"". "\n\n"Para deixar o seu telefone sem proteção, selecione “Cancelar”."
+ "Proteja o seu telefone contra o uso não autorizado criando um padrão de desbloqueio de tela personalizado. "\n\n"1"" Na próxima tela, observe enquanto um exemplo de padrão é desenhado. "\n\n"2"" Quando estiver pronto, desenhe o seu próprio padrão de desbloqueio pessoal. Experimente padrões diferentes, mas conecte no mínimo quatro pontos. "\n\n"3"" Desenhe novamente o seu padrão para confirmar. "\n\n"Pronto para começar? Toque em “Avançar”"". "\n\n"Para deixar o seu telefone sem proteção, toque em “Cancelar”.""Exemplo de padrão"
- "Conecte no mínimo quatro pontos."\n" "\n"Selecione “Próximo” quando estiver pronto para desenhar o seu próprio padrão."
+ "Conecte no mínimo quatro pontos."\n" "\n"Toque em “Avançar” quando estiver pronto para desenhar o seu próprio padrão.""Gerenciar aplicativos""Gerenciar e remover aplicativos instalados""Aplicativos"
@@ -638,8 +632,7 @@
"Dados""Desinstalar""Limpar dados"
-
-
+ "Desinstalar atualizações""Você selecionou a inicialização padrão deste aplicativo para algumas ações.""Nenhum padrão definido.""Limpar padrão"
@@ -650,47 +643,56 @@
"Filtro""Selecionar as opções de filtro""Todos"
- "Terceiros"
+ "Download concluído""Em execução""Carregando...""Recalculando o tamanho…""Excluir"
- "Todas as informações salvas neste aplicativo serão excluídas permanentemente."
+ "Todos os dados deste aplicativo serão excluídos permanentemente. Isso inclui todos os arquivos, configurações, contas, bancos de dados e outros.""OK""Cancelar""Aplicativo não encontrado""O aplicativo não foi encontrado na lista de aplicativos instalados.""Não é possível limpar os dados do aplicativo."
-
-
-
-
-
-
-
-
+ "Desinstalar atualizações"
+ "Deseja desinstalar todas as atualizações deste aplicativo do sistema Android?"
+ "Limpar dados"
+ "Falha ao limpar os dados do aplicativo""Este aplicativo pode acessar os seguintes itens no seu telefone:""Calculando…""Não é possível calcular o tamanho do pacote"
- "Você não tem aplicativos de terceiros instalados."
-
-
- "Local e texto"
- "Definir opções de local (idioma e região), entrada de texto e correção automática"
+ "Você não tem aplicativos de terceiros instalados."
+ "versão %1$s"
+ "Serviços em execução"
+ "Visualizar e controlar os serviços em execução no momento"
+ "Reiniciando"
+ "Sem serviços em execução"
+ "Parar o serviço?"
+ "O serviço não será mais executado até ser iniciado novamente. Isso pode ter consequências indesejáveis no aplicativo %1$s."
+ "Parar"
+ "Cancelar"
+ "Iniciado pelo aplicativo: toque para parar"
+ "%1$s: toque para gerenciar"
+ "Disp.: %2$s+%3$s em %1$d"
+ "Outro: %2$s em %1$d"
+ "Processo: %1$s"
+ "Idioma e teclado"
+ "Configurações de idioma e teclado"
+ "Definir opções de idioma e região, entrada de texto e correção automática""Configuração de local""Configurações de texto""Selecionar local""Selecionar o idioma e a região""Substituição automática""Corrigir palavras digitadas incorretamente"
- "Iniciar com letra maiúscula automaticamente"
+ "Iniciar com maiúscula""Escrever a primeira letra nas sentenças com letra maiúscula""Pontuação automática""Configurações de teclado físico""Pressione a tecla de Espaço duas vezes para inserir \".\"""Senhas visíveis""Mostrar senha ao digitar"
- "Este método de entrada pode coletar todo o texto que você digitar, incluindo dados pessoais como senhas e números de cartão de crédito. Ele é proveniente do aplicativo %1$s. Ativar este método de entrada?"
+ "Este método de entrada pode coletar todo o texto que você digitar, incluindo dados pessoais como senhas e números de cartão de crédito. Ele é proveniente do aplicativo %1$s. Usar este método de entrada?""Dicionário do usuário""Dicionário do usuário""Adicionar e remover palavras do dicionário do usuário"
@@ -718,7 +720,7 @@
"Entrada de texto""Gerenciar opções de entrada de texto""Configurações de %1$s"
- "Configurações do teclado virtual"
+ "Configurações do teclado virtual""Teclado do dispositivo""Configurações de teclado integrado""Desenvolvimento"
@@ -729,13 +731,11 @@
"A tela nunca entrará em inatividade enquanto estiver carregando.""Permitir locais fictícios""Permitir locais fictícios"
-
-
-
-
+ "Permitir a depuração USB?"
+ "A depuração USB serve apenas para fins de desenvolvimento. Ela pode ser usada para copiar dados entre o computador e o aparelho, instalar aplicativos no seu aparelho sem notificação e ler dados de registro.""Escolher o gadget""Escolher widget"
- "Detalhes do UID %d"
+ "Detalhes do UID %d""UID %1$d""Detalhes do uso da rede do %1$s:""Bytes recebidos: %1$d"
@@ -746,14 +746,10 @@
"Tempo do sistema:""Tempo total:""Inicia: %1$d"
-
-
-
-
-
-
-
-
+ "%1$dd %2$dh %3$dm %4$ds"
+ "%1$dh %2$dm %3$ds"
+ "%1$dm %2$ds"
+ "%1$ds""Pacotes que compartilham este UID:""Não há dados de uso da bateria disponíveis""Sensor:"
@@ -775,400 +771,209 @@
"Aplicativo""Contagem""Tempo de uso"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Acessibilidade"
+ "Configurações de acessibilidade"
+ "Gerenciar opções de acessibilidade"
+ "Acessibilidade"
+ "Serviços de acessibilidade"
+ "Nenhum serviço de acessibilidade instalado."
+ "Este serviço de acessibilidade pode coletar todo o texto que você digitar, incluindo dados pessoais e números de cartão de crédito, menos senhas. Ele também pode registrar as interações da interface do usuário. Ele é proveniente do aplicativo %1$s. Usar este serviço de acessibilidade?"
+ "Desativar acessibilidade?"
+ "Uso da bateria"
+ "Onde a bateria tem sido usada"
+ "Uso da bateria desde a desconexão do aparelho"
+ "Uso da bateria desde a redefinição"
+ "%1$s desde que foi desconectado"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Tempo de ativação do aparelho"
+ "Tempo de ativação da rede WiFi"
+ "Tempo de ativação da rede WiFi"
+ "%1$s - %2$s%%"
+ "Detalhes de uso da bateria"
+ "Detalhes de uso"
+ "Ajustar uso de energia"
+ "Pacotes incluídos"
+ "Tela"
+ "Wi-Fi"
+ "Bluetooth"
+ "Célula em espera"
+ "Chamadas de voz"
+ "Telefone ocioso"
+ "Total da CPU"
+ "CPU prioritária"
+ "GPS"
+ "Telefone"
+ "Dados enviados"
+ "Dados recebidos"
+ "Áudio"
+ "Vídeo"
+ "Horário de ativação"
+ "Horário sem o sinal"
+ "Forçar parada"
+ "Informações do aplicativo"
+ "Configurações do aplicativo"
+ "Configurações da tela"
+ "Configurações de WiFi"
+ "Conf. de Bluetooth"
+ "Bateria usada por chamadas de voz"
+ "Bateria usada quando o telefone está ocioso"
+ "Bateria usada por rádio celular"
+ "Alternar para o modo para avião para economizar energia nas áreas sem cobertura celular"
+ "Bateria usada pela tela e pela luz de fundo"
+ "Reduzir o brilho e/ou o tempo limite da tela"
+ "Bateria usada por Wi-Fi"
+ "Desativar rede Wi-Fi quando não estiver em uso ou disponível"
+ "Bateria usada por Bluetooth"
+ "Desativar Bluetooth quando não estiver em uso"
+ "Tente conectar a um dispositivo Bluetooth diferente"
+ "Bateria usada por aplicativos em execução"
+ "Parar ou desinstalar o aplicativo"
+ "Desativar GPS quando não estiver em uso"
+ "O aplicativo pode oferecer configurações para reduzir o uso da bateria"
+ "%1$s desde que foi desconectado"
+ "Quando foi desconectado pela última vez para %1$s"
+ "Total de uso"
+ "Atualizar"
+ "Sistema operacional do Android"
+ "Servidor de mídia"
+ "Conversão de texto em voz"
+ "Definir opções de conversão de texto em fala"
+ "Configurações da Conversão de texto em voz"
+ "Usar minhas config."
+ "As conf. padrão abaixo substituem as conf. do aplicativo"
+ "Configurações padrão"
+ "Taxa de fala"
+ "Velocidade em que o texto é falado"
+ "Frequência do som"
+ "Afeta o tom do texto falado"
+ "Idioma"
+ "Define a voz específica do idioma para o texto falado"
+ "Ouça um exemplo"
+ "Reproduzir uma rápida demonstração da voz sintetizada"
+ "Instalar dados de voz"
+ "É necessário instalar os dados de voz para a sintetização da fala"
+ "As vozes necessárias para sintetização já estão instaladas corretamente"
+ "Este é um exemplo de sintetização de voz."
+ "Suas configurações foram alteradas. Veja um exemplo de como elas ficaram."
+ "Controle de energia"
+ "Atualizando configuração Wi-Fi"
+ "Atualizando configuração Bluetooth"
+ "Instalador de credenciais"
+ "Configurações de VPN"
+ "Conectar-se a %s"
+ "Nome de usuário:"
+ "Senha:"
+ "um nome de usuário"
+ "uma senha"
+ "Lembrar nome de usuário"
+ "Conectar"
+ "Sim"
+ "Não"
+ "Voltar"
+ "Não"
+ "Salvar"
+ "Cancelar"
+ "Reverter"
+ "Conectar-se à rede"
+ "Desconectar da rede"
+ "Editar rede"
+ "Excluir rede"
+ "Insira %s."
+ "Selecione %s."
+ "O nome de VPN \'%s\' já existe. Procure outro nome."
+ "Tem certeza de que deseja excluir esta VPN?"
+ "Tem certeza de que não deseja criar esse perfil?"
+ "Tem certeza de que deseja descartar as alterações feitas nesse perfil?"
+ "Não é possível se conectar à rede. Deseja tentar novamente?"
+ "Conexão perdida. Deseja conectar novamente?"
+ "O nome do servidor não pode ser solucionado. Deseja verificar sua configuração de nome de servidor?"
+ "Erro de desafio. Deseja verificar sua configuração de pergunta secreta?"
+ "Um ou mais segredos estão faltando nessa configuração de VPN. Deseja verificar sua configuração de pergunta secreta?"
+ "O nome de usuário ou a senha inserida está incorreta. Deseja tentar novamente?"
+ "Servidor desligado. O nome de usuário ou a senha inserida talvez esteja incorreta. Deseja tentar novamente?"
+ "Servidor desconectado. Talvez você esteja atrás de um firewall que impede a conexão com o servidor. Deseja tentar novamente?"
+ "Falha na negociação do servidor. Provavelmente o servidor não concorde com a sua opção de criptografia. Deseja verificar a sua configuração de criptografia?"
+ "Adicionar VPN"
+ "Adicionar VPN"
+ "Adicionar VPN %s"
+ "Detalhes de %s"
+ "VPNs"
+ "Conectando..."
+ "Desconectando..."
+ "Conectado"
+ "Conectar-se à rede"
+ "Nome da VPN"
+ "um nome da VPN"
+ "\'%s\' foi adicionado"
+ "Foram feitas alterações em \'%s\'"
+ "Definir certificado do usuário"
+ "Certificado do usuário"
+ "um certificado do usuário"
+ "Definir certificado de CA"
+ "Certificado da autoridade de certificação (CA)"
+ "um certificado de CA"
+ "Definir segredo L2TP"
+ "Segredo L2TP"
+ "um segredo L2TP"
+ "criptografia"
+ "Criptografia PPTP"
+ "Definir chave pré-compartilhada IPSec"
+ "Chave pré-compartilhada IPSec"
+ "uma chave pré-compartilhada IPSec"
+ "Definir servidor da VPN"
+ "Servidor da VPN"
+ "um servidor da VPN"
+ "Nome do servidor da VPN"
+ "Domínios de pesquisa DNS"
+ "Domínios de pesquisa DNS"
+ "%s foi definido"
+ "%s não definido"
+ "%s não definido (opcional)"
+ "Ativar %s"
+ "Desativar %s"
+ "%s foi ativado"
+ "%s foi desativado"
+ "Configurações de VPN"
+ "Configurar e gerenciar VPNs (Redes privadas virtuais)"
+ "(não alterado)"
+ "(não definido)"
+ "Armazenamento de credenciais"
+ "Usar credenciais seguras"
+ "Permitir que os aplicativos acessem certificados seguros e outras credenciais"
+ "Inserir senha"
+ "Insira a senha do armazenamento de credenciais."
+ "Instalar do cartão SD"
+ "Instalar certificados criptografados do cartão SD"
+ "Definir senha"
+ "Definir ou alterar a senha do armazenamento de credenciais"
+ "Limpar armazenamento"
+ "Remover todo o conteúdo do armazenamento de credenciais e redefinir a senha"
+ "Tem certeza de que deseja excluir todas as credenciais e redefinir a senha do armazenamento de credenciais?"
+ "Senha atual:"
+ "Nova senha:"
+ "Confirmar nova senha:"
+ "Definir uma senha para o armazenamento de credenciais (no mínimo 8 caracteres)"
+ "Insira a senha correta."
+ "Insira a senha correta. Você tem mais uma tentativa para inserir a senha correta antes que o armazenamento de credenciais seja apagado."
+ "Insira a senha correta. Você tem mais %1$d tentativas para inserir a senha correta antes que o armazenamento de credenciais seja apagado."
+ "As senhas não correspondem."
+ "Insira e confirme uma senha."
+ "Insira a senha."
+ "A senha deve ter no mínimo 8 caracteres."
+ "O armazenamento de credenciais foi apagado."
+ "O armazenamento de credenciais foi ativado."
+ "O armazenamento de credenciais foi desativado."
+ "Tom de emergência"
+ "Definir comportamento durante uma chamada de emergência"
+ "Privacidade"
+ "Configurações de privacidade"
+ "Local"
+ "Configurações"
+ "Dados pessoais"
+ "Fazer backup de minhas configurações"
+ "Backup das configurações"
+ "Tem certeza de que deseja parar de fazer backup das suas configurações e apagar todas as cópias nos servidores do Google?"
+
diff --git a/res/values-ru/arrays.xml b/res/values-ru/arrays.xml
index f2fd25f44f7..353e6acb608 100644
--- a/res/values-ru/arrays.xml
+++ b/res/values-ru/arrays.xml
@@ -24,38 +24,59 @@
"Тихий океан""Все"
+
+ "Без анимации"
+ "Анимация в отдельных случаях"
+ "Все анимации"
+
+
+ "Анимация в окне не отображается"
+ "В окне отображается некоторая часть анимации"
+ "В окне отображается вся анимация полностью"
+ "15 секунд""30 секунд""1 минута""2 минуты""10 минут"
- "Не отключать"
+ "30 минут"
+
+
+ "Очень медленная"
+ "Медленная"
+ "Обычная"
+ "Быстрая"
+ "Очень быстро"
+
+
+ "Очень низкий"
+ "Низкий"
+ "Обычный"
+ "Высокий"
+ "Очень высокий"
+
+
+ "Английский (США)"
+ "Английский (Великобритания)"
+ "Французский"
+ "Немецкий"
+ "Итальянский"
+ "Испанский"
+
+
+ "Авто"
+ "Нет"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Нет"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Авто""WEP ASCII"
@@ -75,7 +96,7 @@
"Прочее использование"
- "С последнего отключения питания"
+ "После последнего отключения питания""Всего с момента загрузки""Всего за все время"
@@ -84,15 +105,27 @@
"Начать подсчет""Название приложения"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Нет"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Выкл."
+ "Оповещение"
+ "Вибрация"
+
+
+ "Нет"
+ "PAP"
+ "CHAP"
+ "PAP или CHAP"
+
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 356bb9f18ed..75f6458ceab 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Да"
+ "Нет""Неизвестно""Включить радио""Отключить радио"
@@ -56,6 +58,7 @@
"ОК""SD-карта""Состояние батареи:"
+ "Питание:""Шкала батареи:""Уровень заряда батареи:""Уровень заряда батареи:"
@@ -75,6 +78,11 @@
"Разрядка батареи""Не заряжается""Полностью"
+ "Не подключено"
+ "Питание от сети"
+ "USB"
+ "Питание от сети и USB"
+ "Неизвестно""Неизвестно""Хорошо""Перегрев"
@@ -89,7 +97,7 @@
"Имя устройства""Без настройки имени, использовать имя аккаунта""Поиск устройств"
- "%1$s будет отключено."
+ "Связь с %1$s будет разорвана.""Подключено""Отключено""Отключение..."
@@ -104,14 +112,19 @@
"Запрос сопряжения Bluetooth""Запрос на сопряжение""Выберите для сопряжения с "
+ "Выбор устройства Bluetooth"
+ "Запрос разрешения на включение Bluetooth"
+ "Приложение на вашем телефоне запрашивает разрешение на включение Bluetooth. Разрешить?"
+ "Приложение на вашем телефоне запрашивает разрешение на включение видимого режима Bluetooth на %1$d с. Разрешить?"
+ "Приложение на вашем телефоне запрашивает разрешение на включение Bluetooth и видимого режима на %1$d с. Разрешить?"
+ "Включается Bluetooth...""Настройки даты и времени""1:00 pm""13:00""Изменить время""Дата""Выбрать часовой пояс"
-
-
+ "Обычный (%s)""Предварительный просмотр:""Размер шрифта:"
@@ -192,35 +205,25 @@
"Настройки прокси-сервера""Отмена""Настройки"
-
-
+ "Настройки""Режим полета""Отключить все беспроводные соединения""Отключение беспроводных соединений...""Включение беспроводных соединений..."
- "Настройки беспроводных модулей"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Беспроводные сети"
+ "Настройки беспроводных модулей"
+ "Wi-Fi, Bluetooth, режим полета, мобильные сети и VPN"
+ "Интернет-роуминг"
+ "Подключаться к службам передачи данных при роуминге"
+ "Подключаться к службам передачи данных при роуминге"
+ "Передача данных прекращена, потому что телефон находится за пределами домашней сети, а интернет-роуминг выключен."
+ "Включить"
+ "Разрешить интернет-роуминг? Возможны высокие расходы за использование роуминга."
+ "Внимание"
+ "Выбор оператора"
+ "Выберите оператора связи""Дата и время"
- "Настроить часовой пояс, форматы даты и времени"
+ "Установка даты, времени, часового пояса и форматов""Автоматически""Использовать данные, предоставленные сетью""Использовать данные, предоставленные сетью"
@@ -231,25 +234,31 @@
"Выбрать формат даты""Упорядочить по алфавиту""Упорядочить по часовому поясу"
- "Безопасность и место"
-
-
+ "Местоположение и безопасность"
+ "Настройки местоположения и безопасности"
+ "Настройка функции \"Мое местоположение\", разблокировка экрана и блокировка хранилища регистрационных данных"
+ "Настройка функции \"Мое местоположение\", разблокировка экрана и блокировка хранилища регистрационных данных""Пароли""Bluetooth""Включить Bluetooth""Настройки Bluetooth""Настройки Bluetooth""Настройка подключений, видимости и имени устройства"
- "Запрос сопряжения Bluetooth"
+ "Запрос сопряжения Bluetooth""Сведения об устройстве Bluetooth"
- "%1$s"\n\n"Введите PIN-код для сопряжения."\n"(Попробуйте 0000 или 1234.)"
+ \n"Введите PIN-код для сопряжения с %1$s. (Попробуйте 0000 или 1234.)"
+ \n"Введите ключ доступа для сопряжения с %1$s."
+ "Для сопряжения с \"%1$s\" подтвердите, что показывается ключ доступа: %2$s."
+ "%1$s"\n"запрашивает сопряжение."
+ "Введите %2$s на %1$s, чтобы выполнить сопряжение."
+ "Сопряжение"
+ "Не устанавливать сопряжение"
+ "устройство Bluetooth""Внимание""Неполадка при сопряжении с %1$s."
- "Неполадка при сопряжении с %1$s. Введен неверный PIN."
-
-
-
-
+ "Неполадка при сопряжении с %1$s из-за неверно введенного PIN-кода или ключа доступа."
+ "Не удается установить соединение с %1$s."
+ "%1$s не разрешает сопряжение.""Возникла неполадка при подключении к %1$s.""Поиск устройств""Подключить"
@@ -261,6 +270,7 @@
"Подключить к...""Мультимедиа""Телефон"
+ "Передать""Подключено к мультимедийному аудиоустройству""Подключено к аудиоустройству телефона""Подключено к телефону и мультимедийному аудиоустройству"
@@ -270,8 +280,11 @@
"Профили""Подключено к мультимедийному аудиоустройству""Подключено к аудиоустройству телефона"
+ "Установлено подключение к серверу передачи файлов"
+ "Нет подключения к серверу передачи файлов""Использовать для мультимедийного аудиоустройства""Использовать для аудиоустройства телефона"
+ "Используется для передачи файлов""Wi-Fi""Wi-Fi""Включить Wi-Fi"
@@ -288,25 +301,13 @@
"Безопасность""Открыть""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""Неизвестно"
-
-
-
-
-
-
-
-
-
-
-
-
+ "открытая сеть"
+ "защищено WEP"
+ "защищено WPA/WPA2 PSK"
+ "защищено 802.1x EAP""IP-адрес""Громкость сигнала""Включение..."
@@ -319,28 +320,19 @@
"Не удалось сохранить сеть""Подключить""Подключить к %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Метод EAP"
+ "2-й этап аутентификации"
+ "Идентификационный код"
+ "Идентификационный код без определения личности"
+ "Сертификат клиента"
+ "Сертификат центра сертификации""Пароль для беспроводного подключения""Шестнадцатеричный ключ WEP (0-9, A-F)""Показать пароль.""Поиск""Вне диапазона"
-
-
- "Не удалось установить соединение. Выберите, чтобы повторить попытку"
+ "сохранено в памяти"
+ "Не удалось установить соединение. Нажмите, чтобы повторить попытку.""Сети Wi-Fi""Сетевой SSID""Безопасность"
@@ -391,8 +383,9 @@
"Отключено""Сбой""Звук и изображение"
+ "Звук и изображение""Настройки звука"
- "Настроить мелодии, уведомления, яркость экрана"
+ "Настройка мелодий, уведомлений, яркости экрана""Тихий режим""Все звуки, кроме мультимедиа и сигналов, отключены""Все звуки, кроме аудио и видео, отключены"
@@ -414,19 +407,18 @@
"Воспроизводить тональные сигналы клавиатуры""Воспроизводить тональные сигналы клавиатуры""Звук при нажатии"
- "Воспроизводить тональный сигнал при выборе экрана"
- "Воспроизводить звук при нажатии на экран"
+ "При нажатии на экран будет слышен звук"
+ "При нажатии на экран звука не будет"
+ "Обратная связь"
+ "Вибрация при нажатии софт-клавиш и некоторых элементов интерфейса"
+ "Вибрация при нажатии софт-клавиш и некоторых элементов интерфейса""Уведомления карты SD"
-
-
-
-
- "Синхронизация данных"
- "Выбрать приложения для синхронизации"
-
-
-
-
+ "Включать звук для уведомлений SD-карты"
+ "Включать звук для уведомлений SD-карты"
+ "Аккаунты и синхронизация"
+ "Добавление или удаление аккаунтов и изменение настроек аккаунта"
+ "Поиск"
+ "Настроить параметры и управлять историей поиска""Настройки экрана""Анимация""Показывать анимацию при открытии и закрытии окон"
@@ -438,6 +430,7 @@
"Настроить яркость экрана""Время отключения экрана""Выбрать интервал до автоматического отключения экрана"
+ "Яркость автоматически""Настройки блокировки SIM-карты""Настроить блокировку SIM-карты""Блокировка SIM-карты"
@@ -448,7 +441,7 @@
"PIN-код SIM-карты""Заблокировать SIM-карту""Разблокировать SIM-карту"
- "Старый PIN-код SIM-карты"
+ "Прежний PIN-код SIM-карты""Новый PIN SIM-карты""Введите новый PIN повторно""PIN-код SIM-карты"
@@ -470,18 +463,14 @@
"Недоступно""Состояние""Состояние"
-
-
- "SD-карта и память телефона"
- "Демонтировать SD-карту, показать доступную память"
-
-
-
-
-
-
-
-
+ "Номер телефона, сигнал и т.д."
+ "SD-карта и память телефона"
+ "Настройки SD-карты и памяти телефона"
+ "Отключение SD-карты, сведения о доступной памяти"
+ "Мой номер телефона"
+ "MIN"
+ "Версия PRL"
+ "MEID""Тип мобильной сети""Состояние сотовой сети""Состояние службы"
@@ -520,6 +509,11 @@
"Порт MMS""MCC""MNC"
+ "Тип аутентификации"
+ "Нет"
+ "PAP"
+ "CHAP"
+ "PAP или CHAP""Тип APN""Удалить APN""Новая точка доступа"
@@ -535,11 +529,9 @@
"Восстановление настроек APN по умолчанию завершено""Возврат к исходным настройкам""Удаляет всю информацию в памяти телефона"
-
-
+ "С телефона будут удалены все данные, в том числе: "\n
"ваш аккаунт Google;"
\n
"данные и настройки системы и приложений;"
\n
"загруженные приложения."
\n"Не будут удалены:"\n
"текущее системное ПО и пакетные приложения;"
\n
"файлы на SD-карте, например фотографии и музыка."
"Сбросить настройки телефона"
-
-
+ "Стереть всю личную информацию и загруженные приложения? Это действие нельзя отменить!""Стереть все""Начертить графический ключ""Для подтверждения сброса настроек телефона необходимо начертить графический ключ."
@@ -553,23 +545,22 @@
"Начертить графический ключ разблокировки""Для подтверждения форматирования карты SD нужно начертить графический ключ разблокировки.""Настройки вызовов"
- "Настроить голосовую почту, АОН, переадресацию, паралл. вызов"
+ "Голосовая почта, АОН, переадресация, параллельный вызов""Мобильная сеть""Настроить параметры роуминга, сетей, точек доступа (APN)"
-
-
+ "Мое местоположение""Беспроводные сети"
- "Просматривайте местоположение в приложениях (например, в Картах), используя беспроводную сеть"
+ "Местоположение не определяется с помощью беспроводных сетей""Местоположение определяется сотовой сетью и/или Wi-Fi"
- "Спутники GPS"
- "При определении местоположения с точностью до улицы (отмените выделения для экономии энергии батареи)"
- "Точные координаты (требуется открытое небо и больше энергии)"
-
-
-
-
-
-
+ "Спутники GPS"
+ "Точные координаты (требуется открытое небо и больше энергии)"
+ "Приблизительные координаты (экономит энергию)"
+ "Использовать A-GPS"
+ "Использовать сервер для A-GPS (снимите флажок для менее интенсивного использования сети)"
+ "Использовать сервер для A-GPS (снимите флажок для улучшения работы GPS)"
+ "Использовать функцию \"Мое местоположение\""
+ "Использовать функцию \"Мое местоположение\" для улучшения результатов поиска Google и работы других служб Google."
+ "Разрешить Google использовать данные о местоположении для улучшения результативности поиска и работы других служб?""Принимаю""Не принимаю""О телефоне"
@@ -579,12 +570,15 @@
"Авторские права""Лицензия""Условия предоставления услуг"
-
-
+ "Руководство по работе с системой""Узнайте, как пользоваться телефоном""Лицензии ПО с открытым исходным кодом""При загрузке лицензий возникла неполадка.""Идет загрузка…"
+ "Сведения о безопасности"
+ "Сведения о безопасности"
+ "Телефон не подключен к службе передачи данных. Чтобы просмотреть эту информацию, откройте страницу %s на любом компьютере, подключенном к Интернету."
+ "Идет загрузка…""Графический ключ разблокировки экрана""Изменить графический ключ""Начертите существующий ключ"
@@ -613,11 +607,11 @@
"Отмена""Далее""Обеспечение безопасности телефона"
- "Защитите телефон от несанкционированного использования, создав собственный графический ключ разблокировки экрана. "\n\n"1"" На следующем экране показан пример вычерчивания ключа. "\n\n"3"" Подготовьтесь и создайте собственный графический ключ разблокировки. Можно экспериментировать с ключами, но в них должны быть соединены как минимум четыре точки. "\n\n"3"" Для подтверждения начертите графический ключ повторно. "\n\n" Готовы? Нажмите \"Далее\""". "\n\n"Если вы не хотите устанавливать защиту телефона, выберите \"Отмена\"."
+ "Защитите телефон от несанкционированного использования, создав собственный графический ключ разблокировки экрана. "\n\n"1"" На следующем экране показан пример вычерчивания ключа. "\n\n"3"" Подготовьтесь и создайте собственный графический ключ разблокировки. Можно экспериментировать с ключами, но в них должны быть соединены как минимум четыре точки. "\n\n"3"" Для подтверждения начертите графический ключ повторно. "\n\n" Готовы? Нажмите \"Далее\""". "\n\n"Если вы не хотите устанавливать защиту телефона, выберите \"Отмена\".""Пример графического ключа"
- "Соедините как минимум четыре точки."\n" "\n"Выберите \"Далее\", когда будете готовы начертить собственный графический ключ разблокировки."
+ "Соедините как минимум четыре точки."\n" "\n"Выберите \"Далее\", когда будете готовы начертить собственный графический ключ разблокировки.""Управление приложениями"
- "Управлять установленными приложениями и удалять их"
+ "Управление установленными приложениями и удаление их""Приложения""Управление приложениями, настройка клавиш быстрого запуска""Настройки приложения"
@@ -638,8 +632,7 @@
"Данные""Удалить""Стереть данные"
-
-
+ "Удалить обновления""Выбран запуск этого приложения по умолчанию при выполнении некоторых действий.""Без настроек по умолчанию.""Удалить настройки по умолчанию"
@@ -650,33 +643,42 @@
"Фильтр""Выбрать параметры фильтра""Все"
- "Независимые производители"
+ "Сторонние разработчики""Выполняемые сейчас""Идет загрузка…""Повторное вычисление размера...""Удалить"
- "Вся информация, сохраненная в этом приложении, будет удалена навсегда."
+ "Все данные этой программы будут удалены навсегда, включая все файлы, базы данных, настройки, аккаунты и прочее.""ОК""Отмена""Приложение не найдено""Приложение не было найдено в списке установленных приложений.""Не удалось очистить данные приложения."
-
-
-
-
-
-
-
-
+ "Удалить обновления"
+ "Удалить все обновления в этом системном приложении Android?"
+ "Стереть данные"
+ "Не удалось очистить данные для приложения""Это приложение имеет доступ к следующей информации и следующие права:""Вычисление...""Не удалось вычислить размер пакета"
- "Не обнаружено установленных приложений от независимых поставщиков."
-
-
- "Регион и ввод текста"
- "Выбрать язык и регион, способ ввода текста и параметры автокоррекции"
+ "Не обнаружено установленных приложений от независимых поставщиков."
+ "Версия %1$s"
+ "Работающие службы"
+ "Просмотр и управление работающими службами"
+ "Перезапуск"
+ "Работающие службы отсутствуют"
+ "Остановить службу?"
+ "Эта служба не будет больше выполняться, пока не будет запущена снова. Это может негативно повлиять на программу %1$s."
+ "Стоп"
+ "Отмена"
+ "Запущено приложением. Нажмите, чтобы остановить."
+ "%1$s: нажмите, чтобы изменить"
+ "Дост.: %2$s+%3$s (%1$d)"
+ "Другое: %2$s (%1$d)"
+ "Процесс %1$s"
+ "Язык и клавиатура"
+ "Настройки языка и клавиатуры"
+ "Выбор языка и региона, способов ввода и настройка автокоррекции""Региональные настройки""Настройки текста""Выбрать регион"
@@ -690,7 +692,7 @@
"Для ввода точки можно дважды нажать клавишу \"Пробел\"""Видимые пароли""Показывать пароль при вводе"
- "Возможно, при использовании этого метода будут собираться все вводимые данные, в том числе такие личные сведения, как пароли или номера кредитных карт. Метод обеспечивается приложением %1$s. Разрешить этот метод ввода?"
+ "Возможно, при использовании этого метода будут собираться все вводимые данные, в том числе такие личные сведения, как пароли или номера кредитных карт. Метод обеспечивается приложением %1$s. Использовать этот метод ввода?""Пользовательский словарь""Пользовательский словарь""Добавить или удалить слова из пользовательского словаря"
@@ -718,24 +720,22 @@
"Ввод текста""Задать параметры ввода текста""Настройки %1$s"
- "Настройки экранной клавиатуры"
+ "Настройки экранной клавиатуры""Клавиатура устройства""Настройки встроенной клавиатуры""Разработка"
- "Настроить параметры для разработки приложений"
+ "Настройка параметров для разработки приложений""Отладка USB""Режим отладки при подключенном USB-устройстве""Оставить включенным""Во время зарядки экран будет всегда включен""Разрешить копии мест""Разрешить копии местоположений"
-
-
-
-
+ "Разрешить отладку USB?"
+ "Отладка USB предназначена только в целях разработки. С ее помощью можно копировать данные с компьютера на мобильное устройство и обратно, устанавливать на устройство приложения без уведомления и просматривать данные журналов.""Выбор·гаджета""Выбор виджета"
- "Сведения для идентификатора пользователя %d"
+ "Сведения для идентификатора пользователя %d""Идентификатор пользователя %1$d""Сведения об использовании сети приложением %1$s:""Получено байт: %1$d"
@@ -746,14 +746,10 @@
"Системное время:""Общее время:""Запусков: %1$d"
-
-
-
-
-
-
-
-
+ "%1$d дн. %2$d ч. %3$d мин. %4$d с."
+ "%1$d ч. %2$d мин. %3$d с."
+ "%1$d мин. %2$d с."
+ "%1$d с.""Пакеты с этим идентификатором пользователя:""Данные об использовании батареи недоступны""Сенсор:"
@@ -775,400 +771,209 @@
"Приложение""Подсчет""Время использования"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Специальные возможности"
+ "Настройки специальных возможностей"
+ "Настройка специальных возможностей"
+ "Специальные возможности"
+ "Службы специальных возможностей"
+ "Службы специальных возможностей не установлены."
+ "Эта служба специальных возможностей может записывать весь текст, который вы вводите, в том числе личные данные и номера кредитных карт, за исключением паролей. Служба запущена приложением %1$s. Использовать службу?"
+ "Отключить специальные возможности?"
+ "Расход заряда батареи"
+ "На что расходуется заряд батареи"
+ "Расход заряда батареи с момента отключения от сети питания"
+ "Расход заряда батареи с момента перезагрузки"
+ "%1$s с момента отключения"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Время включения устройства"
+ "Время работы WiFi"
+ "Время работы WiFi"
+ "%1$s – %2$s%%"
+ "Подробные сведения о расходе заряда батареи"
+ "Использовать сведения"
+ "Настроить режим энергопотребления"
+ "Вложенные пакеты"
+ "Показать"
+ "Wi-Fi"
+ "Bluetooth"
+ "В режиме ожидания"
+ "Голосовые вызовы"
+ "Телефон в режиме ожидания"
+ "Суммарное использование ЦП"
+ "Использование ЦП активными приложениями"
+ "GPS"
+ "Телефон"
+ "Данные отправлены"
+ "Полученные данные"
+ "Аудио"
+ "Видео"
+ "Время работы"
+ "Время отсутствия сигнала"
+ "Остановить принудительно"
+ "Сведения о приложении"
+ "Настройки приложения"
+ "Настройки экрана"
+ "Настройки WiFi"
+ "Настройки Bluetooth"
+ "Заряд батареи, израсходованный на голосовые вызовы"
+ "Расход заряда батареи в режиме ожидания"
+ "Батарея используется сотовым радио"
+ "Перейти в режим полета, чтобы сэкономить заряд батареи при отсутствии покрытия сети"
+ "Заряд батареи, израсходованный на подсветку экрана"
+ "Уменьшить яркость экрана и/или время до отключения экрана"
+ "Батарея используется Wi-Fi"
+ "Отключить модуль Wi-Fi, когда он не используется или сеть недоступна"
+ "Заряд батареи, израсходованный Bluetooth"
+ "Отключить Bluetooth, если он не используется"
+ "Попробуйте подключиться к другому устройству Bluetooth"
+ "Расход заряда батареи для работы приложений"
+ "Остановить или удалить приложение"
+ "Отключать GPS, когда не используется"
+ "В программе могут быть настройки для снижения расхода заряда батареи"
+ "%1$s с момента отключения"
+ "С последнего отключения %1$s"
+ "Суммарное использование"
+ "Обновить"
+ "ОС Android"
+ "Сервер медиа"
+ "Преобразование текста в речь"
+ "Настроить параметры преобразования текста в речь"
+ "Настройки синтеза речи"
+ "Всегда использовать мои настройки"
+ "Переопределенные настройки приложения имеют приоритет перед настройками по умолчанию"
+ "Настройки по умолчанию"
+ "Скорость речи"
+ "Скорость чтения текста"
+ "Тон"
+ "Влияет на высоту синтезированной речи"
+ "Язык"
+ "Выбрать голос, связанный с определенным языком, для чтения текста"
+ "Прослушайте пример"
+ "Воспроизвести краткую демонстрацию синтезированной речи"
+ "Установка голосовых данных"
+ "Установить голосовые данные, необходимые для синтеза речи"
+ "Голоса, необходимые для синтеза речи, уже установлены"
+ "Это пример синтеза речи."
+ "Ваши настройки изменены. Вот пример того, как это звучит."
+ "Управление питанием"
+ "Обновление настроек Wi-Fi"
+ "Обновление настроек Bluetooth"
+ "Установщик регистрационных данных"
+ "Настройки VPN"
+ "Подключить к \"%s\""
+ "Имя:"
+ "Пароль:"
+ "имя пользователя"
+ "пароль"
+ "Запомнить имя пользователя"
+ "Подключить"
+ "Да"
+ "Нет"
+ "Назад"
+ "Нет"
+ "Сохранить"
+ "Отмена"
+ "Отменить изменения"
+ "Подключить к сети"
+ "Отключиться от сети"
+ "Изменить сеть"
+ "Удалить сеть"
+ "Необходимо ввести %s."
+ "Необходимо выбрать %s."
+ "VPN с названием \"%s\" уже существует. Выберите другое название."
+ "Действительно удалить эту VPN?"
+ "Не создавать этот профиль?"
+ "Отменить все изменения этого профиля?"
+ "Не удалось подключиться к сети. Повторить попытку?"
+ "Соединение утрачено. Подключиться снова?"
+ "Не удается найти сервер с таким именем. Проверить настройки имени сервера?"
+ "Ошибка проверки. Проверить настройки секретов?"
+ "В данной конфигурации VPN не хватает одного или более секретов. Проверить настройки секретов?"
+ "Вы неверно ввели имя пользователя или пароль. Повторить попытку?"
+ "Сеанс прекращен сервером. Возможно, вы неверно ввели имя пользователя или пароль. Повторить попытку?"
+ "Сбой на сервере. Возможно вы защищены брандмауэром, который не дает подключиться к серверу. Повторить попытку?"
+ "Связь с сервером не установлена. Возможно, не были согласованы параметры шифрования. Изменить настройки шифрования?"
+ "Добавить VPN"
+ "Добавить VPN"
+ "Добавить VPN \"%s\""
+ "Сведения: %s"
+ "Сети VPN"
+ "Подключение..."
+ "Отключение..."
+ "Подключено"
+ "Подключить к сети"
+ "Имя VPN"
+ "имя VPN"
+ "Профиль \"%s\" добавлен"
+ "В профиль \"%s\" внесены изменения"
+ "Установить пользовательский сертификат"
+ "Сертификат пользователя"
+ "сертификат пользователя"
+ "Установить сертификат центра сертификации"
+ "Сертификат центра сертификации"
+ "сертификат центра сертификации"
+ "Установить секрет L2TP"
+ "секрет L2TP"
+ "секрет L2TP"
+ "шифрование"
+ "Шифрование PPTP"
+ "Установить совместно используемый ключ IPSec"
+ "Совместно используемый ключ IPSec"
+ "совместно используемый ключ IPSec"
+ "Указать сервер VPN"
+ "Сервер VPN"
+ "сервер VPN"
+ "Имя сервера VPN"
+ "Домены поиска DNS"
+ "DNS поиска"
+ "%s установлено"
+ "%s не установлено"
+ "%s не установлено (необязательно)"
+ "Включить %s"
+ "Отключить %s"
+ "%s вкл."
+ "%s откл."
+ "Настройки VPN"
+ "Настройка и управление виртуальными частными сетями (VPN)"
+ "(не изменялось)"
+ "(не настроено)"
+ "Хранилище регистрационных данных"
+ "Использовать безопасные регистрационные данные"
+ "Разрешить приложениям доступ к сертификатам безопасности и другим регистрационным данным"
+ "Ввод пароля"
+ "Введите пароль для доступа в хранилище регистрационных данных."
+ "Установка с SD-карты"
+ "Установить зашифрованные сертификаты с SD-карты"
+ "Установить пароль"
+ "Установить или изменить пароль для доступа в хранилище регистрационных данных"
+ "Очистить хранилище"
+ "Очистить все регистрационные данные в хранилище и сбросить пароль"
+ "Вы действительно хотите удалить все регистрационные данные и сбросить пароль для доступа в хранилище регистрационных данных?"
+ "Текущий пароль:"
+ "Новый пароль:"
+ "Подтвердите новый пароль:"
+ "Установите пароль для доступа в хранилище регистрационных данных (не менее 8 символов)."
+ "Введите правильный пароль."
+ "Введите правильный пароль. У вас осталась 1 попытка. После этого хранилище регистрационных данных будет очищено."
+ "Введите правильный пароль. Количество попыток ограничено (осталось: %1$d). После этого хранилище регистрационных данных будет очищено."
+ "Пароли не совпадают."
+ "Необходимо ввести и подтвердить пароль."
+ "Введите пароль."
+ "В пароле должно быть не менее 8 символов."
+ "Хранилище регистрационных данных очищено."
+ "Хранилище регистрационных данных включено."
+ "Хранилище регистрационных данных отключено."
+ "Тональный сигнал экстренного вызова"
+ "Настроить режим работы при экстренном вызове"
+ "Конфиденциальность"
+ "Настройки конфиденциальности"
+ "Местоположение"
+ "Настройки"
+ "Личные данные"
+ "Создать резервную копию настроек"
+ "Резервные копии настроек"
+ "Вы уверены, что не хотите больше создавать резервные копии настроек и хотите удалить все копии с серверов Google?"
+
diff --git a/res/values-sv/arrays.xml b/res/values-sv/arrays.xml
index 34dcd084615..e2de9457c98 100644
--- a/res/values-sv/arrays.xml
+++ b/res/values-sv/arrays.xml
@@ -24,38 +24,59 @@
"Stilla havet""Alla"
+
+ "Inga animeringar"
+ "Vissa animeringar"
+ "Alla animeringar"
+
+
+ "Inga fönsteranimeringar visas"
+ "Vissa fönsteranimeringar visas"
+ "Alla fönsteranimeringar visas"
+ "15 sekunder""30 sekunder""1 minut""2 minuter""10 minuter"
- "Ingen tidsgräns"
+ "30 minuter"
+
+
+ "Mycket långsam"
+ "Långsam"
+ "Normal"
+ "Snabb"
+ "Mycket snabb"
+
+
+ "Mycket låg"
+ "Låg"
+ "Normal"
+ "Hög"
+ "Mycket hög"
+
+
+ "Amerikansk engelska"
+ "Brittisk engelska"
+ "Franska"
+ "Tyska"
+ "Italienska"
+ "Spanska"
+
+
+ "Automatiskt"
+ "Inga"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Inga"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Automatiskt""WEP ASCII"
@@ -84,15 +105,27 @@
"Starta räkneverk""Namn på program"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Inga"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Av"
+ "Varning"
+ "Vibrera"
+
+
+ "Inga"
+ "PAP"
+ "CHAP"
+ "PAP eller CHAP"
+
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 6b1b90f6c92..1ec0c07db50 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Ja"
+ "Nej""Okänd""Sätt på radio""Stäng av radio"
@@ -56,6 +58,7 @@
"OK""SD-kort""Batteristatus"
+ "Elkontakt:""Batteriskala:""Batterinivå:""Batteriets tillstånd:"
@@ -75,6 +78,11 @@
"Laddar ur""Laddar inte""Fullt"
+ "Urkopplad"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Okänd""Okänd""Bra""Överhettning"
@@ -104,14 +112,19 @@
"Begäran om parkoppling för Bluetooth""Begäran om parkoppling""Välj att parkoppla med "
+ "Bluetooth-enhetsväljare"
+ "Begäran om Bluetooth-behörighet"
+ "Ett program i telefonen begär tillåtelse att aktivera Bluetooth. Vill du tillåta det?"
+ "Ett program i telefonen begär tillåtelse att göra telefonen synlig för andra Bluetooth-enheter i %1$d sekunder. Vill du tillåta det?"
+ "Ett program i telefonen begär tillåtelse att aktivera Bluetooth och göra telefonen synlig för andra enheter i %1$d sekunder. Vill du tillåta det?"
+ "Aktiverar Bluetooth …""Inställningar för datum och tid""Kl. 13:00""13:00""Byt tid""Datum""Välj tidszon"
-
-
+ "Normalt (%s)""Förhandsgranska:""Teckenstorlek:"
@@ -192,33 +205,23 @@
"Proxy-inställningar""Avbryt""Inställningar"
-
-
+ "Inställningar""Flygplansläge""Inaktivera alla trådlösa anslutningar""Inaktiverar trådlösa anslutningar…""Aktivera trådlösa anslutningar..."
- "Trådlösa styrenheter"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Trådlöst och nätverk"
+ "Inställningar för trådlöst och nätverk"
+ "Hantera Wi-Fi, Bluetooth, flygplansläge, mobila nätverk och VPN"
+ "Dataroaming"
+ "Anslut till datatjänster vid roaming"
+ "Anslut till datatjänster vid roaming"
+ "Du förlorade dataanslutningen eftersom du lämnade ditt hemnätverk utan att aktivera roaming."
+ "Aktivera"
+ "Tillåta roaming? Observera att detta kan leda till höga kostnader!"
+ "Obs!"
+ "Val av operatör"
+ "Välj en nätverksoperatör""Datum och tid""Ange datum, tidszon och format""Automatiskt"
@@ -226,30 +229,36 @@
"Använd värden som tillhandahålls av nätverket""Använd 24-timmarsformat""Ange tid"
- "Välja tidszon"
+ "Välj tidszon""Ange datum""Välj datumformat""Sortera i bokstavsordning""Sortera efter tidszon"
- "Säkerhet och plats"
-
-
+ "Plats och säkerhet"
+ "Inställningar för plats och säkerhet"
+ "Ställ in Min plats, skärmupplåsning, lås för SIM-kort och lås för uppgiftslagring"
+ "Ställ in Min plats, skärmupplåsning, lås för uppgiftslagring""Lösenord""Bluetooth""Aktivera Bluetooth""Bluetooth-inställningar""Bluetooth-inställningar""Hantera anslutningar, ange inställningar för enhetens namn och synlighet"
- "Begäran om Bluetooth-parkoppling"
+ "Begäran om Bluetooth-parkoppling""Information om Bluetooth-enhet"
- "%1$s"\n\n" Ange PIN-kod för parkoppling."\n" (Försök med 0000 eller 1234.)"
+ \n"Ange PIN-koden om du vill koppla ihop med \"%1$s\". (testa 0000 eller 1234.)"
+ \n"Ange nyckel för parkoppling med \"%1$s\"."
+ "Om du vill parkoppla med %1$sbekräftar du att rätt nyckel visas: %2$s."
+ "%1$s"\n"vill kopplas ihop."
+ "Ange %2$s i \"%1$s\" om du vill parkoppla."
+ "Parkoppling"
+ "Parkoppla inte"
+ "Bluetooth-enhet""Obs!""Ett problem inträffade när %1$s parkopplades."
- "Det gick inte att parkoppla %1$s eftersom den angivna PIN-koden är fel."
-
-
-
-
+ "Det gick inte att parkoppla %1$s eftersom PIN-koden eller nyckeln inte stämmer."
+ "Det gick inte att upprätta kommunikation med %1$s."
+ "Parkoppling avvisad av %1$s.""Det gick inte att ansluta till %1$s.""Sök efter enheter""Anslut"
@@ -261,6 +270,7 @@
"Anslut till…""Media""Telefon"
+ "Överför""Ansluten till medialjud""Ansluten till telefonens ljud""Ansluten till telefon- och medialjud"
@@ -270,8 +280,11 @@
"Profiler""Ansluten till medialjud""Ansluten till telefonens ljud"
+ "Ansluten till filöverföringsserver"
+ "Inte ansluten till filöverföringsserver""Använd för medialjud""Använd för telefonens ljud"
+ "Använd för filöverföring""Wi-Fi""Wi-Fi""Aktivera Wi-Fi"
@@ -288,25 +301,13 @@
"Säkerhet""Öppna""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Okänd"
-
-
-
-
-
-
-
-
-
-
-
-
+ "öppet nätverk"
+ "skyddad med WEP"
+ "skyddad med WPA/WPA2 PSK"
+ "skyddad med 802.1x EAP""IP-adress""Signalstyrka""Aktiverar…"
@@ -319,28 +320,19 @@
"Det gick inte att spara nätverket""Anslut""Anslut till %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "EAP-metod"
+ "Autentisering för fas 2"
+ "Identitet"
+ "Anonym identitet"
+ "Klientcertifikat"
+ "CA-certifikat""Lösenord för trådlöst""WEP-hextangent (0-9, A-F)""Visa lösenord.""Skanna""Inte i intervall"
-
-
- "Det gick inte att ansluta. Välj om du vill försöka igen."
+ "sparad"
+ "Det gick inte att ansluta. Tryck om du vill försöka igen.""Wi-Fi-nätverk""Nätverks-SSID""Säkerhet"
@@ -391,6 +383,7 @@
"Frånkopplad""Misslyckades""Ljud och skärm"
+ "Inställningar för ljud och skärm""Ljudinställningar""Ställ in ringsignaler, aviseringar, skärmens ljusstryka""Tyst läge"
@@ -412,21 +405,20 @@
"Ställ in volym för musik och video""Knappljud""Spela upp signaler när knappsatsen används"
- "Spela upp signaler när knappsatsen används"
+ "Spela signaler när knappsatsen används""Välj ljud""Spela upp ljud när du väljer på skärmen"
- "Spela upp ljud när du väljer något på skärmen"
+ "Spela ljud när du väljer något på skärmen"
+ "Haptisk återkoppling"
+ "Vibrera när funktionsknappar trycks ned och vid vissa gränssnittshändelser"
+ "Vibrera när funktionsknappar trycks ned och vid vissa gränssnittshändelser""Aviseringar för SD-kort"
-
-
-
-
- "Datasynkronisering"
- "Välj vilka program som ska synkroniseras"
-
-
-
-
+ "Spela ljud vid aviseringar för SD-kort"
+ "Spela ljud vid aviseringar för SD-kort"
+ "Konton och synkronisering"
+ "Lägg till eller ta bort konton och ändra kontoinställningar"
+ "Sök"
+ "Hantera sökinställningar och historik""Visa inställningar""Animering""Visa animering när fönster öppnas och stängs"
@@ -438,6 +430,7 @@
"Ändra skärmens ljusstyrka""Skärmens tidsgräns""Justera fördröjningen innan skärmen stängs av automatiskt"
+ "Automatisk ljusstyrka""Låsinställningar för SIM-kort""Ställ in lås för SIM-kort""Lås för SIM-kort"
@@ -470,18 +463,14 @@
"Inte tillgänglig""Status""Status"
-
-
- "SD-kort och telefonlagr."
+ "Telefonnummer, signal osv."
+ "SD-kort och telefonlagr."
+ "Inställningar för lagring på SD-kort och i telefonen""Montera bort SD-kort, visa tillgängligt lagringsutrymme"
-
-
-
-
-
-
-
-
+ "Mitt telefonnummer"
+ "MIN"
+ "PRL-version"
+ "MEID""Mobil nätverkstyp""Status för mobilt nätverk""Tjänststatus"
@@ -520,6 +509,11 @@
"MMS-port""MCC""MNC"
+ "Autentiseringstyp"
+ "Inga"
+ "PAP"
+ "CHAP"
+ "PAP eller CHAP""APN-typ""Ta bort APN""Nytt APN"
@@ -533,13 +527,11 @@
"Återställer standardinställning för APN""Återställ standardinst.""Återställning av standardinställningar för APN har slutförts"
- "Återställ standardinställn."
+ "Återställ standardinst.""Raderar alla data på telefonen"
-
-
+ "Detta tar bort alla data från telefonen, inklusive: "\n
"Ditt Google-konto"
\n
"Data och inställningar för system och program"
\n
"Hämtade program"
\n"Det tar inte bort:"\n
"Aktuell systemprogramvara och medföljande program"
\n
"Filer på SD-kortet, som musik eller bilder"
"Återställ telefonen"
-
-
+ "Vill du ta bort all personlig information och alla hämtade program? Det går inte att ångra åtgärden!""Radera allt""Rita ditt grafiska lösenord""Du måste rita ditt grafiska lösenord om du vill återställa telefonen."
@@ -556,20 +548,19 @@
"Ställ in röstbrevlåda, vidarebefordra samtal, samtal väntar, nummerpres.""Mobila nätverk""Ställ in alternativ för roaming, nätverk, APN:er"
-
-
+ "Min plats""Använd trådlösa nätverk""Se plats i programmen (till exempel kartor) med hjälp av trådlösa nätverk""Plats fastställs av Wi-Fi och/eller mobila nätverk"
- "Aktivera GPS-satelliter"
- "När du söker, korrekt till gatunivå (avmarkera om du vill spara batteri)"
+ "Använd GPS-satelliter"
+ "När du söker, korrekt till gatunivå (avmarkera om du vill spara batteri)""Hitta till gatunivå (kräver mer batteri och fungerar endast utomhus)"
-
-
-
-
-
-
+ "Använd assisterad GPS"
+ "Använd servern för att förbättra GPS-funktionen (avmarkera om du vill minska nätverksbelastningen)"
+ "Använd servern för att förbättra GPS-funktionen (avmarkera om du vill förbättra GPS-funktionen)"
+ "Använd Min plats"
+ "Använd Min plats för Google-sökresultat och andra Google-tjänster"
+ "Vill du tillåta att Google använder plats för förbättrade sökresultat och andra tjänster?""Jag godkänner""Godkänn inte""Om telefonen"
@@ -579,12 +570,15 @@
"Upphovsrätt""Licens""Användarvillkor"
-
-
+ "Systemets självstudie""Lär dig hur du använder din telefon""Öppen källkodslicens""Ett problem inträffade när licenserna lästes in.""Läser in…"
+ "Säkerhetsinformation"
+ "Säkerhetsinformation"
+ "Din telefon är inte ansluten till en datatjänst. Besök %s på en dator som är ansluten till Internet om du vill visa informationen nu."
+ "Läser in …""Skärmens grafiska lösenord""Byt grafiskt lösenord""Bekräfta sparat grafiskt lösenord"
@@ -613,9 +607,9 @@
"Avbryt""Nästa""Skydda din telefon"
- "Skydda din telefon från obehörig användning genom att skapa ett personligt grafiskt lösenord på skärmen. "\n\n"1"" Se hur ett grafiskt lösenord ritas på nästa skärm. "\n\n"2"" Rita ditt eget grafiska lösenord. Experimentera med olika grafiska lösenord men anslut minst fyra punkter. "\n\n"3"" Rita ditt grafiska lösenord igen för att bekräfta. "\n\n" Är du redo att börja? Välj Nästa"". "\n\n"Välj Avbryt om du vill lämna telefonen oskyddad."
+ "Skydda din telefon från obehörig användning genom att skapa ett personligt grafiskt lösenord på skärmen. "\n\n"1"" Se hur ett grafiskt lösenord ritas på nästa skärm. "\n\n"2"" Rita ditt eget grafiska lösenord. Experimentera med olika grafiska lösenord men anslut minst fyra punkter. "\n\n"3"" Rita ditt grafiska lösenord igen för att bekräfta. "\n\n" Är du redo att börja? Tryck på Nästa"". "\n\n"Tryck på Avbryt om du vill lämna telefonen oskyddad.""Exempel på grafiskt lösenord"
- "Anslut minst fyra punkter."\n" "\n"Välj Nästa när du vill rita ditt eget grafiska lösenord."
+ "Anslut minst fyra punkter."\n" "\n"Tryck på Nästa när du vill rita ditt eget grafiska lösenord.""Hantera program""Hantera och ta bort installerade program""Program"
@@ -638,8 +632,7 @@
"Data""Avinstallera""Rensa data"
-
-
+ "Avinstallera uppdateringar""Du har valt att starta detta program som standard för vissa åtgärder.""Inga standardinställningar har angetts.""Rensa standardinställn."
@@ -650,32 +643,41 @@
"Filtrera""Välj filteralternativ""Alla"
- "Tredje part"
+ "Hämtade""Kör""Läser in…""Räknar om storlek…""Radera"
- "All information som du har sparat i detta program tas bort permanent."
+ "Alla programmets data tas bort permanent. Det inkluderar alla filer, inställningar, konton, databaser och så vidare.""OK""Avbryt""Programmet hittades inte""Programmet fanns inte med i listan över installerade program.""Det gick inte att rensa programdata."
-
-
-
-
-
-
-
-
+ "Avinstallera uppdateringar"
+ "Vill du avinstallera alla uppdateringar av det här Android-programmet?"
+ "Ta bort data"
+ "Det gick inte att ta bort data för programmet""Med det här programmet kommer du åt följande på din telefon:"
- "Beräkningar…"
+ "Beräknar…""Det gick inte att räkna ut paketstorlek"
- "Du har inte installerat några program från tredje part."
-
-
- "Språkkod och text"
+ "Du har inte installerat några program från tredje part."
+ "version %1$s"
+ "Aktiva tjänster"
+ "Visa och styra aktiva tjänster"
+ "Startar om"
+ "Det finns inga aktiva tjänster"
+ "Vill du avbryta tjänsten?"
+ "Den här tjänsten körs inte igen förrän du startar om den. Det kan ha oönskad effekt på programmet %1$s."
+ "Stopp"
+ "Avbryt"
+ "Startades av ett program: tryck om du vill avbryta"
+ "%1$s: tryck om du vill hantera"
+ "Tillg.: %2$s+%3$s i %1$d"
+ "Övriga: %2$s i %1$d"
+ "Process: %1$s"
+ "Språk och tangentbord"
+ "Inställningar för språk och tangentbord""Ställ in alternativ för språkkod (land och område), textinmatning och autokorrigering""Språkkodsinställningar""Textinställningar"
@@ -690,12 +692,12 @@
"Tryck på blanksteg två gånger om du vill infoga \".\"""Synliga lösenord""Visa lösenord när du skriver"
- "Den här inmatningsmetoden kan samla all text som du anger, inklusive personliga uppgifter som lösenord och kreditkortsnummer. Den kommer från programmet %1$s. Ska inmatningsmetoden aktiveras?"
+ "Den här inmatningsmetoden kan samla all text som du anger, inklusive personliga uppgifter som lösenord och kreditkortsnummer. Den kommer från programmet %1$s. Ska inmatningsmetoden aktiveras?""Användarens ordlista""Användarens ordlista""Lägg till och ta bort ord från användarens ordlista"
- "Lägga till"
- "Lägga till i ordlista"
+ "Lägg till"
+ "Lägg till i ordlista""Redigera ord""Redigera""Radera"
@@ -718,7 +720,7 @@
"Textinmatning""Hantera textinmatningsalternativ""%1$s-inställningar"
- "Inställningar för skärmtangentbord"
+ "Inställningar för tangentbordet på skärmen""Enhetens knappsats""Inställningar för inbyggt tangentbord""Utveckling"
@@ -729,13 +731,11 @@
"Skärmen vilar aldrig när laddning pågår""Tillåt skenplatser""Tillåt skenplatser"
-
-
-
-
+ "Ska USB-felsökning tillåtas?"
+ "USB-felsökning ska endast användas i utvecklingssyfte. Felsökningen kan användas för att kopiera data mellan datorn och enheten, installera program på enheten utan avisering och läsa loggdata.""Välj gadget""Välj widget"
- "Information för användar-id %d"
+ "Information för användar-ID %d""Användar-id %1$d""Information om nätverksanvändning för %1$s:""Mottagna bytes: %1$d"
@@ -746,14 +746,10 @@
"Systemtid:""Total tid:""Startar: %1$d"
-
-
-
-
-
-
-
-
+ "%1$d d %2$d h %3$d m %4$d s"
+ "%1$d h %2$d m %3$d s"
+ "%1$d m %2$d s"
+ "%1$ds""Paket som delar denna UID:""Ingen information om batterianvändning är tillgänglig""Sensor:"
@@ -775,400 +771,209 @@
"Program""Räkneverk""Användningstid"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Tillgänglighet"
+ "Tillgänglighetsinställningar"
+ "Hantera tillgänglighetsalternativ"
+ "Tillgänglighet"
+ "Tjänster för tillgänglighet"
+ "Inga installerade tillgänglighetstjänster."
+ "Tillgänglighetstjänsten kan samla in all text du skriver, inklusive personliga uppgifter som kreditkortsnummer, men inte lösenord. Den kan även logga din kommunikation med användargränssnittet. Den kommer från programmet %1$s. Vill du aktivera tillgänglighetstjänsten?"
+ "Vill du inaktivera tillgänglighet?"
+ "Batteriförbrukning"
+ "Program som har förbrukat batteriet"
+ "Batteriförbrukning sedan bortkoppling"
+ "Batteriförbrukning sedan återställning"
+ "%1$s sedan bortkoppling"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Aktiv tid för enheten"
+ "WiFi på sedan"
+ "WiFi på sedan"
+ "%1$s - %2$s%%"
+ "Information om batteriförbrukning"
+ "Information om användning"
+ "Justera strömförbrukningen"
+ "Inkluderade paket"
+ "Skärm"
+ "Wi-Fi"
+ "Bluetooth"
+ "Mobilens viloläge"
+ "Röstsamtal"
+ "Telefonen är inaktiv"
+ "CPU totalt"
+ "CPU i förgrunden"
+ "GPS"
+ "Telefon"
+ "Skickade data"
+ "Mottagna data"
+ "Ljud"
+ "Video"
+ "Tid som funktionen varit på"
+ "Tid utan täckning"
+ "Tvingad avslutning"
+ "Programinformation"
+ "Programinställningar"
+ "Skärminställningar"
+ "WiFi-inställningar"
+ "Bluetooth-inställningar"
+ "Batteri som förbrukats av röstsamtal"
+ "Batteri som förbrukas när telefonen är inaktiv"
+ "Batteri som förbrukats av radion"
+ "Växla till flygplansläge om du vill spara batteri när du är i ett område utan täckning"
+ "Batteri som förbrukats av skärm och bakgrundsbelysning"
+ "Minska skärmens ljusstyrka och/eller skärmens tidsgräns"
+ "Batteri som förbrukats av Wi-Fi"
+ "Inaktivera Wi-Fi när det inte används eller när det inte är tillgängligt"
+ "Batteri som förbrukats av Bluetooth"
+ "Inaktivera Bluetooth när du inte använder funktionen"
+ "Försök ansluta till en annan Bluetooth-enhet"
+ "Batteri som förbrukats av program som körs"
+ "Avsluta eller avinstallera programmet"
+ "Inaktivera GPS när det inte används"
+ "Programmet erbjuder eventuellt inställningar som minskar batteriförbrukningen"
+ "%1$s sedan bortkoppling"
+ "Sedan senaste bortkoppling %1$s"
+ "Total förbrukning"
+ "Uppdatera"
+ "Operativsystemet Android"
+ "Mediaserver"
+ "Text-till-tal"
+ "Ange alternativ för text-till-tal"
+ "Text-till-tal-inställningar"
+ "Använd alltid mina inställningar"
+ "Standardinställningarna nedan åsidosätter programinställningarna"
+ "Standardinställningar"
+ "Talhastighet"
+ "Talhastighet för texten"
+ "Ton"
+ "Påverkar den talade textens ton"
+ "Språk"
+ "Ange språkspecifik röst för den talade texten"
+ "Lyssna på ett exempel"
+ "Spela upp en kort demonstration av talsyntes"
+ "Installera röstdata"
+ "Installera de ljuddata som krävs för talsyntes"
+ "Rösterna som krävs för talsyntes är redan installerade"
+ "Detta är ett exempel på talsyntes."
+ "Dina inställningar har ändrats. Detta är ett exempel på hur de låter."
+ "Strömkontroll"
+ "Uppdaterar Wi-Fi-inställningar"
+ "Uppdatera Bluetooth-inställningar"
+ "Installerare för användaruppgifter"
+ "VPN-inställningar"
+ "Anslut till %s"
+ "Användarnamn:"
+ "Lösenord:"
+ "ett användarnamn"
+ "ett lösenord"
+ "Kom ihåg användarnamnet"
+ "Anslut"
+ "Ja"
+ "Nej"
+ "Tillbaka"
+ "Nej"
+ "Spara"
+ "Avbryt"
+ "Återgå"
+ "Anslut till nätverk"
+ "Koppla ifrån nätverket"
+ "Redigera nätverk"
+ "Ta bort nätverk"
+ "Du måste ange %s."
+ "Du måste välja %s."
+ "VPN-namnet %s finns redan. Använd ett annat namn."
+ "Vill du ta bort detta VPN?"
+ "Vill du inte skapa den här profilen?"
+ "Vill du ignorera ändringarna som gjorts i profilen?"
+ "Det går inte att ansluta till nätverket. Vill du försöka igen?"
+ "Anslutningen avbröts. Vill du ansluta igen?"
+ "Servernamnet kunde inte matchas. Vill du kontrollera inställningarna för servernamn?"
+ "Fel vid anrop. Vill du kontrollera hemlighetsinställningen?"
+ "Det saknas en eller flera hemligheter i VPN-konfigurationen. Vill du kontrollera hemlighetsinställningen?"
+ "Användarnamnet eller lösenordet som du angav var felaktigt. Vill du försöka igen?"
+ "Servern kopplade ifrån. Du kanske angav fel användarnamn eller lösenord. Vill du försöka igen?"
+ "Servern avbröt kommunikationen. Du kanske befinner dig bakom en brandvägg som förhindrar att du ansluter till servern. Vill du försöka igen?"
+ "Serveranslutningen misslyckades. Servern kanske inte accepterar ditt krypteringsval. Vill du kontrollera krypteringsinställningen?"
+ "Lägg till VPN"
+ "Lägg till VPN"
+ "Lägg till %s VPN"
+ "Information om %s"
+ "VPN"
+ "Ansluter..."
+ "Kopplar ifrån..."
+ "Ansluten"
+ "Anslut till nätverk"
+ "VPN-namn"
+ "ett VPN-namn"
+ "\"%s\" har lagts till"
+ "Ändringar har gjorts i \"%s\""
+ "Ange användarcertifikat"
+ "Användarcertifikat"
+ "ett användarcertifikat"
+ "Ange CA-certifikat"
+ "Certifikat från certifikatutfärdare"
+ "ett CA-certifikat"
+ "Ange L2TP-hemlighet"
+ "L2TP-hemlighet"
+ "en L2TP-hemlighet"
+ "kryptering"
+ "PPTP-kryptering"
+ "Ange i förväg delad IPSec-nyckel"
+ "I förväg delad IPSec-nyckel"
+ "en i förväg delad IPsec-nyckel"
+ "Ange VPN-server"
+ "VPN-server"
+ "en VPN-server"
+ "VPN-serverns namn"
+ "DNS-sökdomäner"
+ "DNS-sökdomäner"
+ "%s har angetts"
+ "%s ej angivet"
+ "%s har inte angetts (valfritt)"
+ "Aktivera %s"
+ "Inaktivera %s"
+ "%s är aktiverad"
+ "%s är inaktiverat"
+ "VPN-inställningar"
+ "Konfigurera och hantera virtuella privata nätverk (VPN)"
+ "(oförändrat)"
+ "(ej angivet)"
+ "Uppgiftslagring"
+ "Använd säkra uppgifter"
+ "Tillåt att program får åtkomst till säkra certifikat och andra uppgifter"
+ "Ange lösenord"
+ "Ange lösenord för lagring av uppgifter."
+ "Installera från SD-kort"
+ "Installera krypterade certifikat från SD-kort"
+ "Ange lösenord"
+ "Ange eller ändra lösenord för uppgiftslagring"
+ "Rensa lagring"
+ "Ta bort uppgiftslagring för allt innehåll och återställ lösenordet"
+ "Vill du ta bort alla uppgifter och återställa lösenordet för uppgiftslagring?"
+ "Nuvarande lösenord:"
+ "Nytt lösenord:"
+ "Bekräfta det nya lösenordet:"
+ "Ange ett lösenord för uppgiftslagring (minst 8 tecken)."
+ "Ange rätt lösenord."
+ "Ange rätt lösenord. Du har ett försök på dig att ange rätt lösenord, därefter raderas uppgiftslagringen."
+ "Ange rätt lösenord. Du har %1$d försök på dig att ange rätt lösenord, därefter raderas uppgiftslagringen."
+ "Lösenorden stämmer inte överens."
+ "Du måste ange och bekräfta ett lösenord."
+ "Ange lösenordet."
+ "Lösenordet måste innehålla minst 8 tecken."
+ "Uppgiftslagringen raderades."
+ "Uppgiftslagring är aktiverat."
+ "Uppgiftslagring har inaktiverats."
+ "Nödsignal"
+ "Ange beteende vid nödsamtal"
+ "Sekretess"
+ "Sekretessinställningar"
+ "Plats"
+ "Inställningar"
+ "Personliga data"
+ "Säkerhetskopiera mina inställningar"
+ "Säkerhetskopiering av inställningar"
+ "Vill du avbryta säkerhetskopiering av dina inställningar och radera alla kopior på Googles servrar?"
+
diff --git a/res/values-tr/arrays.xml b/res/values-tr/arrays.xml
index 04e79bded24..b64ad881913 100644
--- a/res/values-tr/arrays.xml
+++ b/res/values-tr/arrays.xml
@@ -24,38 +24,59 @@
"Pasifik""Tümü"
+
+ "Canlandırma yok"
+ "Bazı canlandırmalar"
+ "Tüm canlandırmalar"
+
+
+ "Hiçbir pencere animasyonu gösterilmiyor"
+ "Bazı pencere animasyonları gösterilir"
+ "Tüm pencere animasyonları gösterilir"
+ "15 saniye""30 saniye""1 dakika""2 dakika""10 dakika"
- "Asla zaman aşımına uğrama"
+ "30 dakika"
+
+
+ "Çok yavaş"
+ "Yavaş"
+ "Normal"
+ "Hızlı"
+ "Çok hızlı"
+
+
+ "Çok düşük"
+ "Düşük"
+ "Normal"
+ "Yüksek"
+ "Çok yüksek"
+
+
+ "Amerikan İngilizcesi"
+ "İngiliz İngilizcesi"
+ "Fransızca"
+ "Almanca"
+ "İtalyanca"
+ "İspanyolca"
+
+
+ "Otomatik"
+ "Hiçbiri"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "Hiçbiri"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"Otomatik""WEP ASCII"
@@ -75,8 +96,8 @@
"Diğer kullanım"
- "Fişten son çıkarmadan bu yana"
- "Açılıştan bu yana toplam"
+ "Fişten son çıkarmadan itibaren"
+ "Açılıştan itibaren toplam""Tüm zamanlardaki toplam"
@@ -84,15 +105,27 @@
"Sayımı Başlat""Uygulama Adı"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "Yok"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "Kapalı"
+ "Uyarı"
+ "Titret"
+
+
+ "Yok"
+ "PAP"
+ "CHAP"
+ "PAP veya CHAP"
+
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 503280c34bf..45d7d71b9ca 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -15,6 +15,8 @@
-->
+ "Evet"
+ "Hayır""Bilinmiyor""Radyoyu aç""Radyoyu kapat"
@@ -56,6 +58,7 @@
"Tamam""SD kart""Pil durumu:"
+ "Güç fişi:""Pil skalası:""Pil düzeyi:""Pil gücü:"
@@ -75,6 +78,11 @@
"Boşaltılıyor""Şarj etmiyor""Dolu"
+ "Prize takılı değil"
+ "AC"
+ "USB"
+ "AC+USB"
+ "Bilinmiyor""Bilinmiyor""İyi""Aşırı ısınma"
@@ -104,14 +112,19 @@
"Bluetooth eşleşme isteği""Eşleşme isteği""Eşleşmek için seç "
+ "Bluetooth cihazı seçicisi"
+ "Bluetooth izin isteği"
+ "Telefonunuzdaki bir uygulama, Bluetooth\'u açmak için izin istiyor. Bunu yapmak istiyor musunuz?"
+ "Telefonunuzdaki bir uygulama telefonunuzu %1$d saniye boyunca diğer Bluetooth cihazları tarafından bulunabilir duruma getirmek için izin istiyor. Bunu yapmak istiyor musunuz?"
+ "Telefonunuzdaki bir uygulama, %1$d saniye boyunca Bluetooth\'u açmak ve telefonunuzu diğer cihazlar tarafından bulunabilir duruma getirmek için izin istiyor. Bunu yapmak istiyor musunuz?"
+ "Bluetooth açılıyor...""Tarih ve saat ayarları""13:00""13:00""Saati değiştir""Tarih""Saat dilimini seç"
-
-
+ "Normal (%s)""Önizleme:""Yazı tipi boyutu:"
@@ -192,33 +205,23 @@
"Proxy ayarları""İptal""Ayarlar"
-
-
+ "Ayarlar""Uçak modu""Tüm kablosuz bağlantıları devre dışı bırak""Kablosuz bağlantılar devre dışı bırakılıyor…""Kablosuz bağlantılar etkinleştiriliyor…"
- "Kablosuz denetimler"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Kablosuz özelliği ve ağlar"
+ "Kablosuz ve ağ ayarları"
+ "Kablosuz, Bluetooth, uçak modu, mobil ağ ve VPN özelliklerini yönet"
+ "Veri dolaşımı"
+ "Dolaşırken veri hizmetlerine bağlan"
+ "Dolaşırken veri hizmetlerine bağlan"
+ "Veri dolaşımı kapalıyken ana ağınızdan ayrıldığınız için veri bağlantısını kaybettiniz."
+ "Açın"
+ "Veri dolaşımına izin verilsin mi? Kayda değer dolaşım ücretleri ödeyebilirsiniz!"
+ "Dikkat"
+ "Operatör seçimi"
+ "Bir ağ operatörü seçin""Tarih ve saat""Tarihi, saati, saat dilimini ve biçimleri ayarla""Otomatik"
@@ -231,25 +234,31 @@
"Tarih biçimini seç""Alfabetik olarak sırala""Saat dilimine göre sırala"
- "Güvenlik ve konum"
-
-
+ "Konum ve güvenlik"
+ "Konum ve güvenlik ayarları"
+ "Konumum, ekran kil. açma, SIM kart kil., kim. bilg. dep.kilidini ayarla"
+ "Konumum, ekran kilidi açma, kimlik bilgileri deposunun kilidi özelliklerini ayarla""Şifreler""Bluetooth""Bluetooth\'u aç""Bluetooth ayarları""Bluetooth ayarları""Bağlantıları yönet, cihaz adını gir ve keşfedilebilirlik ayarını yap"
- "Bluetooth eşleşme isteği"
+ "Bluetooth eşleşme isteği""Bluetooth cihaz bilgileri"
- "%1$s"\n\n"Eşleşmek için PIN kodunu yazın."\n"(0000 ve 1234\'ü deneyin.)"
+ \n"\"%1$s\" ile eşleşmesi için PIN kodunu yazın. (0000 veya 1234\'ü deneyin.)"
+ \n"\"%1$s\" ile eşleştirmek için passkey kodunu yazın."
+ "\"%1$s\" ile eşleştirmek için, şu passkey kodunu gösterdiğini doğrulayın: %2$s."
+ "%1$s"\n"eşleşme istiyor."
+ "Eşleştirmek için \"%1$s\" cihazına %2$s kodunu girin."
+ "Çift"
+ "Eşleştirme"
+ "bluetooth cihazı""Dikkat""%1$s ile eşleşmede bir sorun oluştu."
- "Yazılan PIN kodu yanlış olduğundan %1$s ile eşleşmede bir sorun oldu."
-
-
-
-
+ "PIN veya Passkey kodu yanlış olduğundan %1$s ile eşleşmede bir sorun oldu."
+ "%1$s ile bağlantı kurulamıyor."
+ "Eşleştirme %1$s tarafından reddedildi.""%1$s noktasına bağlanırken bir sorun oluştu.""Cihazları tara""Bağlan"
@@ -261,6 +270,7 @@
"Bağlan…""Medya""Telefon"
+ "Aktar""Medya sesine bağlanıldı""Telefon sesine bağlandı""Telefon ve medya sesine bağlandı"
@@ -270,8 +280,11 @@
"Profiller""Medya sesine bağlanıldı""Telefon sesine bağlandı"
+ "Dosya aktarım sunucusuna bağlandı"
+ "Dosya aktarım sunucusuna bağlanmadı""Medya sesi için kullan""Telefon sesi için kullan"
+ "Dosya aktarımı için kullan""Kablosuz""Kablosuz""Kablosuzu aç"
@@ -288,25 +301,13 @@
"Güvenlik""Aç""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""Bilinmiyor"
-
-
-
-
-
-
-
-
-
-
-
-
+ "güvensiz ağ"
+ "WEP ile güvenlik altına alındı"
+ "WPA/WPA2 PSK ile güvenlik altına alındı"
+ "802.1x EAP ile güvenlik altına alındı""IP adresi""Sinyal gücü""Açılıyor…"
@@ -319,28 +320,19 @@
"Ağ kaydedilemiyor""Bağlan""%1$s ağına bağlan"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "EAP yöntemi"
+ "Aşama 2 için kimlik doğrulaması"
+ "Kimlik"
+ "Bilinmeyen kimlik"
+ "İstemci sertifikası"
+ "CA sertifikası""Kablosuz şifresi""Onaltılık WEP anahtarı (0-9, A-F)""Şifreyi göster.""Tara""Menzil dışında"
-
-
- "Bağlantı kurulamadı, yeniden denemek için seçin"
+ "anımsandı"
+ "Bağlantı kurulamadı, tekrar denemek için dokunun""Kablosuz ağlar""Ağ SSID\'si""Güvenlik"
@@ -391,6 +383,7 @@
"Bağlantı kesildi""Başarısız""Ses ve görüntü"
+ "Ses ve görüntü ayarları""Ses ayarları""Zil seslerini, bildirimleri, ekran parlaklığını ayarla""Sessiz mod"
@@ -416,17 +409,16 @@
"Duyulabilir seçim""Ekran seçimi yaparken ses çal""Ekran seçimi yaparken ses çal"
+ "Dokunsal geribildirim"
+ "Yumuşak tuşlara basarken ve belirli UI (Kullanıcı Arayüzü) etkileşimleri sırasında titret"
+ "Yumuşak tuşlara basarken ve belirli UI (Kullanıcı Arayüzü) etkileşimleri sırasında titret""SD kart bildirimleri"
-
-
-
-
- "Veri senkronizasyonu"
- "Senkronize edilecek uygulamaları seç"
-
-
-
-
+ "SD kart bildirimleri için ses yürüt"
+ "SD kart bildirimleri için ses yürüt"
+ "Hesaplar ve senkronizasyon"
+ "Hesapları ekle veya kaldır ve hesap ayarlarını değiştir"
+ "Ara"
+ "Arama ayarlarını ve geçmişi yönet""Ekran ayarları""Animasyon""Pencereleri açıp kapatırken animasyon kullan"
@@ -438,6 +430,7 @@
"Ekranın parlaklığını ayarla""Ekran zaman aşımı""Ekran otomatik olarak kapanmadan önceki gecikmeyi ayarla"
+ "Otomatik parlaklık""SIM kart kilit ayarları""SIM kart kilidini ayarla""SIM kart kilidi"
@@ -470,18 +463,14 @@
"Uygun değil""Durum""Durum"
-
-
- "SD kart ve telefon depolama alanı"
+ "Telefon numarası, sinyal vb."
+ "SD kart ve telefon depolama alanı"
+ "SD kart ve telefon depolama alanı ayarları""SD kartın bağlantısını kes, kull. Depolama alanını görüntüle"
-
-
-
-
-
-
-
-
+ "Telefon numaram"
+ "MİN"
+ "PRL Sürümü"
+ "MEID""Mobil ağ türü""Mobil ağ durumu""Hizmet durumu"
@@ -520,6 +509,11 @@
"MMS bağlantı noktası""MCC""MNC"
+ "Kimlik doğrulama türü"
+ "Yok"
+ "PAP"
+ "CHAP"
+ "PAP veya CHAP""APN türü""APN\'yi sil""Yeni APN"
@@ -535,11 +529,9 @@
"Varsayılan APN ayarlarını sıfırlama tamamlandı""Fabrika verilerine sıfırla""Telefondaki tüm verileri siler"
-
-
+ "Bu, şunlar da dahil olmak üzere telefonunuzdaki tüm verileri silecektir:"\n
"Google hesabınız"
\n
"Sistem ve uygulama verisi ve ayarları"
\n
"İndirilmiş uygulamalar"
\n"Şunlar silinmeyecektir:"\n
"Geçerli sistem yazılımı ve donanımla gelen uygulamalar"
\n
"Müzik veya resim gibi SD kart dosyaları"
"Telefonu sıfırla"
-
-
+ "Tüm kişisel bilgilerinizi ve indirilen tüm uygulamaları silmek istiyor musunuz? Bu işlem geri döndürülemez!""Her şeyi sil""Kilit açma deseninizi çizin""Telefon sıfırlamayı onaylamak için kilit açma deseninizi çizmelisiniz."
@@ -556,20 +548,19 @@
"Sesli mesaj, çağrı yönlendirme ve bekletme, arayan kimliğini ayarla""Mobil ağlar""Dolaşım, şebeke, APN seçeneklerini ayarla"
-
-
+ "Konumum""Kablosuz ağ kullan""Konumu, kablosuz ağlar kullanan (Google Haritalar gibi) uygulamalarda gör""Konum kablosuz ve/veya cep telefonu ağları tarafından belirlenir"
- "GPS uydularını etkinleştir"
- "Yer bulunurken sokak düzeyinde kesinlik (pilden tasarruf etmek için seçimi kaldırın)"
+ "GPS uydularını kullan"
+ "Konum bulunurken sokak düzeyinde kesinliğe ayarlayın (pilden tasarruf etmek için onay işaretini kaldırın)""Sokak düzeyinde yer bul (daha fazla pil ve gökyüzü görünümü gerektirir)"
-
-
-
-
-
-
+ "Desteklenen GPS kullan"
+ "GPS\'ye destek olmak için sunucu kullan (ağ kullanımını azaltmak için onay işaretini kaldırın)"
+ "GPS\'ye yardımcı olmak için sunucu kullan (GPS performansını iyileştirmek için onay işaretini kaldırın)"
+ "Konumum\'u Kullan"
+ "Google arama sonuçları ve diğer Google hizmetleri için Konumum\'u kullan"
+ "Google\'a gelişmiş arama sonuçları ve diğer hizmetler için konum kullanma izni vermek istiyor musunuz?""Kabul ediyorum""Kabul etmiyorum""Telefon hakkında"
@@ -579,12 +570,15 @@
"Telif Hakkı""Lisans""Şartlar ve koşullar"
-
-
+ "Sistem eğiticisi""Telefonunuzu nasıl kullanacağınızı öğrenin""Açık kaynak lisansları""Lisanslar yüklenirken bir sorun oluştu.""Yükleniyor…"
+ "Güvenlik bilgileri"
+ "Güvenlik bilgileri"
+ "Telefonunuz bir veri hizmetine bağlı değil. Bu bilgiyi şimdi görüntülemek için İnternet\'e bağlı herhangi bir bilgisayardan %s adresine gidin."
+ "Yükleniyor…""Ekran kilidi açma deseni""Kilit açma desenini değiştir""Kaydedilen deseni onayla"
@@ -613,9 +607,9 @@
"İptal""İleri""Telefonunuz güvenlik altına alınıyor"
- "Kişisel bir ekran kilidi açma deseni oluşturarak telefonunuzu yetkisiz kullanımdan koruyun. "\n\n"1"" Bir sonraki ekranda örnek bir desenin çizilişini izleyin. "\n\n"2"" Hazır olduğunuzda, kendi kişisel kilit açma deseninizi çizin. Değişik desenleri deneyebilirsiniz ancak en az dört noktayı birleştirin. "\n\n"3"" Onaylamak için deseninizi yeniden çizin. "\n\n"Başlamaya hazır mısınız? \"İleri\"yi seçin"". "\n\n"Telefonunuzu korumasız bırakmak için \"İptal\"i seçin."
+ "Kişisel bir ekran kilidi açma deseni oluşturarak telefonunuzu yetkisiz kullanımdan koruyun. "\n\n"1"" Bir sonraki ekranda örnek bir desenin çizilişini izleyin. "\n\n"2"" Hazır olduğunuzda, kendi kişisel kilit açma deseninizi çizin. Değişik desenleri deneyebilirsiniz ancak en az dört noktayı birleştirin. "\n\n"3"" Onaylamak için deseninizi yeniden çizin. "\n\n"Başlamaya hazır mısınız? \"İleri\"ye dokunun"". "\n\n"Telefonunuzu korumasız bırakmak için \"İptal\"e dokunun.""Örnek desen"
- "En az dört noktayı birleştirin."\n" "\n"Kendi deseninizi çizmeye hazır olduğunuzda \"İleri\"yi seçin."
+ "En az dört noktayı birleştirin."\n" "\n"Kendi deseninizi çizmeye hazır olduğunuzda \"İleri\"ye dokunun.""Uygulamaları yönet""Yüklü uygulamaları yönet ve kaldır""Uygulamalar"
@@ -638,8 +632,7 @@
"Veri""Kaldır""Verileri temizle"
-
-
+ "Güncellemeleri kaldır""Bu uygulamayı bazı işlemler için varsayılan olarak başlatmayı seçtiniz.""Hiçbir varsayılan ayarlanmadı.""Varsayılanları temizle"
@@ -650,32 +643,41 @@
"Filtre""Filtre seçeneklerini belirle""Tümü"
- "Üçüncü taraf"
+ "İndirilen""Çalışıyor""Yükleniyor…""Boyut yeniden hesaplanıyor…""Sil"
- "Bu uygulamaya kaydettiğiniz tüm bilgiler kalıcı olarak silinecek."
+ "Bu uygulamanın tüm verileri kalıcı olarak silinecek. Bu veriler arasında tüm dosyalar, ayarlar, hesaplar, veritabanları vs. yer alıyor.""Tamam""İptal""Uygulama bulunamadı""Uygulama yüklü uygulamalar listesinde bulunamadı.""Uygulama verileri silinemiyor."
-
-
-
-
-
-
-
-
+ "Güncellemeleri kaldır"
+ "Bu Android sistem uygulamasıyla ilgili tüm güncellemeleri kaldırmak istiyor musunuz?"
+ "Verileri temizle"
+ "Veriler uygulama için temizlenemedi""Bu uygulama telefonunuzda aşağıdakilere erişebilir:""Hesaplanıyor…""Paket boyutu hesaplanamıyor"
- "Yüklü üçüncü taraf uygulamanız yok."
-
-
- "Yerel ayar ve metin"
+ "Yüklenmiş hiçbir üçüncü taraf uygulamalarınız yok."
+ "sürüm %1$s"
+ "Çalışan hizmetler"
+ "Şu anda çalışan hizmetleri görüntüleyin ve denetleyin"
+ "Yeniden başlatılıyor"
+ "Çalışan hizmet yok"
+ "Hizmet durdurulsun mu?"
+ "Bu hizmet, yeniden başlatılana kadar çalışmayacak. Bu durum, %1$s uygulamasında istenmeyen sonuçlara yol açabilir."
+ "Durdur"
+ "İptal"
+ "Uygulama tarafından başlatıldı: durdurmak için dokunun"
+ "%1$s: yönetmek için dokunun"
+ "Kullanılabilir: %1$d hesabında %2$s+%3$s"
+ "Diğer: %1$d hesabında %2$s"
+ "İşlem: %1$s"
+ "Dil ve klavye"
+ "Dil ve klavye ayarları""Yer (dil ve bölge), metin girişi ve ot. düzeltme seçeneklerini ayarla""Yerel ayar""Metin ayarları"
@@ -690,7 +692,7 @@
"“.” karakterini girmek için Boşluk tuşuna iki kez basın""Görünür şifreler""Yazarken şifreyi göster"
- "Bu giriş yöntemi, şifre ve kredi kartı numarası gibi kişisel veriler dahil olmak üzere yazdığınız tüm metni toplayabilir. %1$s uygulamasından gelir. Bu giriş yöntemi etkinleştirilsin mi?"
+ "Bu giriş yöntemi, şifreler ve kredi kartı numaraları gibi kişisel veriler de dahil olmak üzere yazdığınız tüm metni toplayabilir. %1$s uygulamasından gelmektedir. Bu giriş yöntemini kullanmak istiyor musunuz?""Kullanıcı sözlüğü""Kullanıcı sözlüğü""Kullanıcı sözlüğüne kelime ekleyip sözlükten kelime çıkar"
@@ -718,7 +720,7 @@
"Metin girişi""Metin giriş seçeneklerini yönet""%1$s ayarları"
- "Dokunmatik klavye ayarları"
+ "Ekran klavyesi ayarları""Cihaz klavyesi""Yerleşik klavye ayarları""Geliştirme"
@@ -729,13 +731,11 @@
"Şarj edilirken ekran hiçbir zaman uykuya geçmez""Sahte konumlara izin ver""Sahte konumlara izin ver"
-
-
-
-
+ "USB hata ayıklamasına izin verilsin mi?"
+ "USB hata ayıklaması yalnızca geliştirme amaçlıdır. Verileri bilgisayarınızla cihazınız arasında kopyalamak, bildirim göndermeksizin uygulamaları cihazınıza yüklemek ve günlük verilerini okumak için kullanılabilir.""Gadget seç""Widget seç"
- "UID %d ayrıntıları"
+ "UID %d ayrıntıları""UID %1$d""%1$s için ağ kullanım ayrıntıları:""Alınan bayt: %1$d"
@@ -746,14 +746,10 @@
"Sistem saati:""Toplam süre:""Başlama: %1$d"
-
-
-
-
-
-
-
-
+ "%1$dg %2$ds %3$dd %4$ds"
+ "%1$ds %2$dd %3$ds"
+ "%1$dd %2$ds"
+ "%1$ds""Bu UID\'yi paylaşan paketler:""Pil kullanım verisi yok""Algılayıcı:"
@@ -775,400 +771,209 @@
"Uygulama""Sayım""Kullanım süresi"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Erişilebilirlik"
+ "Erişebilirlik ayarları"
+ "Erişilebilirlik seçeneklerini yönet"
+ "Erişilebilirlik"
+ "Erişilebilirlik hizmetleri"
+ "Yüklenmiş erişilebilirlik hizmeti yok."
+ "Bu erişebilirlik hizmeti, şifreler hariç ve kişisel veriler, kredi kartı numaraları dahil olmak üzere yazdığınız tüm metinleri toplayabilir. Kullanıcı arayüzü etkileşimlerinizin kaydını da tutabilir. %1$s uygulamasından gelmektedir. Bu erişebilirlik hizmetini kullanmak istiyor musunuz?"
+ "Erişilebilirlik devre dışı bırakılsın mı?"
+ "Pil kullanımı"
+ "Pili ne kullanıyor?"
+ "Fişten çekildikten itibaren pil kullanımı"
+ "Sıfırlamadan itibaren pil kullanımı"
+ "Fişten çekildikten itibaren %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "Cihazın açılma zamanı"
+ "Kablosuz özelliğinin açık olduğu süre"
+ "Kablosuz özelliğinin açık olduğu süre"
+ "%1$s - %2$s%%"
+ "Pil kullanım bilgileri"
+ "Ayrıntıları kullan"
+ "Pil kullanımını ayarla"
+ "Dahil olan paketler"
+ "Ekran"
+ "Kablosuz"
+ "Bluetooth"
+ "Telefon beklemesi"
+ "Sesli aramalar"
+ "Telefon boşta"
+ "Toplam CPU"
+ "CPU ön planı"
+ "GPS"
+ "Telefon"
+ "Gönderilen veriler"
+ "Alınan veriler"
+ "Ses"
+ "Video"
+ "Açma zamanı"
+ "Kapsama alanı dışındaki zaman"
+ "Durmaya zorla"
+ "Uygulama bilgileri"
+ "Uygulama ayarları"
+ "Ekran ayarları"
+ "Kablosuz ayarları"
+ "Bluetooth ayarları"
+ "Sesli aramalar tarafından kullanılan pil"
+ "Telefon boştayken kullanılan pil"
+ "Telefon radyosu tarafından kullanılan pil"
+ "Cep telefonunun kapsama alanı dışında olduğu yerlerde pilden tasarruf etmek için uçak moduna geçin"
+ "Ekran ve arka aydınlatma ışığı tarafından kullanılan pil"
+ "Ekran parlaklığını ve/veya ekranın zaman aşımını azaltın"
+ "Kablosuz özellik tarafından kullanılan pil"
+ "Kullanmadığınız veya kullanılamadığı zaman Kablosuz özelliğini kapatın"
+ "Bluetooth tarafından kullanılan pil"
+ "Bluetooth\'u kullanmadığınız zamanlarda kapatın"
+ "Farklı bir Bluetooth cihazına bağlanmaya çalış"
+ "Çalışan uygulamalar tarafından kullanılan pil"
+ "Uygulamayı durdur veya kaldır"
+ "Kullanmadığınız zamanlarda GPS\'yi kapatın"
+ "Uygulama, pil kullanımını azaltmak için ayarlar önerebilir"
+ "Fişten çekildikten itibaren %1$s"
+ "%1$s için fişten son çekilmesinden itibaren"
+ "Kullanım toplamı"
+ "Yenile"
+ "Android İS"
+ "Medya sunucusu"
+ "Metin-konuşma"
+ "Metni konuşma seçeneklerine göre ayarla"
+ "Metin-konuşma ayarları"
+ "Her zaman benim ayarlarımı kullan"
+ "Aşağıdaki varsayılan ayarlar, uygulama ayarlarını geçersiz kılıyor"
+ "Varsayılan ayarlar"
+ "Konuşma hızı"
+ "Metnin konuşulduğu hız"
+ "Perde"
+ "Konuşulan metnin sesini etkiler"
+ "Dil"
+ "Dil tanımlı sesi, konuşulan metin için ayarlar"
+ "Bir örnek dinleyin"
+ "Konuşma sentezinin kısa bir sunumunu yürüt"
+ "Ses verilerini yükle"
+ "Konuşma sentezi için gereken ses verilerini yükle"
+ "Konuşma sentezi için gereken sesler zaten düzgün bir şekilde yüklendi"
+ "Bu bir konuşma sentezi örneğidir."
+ "Ayarlarınız değişti. Bu nasıl duyulacakları ile ilgili bir örnektir."
+ "Güç Denetimi"
+ "Kablosuz ayarı güncelleniyor"
+ "Bluetooth ayarları güncelleniyor"
+ "Kimlik bilgisi yükleyici"
+ "VPN ayarları"
+ "Şuna bağlan: %s"
+ "Kullanıcı adı:"
+ "Şifre:"
+ "bir kullanıcı adı"
+ "bir şifre"
+ "Kullanıcı adını hatırla"
+ "Bağlan"
+ "Evet"
+ "Hayır"
+ "Geri"
+ "Hayır"
+ "Kaydet"
+ "İptal"
+ "Geri Döndür"
+ "Ağa bağlan"
+ "Ağ bağlantısını kes"
+ "Ağı düzenle"
+ "Ağı sil"
+ "Şunu girmelisiniz: %s"
+ "Şunu seçmelisiniz: %s."
+ "\'%s\' VPN adı zaten var. Başka bir ad bulun."
+ "Bu VPN\'yi silmek istediğinizden emin misiniz?"
+ "Bu profili oluşturmak istemediğinizden emin misiniz?"
+ "Bu profilde yapılan değişiklikleri silmek istediğinizden emin misiniz?"
+ "Ağa bağlanılamıyor. Tekrar denemek ister misiniz?"
+ "Bağlantı kaybedildi. Tekrar bağlanmak istiyor musunuz?"
+ "Sunucu adı çözümlenemiyor. Sunucu adı ayarınızı kontrol etmek ister misiniz?"
+ "Hataya itiraz edin. Gizli bilgi ayarınızı kontrol etmek ister misiniz?"
+ "Bu VPN yapılandırmasında bir veya birden fazla gizli bilgi eksik. Gizli ayarınızı kontrol etmek ister misiniz?"
+ "Girdiğiniz kullanıcı adı veya şifre yanlış. Tekrar denemek istiyor musunuz?"
+ "Sunucu bağlantısı kesildi. Girdiğiniz kullanıcı adı veya şifre yanlış olabilir. Tekrar denemek istiyor musunuz?"
+ "Sunucu engellendi. Sunucuya bağlanmanıza engel olan bir güvenlik duvarının ardında bulunuyor olabilirsiniz. Tekrar denemek ister misiniz?"
+ "Sunucu anlaşması başarısız oldu. Sunucu şifreleme seçeneğiniz ile uyuşmuyor olabilir. Şifreleme ayarınızı kontrol etmek istiyor musunuz?"
+ "VPN ekle"
+ "VPN ekle"
+ "%s VPN\'si ekle"
+ "%s ayrıntıları"
+ "VPN\'ler"
+ "Bağlanıyor..."
+ "Bağlantı kesiliyor..."
+ "Bağlandı"
+ "Ağa bağlan"
+ "VPN adı"
+ "bir VPN adı"
+ "\'%s\' eklendi"
+ "\'%s\' üzerinde değişiklikler yapıldı"
+ "Kullanıcı sertifikasını ayarla"
+ "Kullanıcı sertifikası"
+ "bir kullanıcı sertifikası"
+ "CA sertifikasını ayarla"
+ "Sertifika yetkilisi (CA) sertifikası"
+ "bir CA sertifikası"
+ "L2TP gizli bilgisini ayarla"
+ "L2TP gizli bilgisi"
+ "bir L2TP gizli bilgisi"
+ "şifreleme"
+ "PPTP şifreleme"
+ "IPSec önceden paylaşılan anahtarı ayarla"
+ "IPSec önceden paylaşılan anahtar"
+ "bir IPSec önceden paylaşılan anahtar"
+ "VPN sunucusunu ayarla"
+ "VPN sunucusu"
+ "bir VPN sunucusu"
+ "VPN sunucu adı"
+ "DNS arama alanları"
+ "DNS arama alanları"
+ "%s ayarlandı"
+ "%s ayarlanmadı"
+ "%s ayarlanmadı (isteğe bağlı)"
+ "%s seçeneğini etkinleştir"
+ "%s seçeneğini devre dışı bırak"
+ "%s etkinleştirildi"
+ "%s devre dışı bırakıldı"
+ "VPN ayarları"
+ "Sanal Özel Ağlar (VPN\'ler) kur ve yönet"
+ "(değişmedi)"
+ "(ayarlanmadı)"
+ "Kimlik bilgileri deposu"
+ "Güvenli kimlik bilgilerini kullan"
+ "Uygulamaların güvenli sertifikalara ve diğer kimlik bilgilerine erişmesine izin verin"
+ "Şifreyi girin"
+ "Kimlik bilgileri deposunun şifresini girin."
+ "SD karttan yükle"
+ "SD karttan şifrelenmiş sertifikaları yükleyin"
+ "Şifreyi ayarla"
+ "Kimlik bilgileri deposunun şifresini ayarlayın veya değiştirin"
+ "Depoyu temizle"
+ "Tüm içeriklerin kimlik bilgileri deposunu temizleyin ve bu depolama alanının şifresini sıfırlayın"
+ "Tüm kimlik bilgilerini silmek ve kimlik bilgileri deposunun şifresini sıfırlamak istediğinizden emin misiniz?"
+ "Geçerli şifre:"
+ "Yeni şifre:"
+ "Yeni şifreyi doğrulayın:"
+ "Kimlik bilgileri deposu için bir şifre belirleyin (en az 8 karakter)."
+ "Lütfen doğru şifreyi girin."
+ "Lütfen doğru şifreyi girin. Kimlik bilgileri deposu silinmeden önce doğru şifreyi girmek için son bir deneme hakkınız var."
+ "Lütfen doğru şifreyi girin. Kimlik bilgileri deposu silinmeden önce doğru şifreyi girmek için %1$d deneme hakkınız daha var."
+ "Şifreler eşleşmiyor."
+ "Bir şifre girip doğrulamanız gerekiyor."
+ "Lütfen şifreyi girin."
+ "Şifre, en az 8 karakterden oluşmalıdır."
+ "Kimlik bilgileri deposu silindi."
+ "Kimlik bilgileri deposu etkin."
+ "Kimlik bilgileri deposu devre dışı."
+ "Acil sesi"
+ "Acil bir arama yapıldığında nasıl işlev göreceğini ayarlayın"
+ "Gizlilik"
+ "Gizlilik ayarları"
+ "Konum"
+ "Ayarlar"
+ "Kişisel veriler"
+ "Ayarlarımı yedekle"
+ "Ayarlar yedeği"
+ "Ayarlarınızın yedeklemesini durdurmak ve Google sunucularındaki tüm kopyaları silmek istediğinizden emin misiniz?"
+
diff --git a/res/values-zh-rCN/arrays.xml b/res/values-zh-rCN/arrays.xml
index aec3523262d..80782592e4d 100644
--- a/res/values-zh-rCN/arrays.xml
+++ b/res/values-zh-rCN/arrays.xml
@@ -24,38 +24,59 @@
"太平洋""全部"
+
+ "无动画"
+ "部分动画"
+ "所有动画"
+
+
+ "未显示窗口动画"
+ "显示部分窗口动画"
+ "显示所有窗口动画"
+ "15 秒""30 秒""1 分钟""2 分钟""10 分钟"
- "从不待机"
+ "30 分钟"
+
+
+ "很慢"
+ "慢"
+ "正常"
+ "快"
+ "很快"
+
+
+ "很低"
+ "低"
+ "正常"
+ "高"
+ "很高"
+
+
+ "美国英语"
+ "英国英语"
+ "法语"
+ "德语"
+ "意大利语"
+ "西班牙语"
+
+
+ "自动"
+ "无"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
+
+
+ "无"
+ "WEP"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
"自动""WEP ASCII"
@@ -70,12 +91,12 @@
"CPU 使用率""网络使用率""GPS 使用率"
- "传感器使用率"
- "部分激活使用率"
- "其他使用率"
+ "传感器使用情况"
+ "部分唤醒使用情况"
+ "其他使用情况"
- "自上次拔出后"
+ "自上次拔下电源后""自启动以来的总时间""所有时间总计"
@@ -84,15 +105,27 @@
"启动次数""应用程序名称"
-
-
-
-
-
-
-
-
-
-
-
+
+ "PEAP"
+ "TLS"
+ "TTLS"
+
+
+ "无"
+ "PAP"
+ "MSCHAP"
+ "MSCHAPV2"
+ "GTC"
+
+
+ "关"
+ "警报"
+ "振动"
+
+
+ "无"
+ "PAP"
+ "CHAP"
+ "PAP 或 CHAP"
+
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 461f198976e..fbb8a9bc2f0 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -15,6 +15,8 @@
-->
+ "是"
+ "无""未知""打开收音机""关闭收音机"
@@ -56,6 +58,7 @@
"确定""SD 卡""电池状态:"
+ "是否已插电:""电池电量:""电池电量:""电池运行状况:"
@@ -75,6 +78,11 @@
"正在放电""未在充电""已满"
+ "未插电"
+ "交流电"
+ "USB"
+ "交流电 + USB"
+ "未知""未知""正常""过热"
@@ -104,14 +112,19 @@
"蓝牙配对请求""配对请求""选择要配对的对象 "
+ "蓝牙设备选择器"
+ "蓝牙权限请求"
+ "您手机上的某一应用程序正在请求相应权限以便打开蓝牙。是否要授予这种权限?"
+ "您手机上的某一应用程序正在请求相应权限以便打开蓝牙,从而使其他设备可在 %1$d 秒内检测到您的手机。是否要授予这种权限?"
+ "您手机上的某一应用程序正在请求相应权限以便打开蓝牙,从而使其他设备可在 %1$d 秒内检测到您的手机。是否要授予这种权限?"
+ "正在打开蓝牙…""日期和时间设置""下午 1:00""13:00""更改时间""日期""选择时区"
-
-
+ "普通 (%s)""预览:""字号:"
@@ -192,33 +205,23 @@
"代理设置""取消""设置"
-
-
+ "设置""飞行模式""停用所有无线连接""正在停用无线连接...""正在启用无线连接..."
- "无线控件"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "无线和网络设置"
+ "无线和网络设置"
+ "管理 Wi-Fi、蓝牙、飞行模式、移动网络和虚拟专用网"
+ "数据漫游"
+ "漫游时连接到数据服务"
+ "漫游时连接到数据服务"
+ "数据连接已断,因为您已离开本地网络并已关闭数据漫游。"
+ "将其启用"
+ "是否允许数据漫游?这可能产生大量漫游费!"
+ "注意"
+ "运营商选择"
+ "选择网络运营商""日期和时间""设置日期、时间、时区和格式""自动"
@@ -231,25 +234,31 @@
"选择日期格式""按字母顺序排序""按时区排序"
- "安全性和位置"
-
-
+ "地点和安全"
+ "位置和安全设置"
+ "设置我的位置、屏幕解锁、SIM 卡锁定和凭据存储锁定"
+ "设置我的位置、屏幕解锁和凭据存储锁定""密码""蓝牙""打开蓝牙""蓝牙设置""蓝牙设置""管理连接,设置设备名称和可检测性"
- "蓝牙配对请求"
+ "蓝牙配对请求""蓝牙设备信息"
- "%1$s"\n\n"输入 PIN 进行配对。"\n"(尝试一下 0000 或 1234。)"
+ \n"键入 PIN 与“%1$s”进行配对。(尝试键入 0000 或 1234。)"
+ \n"键入匹配密钥可与“%1$s”进行配对。"
+ "要与“%1$s”配对,请核实其中是否显示匹配密钥:%2$s。"
+ "%1$s"\n"想要配对。"
+ "在“%1$s”中输入%2$s可进行配对。"
+ "配对"
+ "不要配对"
+ "蓝牙设备""注意""与%1$s配对时出现问题。"
- "与%1$s配对时出现问题,因为输入的 PIN 不正确。"
-
-
-
-
+ "与 %1$s 配对时出现问题,因为 PIN 或匹配密钥不正确。"
+ "无法与 %1$s 建立通信连接。"
+ "%1$s 已拒绝配对。""连接到%1$s时出现问题。""扫描查找设备""连接"
@@ -261,6 +270,7 @@
"连接到...""媒体""手机"
+ "传输""已连接到媒体音频""已连接到手机音频""已连接到手机和媒体音频"
@@ -270,8 +280,11 @@
"个人资料""已连接到媒体音频""已连接到手机音频"
+ "已连接到文件传输服务器"
+ "未连接到文件传输服务器""用于媒体音频""用于手机音频"
+ "用于文件传输""Wi-Fi""Wi-Fi""打开 Wi-Fi"
@@ -286,27 +299,15 @@
"较强""弱""安全性"
- "打开"
+ "开放""WEP"
- "WPA"
- "WPA2"
-
-
-
-
+ "WPA/WPA2 PSK"
+ "Enterprise (802.1x)""未知"
-
-
-
-
-
-
-
-
-
-
-
-
+ "开放网络"
+ "通过 WEP 保护"
+ "通过 WPA/WPA2 PSK 保护"
+ "通过 802.1x EAP 保护""IP 地址""信号强度""正在打开..."
@@ -319,28 +320,19 @@
"无法保存网络""连接""连接到 %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "EAP 方式"
+ "Phase 2 身份验证"
+ "身份"
+ "匿名身份"
+ "客户端证书"
+ "CA 证书""无线密码"
- "WEP 十六进制键(0-9、A-F)"
+ "WEP 十六进制密钥(0-9、A-F)""显示密码。""扫描""不在范围内"
-
-
- "连接失败,请选择重试"
+ "已记住"
+ "连接失败,请触摸重试""Wi-Fi 网络""网络 SSID""安全性"
@@ -350,7 +342,7 @@
"网络通知""附近有开放网络时通知我""您输入的网络密码不正确,请重试。"
- "连接网络时出现问题,请重试。"
+ "连接到网络时出现问题,请重试。""高级""IP 设置""保存"
@@ -391,6 +383,7 @@
"已断开连接""失败""声音和显示"
+ "声音和显示设置""声音设置""设置铃声、通知和屏幕亮度""静音模式"
@@ -414,19 +407,18 @@
"使用拨号键盘时发出声音""使用拨号键盘时发出声音""操作音选择"
- "进行屏幕选择时发出声音"
- "进行屏幕选择时发出声音"
+ "在屏幕上进行选择时发出声音"
+ "在屏幕上进行选择时发出声音"
+ "触感反馈"
+ "按软键以及进行某些 UI 交互时振动"
+ "按软键以及进行某些 UI 交互时振动""SD 卡通知"
-
-
-
-
- "数据同步"
- "选择要同步的应用程序"
-
-
-
-
+ "提示 SD 卡通知时发出声音"
+ "弹出 SD 卡通知时发出声音"
+ "帐户与同步"
+ "添加或删除帐户和更改帐户设置"
+ "搜索"
+ "管理搜索设置和历史记录""显示设置""动画""打开和关闭窗口时显示动画"
@@ -437,7 +429,8 @@
"亮度""调整屏幕亮度""屏幕待机"
- "调整屏幕自动关闭前的延迟"
+ "调整屏幕自动锁定前的延迟"
+ "自动亮度""SIM 卡锁定设置""设置 SIM 卡锁定""SIM 卡锁定"
@@ -470,18 +463,14 @@
"不可用""状态""状态"
-
-
- "SD 卡和手机存储"
+ "电话号码、信号等"
+ "SD 卡和手机存储"
+ "SD 卡和手机存储设置""卸下 SD 卡,查看可用的存储空间"
-
-
-
-
-
-
-
-
+ "本机号码"
+ "MIN"
+ "PRL 版本"
+ "MEID""手机网络类型""手机网络状态""服务状态"
@@ -493,7 +482,7 @@
"不可用""开机时间""唤醒时间"
- "手机内部存储"
+ "手机内存""SD 卡""可用空间""总存储量"
@@ -520,6 +509,11 @@
"彩信端口""MCC""MNC"
+ "身份验证类型"
+ "无"
+ "PAP"
+ "CHAP"
+ "PAP 或 CHAP""APN 类型""删除 APN""新 APN"
@@ -535,11 +529,9 @@
"重置默认 APN 设置已完成""恢复出厂设置""清除手机上的所有数据"
-
-
+ "这会从手机中删除以下数据:"\n
"Google 帐户"
\n
"系统与应用程序的数据和设置"
\n
"下载的应用程序"
\n"这不会删除:"\n
"当前系统软件和捆绑的应用程序"
\n
"SD 卡文件,如音乐或照片"
"重置手机"
-
-
+ "是否删除所有个人信息和下载的所有应用程序?此操作无法还原!""清除全部内容""绘制您的解锁图案""您必须绘制解锁图案才能确认重置手机。"
@@ -553,23 +545,22 @@
"绘制您的解锁图案""您必须绘制解锁图案才能确认格式化 SD 卡。""通话设置"
- "设置语音信箱、呼叫转接、呼叫等待和来电显示"
+ "设置语音信箱、呼叫转接、呼叫等待和来电者信息""移动网络""设置漫游、网络、APN 选项"
-
-
+ "我的位置""使用无线网络""使用无线网络在应用程序(例如 Google 地图)中查看位置""通过 Wi-Fi 和/或移动网络确定位置"
- "启用 GPS 卫星"
- "定位时可精确到街道级别(取消选中可节约电量)"
+ "使用 GPS 卫星"
+ "定位级别可精确到街道(取消选中可节约电量)""定位到街道级别(需要消耗更多电量以及天气允许)"
-
-
-
-
-
-
+ "使用增强型 GPS"
+ "使用服务器来辅助 GPS(取消选中可降低网络使用率)"
+ "使用服务器来辅助 GPS(取消选中可提高 GPS 性能)"
+ "使用“我的位置”"
+ "将“我的位置”用于 Google 搜索结果和其他 Google 服务"
+ "是否允许 Google 使用位置信息改善搜索结果和其他服务?""同意""不同意""关于手机"
@@ -579,12 +570,15 @@
"版权""许可""条款"
-
-
- "了解如何使用您的手机"
+ "系统辅导手册"
+ "了解如何使用手机""开放源代码许可""载入许可时出现问题。""正在载入..."
+ "安全信息"
+ "安全信息"
+ "您的手机未连接到数据服务。要立即查看此信息,请通过连接到互联网的任意计算机访问 %s。"
+ "正在载入...""屏幕解锁图案""更改解锁图案""确认已保存的图案"
@@ -613,9 +607,9 @@
"取消""下一步""保护您的手机"
- "通过创建个人屏幕解锁图案,来保护您的手机不受未经授权的使用。"\n\n"1"" 在下一屏幕上,观看示例图案的绘制过程。"\n\n"2"" 准备就绪后,绘制您自己的个人解锁图案。可尝试不同的图案,但至少要连接四个点。"\n\n"3"" 重新绘制您的图案进行确认。"\n\n"可以开始了吗?选择“下一步”""。"\n\n"要让手机处于不受保护的状态,请选择“取消”。"
+ "通过创建个人屏幕解锁图案,防止他人未经授权使用您的手机。"\n\n"1"" 在下一屏幕上,观看示例图案的绘制过程。"\n\n"2"" 准备就绪后,绘制您自己的个人解锁图案。可尝试不同的图案,但至少要连接四个点。"\n\n"3"" 重新绘制您的图案进行确认。"\n\n"可以开始了吗?触摸“下一步”""。"\n\n"要让手机处于不受保护的状态,请触摸“取消”。""示例图案"
- "至少连接四个点。"\n\n"准备好后选择“下一步”绘制自己的图案。"
+ "至少连接四个点。"\n\n"准备就绪后,触摸“下一步”绘制自己的图案。""管理应用程序""管理和删除安装的应用程序""应用程序"
@@ -638,8 +632,7 @@
"数据""卸载""清除数据"
-
-
+ "卸载更新""您已选择在默认情况下对某些操作启动此应用程序。""无默认设置。""清除默认设置"
@@ -650,32 +643,41 @@
"过滤""选择过滤选项""全部"
- "第三方"
+ "已下载""正在运行""正在载入...""正在重新计算大小...""删除"
- "您保存在此应用程序中的所有信息将会永久删除。"
+ "此应用程序的所有数据将被永久删除。删除的内容包括所有文件、设置、帐户、数据库等。""确定""取消""找不到应用程序""在已安装应用程序的列表中找不到该应用程序。""无法清除应用程序数据。"
-
-
-
-
-
-
-
-
+ "卸载更新"
+ "是否要卸载此 Android 系统应用程序的所有更新?"
+ "清除数据"
+ "无法清除应用程序数据""此应用程序有权访问手机上的以下内容:""正在计算...""无法计算包大小"
- "您没有安装任何第三方企业应用套件。"
-
-
- "语言区域和文字"
+ "未安装任何第三方应用程序。"
+ "版本 %1$s"
+ "正在运行的服务"
+ "查看与控制当前正在运行的服务"
+ "正在重新启动"
+ "当前未运行任何服务"
+ "是否停止服务?"
+ "服务只有在重新启动之后,才可以继续运行。但这可能会给 %1$s 应用程序带来意想不到的结果。"
+ "停止"
+ "取消"
+ "由应用程序启动:触摸可停止"
+ "%1$s:触摸可进行管理"
+ "可用:%2$s+%3$s,合计 %1$d"
+ "其他:%2$s,合计 %1$d"
+ "进程:%1$s"
+ "语言和键盘"
+ "语言和键盘设置""设置语言区域(语言和区域)、文字输入和自动更正选项""语言区域设置""文字设置"
@@ -690,7 +692,7 @@
"按两次空格键可以插入句号""密码可见""输入时密码可见"
- "该输入法可能会收集您输入的所有文字,包括密码和信用卡号码等个人数据。它源自%1$s应用程序。是否要启用该输入法?"
+ "该输入法可能会收集您输入的所有文字,包括密码和信用卡号码等个人数据。它源自 %1$s 应用程序。是否要使用该输入法?""用户词典""用户词典""向用户词典中添加字词以及从用户词典中删除字词"
@@ -718,7 +720,7 @@
"文字输入""管理文字输入选项""%1$s设置"
- "屏幕键盘设置"
+ "屏幕键盘设置""设备键盘""内置键盘设置""开发"
@@ -729,13 +731,11 @@
"充电时屏幕不会休眠""允许模拟位置""允许模拟位置"
-
-
-
-
+ "是否允许 USB 调试?"
+ "USB 调试仅用于开发工作。使用该功能可在计算机和移动设备之间复制数据、在移动设备上安装应用程序而不进行通知,以及读取日志数据。""选择小工具""选择窗口小部件"
- "有关用户 ID %d 的详情"
+ "有关用户 ID %d 的详情""用户 ID %1$d""有关%1$s的网络使用详情:""收到的字节数:%1$d"
@@ -746,14 +746,10 @@
"系统时间:""合计时间:""启动次数:%1$d"
-
-
-
-
-
-
-
-
+ "%1$d 天 %2$d 小时 %3$d 分 %4$d 秒"
+ "%1$d 小时 %2$d 分 %3$d 秒"
+ "%1$d 分 %2$d 秒"
+ "%1$d 秒""共享该用户 ID 的数据包:""没有可用的电池使用数据""传感器:"
@@ -768,407 +764,216 @@
"屏幕开启所花费的时间:""手机处于开机状态的时间:""正在使用电池:"
- "已插入:"
+ "充电时间:""使用情况统计""使用情况统计数据""排序方式:""应用程序""次数""使用时间"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "辅助功能"
+ "辅助功能设置"
+ "管理辅助功能选项"
+ "辅助功能"
+ "辅助功能服务"
+ "未安装辅助功能服务。"
+ "此辅助服务能够收集键入的所有文字,包括除密码以外的个人资料,如信用卡号。该服务还会记录用户界面交互情况。该服务来自应用程序 %1$s。是否使用此辅助服务?"
+ "是否停用辅助功能?"
+ "电量使用情况"
+ "耗电情况"
+ "拔下电源后的电量消耗情况"
+ "重置后的电量消耗情况"
+ "拔下电源后已使用 %1$s"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ "设备唤醒时间"
+ "WiFi 开启时间"
+ "WiFi 开启时间"
+ "%1$s - %2$s%%"
+ "电量使用详情"
+ "详细使用情况"
+ "调配电量"
+ "包括的软件包"
+ "显示屏"
+ "Wi-Fi"
+ "蓝牙"
+ "手机待机"
+ "语音通话"
+ "手机待机"
+ "CPU 总使用时间"
+ "CPU(前台)"
+ "GPS"
+ "手机"
+ "数据已发送"
+ "数据已收到"
+ "音频"
+ "视频"
+ "已运行时间"
+ "无信号的时间"
+ "强行停止"
+ "应用程序信息"
+ "应用程序设置"
+ "显示设置"
+ "WiFi 设置"
+ "蓝牙设置"
+ "语音通话所耗的电量"
+ "手机待机时所耗的电量"
+ "手机射频所耗的电量"
+ "不在信号覆盖范围内时切换到飞行模式,以节约电量"
+ "显示屏和背光所耗的电量"
+ "降低屏幕亮度,并且/或者缩短屏幕超时时间"
+ "Wi-Fi 所耗的电量"
+ "不使用 Wi-Fi 或其不可用时将其关闭"
+ "蓝牙所耗的电量"
+ "请在未使用蓝牙功能时将其关闭"
+ "正在尝试连接另一蓝牙设备"
+ "运行应用程序时所耗的电量"
+ "停止或卸载应用程序"
+ "不使用 GPS 时将其关闭"
+ "该应用程序中可能有用于减少耗电量的设置"
+ "拔下电源 %1$s后的电量消耗情况"
+ "%1$s前拔下电源时的电量消耗情况"
+ "总使用量"
+ "刷新"
+ "Android OS"
+ "媒体服务器"
+ "文字到语音转换"
+ "设置文字转语音选项"
+ "文字到语音转换设置"
+ "总是使用我的设置"
+ "使用以下默认设置代替应用程序设置"
+ "默认设置"
+ "语速"
+ "文字转换成语音后的播放速度"
+ "音高"
+ "更改所播放的文字的音调"
+ "语言"
+ "为文字转语音功能设置所使用的语言"
+ "聆听示例"
+ "播放简短的语音合成示例"
+ "安装语音数据"
+ "安装语音合成所需的语音数据"
+ "语音合成所需的语音已安装妥当"
+ "这是语音合成示例。"
+ "设置已发生变化。这是声音效果示例。"
+ "电量控制"
+ "正在更新 Wi-Fi 设置"
+ "正在更新蓝牙设置"
+ "凭证安装程序"
+ "虚拟专用网设置"
+ "连接到 %s"
+ "用户名:"
+ "密码:"
+ "用户名"
+ "密码"
+ "记住用户名"
+ "连接"
+ "是"
+ "否"
+ "返回"
+ "否"
+ "保存"
+ "取消"
+ "还原"
+ "连接到网络"
+ "断开与网络的连接"
+ "修改网络"
+ "删除网络"
+ "必须输入%s。"
+ "必须选择%s。"
+ "VPN 名称“%s”已存在。请换用其他名称。"
+ "确定要删除此虚拟专用网吗?"
+ "确定不想创建此个人资料吗?"
+ "确定要舍弃对此配置所做的更改吗?"
+ "无法连接到网络。是否要再试一次?"
+ "连接已断。是否要重新连接?"
+ "服务器名称无法解析。是否要核实服务器名称设置?"
+ "质询错误。是否要核实密钥设置?"
+ "此虚拟专用网配置中缺少一个或多个密钥。是否要检查密钥设置?"
+ "输入的用户名或密码不正确。是否要再试一次?"
+ "服务器已暂停。输入的用户名或密码可能不正确。是否要再试一次?"
+ "服务器已挂起。可能是防火墙阻止了您与服务器的连接。是否要重试?"
+ "服务器协商失败。该服务器可能不认可您的加密选项。是否要检查您的加密设置?"
+ "添加虚拟专用网"
+ "添加虚拟专用网"
+ "添加 VPN“%s”"
+ "“%s”详情"
+ "虚拟专用网"
+ "正在连接..."
+ "正在断开连接..."
+ "已连接"
+ "连接到网络"
+ "虚拟专用网名称"
+ "虚拟专用网名称"
+ "已添加“%s”"
+ "已更改“%s”"
+ "设置用户证书"
+ "用户证书"
+ "用户证书"
+ "设置 CA 证书"
+ "证书授权中心 (CA) 的证书"
+ "CA 证书"
+ "设置 L2TP 密钥"
+ "L2TP 密钥"
+ "L2TP 密钥"
+ "加密"
+ "PPTP 加密"
+ "设置 IPSec 预共享密钥"
+ "IPSec 预共享密钥"
+ "IPSec 预共享密钥"
+ "设置虚拟专用网服务器"
+ "虚拟专用网服务器"
+ "虚拟专用网服务器"
+ "虚拟专用网服务器名称"
+ "DNS 搜索范围"
+ "DNS 搜索范围"
+ "已设置 %s"
+ "%s 未设置"
+ "未设置 %s(可选)"
+ "启用%s"
+ "停用%s"
+ "已启用%s"
+ "已停用%s"
+ "虚拟专用网设置"
+ "设置和管理虚拟专用网"
+ "(未更改)"
+ "(未设置)"
+ "凭证存储"
+ "使用安全凭证"
+ "允许应用程序访问安全凭证和其他凭证"
+ "输入密码"
+ "输入凭证存储密码。"
+ "从 SD 卡安装"
+ "从 SD 卡安装加密的证书"
+ "设置密码"
+ "设置或更改凭证存储密码"
+ "清除存储"
+ "清除所有内容的凭证存储并重置其密码"
+ "确定要删除所有凭证,并且重置凭证存储密码吗?"
+ "当前密码:"
+ "新密码:"
+ "确认新密码:"
+ "设置凭证存储密码(至少 8 个字符)。"
+ "请输入正确的密码。"
+ "请输入正确的密码。在系统删除该凭证存储之前,您还有一次输入正确密码的机会。"
+ "请输入正确的密码。在系统删除该凭证存储之前,您还有 %1$d 次输入正确密码的机会。"
+ "密码不匹配。"
+ "您需要输入并确认密码。"
+ "请输入密码。"
+ "密码至少应包含 8 个字符。"
+ "该凭证存储已删除。"
+ "凭证存储已启用。"
+ "凭证存储已停用。"
+ "紧急提示音"
+ "设置进行紧急呼叫时的行为"
+ "隐私权"
+ "隐私权设置"
+ "位置"
+ "设置"
+ "个人数据"
+ "备份我的设置"
+ "设置备份"
+ "确定要停止备份您的设置并清除 Google 服务器上的所有副本吗?"
+
diff --git a/res/values-zh-rTW/arrays.xml b/res/values-zh-rTW/arrays.xml
index 0f3cb313264..aa59593f056 100644
--- a/res/values-zh-rTW/arrays.xml
+++ b/res/values-zh-rTW/arrays.xml
@@ -24,13 +24,23 @@
"太平洋""全部"
+
+ "沒有動畫"
+ "部分動畫"
+ "全部動畫"
+
+
+ "不顯示視窗動畫"
+ "顯示部分視窗動畫"
+ "顯示所有視窗動畫"
+ "15 秒""30 秒""1 分鐘""2 分鐘""10 分鐘"
- "從不逾時"
+ "30 分鐘""非常慢"
@@ -58,18 +68,14 @@
"自動""無""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""無""WEP"
- "WPA Personal"
- "WPA2 Personal"
- "WPA-EAP"
- "IEEE 802.1x"
+ "WPA/WPA2 PSK"
+ "802.1x Enterprise""自動"
@@ -108,7 +114,7 @@
"無""PAP""MSCHAP"
- "MSCHAP2"
+ "MSCHAPV2""GTC"
@@ -116,4 +122,10 @@
"警示""震動"
+
+ "無"
+ "PAP"
+ "CHAP"
+ "PAP 或 CHAP"
+
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 4ca76becb5c..ebf974e6547 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -15,6 +15,8 @@
-->
+ "是"
+ "否""未知的""開啟無線通訊""關閉無線通訊"
@@ -56,6 +58,7 @@
"確定""SD 卡""電池狀態:"
+ "電源插頭:""電池存量:""電池存量:""電池壽命:"
@@ -75,6 +78,11 @@
"放電中""未充電""電力充足"
+ "未插入"
+ "AC"
+ "USB"
+ "AC+USB"
+ "不明""未知的""好""過熱"
@@ -104,6 +112,12 @@
"藍牙配對要求""配對要求""選取要配對的裝置 "
+ "藍牙裝置選取器"
+ "藍牙權限要求"
+ "手機上的某個應用程式要求開啟藍牙裝置,您想要允許要求嗎?"
+ "手機上的某個應用程式要求開啟藍牙裝置,這表示您的藍牙連線將開放 %1$d 秒,讓其他裝置可在時間內搜尋到您的手機。您想要允許要求嗎?"
+ "手機上的某個應用程式要求開啟藍牙裝置,這表示您的藍牙連線將開放 %1$d 秒,讓其他裝置可在時間內搜尋到您的手機。您想要允許要求嗎?"
+ "正在開啟藍牙...""日期與時間設定""下午 1:00""13:00"
@@ -196,7 +210,8 @@
"停用所有的無線網路連線""停用無線網路連線中...""啟用無線網路連線中..."
- "無線網路控制"
+ "無線與網路"
+ "無線裝置和網路設定""管理 Wi-Fi、藍牙、飛行模式、行動網路和 VPN""漫游服務""漫遊時連線到資料傳輸服務"
@@ -219,20 +234,29 @@
"選取日期格式""依照字母排序""依時區排序"
- "安全性與位置"
+ "位置與安全性"
+ "位置與安全性設定""設定我的位置、畫面解鎖、SIM 卡鎖定、認證儲存空間鎖定"
+ "設定我的位置、解除鎖定畫面及鎖定認證儲存空間""密碼""藍牙""開啟藍牙""藍牙設定""藍牙設定""管理連線、設定裝置名稱與可偵測性"
- "藍牙配對要求"
+ "藍牙配對要求""藍牙裝置資訊"
- "%1$s"\n\n"輸入 PIN 進行配對。"\n"(請嘗試 0000 或 1234。)"
+ \n"請輸入 PIN 與「%1$s」進行配對 (建議嘗試輸入 0000 或 1234)。"
+ \n"請輸入密碼金鑰與「%1$s」進行配對。"
+ "如要與「%1$s」配對,請確定裝置顯示以下密碼金鑰:%2$s。"
+ "%1$s"\n"想要進行配對。"
+ "請在「%1$s」輸入 %2$s 以進行配對。"
+ "配對"
+ "不要配對"
+ "藍牙裝置""注意""與%1$s配對時發生問題。"
- "由於輸入的 PIN 不正確,因此無法與%1$s配對。"
+ "無法與 %1$s 進行配對,因為輸入的 PIN 或密碼金鑰有誤。""無法與「%1$s」建立通訊。""「%1$s」拒絕配對要求。""連接至%1$s時發生問題。"
@@ -246,6 +270,7 @@
"連線到...""媒體""電話"
+ "傳輸""連接至媒體音訊""連接至電話音訊""連接至電話和媒體音訊"
@@ -255,8 +280,11 @@
"設定檔""連接至媒體音訊""連接至電話音訊"
+ "已連線到檔案傳輸伺服器"
+ "不要連線到檔案傳輸伺服器""用於媒體音訊""用於電話音訊"
+ "用於傳輸檔案""Wi-Fi""Wi-Fi""開啟 Wi-Fi"
@@ -271,19 +299,15 @@
"可""差""安全性"
- "開啟"
+ "開放""WEP"
- "WPA"
- "WPA2"
- "WPA-EAP"
- "IEEE8021X"
+ "WPA/WPA2 PSK"
+ "Enterprise(802.1x)""未知的""開放網路""以 WEP 保護連線安全性"
- "以 WPA 保護連線安全性"
- "以 WPA2 保護連線安全性"
- "以 WPA-EAP 保護連線安全性"
- "以 IEEE 802.1x 保護連線安全性"
+ "以 WPA/WPA2 PSK 保護連線安全性"
+ "以 802.1x EAP 保護連線安全性""IP 位址""訊號強度""開啟中..."
@@ -302,14 +326,13 @@
"匿名識別""用戶端憑證""CA 憑證"
- "私密金鑰密碼""無線網路密碼""WEP hex key (0-9,A-F)""顯示密碼""掃描""不在範圍內""已記憶"
- "連線失敗,選取此項再試一次。"
+ "連線失敗,請輕觸以再試一次""Wi-Fi 網路""網路 SSID""安全性"
@@ -360,6 +383,7 @@
"已中斷連線""失敗""音效與顯示"
+ "音效與顯示設定""音效設定""設定鈴聲、通知與螢幕亮度""靜音模式"
@@ -385,11 +409,14 @@
"有聲選項""使用螢幕選取時播放音效""在螢幕上進行選取時播放音效"
+ "觸動回饋"
+ "按下螢幕按鍵與出現特定的操作行為時會震動"
+ "按下螢幕按鍵與出現特定的操作行為時會震動""SD 卡通知""播放 SD 卡通知音效""播放 SD 卡通知音效"
- "資料同步處理"
- "選取要同步處理的應用程式"
+ "帳戶與同步處理"
+ "新增或移除帳戶和變更帳戶設定""搜尋""管理搜尋設定和記錄""顯示設定"
@@ -403,6 +430,7 @@
"調整螢幕亮度""螢幕逾時""調整螢幕自動關閉前的延遲時間"
+ "自動調整亮度""SIM 卡鎖定設定""設定 SIM 卡鎖定""SIM 卡鎖定"
@@ -436,7 +464,8 @@
"狀態""狀態""電話號碼、訊號等。"
- "SD 卡與手機儲存"
+ "SD 卡和行動電話儲存空間"
+ "SD 卡和行動電話儲存空間設定""卸載 SD 卡,檢視可用儲存媒體。""我的電話號碼""MIN"
@@ -480,6 +509,11 @@
"MMS 連接埠""MCC""MNC"
+ "驗證類型"
+ "無"
+ "PAP"
+ "CHAP"
+ "PAP 或 CHAP""APN 類型""刪除 APN""新增 APN"
@@ -518,12 +552,15 @@
"使用無線網路""使用無線網路,在應用程式中查詢位置 (例如 Google 地圖)""根據 Wi-Fi 與/或行動網路判定位置"
- "啟用 GPS 衛星接收器"
- "定位時,精準度設定為街道等級 (取消選取此項可較省電)"
+ "使用 GPS 衛星定位"
+ "定位時,精準度設定為街道等級 (取消勾選即可節省電力)""定位至街道等級 (需要更多電力及天候允許)"
- "與 Google 分享"
- "允許 Google 使用位置資訊來改善搜尋與其他服務"
- "允許 Google 使用位置資訊來改善搜尋結果與其他服務"
+ "使用輔助 GPS"
+ "使用伺服器輔助 GPS (取消勾選即可降低網路使用量)"
+ "使用伺服器輔助 GPS (取消勾選即可提升 GPS 效能)"
+ "使用我的位置"
+ "在 Google 搜尋結果和其他 Google 服務使用「我的位置」資訊"
+ "要允許 Google 使用位置資訊改善搜尋結果與其他服務嗎?""同意""不同意""關於手機"
@@ -538,6 +575,10 @@
"開啟原始授權""載入授權時發生問題""載入中..."
+ "安全資訊"
+ "安全資訊"
+ "您的手機尚未與資料傳輸服務連線。如要檢視此資訊,請使用任何可上網的電腦前往 %s。"
+ "載入中...""螢幕解鎖圖形""變更解鎖圖形""確認儲存的圖形"
@@ -566,9 +607,9 @@
"取消""下一頁""手機安全設定"
- " 建立個人螢幕解鎖圖形,避免您的手機在未授權狀態下遭人使用。 "\n\n" 1 "" 請在下一個畫面中,檢視範例圖形繪畫示範。"\n\n" 2 "" 準備好後,便可畫出個人解鎖圖形。您可以嘗試不同的圖形,但需要至少連接四點。 "\n\n" 3 "" 再次畫出圖形以確認。"\n\n" 準備開始了嗎?選取 [下一步]""。"\n\n" 如要維持未保護的狀態,請選取 [取消]。"
+ "建立個人螢幕的解鎖圖案,避免手機在未經授權的狀態下遭人使用。"\n\n"1"" 請在下一個畫面檢視範例圖案的繪製示範。"\n\n"2"" 當您準備就緒後,請繪製自己的個人解鎖圖案。請嘗試繪製不同的圖案,但至少要連接四個點。"\n\n"3"" 再次繪製圖案來確認。"\n\n"準備好要開始了嗎?請輕觸 [下一步]""。"\n\n"如要繼續讓手機處於未保護狀態,請輕觸 [取消]。""範例圖形"
- "畫出圖形時,需要至少連接四個點。"\n" "\n"準備好要畫出您的解鎖圖形時,請選取 [下一步]。"
+ "至少連接四個點。"\n" "\n"您準備好要繪製自己的解鎖圖案時,請輕觸 [下一步]。""管理應用程式""管理及移除已安裝的應用程式""應用程式"
@@ -602,12 +643,12 @@
"篩選""選取篩選選項""全部"
- "第三方"
+ "已下載""執行中""載入中...""重新計算大小...""刪除"
- "所有儲存在此應用程式的資訊都會被永久刪除。"
+ "該應用程式的所有資料都將遭到永遠刪除,包含所有檔案、設定、帳戶、資料庫等等。""確定""取消""找不到應用程式"
@@ -620,9 +661,23 @@
"此應用程式可存取您電話中的下列項目:""計算中...""無法計算封裝大小"
- "您未安裝任何第三方應用程式。"
+ "您未安裝任何第三方應用程式。""版本 %1$s"
- "地區設定與文字"
+ "正在運作的服務"
+ "查看並控制目前正在運作的服務"
+ "重新啟動中"
+ "沒有正在運作的服務"
+ "要停止服務嗎?"
+ "服務將不再繼續執行,除非您重新啟動該服務。這個動作可能會對應用程式「%1$s」造成無法預期的結果。"
+ "停止"
+ "取消"
+ "由應用程式啟動:輕觸螢幕即可停止"
+ "%1$s:輕觸即可進行管理"
+ "可用:%2$s+%3$s,共 %1$d 個程序"
+ "其他:%2$s,共 %1$d 個程序"
+ "程序:%1$s"
+ "語言與鍵盤"
+ "語言與鍵盤設定""選取地區設定 (語言和地區)、文字輸入和自動校正選項""地區設定""文字設定"
@@ -637,7 +692,7 @@
"按空白鍵兩次可插入「.」""顯示密碼""顯示輸入的密碼"
- "此輸入法可能會收集您輸入的所有文字,包括密碼和信用卡號等個人資料。此輸入法來自 %1$s 應用程式。是否啟用此輸入法?"
+ "此輸入法可能會收集您輸入的所有文字,包括密碼和信用卡號等個人資料。此輸入法來自「%1$s」應用程式。是否要使用此輸入法?""使用者字典""使用者字典""在使用者字典中新增及移除字詞"
@@ -665,7 +720,7 @@
"文字輸入法""管理輸入法選項""%1$s 設定"
- "螢幕小鍵盤設定"
+ "螢幕鍵盤設定""裝置小鍵盤""內建小鍵盤設定""開發"
@@ -676,11 +731,11 @@
"充電時螢幕不會進入休眠""允許模擬位置""允許模擬位置"
- "啟用 USB 偵錯功能嗎?"
+ "允許 USB 偵錯嗎?""USB 偵錯是針對應用程式開發而設計的功能,可讓您在電腦與裝置間複製資料、不用通知即可在裝置上安裝應用程式,以及讀取記錄資料。""選擇小工具""選擇小工具"
- "UID %d 的詳細資料"
+ "UID %d 的詳細資料""UID %1$d""%1$s 的網路使用率詳細資料:""已接收的位元組數:%1$d"
@@ -716,12 +771,13 @@
"應用程式""計數""使用時間"
- "協助工具"
+ "協助工具"
+ "協助工具設定""管理協助工具選項""協助工具""協助工具服務""尚未安裝協助工具服務。"
- "此協助工具服務可能會收集您輸入的所有文字,包括個人資料及信用卡號碼,但並不會收集您輸入的密碼,而且它也可能會記錄您的使用者介面互動行為。該服務是由應用程式「%1$s」所提供,要啟動此協助工具服務嗎?"
+ "此協助工具服務可能會收集您輸入的所有文字,包括個人資料及信用卡號碼,但並不會收集您輸入的密碼,而且它也可能會記錄您的使用者介面互動行為。該服務是由應用程式「%1$s」所提供,要使用此協助工具服務嗎?""要停用協助工具嗎?""電池使用狀況""消耗電池電力的功能"
@@ -733,7 +789,7 @@
"裝置甦醒時間""WiFi 開啟時間""WiFi 開啟時間"
- "%1$s - %2$s%%"
+ "%1$s - %2$s%%""電池使用狀況詳細資料""使用狀況詳細資訊""調整電力使用"
@@ -769,7 +825,7 @@
"Wi-Fi 耗電量""未使用或無法使用 Wi-Fi 時即關閉 Wi-Fi""藍牙耗電量"
- "未使用藍牙時即關閉藍牙"
+ "未使用藍牙時即關閉藍牙""嘗試連線至不同的藍牙裝置""應用程式執行時的耗電量""停止或解除安裝應用程式"
@@ -781,9 +837,9 @@
"重新整理""Android 作業系統""媒體伺服器"
- "語音合成"
+ "文字轉語音""設定文字轉語音選項"
- "語音合成器控制項"
+ "文字轉語音設定""永遠使用我的設定""下列預設設定會覆寫應用程式設定""預設設定"
@@ -801,8 +857,11 @@
"請聆聽合成的範例。""設定已變更,請聆聽語音範例。""電源控制"
+ "正在更新 Wi-Fi 設定"
+ "正在更新藍牙設定"
+ "認證安裝程式""VPN 設定"
- "連線至「%s」"
+ "連線至%s""使用者名稱:""密碼:""使用者名稱"
@@ -820,9 +879,9 @@
"中斷網路連線""編輯網路""刪除網路"
- "請輸入%s。"
- "請選取%s。"
- "VPN 名稱「%s」已經存在,請使用其他名稱。"
+ "請輸入%s。"
+ "請選取%s。"
+ "VPN 名稱「%s」已經存在,請使用其他名稱。""確定要刪除此 VPN 嗎?""確定不要建立此設定檔嗎?""確定要捨棄您對此設定檔所做的變更嗎?"
@@ -833,10 +892,12 @@
"此 VPN 設定遺失了一或多個密碼檔,要檢查密碼檔設定嗎?""您所輸入的使用者名稱或密碼不正確,您要再試一次嗎?""伺服器無回應,您所輸入的使用者名稱或密碼可能有誤,要再試一次嗎?"
+ "伺服器中斷連線,這可能是因為您的防火牆禁止您連線到該伺服器。要再試一次嗎?"
+ "伺服器協商失敗;伺服器不同意您的加密選項。要查看您的加密設定嗎?""新增 VPN""新增 VPN"
- "新增%s VPN"
- "%s詳細資訊"
+ "新增 %s VPN"
+ "%s的詳細資料""VPN""連線中...""中斷連線中..."
@@ -844,8 +905,8 @@
"連線至網路""VPN 名稱""VPN 名稱"
- "已新增「%s」"
- "已變更「%s」的設定"
+ "已新增「%s」"
+ "已變更「%s」的設定""設定使用者憑證""使用者憑證""使用者憑證"
@@ -866,53 +927,53 @@
"VPN 伺服器名稱""DNS 搜尋網域""DNS 搜尋網域"
- "已設定%s"
- "未設定%s"
- "未設定%s (可略過)"
- "啟用%s"
- "停用%s"
- "已啟用%s"
- "已停用%s"
+ "已設定%s"
+ "未設定%s"
+ "未設定%s (可略過)"
+ "啟用%s"
+ "停用%s"
+ "已啟用%s"
+ "已停用%s""VPN 設定""設定與管理虛擬私人網路 (VPN)""(未變更)""(未設定)"
- "認證儲存空間"
- "使用安全認證"
- "允許應用程式存取安全認證及其他認證"
- "輸入密碼"
- "輸入認證儲存空間密碼。"
- "設定密碼"
- "設定或變更認證儲存空間密碼"
- "設定密碼"
- "清除儲存空間"
- "清除認證儲存空間的所有內容,並重新設定密碼"
- "確定要刪除所有認證,並重新設定認證儲存空間密碼嗎?"
- "為憑證命名"
- "憑證名稱:"
- "擷取憑證的密碼:"
- "憑證詳細資訊:"
- "名稱只能包含英數字元。"
- "目前的密碼:"
- "新密碼:"
- "確認新密碼:"
- "設定認證儲存空間密碼。"
- "設定認證儲存空間密碼。"
- "請輸入正確的密碼。"
- "請輸入正確的密碼。您還有 1 次輸入密碼的機會,如果輸入錯誤,認證儲存空間將遭到清除。"
- "請輸入正確的密碼。您還有 %d 次輸入密碼的機會,如果輸入錯誤,認證儲存空間將遭到清除。"
- "密碼不符。"
- "請輸入一個密碼,並確認未輸錯。"
- "請輸入密碼。"
- "請再次輸入密碼,密碼必須包含至少 8 個字元,且不得包含空格。"
- "請輸入名稱。"
- "請輸入名稱 (只能包含英數字元)。"
- "無法儲存憑證,如要重試,請按一下 [確定]。"
- "無法儲存憑證,未啟用或未正確初始化認證儲存空間。"
- "未儲存憑證。"
- "已清除認證儲存空間內容。"
- "已啟用認證儲存空間。"
- "已新增%s。"
+ "認證儲存空間"
+ "使用安全認證"
+ "允許應用程式存取安全認證及其他認證"
+ "輸入密碼"
+ "輸入認證儲存空間密碼。"
+ "從 SD 卡安裝"
+ "從 SD 卡安裝加密憑證"
+ "設定密碼"
+ "設定或變更認證儲存空間密碼"
+ "清除儲存空間"
+ "清除認證儲存空間的所有內容,並重新設定密碼"
+ "確定要刪除所有認證,並重新設定認證儲存空間密碼嗎?"
+ "目前的密碼:"
+ "新密碼:"
+ "確認新密碼:"
+ "設定認證儲存空間密碼 (最少 8 個字元)。"
+ "請輸入正確的密碼。"
+ "請輸入正確的密碼。您還有 1 次輸入密碼的機會,如果輸入錯誤,認證儲存空間將遭到清除。"
+ "請輸入正確的密碼。您還有 %1$d 次輸入密碼的機會,如果輸入錯誤,認證儲存空間將遭到清除。"
+ "密碼不符。"
+ "請輸入您的密碼,並加以確認。"
+ "請輸入密碼。"
+ "密碼最少必須包含 8 個字元。"
+ "已清除認證儲存空間內容。"
+ "已啟用認證儲存空間。"
+ "已停用認證儲存空間。""緊急警示音""設定撥打緊急電話時的運作方式"
+ "隱私設定"
+ "隱私設定"
+ "位置"
+ "設定"
+ "個人資料"
+ "備份我的設定"
+ "設定備份"
+ "您確定要停止備份設定,並清除 Google 伺服器上的所有設定資料嗎?"
+
+
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 6ec90ca5f56..2981b1245e4 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -48,6 +48,30 @@
yyyy-MM-dd
+
+
+ No animations
+ Some animations
+ All animations
+
+
+
+
+ No window animations are shown
+ Some window animations are shown
+ All window animations are shown
+
+
+
+
+
+ 00
+
+ 01
+
+ 11
+
+
15 seconds
@@ -55,12 +79,11 @@
1 minute2 minutes10 minutes
-
- Never timeout
+ 30 minutes
-
+ 15000
@@ -72,7 +95,7 @@
600000
- -1
+ 1800000
@@ -129,6 +152,15 @@
ita-ITAspa-ESP
+
+
+ This is an example of speech synthesis in English.
+ This is an example of speech synthesis in English.
+ Voici un échantillon de synthèse vocale en français.
+ Dies ist ein Beispiel für Sprachsynthese in Deutsch.
+ Questo è un esempio di sintesi vocale in italiano.
+ Este es un ejemplo de síntesis de voz en español.
+
@@ -142,13 +174,9 @@
WEP
- WPA personal
-
- WPA2 personal
+ WPA/WPA2 PSK
- WPA-EAP
-
- IEEE 802.1x
+ 802.1x Enterprise
@@ -159,14 +187,9 @@
WEP
- WPA personal
-
- WPA2 personal
+ WPA/WPA2 PSK
-
- WPA-EAP
-
- IEEE 802.1x
+ 802.1x Enterprise
@@ -237,7 +260,7 @@
NonePAPMSCHAP
- MSCHAP2
+ MSCHAPV2GTC
@@ -264,8 +287,27 @@
- 中文(简体)
+ 中文 (简体)中文 (繁體)
+
+
+ None
+ PAP
+ CHAP
+ PAP or CHAP
+
+
+
+
+ 0
+
+ 1
+
+ 2
+
+ 3
+
+
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 9bf79f9c0c5..0a2c5c52e9e 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -18,4 +18,7 @@
+
+
+
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9626837f0f4..80a4a376d01 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -18,7 +18,4 @@
10sp16sp90sp
-
- 311dip
- 80dip
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8d8b226f52b..23d1767cc63 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -15,6 +15,11 @@
-->
+
+ "Yes"
+
+
+ "No"
@@ -117,6 +122,8 @@
Battery status:
+ Power plug:
+
Battery scale:Battery level:
@@ -157,6 +164,13 @@
Full
+
+ Unplugged
+ AC
+ USB
+ AC+USB
+ Unknown
+
Unknown
@@ -174,7 +188,7 @@
BluetoothDiscoverable
-
+
Discoverable for %1$s seconds\u2026Make device discoverable
@@ -215,6 +229,23 @@
Select to pair with\u0020
+
+ Bluetooth device picker
+
+
+ "Bluetooth permission request"
+
+
+ "An application on your phone is requesting permission to turn on Bluetooth. Do you want to do this?"
+
+
+ "An application on your phone is requesting permission to make your phone discoverable by other Bluetooth devices for %1$d seconds. Do you want to do this?"
+
+
+ "An application on your phone is requesting permission to turn on Bluetooth and to make your phone discoverable by other devices for %1$d seconds. Do you want to do this?"
+
+
+ "Turning on Bluetooth\u2026"Empty button\u2026
@@ -435,7 +466,9 @@
Enabling wireless connections\u2026
- Wireless controls
+ Wireless & networks
+
+ Wireless & network settingsManage Wi-Fi, Bluetooth, airplane mode, mobile networks, & VPNs
@@ -486,9 +519,13 @@
Sort by time zone
- Security & location
+ Location & security
+
+ Location & security settingsSet My Location, screen unlock, SIM card lock, credential storage lock
+
+ Set My Location, screen unlock, credential storage lockPasswords
@@ -505,18 +542,33 @@
Manage connections, set device name & discoverability
- Bluetooth pairing request
+ Bluetooth pairing requestBluetooth device info
-
- %1$s\n\nType PIN to pair.\n(Try 0000 or 1234.)
+
+ \nType PIN to pair with \u0022%1$s\u0022. (Try 0000 or 1234.)
+
+ \nType passkey to pair with \u0022%1$s\u0022.
+
+ To pair with \u0022%1$s\u0022, confirm that it is showing the passkey: %2$s.
+
+ %1$s\nwants to pair.
+
+ Enter %2$s on \u0022%1$s\u0022 to pair.
+
+ Pair
+
+ Don\u0027t Pair
+
+ bluetooth deviceAttentionThere was a problem pairing with %1$s.
-
- There was a problem pairing with %1$s because the typed PIN is incorrect.
+
+ There was a problem pairing with %1$s because the PIN or Passkey is incorrect.Cannot establish communication with %1$s.
@@ -557,6 +609,8 @@
MediaPhone
+
+ TransferConnected to media audio
@@ -577,11 +631,17 @@
Connected to media audioConnected to phone audio
+
+ Connected to file transfer server
+
+ Not connected to file transfer serverUse for media audioUse for phone audio
+
+ Use for file transfer
@@ -617,13 +677,10 @@
WEP
- WPA
+ WPA/WPA2 PSK
- WPA2
+ Enterprise(802.1x)
- WPA-EAP
-
- IEEE8021XUnknown
@@ -632,14 +689,10 @@
secured with WEP
- secured with WPA
+ secured with WPA/WPA2 PSK
- secured with WPA2
-
- secured with WPA-EAP
-
- secured with IEEE 802.1x
-
+ secured with 802.1x EAP
+
IP addressSignal strength
@@ -675,8 +728,6 @@
Client certificateCA certificate
-
- Private key passwordWireless password
@@ -690,7 +741,7 @@
remembered
- Connection unsuccessful, select to try again
+ Connection unsuccessful, touch to try againWi-Fi networks
@@ -798,6 +849,8 @@
Sound & display
+
+ Sound & display settingsSound settings
@@ -850,16 +903,26 @@
Play sound when making screen selection
+ Haptic feedback
+
+ Vibrate when pressing soft keys and on certain UI interactions
+
+ Vibrate when pressing soft keys and on certain UI interactions
+
SD card notificationsPlay sound for SD card notificationsPlay sound for SD card notifications
+
+ Noise cancellation
+
+ Suppress background noise when speaking or recording.
-
- Data synchronization
+
+ Accounts & sync
- Select which applications are synchronized
+ Add or remove accounts and change account settingsSearch
@@ -889,6 +952,8 @@
Screen timeoutAdjust the delay before the screen automatically turns off
+
+ Automatic brightnessSIM card lock settings
@@ -960,7 +1025,9 @@
Phone number, signal, etc.
- SD card & phone storage
+ SD card & phone storage
+
+ SD card & phone storage settingsUnmount SD card, view available storage
@@ -1053,6 +1120,16 @@
MCCMNC
+
+ Authentication type
+
+ None
+
+ PAP
+
+ CHAP
+
+ PAP or CHAPAPN type
@@ -1137,17 +1214,23 @@
Location determined by Wi-Fi and/or mobile networks
- Enable GPS satellites
-
- When locating, accurate to street level (deselect to conserve battery)
-
+ Use GPS satellites
+
+ When locating, accurate to street level (uncheck to conserve battery)
+
Locate to street-level (requires more battery plus view of sky)
+
+ Use assisted GPS
+
+ Use server to assist GPS (uncheck to reduce network usage)
+
+ Use server to assist GPS (uncheck to improve GPS performance)
- Share with Google
-
- Allow Google to use location for improved search and other services
+ Use My Location
+
+ Use My Location for Google search results and other Google services
- Allow Google to use location for improved search results and other services
+ Do you want to allow Google to use location for improved search results and other services?Agree
@@ -1185,6 +1268,15 @@
Loading\u2026
+
+ Safety information
+
+ Safety information
+
+ Your phone is not connected to a data service. To view this information now, go to %s from any computer connected to the Internet.
+
+ Loading\u2026
+
Screen unlock pattern
@@ -1252,8 +1344,8 @@
\n\n1\u00A0 On the next screen, watch while an example pattern is drawn.
\n\n2\u00A0 When ready, draw your own personal unlock pattern. Experiment with different patterns but connect at least four dots.
\n\n3\u00A0 Redraw your pattern to confirm.
- \n\nReady to start? Select \u201CNext\u201D.
- \n\nTo leave your phone unprotected, select \u201CCancel\u201D.
+ \n\nReady to start? Touch \u201CNext\u201D.
+ \n\nTo leave your phone unprotected, touch \u201CCancel\u201D.
@@ -1261,7 +1353,7 @@
Example patternConnect at least four dots.\n
- \nSelect \u201CNext\u201D when you\u2019re ready to draw your own pattern.
+ \nTouch \u201CNext\u201D when you\u2019re ready to draw your own pattern.
@@ -1337,7 +1429,7 @@
All
- Third-party
+ DownloadedRunning
@@ -1347,7 +1439,7 @@
Delete
- All information you\'ve saved in this application will be deleted permanently.
+ All of this application\'s data will be deleted permanently. This includes all files, settings, accounts, databases and so on.OK
@@ -1372,13 +1464,45 @@ found in the list of installed applications.
Computing\u2026Unable to compute package size
- You do not have any third-party apps installed.
+ You do not have any third-party applications installed.version %1$s
+
+ Running services
+
+ View and control currently running services
+
+ Restarting
+
+ No running services
+
+ Stop service?
+
+ The service will no longer run until
+ started again. This may have undesireable
+ consequences on the applicaton
+ %1$s.
+
+ Stop
+
+ Cancel
+
+ Started by application: touch to stop
+
+ %1$s: touch to manage
+
+ Avail: %2$s+%3$s in %1$d
+
+ Other: %2$s in %1$d
+
+ Process: %1$s
+
- Locale & text
+ Language & keyboard
+
+ Language & keyboard settingsSet locale (language and region), text input and auto-correction options
@@ -1413,7 +1537,7 @@ found in the list of installed applications.
all the text you type, including personal data like passwords and credit
card numbers. It comes from the application
%1$s.
- Enable this input method?
+ Use this input method?
@@ -1475,7 +1599,7 @@ found in the list of installed applications.
%1$s settings
- On-screen keyboard settings
+ Onscreen keyboard settingsDevice keyboard
@@ -1498,7 +1622,7 @@ found in the list of installed applications.
Allow mock locations
- Enable USB debugging?
+ Allow USB debugging?USB debugging is intended for development purposes only. It can be used to copy data between your computer and your device, install applications on your device without notification, and read log data.
@@ -1506,13 +1630,14 @@ found in the list of installed applications.
(or other screens that can host gadgets). Note to translators: we're still determining
the final name for Gadgets/Widgets, so please translate both for now. -->
Choose gadget
+
Choose widget
- Details for UID %d
+ Details for UID %dUID %1$d
@@ -1618,8 +1743,10 @@ found in the list of installed applications.
-
- Accessibility
+
+ Accessibility
+
+ Accessibility settingsManage accessibility options
@@ -1633,7 +1760,7 @@ found in the list of installed applications.
This accessibility service may be able to collect
all the text you type, including personal data credit card numbers except passwords.
It may also log your user interface interactions. It comes from the application
- %1$s. Enable this accessibility service?
+ %1$s. Use this accessibility service?
Disable accessibility?
@@ -1661,7 +1788,7 @@ found in the list of installed applications.
WiFi on time%1$s" - "
- %2$s"%%"
+ %2$s%%Battery use details
@@ -1742,7 +1869,7 @@ found in the list of installed applications.
Battery used by bluetooth
- Turn off bluetooth when you aren't using it
+ Turn off bluetooth when you aren\'t using itTry connecting to a different bluetooth device
@@ -1771,11 +1898,11 @@ found in the list of installed applications.
- Speech synthesis
+ Text-to-speechSet text-to-speech options
- Speech synthesizer controls
+ Text-to-speech settingsAlways use my settings
@@ -1811,11 +1938,16 @@ found in the list of installed applications.
Power Control
+ Updating Wi-Fi setting
+ Updating Bluetooth setting
+
+
+ Credential installerVPN settings
- Connect to %s
+ Connect to %sUsername:Password:
@@ -1840,9 +1972,9 @@ found in the list of installed applications.
Delete network
- You must enter %s.
- You must select %s.
- The VPN name \'%s\' already exists. Find another name.
+ You must enter %s.
+ You must select %s.
+ The VPN name \'%s\' already exists. Find another name.Are you sure you want to delete this VPN?Are you sure you don\'t want to create this profile?Are you sure you want to discard the changes made to this profile?
@@ -1853,15 +1985,17 @@ found in the list of installed applications.
One or more secrets are missing in this VPN configuration. Do you want to check your secret setting?The username or password you entered is incorrect. Do you want to try again?Server hung up. The username or password you entered could be incorrect. Do you want to try again?
+ Server hung up. It is possible that you are behind a firewall that prevents you from connecting to the server. Do you want to try again?
+ Server negotiation failed. The server may not agree with your encryption option. Do you want to check your encryption setting?Add VPNAdd VPN
- Add %s VPN
+ Add %s VPN
- %s details
+ %s detailsVPNs
@@ -1878,9 +2012,9 @@ found in the list of installed applications.
a VPN name
- '%s' is added
+ \'%s\' is added
- Changes are made to '%s'
+ Changes are made to \'%s\'Set user certificate
@@ -1921,21 +2055,21 @@ found in the list of installed applications.
DNS search domains
- %s is set
+ %s is set
- %s not set
+ %s not set
- %s not set (optional)
+ %s not set (optional)
- Enable %s
+ Enable %s
- Disable %s
+ Disable %s
- %s is enabled
+ %s is enabled
- %s is disabled
+ %s is disabledVPN settings
@@ -1947,71 +2081,74 @@ found in the list of installed applications.
(not set)
- Credential storage
+ Credential storage
- Use secure credentials
+ Use secure credentials
- Allow applications to access secure certificates and other credentials
+ Allow applications to access secure certificates and other credentials
- Enter password
-
- Enter the credential storage password.
-
+ Enter password
+
+ Enter the credential storage password.
+
+ Install from SD card
+
+ Install encrypted certificates from SD card
- Set password
+ Set password
- Set or change the credential storage password
-
- Set password
-
-
- Clear storage
-
- Clear credential storage of all contents and reset its password
- Are you sure you want to delete all credentials and reset the credential storage password?
-
-
- Name the certificate
-
- Certificate name:
-
-
- Password to extract the certificate:
- Certificate details:
- The name can contain only letters and numbers.
-
-
+ Set or change the credential storage password
+
+ Clear storage
+
+ Clear credential storage of all contents and reset its password
+
+ Are you sure you want to delete all credentials and reset the credential storage password?
- Current password:
+ Current password:
- New password:
+ New password:
- Confirm new password:
+ Confirm new password:
- Set a password for the credential storage.
-
- Set a password for the credential storage.
- Please enter the correct password.
- Please enter the correct password. You have one more try to enter the correct password before the credential storage is erased.
- Please enter the correct password. You have %d more tries to enter the correct password before the credential storage is erased.
- Passwords do not match.
- You must enter and confirm a password.
- Please enter the password.
- Please enter the password again. The password must have at least 8 characters and must not contain spaces.
- Please enter a name.
- Please enter a name that contains only letters and numbers.
- Unable to save the certificate. Click OK to retry.
- Unable to save the certificate. The credential storage is not enabled or properly initialized.
- The certificate is not saved.
- The credential storage is erased.
-
+ Set a password for the credential storage (at least 8 characters).
+ Please enter the correct password.
+ Please enter the correct password. You have one more try to enter the correct password before the credential storage is erased.
+ Please enter the correct password. You have %1$d more tries to enter the correct password before the credential storage is erased.
+ Passwords do not match.
+ You must enter and confirm a password.
+ Please enter the password.
+ The password must have at least 8 characters.
- Credential storage is enabled.
+ The credential storage is erased.
- %s is added.
+ Credential storage is enabled.
+
+ Credential storage is disabled.Emergency toneSet behavior when an emergency call is placed
+
+
+
+ Privacy
+
+ Privacy settings
+
+ Location
+
+ Settings
+
+ Personal data
+
+ Back up my settings
+
+ Settings backup
+
+ Are you sure you want to stop backing up your settings and erase all copies on Google servers?
+
+
+ Untitled
diff --git a/res/xml-ar/timezones.xml b/res/xml-ar/timezones.xml
index 395e5e23430..b9038805b63 100644
--- a/res/xml-ar/timezones.xml
+++ b/res/xml-ar/timezones.xml
@@ -2,7 +2,7 @@
ماجوروميدوايهونولولو
- أنكوريج
+ أنشوراجلوس انجلوستيخوانافينكس
@@ -18,7 +18,7 @@
Barbadosماناوسسانتيجو
- سانت جونز
+ سانت جونسأروجوانيابوينوس أيرسجودثاب
@@ -62,6 +62,7 @@
RangoonكراسنويارسكBangkok
+ بكينHong Kongايركيتسككوالالمبور
@@ -70,7 +71,7 @@
SeoulTokyoياكتسك
- أدليادا
+ استراليا(توقيت أدليادادارونبرسيبانهوبارت
diff --git a/res/xml-cs/timezones.xml b/res/xml-cs/timezones.xml
index 26a97156356..3b7e87b7cba 100644
--- a/res/xml-cs/timezones.xml
+++ b/res/xml-cs/timezones.xml
@@ -2,7 +2,7 @@
MajuroMidwayHonolulu
- Aljašský čas
+ AnchoragePacifický standardní čas (Los Angeles)Pacifický standardní čas (Tichuana)Horský standardní čas (Phoenix)
diff --git a/res/xml-da/timezones.xml b/res/xml-da/timezones.xml
index eb63dcea617..6e80e87fc9a 100644
--- a/res/xml-da/timezones.xml
+++ b/res/xml-da/timezones.xml
@@ -2,7 +2,7 @@
MajuroMidwayHonolulu
- Alaska Time
+ AlaskaPacific-tid (Los Angeles)Pacific-tid (Tijuana)Mountain-tid (Phoenix)
@@ -62,13 +62,14 @@
RangoonKrasnoyarskIndokinesisk tid (Bangkok)
+ Kinesisk tid (Beijing)Hongkong-tid (Hongkong)IrkutskKuala LumpurVestaustralsk tid (Perth)
- Kinesisk normaltid (Taipei)
+ TaipeiKoreansk normaltid (Seoul)
- Japansk normaltid (Tokyo)
+ Japansk tid (Tokyo)YakutskCentralaustralsk tid (Adelaide)Centralaustralsk tid (Darwin)
diff --git a/res/xml-el/timezones.xml b/res/xml-el/timezones.xml
index 9cb4dc124c9..de25148e29f 100644
--- a/res/xml-el/timezones.xml
+++ b/res/xml-el/timezones.xml
@@ -6,19 +6,19 @@
Λος ΆντζελεςΤιχουάναΦοίνιξ
- Chihuahua
+ ΤσιουάουαΝτένβερΚόστα ΡίκαΣικάγοΠόλη του Μεξικού
- Regina
+ ΡετζίναΜπογκοτάΝέα ΥόρκηΚαράκαςΜπαρμπέιντοςΜανάοςΣαντιάγκο
- St. John's
+ Σεντ ΤζονςΑραγκουάιναΜπουένος ΆιρεςΓκόνθαμπ
@@ -33,7 +33,7 @@
ΒρυξέλλεςSarajevoΓουιντχόεκ
- Μπράζαβιλ
+ ώρα Δυτικής Αφρικής (Μπράζαβιλ)ΑμάνΑθήναΒηρυτός
@@ -41,11 +41,11 @@
ΕλσίνκιΙερουσαλήμΜινσκ
- Ζιμπάμπουε
+ ώρα Κεντρικής Αφρικής (Ζιμπάμπουε)ΒαγδάτηΜόσχαKuwait
- Κένυα
+ ώρα Ανατολικής Αφρικής (Κένυα)ΤεχεράνηΜπακούΤμπιλίσι
@@ -53,31 +53,32 @@
ΝτουμπάιΚαμπούλΚαράτσι
- Oral
+ ΌραλΑικατερινούποληCalcuttaΚολόμποΚατμαντούΑλμάτυΡανγκούν
- Krasnoyarsk
+ ΚρασνογιάρσκΜπανγκόκ
+ ΠεκίνοΧονγκ ΚονγκΙρκούτσκΚουάλα Λουμπούρ
- Perth
+ ΠερθΤαϊπέιΣεούλΤόκυο
- Yakutsk
+ ΓιάκουτσκΑδελαΐδα
- Darwin
- Brisbane
- Hobart
- Σύδνεϊ
+ Ντάργουιν
+ Μπρίσμπεϊν
+ Χόμπαρτ
+ ΣίδνεϊΒλαδιβοστόκΓκουάμ
- Magadan
+ ΜαγκαντάνΌκλαντΦίτζιΤονγκατάπου
diff --git a/res/xml-es/timezones.xml b/res/xml-es/timezones.xml
index d59aabe94ac..4fe564db591 100644
--- a/res/xml-es/timezones.xml
+++ b/res/xml-es/timezones.xml
@@ -3,29 +3,29 @@
MidwayHonolulúAnchorage
- Hora estándar del Pacífico (Los Ángeles)
- Hora estándar del Pacífico (Hora de México (Tijuana))
- Hora estándar de Montaña (Hora de Estados Unidos (Phoenix))
- Hora de México (Chihuahua)
+ Hora del Pacífico (Los Ángeles)
+ Hora del Pacífico (Tijuana)
+ Hora estándar de Montaña (Phoenix)
+ ChihuahuaHora estándar de Montaña (Denver)Hora central (Costa Rica)Hora central (Chicago)Hora central (Ciudad de México)Hora central (Hora de Canadá (Regina))
- Bogotá
+ Hora de Colombia (Bogotá)Hora oriental (Nueva York)
- Caracas
- Hora estándar del Atlántico (Barbados)
- Manaus
- Santiago
- Hora estándar de Newfoundland (St. Johns)
- Araguaína
- Hora de Argentina (Buenos Aires)
- Godthab
- Montevideo
- Georgia del Sur
+ Hora de Venezuela (Caracas)
+ Hora del Atlántico (Barbados)
+ Hora del Amazonas (Manaus)
+ Hora de Chile (Santiago)
+ Hora estándar de Newfoundland (St. John’s)
+ Hora de Brasilia (Araguaína)
+ Hora de Argentina (Hora de Argentina (Buenos Aires))
+ Hora de Groenlandia occidental (Godthab)
+ Hora de Uruguay (Montevideo)
+ Hora de Georgia meridional (Georgia del Sur)Azores
- Cabo Verde
+ Hora de Cabo Verde (Cabo Verde)CasablancaHora media de Greenwich (Londres)Hora estándar de Europa Central (Amsterdam)
@@ -33,7 +33,7 @@
Hora estándar de Europa Central (Bruselas)Hora estándar de Europa Central (Sarajevo)Windhoek
- Brazzaville
+ Hora de África occidental (Brazzaville)Hora estándar de Europa del Este (Amman)Hora estándar de Europa del Este (Atenas)Hora estándar de Europa del Este (Beirut)
@@ -41,45 +41,45 @@
Hora estándar de Europa del Este (Helsinki)Hora estándar de Israel (Jerusalén)Minsk
- Harare
- Bagdad
+ Hora de África central (Harare)
+ Hora de Arabia (Bagdad)Moscú
- Kuwait
- Nairobi
+ Hora de Arabia (Kuwait)
+ Hora de África oriental (Nairobi)TeheránBakúTiflisErevánDubai
- Kabul
+ Hora de Afganistán (Kabul)KarachiOralYekaterinburgo
- Calcutta
+ Hora estándar de la India (Calcutta)ColomboKatmandúAlmatyRangúnKrasnoyarskBangkok
- Hora estándar de China (Beijing)
- Hong Kong
+ Hora de China (Beijing)
+ Hora de Hong Kong (Hong Kong)IrkutskKuala Lumpur
- Hora de Australia (Perth)
+ Hora de Australia occidental (Perth)Taipei
- Seúl
+ Hora de Corea (Seúl)Hora estándar de Japón (Tokio)Yakutsk
- Adelaida
- Hora de Australia (Darwin)
- Hora de Australia (Brisbane)
- Hora de Australia (Hobart)
- Sydney
+ Hora de Australia central (Adelaida)
+ Hora de Australia central (Darwin)
+ Hora de Australia oriental (Brisbane)
+ Hora de Australia oriental (Hobart)
+ Hora de Australia oriental (Sídney)VladivostokGuamMagadan
- Auckland
+ Hora de Nueva Zelanda (Auckland)FiyiTongatapu
diff --git a/res/xml-fi/timezones.xml b/res/xml-fi/timezones.xml
index 4172ec0de0b..ae194a71b2e 100644
--- a/res/xml-fi/timezones.xml
+++ b/res/xml-fi/timezones.xml
@@ -3,22 +3,22 @@
MidwayHonoluluAnchorage
- Yhdysvaltain Tyynenmeren normaaliaika (Los Angeles)
- Yhdysvaltain Tyynenmeren normaaliaika (Tijuana)
- Kalliovuorten normaaliaika (Phoenix)
+ Yhdysvaltain Tyynenmeren aika (Los Angeles)
+ Yhdysvaltain Tyynenmeren aika (Tijuana)
+ Kalliovuorten aika (Phoenix)Chihuahua
- Kalliovuorten normaaliaika (Denver)
- Yhdysvaltain keskinen normaaliaika (Costa Rica)
- Yhdysvaltain keskinen normaaliaika (Chicago)
- Yhdysvaltain keskinen normaaliaika (Ciudad de México)
- Yhdysvaltain keskinen normaaliaika (Regina)
+ Kalliovuorten aika (Denver)
+ Yhdysvaltain keskinen aika (Costa Rica)
+ Yhdysvaltain keskinen aika (Chicago)
+ Yhdysvaltain keskinen aika (Ciudad de México)
+ Yhdysvaltain keskinen aika (Regina)Bogota
- Yhdysvaltain itäinen normaaliaika (New York)
+ Yhdysvaltain itäinen aika (New York)Caracas
- Kanadan Atlantin normaaliaika (Barbados)
+ Kanadan Atlantin aika (Barbados)ManausSantiago
- Newfoundlandin normaaliaika (St. John's)
+ Newfoundlandin normaaliaika (St. Johns)AraguainaBuenos AiresGodthåb
@@ -33,7 +33,7 @@
Keski-Euroopan normaaliaika (Bryssel)Keski-Euroopan normaaliaika (Sarajevo)Windhoek
- Brazzaville
+ Länsi-Afrikan aika (Brazzaville)Itä-Euroopan normaaliaika (Amman)Itä-Euroopan normaaliaika (Ateena)Itä-Euroopan normaaliaika (Beirut)
@@ -41,11 +41,11 @@
Itä-Euroopan normaaliaika (Helsinki)Israelin normaaliaika (Jerusalem)Minsk
- Harare
+ Keski-Afrikan aika (Harare)BaghdadMoskovaKuwait
- Nairobi
+ Itä-Afrikan aika (Nairobi)TeheranBakuTbilisi
@@ -62,11 +62,12 @@
RangoonKrasnojarskBangkok
+ Kiinan normaaliaika (Peking)HongkongIrkutskKuala LumpurPerth
- Kiinan normaaliaika (Taipei)
+ TaipeiSeoulJapanin normaaliaika (Tokio)Jakutsk
diff --git a/res/xml-fr/timezones.xml b/res/xml-fr/timezones.xml
index 6def4757728..d655e895a1c 100644
--- a/res/xml-fr/timezones.xml
+++ b/res/xml-fr/timezones.xml
@@ -1,8 +1,8 @@
- Majuro
+ Heure des îles Marshall (Majuro)MidwayHonolulu
- Anchorage
+ AlaskaHeure du Pacifique (Los Angeles)Heure du Pacifique (Tijuana)Heure des Rocheuses (Phoenix)
@@ -11,21 +11,21 @@
Heure du Centre (San José)Heure du Centre (Chicago)Heure du Centre (Mexico)
- Heure du Centre (Regina)
- Bogota
+ Heure du Centre (Régina)
+ Heure de Colombie (Bogota)Heure de l’Est (New York)CaracasHeure de l’Atlantique (Barbade (La))
- Manaus
- Santiago
+ Heure de l’Amazonie (Manaos)
+ Heure du Chili (Santiago)Heure de Terre-Neuve (Saint-Jean de Terre-Neuve)
- Araguaína
- Heure d’Argentine (Buenos Aires)
+ Heure de Brasilia (Araguaína)
+ Heure de l’Est argentin (Buenos Aires)Heure de l’Ouest du Groenland (Godthåb)MontevideoHeure de Géorgie du Sud (Géorgie du Sud)
- Ponta Delgada
- Cap Vert
+ Açores
+ Heure du Cap-Vert (Cap Vert)CasablancaHeure moyenne de Greenwich (Londres)Heure de l’Europe centrale (Amsterdam)
@@ -33,7 +33,7 @@
Heure de l’Europe centrale (Bruxelles)Heure de l’Europe centrale (Sarajevo)Windhoek
- Heure normale d’Afrique de l’Ouest (Brazzaville)
+ Heure d’Afrique de l’Ouest (Brazzaville)Heure normale de l’Europe de l’Est (Amman)Heure normale de l’Europe de l’Est (Athènes)Heure normale de l’Europe de l’Est (Beyrouth)
@@ -41,24 +41,24 @@
Heure normale de l’Europe de l’Est (Helsinki)Heure d’Israël (Jérusalem)Minsk
- Heure normale d’Afrique centrale (Harare)
+ Heure d’Afrique centrale (Harare)Heure de l’Arabie (Bagdad)MoscouHeure de l’Arabie (Koweït)
- Heure normale d’Afrique de l’Est (Nairobi)
- Heure normale d’Iran (Téhéran)
+ Heure d’Afrique de l’Est (Nairobi)
+ Heure d’Iran (Téhéran)BakouTbilissiErevanHeure du Golfe (Dubaï)Heure d’Afghanistan (Kaboul)Karâchi
- Oral
- Iekaterinbourg
- Heure normale de l’Inde (Kolkata)
+ Ouralsk
+ Ekaterinbourg
+ Heure de l’Inde (Kolkata)ColomboKatmandou
- Almaty
+ Alma AtaRangoonHeure de Krasnoïarsk (Krasnoïarsk)Heure d’Indochine (Bangkok)
@@ -79,7 +79,7 @@
VladivostokHagåtñaMagadan
- Auckland
+ Heure de Nouvelle-Zélande (Auckland)Heure des îles Fidji (Fidji)
- Nukuʻalofa
+ Heure de Tonga (Nukuʻalofa)
diff --git a/res/xml-he/timezones.xml b/res/xml-he/timezones.xml
index 510e0a5a6c0..9a2d9f3f9ea 100644
--- a/res/xml-he/timezones.xml
+++ b/res/xml-he/timezones.xml
@@ -62,6 +62,7 @@
ראנגוןKrasnoyarskבנקוק
+ בייג'יןהונג קונגIrkutskקואלה לומפור
diff --git a/res/xml-hr/timezones.xml b/res/xml-hr/timezones.xml
index 7280fdb12fb..9a44c475152 100644
--- a/res/xml-hr/timezones.xml
+++ b/res/xml-hr/timezones.xml
@@ -3,19 +3,19 @@
MidwayHonoluluAlaska vremenska zona
- Los Angeles
- Tijuana
- Phoenix
+ Pacifičko vrijeme (Los Angeles)
+ Pacifičko vrijeme (Tijuana)
+ Planinsko vrijeme (Phoenix)Chihuahua
- Denver
- Kostarika
- Chicago
- Mexico City
- Regina
+ Planinsko vrijeme (Denver)
+ Središnje vrijeme (Kostarika)
+ Središnje vrijeme (Chicago)
+ Središnje vrijeme (Mexico City)
+ Središnje vrijeme (Regina)Bogota
- New York
+ Istočno vrijeme (New York)Caracas
- Barbados
+ Atlantsko vrijeme (Barbados)ManausSantiagoSt. John's
@@ -24,7 +24,7 @@
GodthabMontevideoJužna Georgia
- Azores
+ Azorski otociZelenortska RepublikaCasablancaLondon
@@ -33,7 +33,7 @@
BrusselsSarajevoWindhoek
- Brazzaville
+ Zapadna Afrika (Brazzaville)AmmanAtenaBeirut
@@ -41,11 +41,11 @@
HelsinkiJerusalemMinsk
- Harare
+ Središnja Afrika (Harare)BaghdadMoskvaKuvajt
- Nairobi
+ Istočna Afrika (Nairobi)TehranBakuTbilisi
@@ -62,6 +62,7 @@
RangoonKrasnojarskBangkok
+ PekingHong KongIrkutskKuala Lumpur
diff --git a/res/xml-hu/timezones.xml b/res/xml-hu/timezones.xml
index 7fcc513c7a5..72668600169 100644
--- a/res/xml-hu/timezones.xml
+++ b/res/xml-hu/timezones.xml
@@ -2,7 +2,7 @@
Marshall-szigeteki idő (Majuro-zátony)Midway-szigetekHonolulu
- anchorage-i idő
+ AnchorageCsendes-óceáni idő (Los Angeles)Csendes-óceáni idő (Tijuana)Hegyvidéki idő (Phoenix)
@@ -33,7 +33,7 @@
Közép-európai idő (Brüsszel)Közép-európai idő (Sarajevo)Windhoek
- Nyugat-afrikai idő (Brazzaville)
+ Nigériai idő (Brazzaville)Kelet-európai idő (Amman)Kelet-európai idő (Athén)Kelet-európai idő (Bejrút)
@@ -41,11 +41,11 @@
Kelet-európai idő (Helsinki)Izraeli zónaidő (Jerusalem)Minszk
- Közép-afrikai idő (Harare)
+ Mozambiki idő (Harare)Arab idő (Bagdad)MoszkvaArab idő (Kuvait)
- Kelet-afrikai idő (Nairobi)
+ Kenyai idő (Nairobi)Iráni zónaidő (Teherán)BakuTbilisi
@@ -58,15 +58,16 @@
Indiai zónaidő (Calcutta)ColomboNepáli idő (Katmandu)
- almati idő
+ Alma-AtaMyanmari idő (Rangoon)Krasznojarszki idő (Krasznojarszk)Bangkok
+ Kínai zónaidő (Peking)Hongkongi idő (Hong Kong)Irkutszki idő (Irkutszk)Kuala LumpurNyugat-ausztrál idő (Perth)
- Kínai zónaidő (Tajvan)
+ TajvanKoreai idő (Dél-Korea)Japán zónaidő (Tokio)Jakutszki idő (Jakutszk)
diff --git a/res/xml-id/timezones.xml b/res/xml-id/timezones.xml
index c1db8374af0..ee625b0b54f 100644
--- a/res/xml-id/timezones.xml
+++ b/res/xml-id/timezones.xml
@@ -62,6 +62,7 @@
RangoonKrasnoyarskBangkok
+ BeijingHongkongIrkutskKuala Lumpur
diff --git a/res/xml-ko/timezones.xml b/res/xml-ko/timezones.xml
index 6d62d035430..711f732ad72 100644
--- a/res/xml-ko/timezones.xml
+++ b/res/xml-ko/timezones.xml
@@ -23,9 +23,9 @@
부에노스 아이레스고드호프몬테비데오
- 남부 조지아
+ 사우스 조지아 표준시 (남부 조지아)아조레스
- 카보 베르데
+ 카보 베르데 표준시 (카보 베르데)카사블랑카그리니치 표준시 (런던)중부유럽 표준시 (암스텔담)
@@ -42,9 +42,9 @@
이스라엘 표준시 (예루살렘)민스크중앙아프리카 시간 (하라레)
- 바그다드
+ 아라비아 시간 (바그다드)모스크바
- 쿠웨이트
+ 아라비아 시간 (쿠웨이트)동아프리카 시간 (나이로비)테헤란바쿠
@@ -55,7 +55,7 @@
카라치오랄예카테린부르크
- Calcutta
+ 인도 표준시 (Calcutta)콜롬보카트만두알마티
@@ -80,6 +80,6 @@
괌마가단뉴질랜드 시간 (오클랜드)
- 피지
+ 피지 표준시 (피지)통가타푸
diff --git a/res/xml-nb/timezones.xml b/res/xml-nb/timezones.xml
index 4bf41450064..f374a34c311 100644
--- a/res/xml-nb/timezones.xml
+++ b/res/xml-nb/timezones.xml
@@ -2,24 +2,24 @@
MajuroMidwayHonolulu
- Anchorage
- Los Angeles
- Tijuana
- Phoenix
+ Alaska
+ PST (Los Angeles)
+ PST (Tijuana)
+ MST (Phoenix)Chihuahua
- Denver
- Costa Rica
- Chicago
- Mexico by
- Regina
+ MST (Denver)
+ Normaltid (Costa Rica)
+ Normaltid (Chicago)
+ Normaltid (Mexico by)
+ Normaltid (Regina)BogotáNew YorkCaracas
- Barbados
- Manaus
+ AT (Barbados)
+ Amazonas-tid (Manaus)SantiagoSt. John's
- Araguaína
+ Brasilia-tid (Araguaína)Buenos AiresGodthåbMontevideo
@@ -62,11 +62,12 @@
RangoonKrasnojarskIndokinesisk tid (Bangkok)
+ Kinesisk standardtid (Beijing)Hong Kong-tid (Hong Kong)IrkutskKuala LumpurVestaustralsk tid (Perth)
- Kinesisk standardtid (Taipei)
+ TaipeiKoreansk standardtid (Seoul)Japansk standardtid (Tokyo)Jakutsk
diff --git a/res/xml-nl/timezones.xml b/res/xml-nl/timezones.xml
index e2315dfbc5a..ee2453e7abc 100644
--- a/res/xml-nl/timezones.xml
+++ b/res/xml-nl/timezones.xml
@@ -62,7 +62,7 @@
RangoonKrasnojarskBangkok
- Chinese standaardtijd (Peking)
+ Chinese standaardtijd (Beijing)HongkongIrkoetskKuala Lumpur
diff --git a/res/xml-no/timezones.xml b/res/xml-no/timezones.xml
deleted file mode 100644
index 85201b96e2a..00000000000
--- a/res/xml-no/timezones.xml
+++ /dev/null
@@ -1,85 +0,0 @@
-
- Majuro
- Midway
- Honolulu
- Anchorage
- Los Angeles
- Tijuana
- Phoenix
- Chihuahua
- Denver
- Costa Rica
- Chicago
- Mexico City
- Regina
- Bogota
- New York
- Caracas
- Barbados
- Manaus
- Santiago
- St. John's
- Araguaina
- Buenos Aires
- Godthab
- Montevideo
- South Georgia
- Azores
- Cape Verde
- Casablanca
- London
- Amsterdam
- Belgrade
- Brussels
- Sarajevo
- Windhoek
- Brazzaville
- Amman
- Athens
- Beirut
- Cairo
- Helsinki
- Jerusalem
- Minsk
- Harare
- Baghdad
- Moscow
- Kuwait
- Nairobi
- Tehran
- Baku
- Tbilisi
- Yerevan
- Dubai
- Kabul
- Karachi
- Oral
- Yekaterinburg
- Calcutta
- Colombo
- Katmandu
- Almaty
- Rangoon
- Krasnoyarsk
- Bangkok
- Beijing
- Hong Kong
- Irkutsk
- Kuala Lumpur
- Perth
- Taipei
- Seoul
- Tokyo
- Yakutsk
- Adelaide
- Darwin
- Brisbane
- Hobart
- Sydney
- Vladivostok
- Guam
- Magadan
- Auckland
- Fiji
- Tongatapu
-
diff --git a/res/xml-pt/timezones.xml b/res/xml-pt/timezones.xml
index b77e30fd624..176d214353e 100644
--- a/res/xml-pt/timezones.xml
+++ b/res/xml-pt/timezones.xml
@@ -1,5 +1,5 @@
- Majuro
+ Horário das Ilhas Marshall (Majuro)MidwayHonoluluAnchorage
@@ -8,24 +8,24 @@
Horário da Montanha (Phoenix)ChihuahuaHorário da Montanha (Denver)
- Horário Padrão Central (Costa Rica)
- Horário Padrão Central (Chicago)
- Horário Padrão Central (Cidade do México)
- Horário Padrão Central (Regina)
- Bogotá
- Horário Padrão Oriental (Nova Iorque)
- Caracas
+ Horário Central (Costa Rica)
+ Horário Central (Chicago)
+ Horário Central (Cidade do México)
+ Horário Central (Regina)
+ Horário da Colômbia (Bogotá)
+ Horário Oriental (Nova York)
+ Horário da Venezuela (Caracas)Horário do Atlântico (Barbados)Horário do Amazonas (Manaus)
- Santiago
- Horário Padrão de Terra Nova (St. Johns)
- Araguaína
+ Horário do Chile (Santiago)
+ Horário de Terra Nova (St. Johns)
+ Horário de Brasília (Araguaína)Horário da Argentina (Buenos Aires)Horário da Groenlândia Ocidental (Godthab)
- Montevidéu
- Geórgia do Sul
+ Horário do Uruguai (Montevidéu)
+ Horário da Geórgia do Sul (Geórgia do Sul)Açores
- Cabo Verde
+ Horário do Cabo Verde (Cabo Verde)CasablancaHorário do Meridiano de Greenwich (Londres)Horário da Europa Central (Amsterdã)
@@ -39,46 +39,47 @@
Horário Padrão da Europa Oriental (Beirute)Horário Padrão da Europa Oriental (Cairo)Horário Padrão da Europa Oriental (Helsinque)
- Horário Padrão de Israel (Jerusalém)
+ Horário de Israel (Jerusalém)MinskHorário da África Central (Harare)
- Bagdá
+ Horário da Arábia (Bagdá)Moscou
- Kuwait
+ Horário da Arábia (Kuwait)Horário da África Oriental (Nairóbi)
- Teerã
+ Horário Padrão do Irã (Teerã)BakuTbilisiIerevan
- Dubai
- Cabul
+ Horário do Golfo (Dubai)
+ Horário do Afeganistão (Cabul)KarachiOral
- Yekaterinburg
+ EcaterimburgoHorário Padrão da Índia (Calcutta)Colombo
- Catmandu
+ Horário do Nepal (Catmandu)Almaty
- Rangoon
- Krasnoyarsk
- Bangkok
- Hong Kong
- Irkutsk
+ Horário de Mianmar (Rangoon)
+ Horário de Krasnoyarsk (Krasnoyarsk)
+ Horário da Indochina (Bangkok)
+ Horário da China (Beijing)
+ Horário de Hong Kong (Hong Kong)
+ Horário de Irkutsk (Irkutsk)Kuala Lumpur
- Perth
- Horário Padrão da China (Taipei)
- Seul
- Horário Padrão do Japão (Tóquio)
- Yakutsk
+ Horário da Austrália Ocidental (Perth)
+ Taipei
+ Horário da Coréia (Seul)
+ Horário do Japão (Tóquio)
+ Horário de Yakutsk (Yakutsk)Horário da Austrália Central (Adelaide)Horário da Austrália Central (Darwin)Horário da Austrália Oriental (Brisbane)Horário da Austrália Oriental (Hobart)Horário da Austrália Oriental (Sydney)
- Vladivostok
+ Horário de Vladivostok (Vladivostok)Guam
- Magadan
+ Horário de Magadan (Magadan)Horário da Nova Zelândia (Auckland)
- Fiji
- Tongatapu
+ Horário de Fiji (Fiji)
+ Horário de Tonga (Tongatapu)
diff --git a/res/xml-ro/timezones.xml b/res/xml-ro/timezones.xml
index c875ef73806..c87d0e0b6f3 100644
--- a/res/xml-ro/timezones.xml
+++ b/res/xml-ro/timezones.xml
@@ -3,49 +3,49 @@
MidwayHonoluluAnchorage
- Los Angeles
- Tijuana
- Phoenix
+ Ora zonei Pacific (Los Angeles)
+ Ora zonei Pacific (Tijuana)
+ Ora zonei montane (Phoenix)Chihuahua
- Denver
- Costa Rica
- Chicago
- Mexico City
- Regina
+ Ora zonei montane (Denver)
+ Ora Centrală (Costa Rica)
+ Ora Centrală (Chicago)
+ Ora Centrală (Mexico City)
+ Ora Centrală (Regina)Bogota
- New York
+ Ora orientală (New York)Caracas
- Barbados
- Manaus
+ Ora zonei Atlantic (Barbados)
+ Ora Amazon (Manaus)SantiagoSt. John'sAraguaina
- Buenos Aires
+ Ora Argentinei (Buenos Aires)GodthabMontevideoGeorgia de SudAzoreCapul VerdeCasablanca
- Londra
- Amsterdam
- Belgrade
- Bruxelles
- Sarajevo
+ Greenwich Mean Time (Londra)
+ Ora Europei Centrale (Amsterdam)
+ Ora Europei Centrale (Belgrade)
+ Ora Europei Centrale (Bruxelles)
+ Ora Europei Centrale (Sarajevo)Windhoek
- Brazzaville
- Amman
- Atena
- Beirut
- Cairo
- Helsinki
+ Ora Africii Occidentale (Brazzaville)
+ Ora Europei de Est (Amman)
+ Ora Europei de Est (Atena)
+ Ora Europei de Est (Beirut)
+ Ora Europei de Est (Cairo)
+ Ora Europei de Est (Helsinki)IerusalimMinsk
- Harare
+ Ora Africii Centrale (Harare)BagdadMoscovaKuweit
- Nairobi
+ Ora Africii Orientale (Nairobi)TeheranBakuTbilisi
@@ -60,21 +60,22 @@
KatmanduAlmatyRangoon
- Krasnoyarsk
+ KrasnoiarskBangkok
+ BeijingHong KongIrkuțkKuala Lumpur
- Perth
+ Ora Australiei Occidentale (Perth)TaipeiSeulTokyoYakuțk
- Adelaide
- Darwin
- Brisbane
- Hobart
- Sydney
+ Ora Australiei Centrale (Adelaide)
+ Ora Australiei Centrale (Darwin)
+ Ora Australiei Orientale (Brisbane)
+ Ora Australiei Orientale (Hobart)
+ Ora Australiei Orientale (Sydney)VladivostokGuamMagadan
diff --git a/res/xml-sk/timezones.xml b/res/xml-sk/timezones.xml
index bd00b105400..2f4254cf3ce 100644
--- a/res/xml-sk/timezones.xml
+++ b/res/xml-sk/timezones.xml
@@ -62,6 +62,7 @@
RangoonKrasnojarskoBangkok
+ PekingHongkongIrkutskoKuala Lumpur
diff --git a/res/xml-sr/timezones.xml b/res/xml-sr/timezones.xml
index 1b7517a27c6..51caf083138 100644
--- a/res/xml-sr/timezones.xml
+++ b/res/xml-sr/timezones.xml
@@ -1,84 +1,85 @@
- Мајуро
+ Маршалска Острва време (Мајуро)МидвејХонолулуЕнкориџ
- Лос Анђелес
- Тихуана
- Феникс
+ Пацифичко време (Лос Анђелес)
+ Пацифичко време (Тихуана)
+ Планинско време (Феникс)Чихуахуа
- Денвер
- Костарика
- Чикаго
- Мексико Сити
- Regina
- Богота
- Њујорк
- Каракас
- Барбадос
- Манаус
- Сантијаго
- Св. Џон
- Арагвајана
- Буенос Аирес
- Нук
- Монтевидео
- Јужна Џорџија
+ Планинско време (Денвер)
+ Централно време (Костарика)
+ Централно време (Чикаго)
+ Централно време (Мексико Сити)
+ Централно време (Регина)
+ Колумбија време (Богота)
+ Источно време (Њујорк)
+ Венецуела време (Каракас)
+ Атланско време (Барбадос)
+ Амазон време (Манаус)
+ Чиле време (Сантијаго)
+ Њуфаундленд време (Св. Џон)
+ Бразилија време (Арагвајана)
+ Аргентина време (Буенос Аирес)
+ Западни Гренланд време (Нук)
+ Уругвај време (Монтевидео)
+ Јужна Џорџија време (Јужна Џорџија)Азори
- Капе Верде
+ Зелениртско време (Капе Верде)Казабланка
- Лондон
+ Гринвич средње време (Лондон)Средњеевропско време (Амстердам)Средњеевропско време (Belgrade)Средњеевропско време (Брисел)Средњеевропско време (Sarajevo)Виндхук
- Бразавил
+ Западно-афричко време (Бразавил)Источноевропско време (Аман)Источноевропско време (Атина)Источноевропско време (Бејрут)Источноевропско време (Каиро)Источноевропско време (Хелсинки)
- Jerusalem
+ Израелско стандардно време (Jerusalem)Минск
- Хараре
- Багдад
+ Централно-афричко време (Хараре)
+ Арабијско време (Багдад)Москва
- Кувајт
- Најроби
- Техеран
+ Арабијско време (Кувајт)
+ Источно-афричко време (Најроби)
+ Иран стандардно време (Техеран)БакуТбилисиЈереван
- Дубаи
+ Залив време (Дубаи)КабулКарачиОралЈекатеринбург
- Calcutta
+ Индијско стандардно време (Calcutta)Коломбо
- Катманду
- Almaty
- Рангун
- Краснојарск
- Банкок
- Хонг Конг
- Иркуцк
+ Непал време (Катманду)
+ Алмати
+ Мијанмар време (Рангун)
+ Краснојарск време (Краснојарск)
+ Индокина време (Банкок)
+ Кина време (Пекинг)
+ Хонг Конг време (Хонг Конг)
+ Иркуцк време (Иркуцк)Куала Лумпур
- Перт
+ Аустралијско западно време (Перт)Тајпеј
- Сеул
- Токио
- Јакутск
- Аделајд
- Дарвин
- Бризбејн
- Хобарт
- Сиднеј
- Владивосток
+ Кореја време (Сеул)
+ Јапанско стандардно време (Токио)
+ Јакутск време (Јакутск)
+ Аустралијско централно време (Аделаида)
+ Аустралијско централно време (Дарвин)
+ Аустралијско источно време (Бризбејн)
+ Аустралијско источно време (Хобарт)
+ Аустралијско источно време (Сиднеј)
+ Владивосток време (Владивосток)Гуам
- Магадан
- Окланд
- Фиџи
- Тонгатапу
+ Магадан време (Магадан)
+ Нови Зеланд време (Окланд)
+ Фиџи време (Фиџи)
+ Тонга време (Тонгатапу)
diff --git a/res/xml-sv/timezones.xml b/res/xml-sv/timezones.xml
index aaed8282579..ecf99215b03 100644
--- a/res/xml-sv/timezones.xml
+++ b/res/xml-sv/timezones.xml
@@ -18,7 +18,7 @@
Atlantic, normaltid (Barbados)Amazonastid (Manaus)Chilensk tid (Santiago)
- Newfoundland, normaltid (S:t Johns)
+ Newfoundland, normaltid (St. Johns)Brasiliansk tid (Araguaina)östargentinsk tid (Buenos Aires)Godthåb
@@ -62,11 +62,12 @@
RangoonKrasnojarskBangkok
+ Kinesisk tid (Peking)HongkongIrkutskKuala LumpurVästaustralisk tid (Perth)
- Kinesisk tid (Taipei)
+ TaipeiSöulJapan, normaltid (Tokyo)Jakutsk
diff --git a/res/xml-th/timezones.xml b/res/xml-th/timezones.xml
index d90c4991d84..f2fdabc387e 100644
--- a/res/xml-th/timezones.xml
+++ b/res/xml-th/timezones.xml
@@ -3,14 +3,14 @@
มิดเวย์โฮโนลูลูแองเคอเรจ
- ลอสแอนเจลิส
+ ลอสแองเจลิสทิฮัวนาฟีนิกซ์ชีวาวาเดนเวอร์คอสตาริกาชิคาโก
- เม็กซิโกซิตี้
+ เม็กซิโกซิตีริไจนาโบโกตานิวยอร์ก
@@ -24,7 +24,7 @@
กอดแธบมอนเตวิเดโอเซาท์ จอร์เจีย
- อาโซเรช
+ อาซอเรสเคปเวิร์ดคาสซาบลางก้าลอนดอน
@@ -53,15 +53,16 @@
ดูใบคาบูลการาจี
- โอรัล
- เยคาเตรินบูร์ก
+ ออรัล
+ ยีคาเตอรินเบิร์กCalcuttaโคลัมโบกาตมันดุอัลมาตีย่างกุ้ง
- ครัสโนยาสค์
+ ครัสโนยาร์สก์กรุงเทพ
+ Beijingฮ่องกงอีร์คุตสค์กัวลาลัมเปอร์
@@ -75,7 +76,7 @@
บริสเบนโฮบาร์ตซิดนีย์
- วลาดีวอสตอค
+ วลาดิโวสต็อกกวมมากาดานโอคแลนด์
diff --git a/res/xml-tr/timezones.xml b/res/xml-tr/timezones.xml
index 31f5d4668d0..18a341ed660 100644
--- a/res/xml-tr/timezones.xml
+++ b/res/xml-tr/timezones.xml
@@ -9,7 +9,7 @@
ChihuahuaABD Sıradağlar Saati (Denver)Merkezi Saat (Kosta Rika)
- Merkezi Saat (Şikago)
+ Merkezi Saat (Chicago)Merkezi Saat (Meksiko City)Merkezi Saat (Regina)Kolombiya Saati (Bogota)
@@ -42,9 +42,9 @@
İsrail Saati (Kudüs)MinskOrta Afrika Saati (Harare)
- Arap Saati (Bağdat)
+ Arabistan Saati (Bağdat)Moskova
- Arap Saati (Kuveyt)
+ Arabistan Saati (Kuveyt)Doğu Afrika Saati (Nairobi)İran Standart Saati (Tahran)Bakü
@@ -62,11 +62,12 @@
Myanmar Saati (Rangoon)Krasnoyarsk Saati (Krasnoyarsk)Çinhindi Saati (Bangkok)
+ Çin Saati (Pekin)Hong Kong Saati (Hong Kong)
- Irkutsk Saati (İrkutsk)
+ İrkutsk Saati (İrkutsk)Kuala LumpurBatı Avustralya Saati (Perth)
- Çin Saati (Taipei)
+ TaipeiKore Saati (Seul)Japonya Saati (Tokyo)Yakutsk Saati (Yakutsk)
diff --git a/res/xml-uk/timezones.xml b/res/xml-uk/timezones.xml
index 55192ef13ca..2337570b4bb 100644
--- a/res/xml-uk/timezones.xml
+++ b/res/xml-uk/timezones.xml
@@ -62,6 +62,7 @@
РангунКрасноярськБангкок
+ ПекінГонконгІркутськКуала-Лумпур
diff --git a/res/xml-zh/timezones.xml b/res/xml-zh/timezones.xml
index 7f852aa979d..1129e7c33b3 100644
--- a/res/xml-zh/timezones.xml
+++ b/res/xml-zh/timezones.xml
@@ -3,26 +3,26 @@
中途岛檀香山安克雷奇
- 太平洋标准时间 (洛杉矶)
- 太平洋标准时间 (提华纳)
- 山区标准时间 (凤凰城)
+ 美国太平洋时间 (洛杉矶)
+ 美国太平洋时间 (提华纳)
+ 美国山区时间 (凤凰城)奇瓦瓦
- 山区标准时间 (丹佛)
- 中部标准时间 (哥斯达黎加)
- 中部标准时间 (芝加哥)
- 中部标准时间 (墨西哥城)
- 中部标准时间 (里贾纳)
- 波哥大
- 东部标准时间 (纽约)
- 加拉加斯
- 大西洋标准时间 (巴巴多斯)
- 亚马逊时间 (马瑙斯)
+ 美国山区时间 (丹佛)
+ 美国中部时间 (哥斯达黎加)
+ 美国中部时间 (芝加哥)
+ 美国中部时间 (墨西哥城)
+ 美国中部时间 (里贾纳)
+ 哥伦比亚时间 (波哥大)
+ 美国东部时间 (纽约)
+ 委内瑞拉时间 (加拉加斯)
+ 大西洋时间 (巴巴多斯)
+ 亚马逊标准时间 (马瑙斯)圣地亚哥
- 纽芬兰标准时间 (圣约翰)
+ 纽芬兰时间 (圣约翰)阿拉瓜伊纳布宜诺斯艾利斯戈特霍布
- 蒙得维的亚
+ 乌拉圭时间 (蒙得维的亚)南乔治亚亚述尔群岛佛得角
@@ -33,52 +33,52 @@
中欧标准时间 (布鲁塞尔)中欧标准时间 (萨拉热窝)温得和克
- 西部非洲时间 (布拉扎维)
+ 西部非洲标准时间 (布拉扎维)东欧标准时间 (安曼)东欧标准时间 (雅典)东欧标准时间 (贝鲁特)东欧标准时间 (开罗)东欧标准时间 (赫尔辛基)
- 以色列标准时间 (耶路撒冷)
+ 以色列时间 (耶路撒冷)明斯克
- 非洲中部时间 (哈拉雷)
+ 中部非洲标准时间 (哈拉雷)巴格达莫斯科科威特
- 非洲东部时间 (内罗毕)
- 德黑兰
+ 东部非洲标准时间 (内罗毕)
+ 伊朗标准时间 (德黑兰)巴库第比利斯埃里温迪拜
- 喀布尔
+ 阿富汗时间 (喀布尔)卡拉奇乌拉尔叶卡捷林堡加尔各答科伦坡
- 加德满都
+ 尼泊尔时间 (加德满都)阿拉木图
- 仰光
+ 缅甸时间 (仰光)克拉斯诺亚尔斯克曼谷中国标准时间 (北京)
- 香港
- 伊尔库茨克
+ 香港时间 (香港)
+ 伊尔库茨克时间 (伊尔库茨克)吉隆坡佩思
- 台北
+ 台北时间 (台北)首尔
- 日本标准时间 (东京)
- 雅库茨克
+ 日本时间 (东京)
+ 雅库茨克时间 (雅库茨克)阿德莱德达尔文布里斯班霍巴特悉尼
- 符拉迪沃斯托克
+ 海参崴时间 (符拉迪沃斯托克)关岛
- 马加丹
+ 马加丹时间 (马加丹)奥克兰斐济东加塔布
diff --git a/res/xml/apn_editor.xml b/res/xml/apn_editor.xml
index e9ded6ca002..3835a2c0674 100644
--- a/res/xml/apn_editor.xml
+++ b/res/xml/apn_editor.xml
@@ -101,10 +101,17 @@
android:singleLine="true"
android:inputType="number"
/>
+
diff --git a/res/xml/application_settings.xml b/res/xml/application_settings.xml
index 8d0a7cb5153..b5418e810de 100644
--- a/res/xml/application_settings.xml
+++ b/res/xml/application_settings.xml
@@ -43,6 +43,14 @@
android:targetClass="com.android.settings.ManageApplications" />
+
+
+
+
diff --git a/res/xml/device_info_memory.xml b/res/xml/device_info_memory.xml
index b7ec3c13a59..febd00f795d 100644
--- a/res/xml/device_info_memory.xml
+++ b/res/xml/device_info_memory.xml
@@ -38,13 +38,6 @@
style="?android:attr/preferenceInformationStyle"
android:title="@string/memory_available"
android:summary="00"/>
-
-
-
diff --git a/res/xml/device_info_settings.xml b/res/xml/device_info_settings.xml
index 56810b47c4f..860c2ea012b 100644
--- a/res/xml/device_info_settings.xml
+++ b/res/xml/device_info_settings.xml
@@ -75,6 +75,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 86893bd616b..47eb79550e8 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -15,8 +15,7 @@
-->
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/security_settings.xml b/res/xml/security_settings.xml
index 8dd9d897b38..1b735848b9c 100644
--- a/res/xml/security_settings.xml
+++ b/res/xml/security_settings.xml
@@ -32,11 +32,14 @@
android:summaryOn="@string/location_street_level"
android:summaryOff="@string/location_gps_disabled"/>
+
diff --git a/res/xml/settings.xml b/res/xml/settings.xml
index 9ca581ae019..79a777dc2d5 100644
--- a/res/xml/settings.xml
+++ b/res/xml/settings.xml
@@ -16,104 +16,96 @@
-
-
+ settings:icon="@drawable/ic_settings_wireless">
-
+
-
+ settings:icon="@drawable/ic_settings_call"
+ android:title="@string/call_settings_title">
-
+
-
-
+
+
-
+
-
-
-
-
-
+
-
-
-
+ android:key="security_settings">
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
+
+
+
+
+
+
+
-
-
+
+
-
+
diff --git a/res/xml/sound_and_display_settings.xml b/res/xml/sound_and_display_settings.xml
index 639204a8aa5..8544fee740c 100644
--- a/res/xml/sound_and_display_settings.xml
+++ b/res/xml/sound_and_display_settings.xml
@@ -84,6 +84,14 @@
android:dependency="silent"
android:defaultValue="true" />
+
+
-
+
+
+
+
+
+
+
+
+
+
diff --git a/res/xml/wifi_settings.xml b/res/xml/wifi_settings.xml
index 9101e46e5f7..8a766746834 100644
--- a/res/xml/wifi_settings.xml
+++ b/res/xml/wifi_settings.xml
@@ -33,7 +33,7 @@
-
+
diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
index 4731fb3f8fd..1bb55ef4b0f 100644
--- a/res/xml/wireless_settings.xml
+++ b/res/xml/wireless_settings.xml
@@ -14,70 +14,68 @@
limitations under the License.
-->
-
+
-
-
+
-
-
-
+
+
-
+
+
+
-
-
-
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 54e3f14af39..6199e50928e 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -130,7 +130,11 @@ public class AccessibilitySettings extends PreferenceActivity {
int count = mAccessibilityServicesCategory.getPreferenceCount();
for (int i = 0; i < count; i++) {
- mAccessibilityServicesCategory.getPreference(i).setEnabled(isEnabled);
+ Preference pref = mAccessibilityServicesCategory.getPreference(i);
+ pref.setEnabled(isEnabled);
+ if (!isEnabled){
+ ((CheckBoxPreference) pref).setChecked(false);
+ }
}
}
diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java
index f105712260f..ff4b27dcc98 100644
--- a/src/com/android/settings/AirplaneModeEnabler.java
+++ b/src/com/android/settings/AirplaneModeEnabler.java
@@ -22,11 +22,14 @@ import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
+import android.os.SystemProperties;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.provider.Settings;
import android.telephony.ServiceState;
+import com.android.internal.telephony.TelephonyProperties;
+
public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener {
private final Context mContext;
@@ -74,7 +77,7 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene
mCheckBoxPref.setOnPreferenceChangeListener(null);
}
- static boolean isAirplaneModeOn(Context context) {
+ public static boolean isAirplaneModeOn(Context context) {
return Settings.System.getInt(context.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
@@ -111,8 +114,23 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene
* Called when someone clicks on the checkbox preference.
*/
public boolean onPreferenceChange(Preference preference, Object newValue) {
- setAirplaneModeOn((Boolean) newValue);
+ if (Boolean.parseBoolean(
+ SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) {
+ // In ECM mode, do not update database at this point
+ } else {
+ setAirplaneModeOn((Boolean) newValue);
+ }
return true;
}
+ public void setAirplaneModeInECM(boolean isECMExit, boolean isAirplaneModeOn) {
+ if (isECMExit) {
+ // update database based on the current checkbox state
+ setAirplaneModeOn(isAirplaneModeOn);
+ } else {
+ // update checkbox state based on database value
+ onAirplaneModeChanged();
+ }
+ }
+
}
diff --git a/src/com/android/settings/ApnEditor.java b/src/com/android/settings/ApnEditor.java
index 0bd91a825de..62856d119e7 100644
--- a/src/com/android/settings/ApnEditor.java
+++ b/src/com/android/settings/ApnEditor.java
@@ -27,28 +27,31 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.SystemProperties;
import android.preference.EditTextPreference;
+import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.provider.Telephony;
-import com.android.internal.telephony.TelephonyProperties;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
+import com.android.internal.telephony.TelephonyProperties;
-public class ApnEditor extends PreferenceActivity
- implements SharedPreferences.OnSharedPreferenceChangeListener {
-
+
+public class ApnEditor extends PreferenceActivity
+ implements SharedPreferences.OnSharedPreferenceChangeListener,
+ Preference.OnPreferenceChangeListener {
private final static String TAG = ApnEditor.class.getSimpleName();
-
+
private final static String SAVED_POS = "pos";
-
+ private final static String KEY_AUTH_TYPE = "auth_type";
+
private static final int MENU_DELETE = Menu.FIRST;
private static final int MENU_SAVE = Menu.FIRST + 1;
private static final int MENU_CANCEL = Menu.FIRST + 2;
-
+
private static String sNotSet;
private EditTextPreference mName;
private EditTextPreference mApn;
@@ -62,16 +65,18 @@ public class ApnEditor extends PreferenceActivity
private EditTextPreference mMnc;
private EditTextPreference mMmsProxy;
private EditTextPreference mMmsPort;
+ private ListPreference mAuthType;
private EditTextPreference mApnType;
+
private String mCurMnc;
private String mCurMcc;
-
+
private Uri mUri;
private Cursor mCursor;
private boolean mNewApn;
private boolean mFirstTime;
private Resources mRes;
-
+
/**
* Standard projection for the interesting columns of a normal note.
*/
@@ -90,9 +95,10 @@ public class ApnEditor extends PreferenceActivity
Telephony.Carriers.NUMERIC, // 11
Telephony.Carriers.MMSPROXY,// 12
Telephony.Carriers.MMSPORT, // 13
- Telephony.Carriers.TYPE, // 14
+ Telephony.Carriers.AUTH_TYPE, // 14
+ Telephony.Carriers.TYPE, // 15
};
-
+
private static final int ID_INDEX = 0;
private static final int NAME_INDEX = 1;
private static final int APN_INDEX = 2;
@@ -106,8 +112,10 @@ public class ApnEditor extends PreferenceActivity
private static final int MNC_INDEX = 10;
private static final int MMSPROXY_INDEX = 12;
private static final int MMSPORT_INDEX = 13;
- private static final int TYPE_INDEX = 14;
-
+ private static final int AUTH_TYPE_INDEX = 14;
+ private static final int TYPE_INDEX = 15;
+
+
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -128,21 +136,24 @@ public class ApnEditor extends PreferenceActivity
mMcc = (EditTextPreference) findPreference("apn_mcc");
mMnc = (EditTextPreference) findPreference("apn_mnc");
mApnType = (EditTextPreference) findPreference("apn_type");
-
+
+ mAuthType = (ListPreference) findPreference("auth_type");
+ mAuthType.setOnPreferenceChangeListener(this);
+
mRes = getResources();
-
+
final Intent intent = getIntent();
final String action = intent.getAction();
mFirstTime = icicle == null;
-
+
if (action.equals(Intent.ACTION_EDIT)) {
mUri = intent.getData();
} else if (action.equals(Intent.ACTION_INSERT)) {
- if (mFirstTime) {
+ if (mFirstTime || icicle.getInt(SAVED_POS) == 0) {
mUri = getContentResolver().insert(intent.getData(), new ContentValues());
} else {
- mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI,
+ mUri = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI,
icicle.getInt(SAVED_POS));
}
mNewApn = true;
@@ -155,7 +166,7 @@ public class ApnEditor extends PreferenceActivity
finish();
return;
}
-
+
// The new entry was created, so assume all will end well and
// set the result to be returned.
setResult(RESULT_OK, (new Intent()).setAction(mUri.toString()));
@@ -167,24 +178,26 @@ public class ApnEditor extends PreferenceActivity
mCursor = managedQuery(mUri, sProjection, null, null);
mCursor.moveToFirst();
-
+
fillUi();
}
@Override
public void onResume() {
super.onResume();
- getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ getPreferenceScreen().getSharedPreferences()
+ .registerOnSharedPreferenceChangeListener(this);
}
-
+
@Override
public void onPause() {
- getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
- super.onPause();
+ getPreferenceScreen().getSharedPreferences()
+ .unregisterOnSharedPreferenceChangeListener(this);
+ super.onPause();
}
-
+
private void fillUi() {
- if (mFirstTime) {
+ if (mFirstTime) {
mFirstTime = false;
// Fill in all the values from the db in both text editor and summary
mName.setText(mCursor.getString(NAME_INDEX));
@@ -201,7 +214,7 @@ public class ApnEditor extends PreferenceActivity
mMnc.setText(mCursor.getString(MNC_INDEX));
mApnType.setText(mCursor.getString(TYPE_INDEX));
if (mNewApn) {
- String numeric =
+ String numeric =
SystemProperties.get(TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC);
// MCC is first 3 chars and then in 2 - 3 chars of MNC
if (numeric != null && numeric.length() > 4) {
@@ -216,8 +229,13 @@ public class ApnEditor extends PreferenceActivity
mCurMcc = mcc;
}
}
+ int authVal = mCursor.getInt(AUTH_TYPE_INDEX);
+ if (authVal != -1) {
+ mAuthType.setValueIndex(authVal);
+ }
+
}
-
+
mName.setSummary(checkNull(mName.getText()));
mApn.setSummary(checkNull(mApn.getText()));
mProxy.setSummary(checkNull(mProxy.getText()));
@@ -231,6 +249,33 @@ public class ApnEditor extends PreferenceActivity
mMcc.setSummary(checkNull(mMcc.getText()));
mMnc.setSummary(checkNull(mMnc.getText()));
mApnType.setSummary(checkNull(mApnType.getText()));
+
+ String authVal = mAuthType.getValue();
+ if (authVal != null) {
+ int authValIndex = Integer.parseInt(authVal);
+ mAuthType.setValueIndex(authValIndex);
+
+ String []values = mRes.getStringArray(R.array.apn_auth_entries);
+ mAuthType.setSummary(values[authValIndex]);
+ } else {
+ mAuthType.setSummary(sNotSet);
+ }
+ }
+
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ String key = preference.getKey();
+ if (KEY_AUTH_TYPE.equals(key)) {
+ try {
+ int index = Integer.parseInt((String) newValue);
+ mAuthType.setValueIndex(index);
+
+ String []values = mRes.getStringArray(R.array.apn_auth_entries);
+ mAuthType.setSummary(values[index]);
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ }
+ return true;
}
@Override
@@ -268,7 +313,7 @@ public class ApnEditor extends PreferenceActivity
}
return super.onOptionsItemSelected(item);
}
-
+
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
@@ -285,10 +330,11 @@ public class ApnEditor extends PreferenceActivity
@Override
protected void onSaveInstanceState(Bundle icicle) {
super.onSaveInstanceState(icicle);
- validateAndSave(true);
- icicle.putInt(SAVED_POS, mCursor.getInt(ID_INDEX));
+ if (validateAndSave(true)) {
+ icicle.putInt(SAVED_POS, mCursor.getInt(ID_INDEX));
+ }
}
-
+
/**
* Check the key fields' validity and save if valid.
* @param force save even if the fields are not valid, if the app is
@@ -300,7 +346,7 @@ public class ApnEditor extends PreferenceActivity
String apn = checkNotSet(mApn.getText());
String mcc = checkNotSet(mMcc.getText());
String mnc = checkNotSet(mMnc.getText());
-
+
String errorMsg = null;
if (name.length() < 1) {
errorMsg = mRes.getString(R.string.error_name_empty);
@@ -311,21 +357,30 @@ public class ApnEditor extends PreferenceActivity
} else if ((mnc.length() & 0xFFFE) != 2) {
errorMsg = mRes.getString(R.string.error_mnc_not23);
}
-
+
if (errorMsg != null && !force) {
showErrorMessage(errorMsg);
return false;
}
-
+
if (!mCursor.moveToFirst()) {
Log.w(TAG,
"Could not go to the first row in the Cursor when saving data.");
return false;
}
-
+
+ // If it's a new APN and a name or apn haven't been entered, then erase the entry
+ if (force && mNewApn && name.length() < 1 && apn.length() < 1) {
+ getContentResolver().delete(mUri, null, null);
+ return false;
+ }
+
ContentValues values = new ContentValues();
-
- values.put(Telephony.Carriers.NAME, name);
+
+ // Add a dummy name "Untitled", if the user exits the screen without adding a name but
+ // entered other information worth keeping.
+ values.put(Telephony.Carriers.NAME,
+ name.length() < 1 ? getResources().getString(R.string.untitled_apn) : name);
values.put(Telephony.Carriers.APN, apn);
values.put(Telephony.Carriers.PROXY, checkNotSet(mProxy.getText()));
values.put(Telephony.Carriers.PORT, checkNotSet(mPort.getText()));
@@ -334,22 +389,28 @@ public class ApnEditor extends PreferenceActivity
values.put(Telephony.Carriers.USER, checkNotSet(mUser.getText()));
values.put(Telephony.Carriers.SERVER, checkNotSet(mServer.getText()));
values.put(Telephony.Carriers.PASSWORD, checkNotSet(mPassword.getText()));
- values.put(Telephony.Carriers.MMSC, checkNotSet(mMmsc.getText()));
+ values.put(Telephony.Carriers.MMSC, checkNotSet(mMmsc.getText()));
+
+ String authVal = mAuthType.getValue();
+ if (authVal != null) {
+ values.put(Telephony.Carriers.AUTH_TYPE, Integer.parseInt(authVal));
+ }
+
values.put(Telephony.Carriers.TYPE, checkNotSet(mApnType.getText()));
values.put(Telephony.Carriers.MCC, mcc);
values.put(Telephony.Carriers.MNC, mnc);
-
+
values.put(Telephony.Carriers.NUMERIC, mcc + mnc);
-
+
if (mCurMnc != null && mCurMcc != null) {
if (mCurMnc.equals(mnc) && mCurMcc.equals(mcc)) {
values.put(Telephony.Carriers.CURRENT, 1);
}
}
-
+
getContentResolver().update(mUri, values, null, null);
-
+
return true;
}
@@ -365,7 +426,7 @@ public class ApnEditor extends PreferenceActivity
getContentResolver().delete(mUri, null, null);
finish();
}
-
+
private String starify(String value) {
if (value == null || value.length() == 0) {
return sNotSet;
@@ -377,7 +438,7 @@ public class ApnEditor extends PreferenceActivity
return new String(password);
}
}
-
+
private String checkNull(String value) {
if (value == null || value.length() == 0) {
return sNotSet;
@@ -385,7 +446,7 @@ public class ApnEditor extends PreferenceActivity
return value;
}
}
-
+
private String checkNotSet(String value) {
if (value == null || value.equals(sNotSet)) {
return "";
@@ -393,7 +454,7 @@ public class ApnEditor extends PreferenceActivity
return value;
}
}
-
+
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);
if (pref != null) {
diff --git a/src/com/android/settings/ApnPreference.java b/src/com/android/settings/ApnPreference.java
index 74fb90216e2..710eda23c4d 100644
--- a/src/com/android/settings/ApnPreference.java
+++ b/src/com/android/settings/ApnPreference.java
@@ -107,7 +107,7 @@ public class ApnPreference extends Preference implements
return getKey().equals(mSelectedKey);
}
- public void setChecked(boolean checked) {
+ public void setChecked() {
mSelectedKey = getKey();
}
diff --git a/src/com/android/settings/ApnSettings.java b/src/com/android/settings/ApnSettings.java
index 2624990ca0c..00ef3a79695 100644
--- a/src/com/android/settings/ApnSettings.java
+++ b/src/com/android/settings/ApnSettings.java
@@ -178,7 +178,7 @@ public class ApnSettings extends PreferenceActivity implements
pref.setSelectable(selectable);
if (selectable) {
if ((mSelectedKey != null) && mSelectedKey.equals(key)) {
- pref.setChecked(true);
+ pref.setChecked();
}
apnList.addPreference(pref);
} else {
diff --git a/src/com/android/settings/BandMode.java b/src/com/android/settings/BandMode.java
index 1297cad5d6d..a8c78333bdb 100644
--- a/src/com/android/settings/BandMode.java
+++ b/src/com/android/settings/BandMode.java
@@ -97,7 +97,7 @@ public class BandMode extends Activity {
}
};
- private class BandListItem {
+ static private class BandListItem {
private int mBandMode = Phone.BM_UNSPECIFIED;
public BandListItem(int bm) {
diff --git a/src/com/android/settings/BatteryInfo.java b/src/com/android/settings/BatteryInfo.java
index eb7ddb49f1b..1cbe47f988a 100644
--- a/src/com/android/settings/BatteryInfo.java
+++ b/src/com/android/settings/BatteryInfo.java
@@ -36,6 +36,7 @@ import com.android.internal.app.IBatteryStats;
public class BatteryInfo extends Activity {
private TextView mStatus;
+ private TextView mPower;
private TextView mLevel;
private TextView mScale;
private TextView mHealth;
@@ -67,7 +68,7 @@ public class BatteryInfo extends Activity {
*/
private final String tenthsToFixedString(int x) {
int tens = x / 10;
- return new String("" + tens + "." + (x - 10*tens));
+ return Integer.toString(tens) + "." + (x - 10 * tens);
}
/**
@@ -111,6 +112,24 @@ public class BatteryInfo extends Activity {
}
mStatus.setText(statusString);
+ switch (plugType) {
+ case 0:
+ mPower.setText(getString(R.string.battery_info_power_unplugged));
+ break;
+ case BatteryManager.BATTERY_PLUGGED_AC:
+ mPower.setText(getString(R.string.battery_info_power_ac));
+ break;
+ case BatteryManager.BATTERY_PLUGGED_USB:
+ mPower.setText(getString(R.string.battery_info_power_usb));
+ break;
+ case (BatteryManager.BATTERY_PLUGGED_AC|BatteryManager.BATTERY_PLUGGED_USB):
+ mPower.setText(getString(R.string.battery_info_power_ac_usb));
+ break;
+ default:
+ mPower.setText(getString(R.string.battery_info_power_unknown));
+ break;
+ }
+
int health = intent.getIntExtra("health", BatteryManager.BATTERY_HEALTH_UNKNOWN);
String healthString;
if (health == BatteryManager.BATTERY_HEALTH_GOOD) {
@@ -148,6 +167,7 @@ public class BatteryInfo extends Activity {
super.onResume();
mStatus = (TextView)findViewById(R.id.status);
+ mPower = (TextView)findViewById(R.id.power);
mLevel = (TextView)findViewById(R.id.level);
mScale = (TextView)findViewById(R.id.scale);
mHealth = (TextView)findViewById(R.id.health);
diff --git a/src/com/android/settings/BrightnessPreference.java b/src/com/android/settings/BrightnessPreference.java
index 9f554632631..fe3b99763b9 100644
--- a/src/com/android/settings/BrightnessPreference.java
+++ b/src/com/android/settings/BrightnessPreference.java
@@ -18,7 +18,7 @@ package com.android.settings;
import android.content.Context;
import android.os.RemoteException;
-import android.os.IHardwareService;
+import android.os.IPowerManager;
import android.os.ServiceManager;
import android.preference.SeekBarPreference;
import android.provider.Settings;
@@ -26,16 +26,22 @@ import android.provider.Settings.SettingNotFoundException;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
import android.widget.SeekBar;
import java.util.Map;
public class BrightnessPreference extends SeekBarPreference implements
- SeekBar.OnSeekBarChangeListener {
+ SeekBar.OnSeekBarChangeListener, CheckBox.OnCheckedChangeListener {
private SeekBar mSeekBar;
+ private CheckBox mCheckBox;
private int mOldBrightness;
+ private int mOldAutomatic;
+
+ private boolean mAutomaticAvailable;
// Backlight range is from 0 - 255. Need to make sure that user
// doesn't set the backlight to 0 and get stuck
@@ -44,6 +50,11 @@ public class BrightnessPreference extends SeekBarPreference implements
public BrightnessPreference(Context context, AttributeSet attrs) {
super(context, attrs);
+
+ mAutomaticAvailable = context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available);
+
+ setDialogLayoutResource(R.layout.preference_dialog_brightness);
}
@Override
@@ -51,7 +62,6 @@ public class BrightnessPreference extends SeekBarPreference implements
super.onBindDialogView(view);
mSeekBar = getSeekBar(view);
- mSeekBar.setOnSeekBarChangeListener(this);
mSeekBar.setMax(MAXIMUM_BACKLIGHT - MINIMUM_BACKLIGHT);
try {
mOldBrightness = Settings.System.getInt(getContext().getContentResolver(),
@@ -60,6 +70,21 @@ public class BrightnessPreference extends SeekBarPreference implements
mOldBrightness = MAXIMUM_BACKLIGHT;
}
mSeekBar.setProgress(mOldBrightness - MINIMUM_BACKLIGHT);
+
+ mCheckBox = (CheckBox)view.findViewById(R.id.automatic_mode);
+ if (mAutomaticAvailable) {
+ mCheckBox.setOnCheckedChangeListener(this);
+ try {
+ mOldAutomatic = Settings.System.getInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE);
+ } catch (SettingNotFoundException snfe) {
+ mOldAutomatic = 0;
+ }
+ mCheckBox.setChecked(mOldAutomatic != 0);
+ } else {
+ mCheckBox.setVisibility(View.GONE);
+ }
+ mSeekBar.setOnSeekBarChangeListener(this);
}
public void onProgressChanged(SeekBar seekBar, int progress,
@@ -75,6 +100,14 @@ public class BrightnessPreference extends SeekBarPreference implements
// NA
}
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ setMode(isChecked ? Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC
+ : Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ if (!isChecked) {
+ setBrightness(mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
+ }
+ }
+
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
@@ -84,20 +117,35 @@ public class BrightnessPreference extends SeekBarPreference implements
Settings.System.SCREEN_BRIGHTNESS,
mSeekBar.getProgress() + MINIMUM_BACKLIGHT);
} else {
- setBrightness(mOldBrightness);
+ if (mAutomaticAvailable) {
+ setMode(mOldAutomatic);
+ }
+ if (!mAutomaticAvailable || mOldAutomatic == 0) {
+ setBrightness(mOldBrightness);
+ }
}
}
private void setBrightness(int brightness) {
try {
- IHardwareService hardware = IHardwareService.Stub.asInterface(
- ServiceManager.getService("hardware"));
- if (hardware != null) {
- hardware.setBacklights(brightness);
+ IPowerManager power = IPowerManager.Stub.asInterface(
+ ServiceManager.getService("power"));
+ if (power != null) {
+ power.setBacklightBrightness(brightness);
}
} catch (RemoteException doe) {
}
}
+
+ private void setMode(int mode) {
+ if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
+ mSeekBar.setVisibility(View.GONE);
+ } else {
+ mSeekBar.setVisibility(View.VISIBLE);
+ }
+ Settings.System.putInt(getContext().getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE, mode);
+ }
}
diff --git a/src/com/android/settings/ChooseLockPattern.java b/src/com/android/settings/ChooseLockPattern.java
index d0c375844ae..f103c6b5927 100644
--- a/src/com/android/settings/ChooseLockPattern.java
+++ b/src/com/android/settings/ChooseLockPattern.java
@@ -21,6 +21,7 @@ import com.google.android.collect.Lists;
import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
+import com.android.internal.widget.LockPatternView.Cell;
import static com.android.internal.widget.LockPatternView.DisplayMode;
import android.app.Activity;
@@ -124,6 +125,10 @@ public class ChooseLockPattern extends Activity implements View.OnClickListener{
}
}
+ public void onPatternCellAdded(List pattern) {
+
+ }
+
private void patternInProgress() {
mHeaderText.setText(R.string.lockpattern_recording_inprogress);
mFooterText.setText("");
diff --git a/src/com/android/settings/ConfirmLockPattern.java b/src/com/android/settings/ConfirmLockPattern.java
index 44baccc6504..a91b45fd56d 100644
--- a/src/com/android/settings/ConfirmLockPattern.java
+++ b/src/com/android/settings/ConfirmLockPattern.java
@@ -19,6 +19,7 @@ package com.android.settings;
import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockPatternView;
import com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient;
+import com.android.internal.widget.LockPatternView.Cell;
import android.app.Activity;
import android.content.Intent;
@@ -216,6 +217,10 @@ public class ConfirmLockPattern extends Activity {
mLockPatternView.removeCallbacks(mClearPatternRunnable);
}
+ public void onPatternCellAdded(List pattern) {
+
+ }
+
public void onPatternDetected(List pattern) {
if (mLockPatternUtils.checkPattern(pattern)) {
setResult(RESULT_OK);
diff --git a/src/com/android/settings/CredentialInstaller.java b/src/com/android/settings/CredentialInstaller.java
new file mode 100644
index 00000000000..5a457d7e65a
--- /dev/null
+++ b/src/com/android/settings/CredentialInstaller.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.security.Credentials;
+import android.security.KeyStore;
+import android.util.Log;
+
+/**
+ * Installs credentials to the system keystore. It reacts to the
+ * {@link Credentials#SYSTEM_INSTALL_ACTION} intent. All the key-value pairs in
+ * the intent are installed to the system keystore. For security reason, the
+ * current implementation limits that only com.android.certinstaller can use
+ * this service.
+ */
+public class CredentialInstaller extends Activity {
+ private static final String TAG = "CredentialInstaller";
+
+ private KeyStore mKeyStore = KeyStore.getInstance();
+ private boolean mUnlocking = false;
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ if (!"com.android.certinstaller".equals(getCallingPackage())) finish();
+
+ if (!isKeyStoreLocked()) {
+ install();
+ finish();
+ } else if (!mUnlocking) {
+ mUnlocking = true;
+ Credentials.getInstance().unlock(this);
+ } else {
+ finish();
+ }
+ }
+
+ private void install() {
+ Intent intent = getIntent();
+ Bundle bundle = (intent == null) ? null : intent.getExtras();
+ if (bundle == null) return;
+ for (String key : bundle.keySet()) {
+ byte[] data = bundle.getByteArray(key);
+ if (data == null) continue;
+ boolean success = mKeyStore.put(key.getBytes(), data);
+ Log.v(TAG, "install " + key + ": " + data.length + " success? " + success);
+ if (!success) return;
+ }
+ setResult(RESULT_OK);
+ }
+
+ private boolean isKeyStoreLocked() {
+ return (mKeyStore.test() != KeyStore.NO_ERROR);
+ }
+}
diff --git a/src/com/android/settings/DefaultRingtonePreference.java b/src/com/android/settings/DefaultRingtonePreference.java
index 8eed5635018..0933d622ed8 100644
--- a/src/com/android/settings/DefaultRingtonePreference.java
+++ b/src/com/android/settings/DefaultRingtonePreference.java
@@ -42,11 +42,6 @@ public class DefaultRingtonePreference extends RingtonePreference {
* doesn't make sense to show a 'Default' item.
*/
ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, false);
-
- /*
- * Similarly, 'Silent' shouldn't be shown here.
- */
- ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
}
@Override
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index c1da18a1413..753f9b9fd42 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -17,6 +17,7 @@
package com.android.settings;
import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.DialogInterface;
import android.os.BatteryManager;
import android.os.Bundle;
@@ -45,6 +46,8 @@ public class DevelopmentSettings extends PreferenceActivity
// To track whether Yes was clicked in the adb warning dialog
private boolean mOkClicked;
+ private Dialog mOkDialog;
+
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -80,14 +83,15 @@ public class DevelopmentSettings extends PreferenceActivity
if (preference == mEnableAdb) {
if (mEnableAdb.isChecked()) {
mOkClicked = false;
- new AlertDialog.Builder(this).setMessage(
+ if (mOkDialog != null) dismissDialog();
+ mOkDialog = new AlertDialog.Builder(this).setMessage(
getResources().getString(R.string.adb_warning_message))
.setTitle(R.string.adb_warning_title)
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes, this)
.setNegativeButton(android.R.string.no, this)
- .show()
- .setOnDismissListener(this);
+ .show();
+ mOkDialog.setOnDismissListener(this);
} else {
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ADB_ENABLED, 0);
}
@@ -99,10 +103,16 @@ public class DevelopmentSettings extends PreferenceActivity
Settings.Secure.putInt(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION,
mAllowMockLocation.isChecked() ? 1 : 0);
}
-
+
return false;
}
+ private void dismissDialog() {
+ if (mOkDialog == null) return;
+ mOkDialog.dismiss();
+ mOkDialog = null;
+ }
+
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
mOkClicked = true;
@@ -119,4 +129,10 @@ public class DevelopmentSettings extends PreferenceActivity
mEnableAdb.setChecked(false);
}
}
+
+ @Override
+ public void onDestroy() {
+ dismissDialog();
+ super.onDestroy();
+ }
}
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index be01f7dc57e..82b7f2879b4 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -48,6 +48,7 @@ public class DeviceInfoSettings extends PreferenceActivity {
private static final String KEY_LICENSE = "license";
private static final String KEY_COPYRIGHT = "copyright";
private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
+ private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
@Override
protected void onCreate(Bundle icicle) {
@@ -61,6 +62,10 @@ public class DeviceInfoSettings extends PreferenceActivity {
setStringSummary("build_number", Build.DISPLAY);
findPreference("kernel_version").setSummary(getFormattedKernelVersion());
+ // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set
+ removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal",
+ PROPERTY_URL_SAFETYLEGAL);
+
/*
* Settings is a generic app and should not contain any device-specific
* info.
@@ -85,7 +90,21 @@ public class DeviceInfoSettings extends PreferenceActivity {
Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_CONTRIBUTORS,
Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
}
-
+
+ private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
+ String preference, String property ) {
+ if (SystemProperties.get(property).equals(""))
+ {
+ // Property is missing so remove preference from group
+ try {
+ preferenceGroup.removePreference(findPreference(preference));
+ } catch (RuntimeException e) {
+ Log.d(TAG, "Property '" + property + "' missing and no '"
+ + preference + "' preference");
+ }
+ }
+ }
+
private void setStringSummary(String preference, String value) {
try {
findPreference(preference).setSummary(value);
@@ -121,7 +140,7 @@ public class DeviceInfoSettings extends PreferenceActivity {
"\\w+\\s+" + /* ignore: version */
"([^\\s]+)\\s+" + /* group 1: 2.6.22-omap1 */
"\\(([^\\s@]+(?:@[^\\s.]+)?)[^)]*\\)\\s+" + /* group 2: (xxxxxx@xxxxx.constant) */
- "\\([^)]+\\)\\s+" + /* ignore: (gcc ..) */
+ "\\(.*?(?:\\(.*?\\)).*?\\)\\s+" + /* ignore: (gcc ..) */
"([^\\s]+)\\s+" + /* group 3: #26 */
"(?:PREEMPT\\s+)?" + /* ignore: PREEMPT (optional) */
"(.+)"; /* group 4: date */
diff --git a/src/com/android/settings/EditPinPreference.java b/src/com/android/settings/EditPinPreference.java
index ee3143c3942..362bed1bd69 100644
--- a/src/com/android/settings/EditPinPreference.java
+++ b/src/com/android/settings/EditPinPreference.java
@@ -16,6 +16,7 @@
package com.android.settings;
+import android.app.Dialog;
import android.content.Context;
import android.preference.EditTextPreference;
import android.text.method.DigitsKeyListener;
@@ -24,15 +25,11 @@ import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
-import java.util.Map;
-
/**
* TODO: Add a soft dialpad for PIN entry.
*/
class EditPinPreference extends EditTextPreference {
- private boolean mDialogOpen;
-
interface OnPinEnteredListener {
void onPinEntered(EditPinPreference preference, boolean positiveResult);
}
@@ -50,13 +47,13 @@ class EditPinPreference extends EditTextPreference {
public void setOnPinEnteredListener(OnPinEnteredListener listener) {
mPinListener = listener;
}
-
+
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
-
+
final EditText editText = (EditText) view.findViewById(android.R.id.edit);
-
+
if (editText != null) {
editText.setSingleLine(true);
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
@@ -65,20 +62,22 @@ class EditPinPreference extends EditTextPreference {
}
public boolean isDialogOpen() {
- return mDialogOpen;
+ Dialog dialog = getDialog();
+ return dialog != null && dialog.isShowing();
}
-
+
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
- mDialogOpen = false;
if (mPinListener != null) {
mPinListener.onPinEntered(this, positiveResult);
}
}
-
+
public void showPinDialog() {
- mDialogOpen = true;
- showDialog(null);
+ Dialog dialog = getDialog();
+ if (dialog == null || !dialog.isShowing()) {
+ showDialog(null);
+ }
}
}
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 18beb3283ca..3a7a7088669 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -261,10 +261,13 @@ public class IccLockSettings extends PreferenceActivity
mPinToggle.setChecked(!mToState);
mDialogState = ICC_LOCK_MODE;
showPinDialog();
+ } else if (preference == mPinDialog) {
+ mDialogState = ICC_OLD_MODE;
+ return false;
}
return true;
}
-
+
private void tryChangeIccLockState() {
// Try to change icc lock. If it succeeds, toggle the lock state and
// reset dialog state. Else inject error message and show dialog again.
@@ -277,7 +280,6 @@ public class IccLockSettings extends PreferenceActivity
if (success) {
mPinToggle.setChecked(mToState);
} else {
- // TODO: I18N
Toast.makeText(this, mRes.getString(R.string.sim_lock_failed), Toast.LENGTH_SHORT)
.show();
}
@@ -286,7 +288,6 @@ public class IccLockSettings extends PreferenceActivity
private void iccPinChanged(boolean success) {
if (!success) {
- // TODO: I18N
Toast.makeText(this, mRes.getString(R.string.sim_change_failed),
Toast.LENGTH_SHORT)
.show();
@@ -304,7 +305,7 @@ public class IccLockSettings extends PreferenceActivity
mPhone.getIccCard().changeIccLockPassword(mOldPin,
mNewPin, callback);
}
-
+
private boolean reasonablePin(String pin) {
if (pin == null || pin.length() < MIN_PIN_LENGTH || pin.length() > MAX_PIN_LENGTH) {
return false;
@@ -312,11 +313,12 @@ public class IccLockSettings extends PreferenceActivity
return true;
}
}
-
+
private void resetDialogState() {
mError = null;
mDialogState = ICC_OLD_MODE; // Default for when Change PIN is clicked
mPin = "";
setDialogValues();
+ mDialogState = OFF_MODE;
}
}
diff --git a/src/com/android/settings/IconPreferenceScreen.java b/src/com/android/settings/IconPreferenceScreen.java
new file mode 100644
index 00000000000..c7c53038ed9
--- /dev/null
+++ b/src/com/android/settings/IconPreferenceScreen.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.preference.Preference;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+
+public class IconPreferenceScreen extends Preference {
+
+ private Drawable mIcon;
+
+ public IconPreferenceScreen(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public IconPreferenceScreen(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ setLayoutResource(R.layout.preference_icon);
+ TypedArray a = context.obtainStyledAttributes(attrs,
+ R.styleable.IconPreferenceScreen, defStyle, 0);
+ mIcon = a.getDrawable(R.styleable.IconPreferenceScreen_icon);
+ }
+
+ @Override
+ public void onBindView(View view) {
+ super.onBindView(view);
+ ImageView imageView = (ImageView) view.findViewById(R.id.icon);
+ if (imageView != null && mIcon != null) {
+ imageView.setImageDrawable(mIcon);
+ }
+ }
+}
diff --git a/src/com/android/settings/InstalledAppDetails.java b/src/com/android/settings/InstalledAppDetails.java
index 5a4e672b9d5..d05014bfc02 100644
--- a/src/com/android/settings/InstalledAppDetails.java
+++ b/src/com/android/settings/InstalledAppDetails.java
@@ -323,7 +323,8 @@ public class InstalledAppDetails extends Activity implements View.OnClickListene
try {
mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
PackageManager.GET_UNINSTALLED_PACKAGES);
- pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 0);
+ pkgInfo = mPm.getPackageInfo(mAppInfo.packageName,
+ PackageManager.GET_UNINSTALLED_PACKAGES);
} catch (NameNotFoundException e) {
Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
showDialogInner(DLG_APP_NOT_FOUND);
diff --git a/src/com/android/settings/LanguageSettings.java b/src/com/android/settings/LanguageSettings.java
index cbab3901981..4b805ed56ed 100644
--- a/src/com/android/settings/LanguageSettings.java
+++ b/src/com/android/settings/LanguageSettings.java
@@ -54,8 +54,6 @@ public class LanguageSettings extends PreferenceActivity {
private String mLastInputMethodId;
private String mLastTickedInputMethodId;
- private String mRootDirectory;
-
static public String getInputMethodIdFromKey(String key) {
return key;
}
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java
index 9cb421786a4..a71d17bb0aa 100644
--- a/src/com/android/settings/ManageApplications.java
+++ b/src/com/android/settings/ManageApplications.java
@@ -52,6 +52,8 @@ import android.view.ViewGroup;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
+import android.widget.Filter;
+import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
@@ -64,7 +66,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.text.Collator;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -133,19 +134,19 @@ public class ManageApplications extends ListActivity implements
// sort order that can be changed through the menu can be sorted alphabetically
// or size(descending)
private static final int MENU_OPTIONS_BASE = 0;
- public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 0;
- public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 1;
// Filter options used for displayed list of applications
- public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 2;
- public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 3;
- public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 4;
- public static final int FILTER_OPTIONS = MENU_OPTIONS_BASE + 5;
+ public static final int FILTER_APPS_ALL = MENU_OPTIONS_BASE + 0;
+ public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 1;
+ public static final int FILTER_APPS_THIRD_PARTY = MENU_OPTIONS_BASE + 2;
+ public static final int FILTER_OPTIONS = MENU_OPTIONS_BASE + 3;
+ public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 4;
+ public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 5;
// Alert Dialog presented to user to find out the filter option
- AlertDialog mAlertDlg;
+ private AlertDialog mAlertDlg;
// sort order
private int mSortOrder = SORT_ORDER_ALPHA;
// Filter value
- int mFilterApps = FILTER_APPS_ALL;
+ private int mFilterApps = FILTER_APPS_THIRD_PARTY;
// Custom Adapter used for managing items in the list
private AppInfoAdapter mAppInfoAdapter;
@@ -176,7 +177,7 @@ public class ManageApplications extends ListActivity implements
private boolean mComputeSizes = false;
// default icon thats used when displaying applications initially before resource info is
// retrieved
- private Drawable mDefaultAppIcon;
+ private static Drawable mDefaultAppIcon;
// temporary dialog displayed while the application info loads
private static final int DLG_BASE = 0;
@@ -211,9 +212,6 @@ public class ManageApplications extends ListActivity implements
// Cache application attributes
private AppInfoCache mCache = new AppInfoCache();
- // empty message displayed when list is empty
- private TextView mEmptyView;
-
// Boolean variables indicating state
private boolean mLoadLabels = false;
private boolean mSizesFirst = false;
@@ -275,6 +273,7 @@ public class ManageApplications extends ListActivity implements
if(localLOGV) Log.i(TAG, "Message INIT_PKG_INFO, justCreated = " + mJustCreated);
List newList = null;
if (!mJustCreated) {
+ if (localLOGV) Log.i(TAG, "List already created");
// Add or delete newly created packages by comparing lists
newList = getInstalledApps(FILTER_APPS_ALL);
updateAppList(newList);
@@ -370,8 +369,7 @@ public class ManageApplications extends ListActivity implements
if (status) {
size = data.getLong(ATTR_PKG_STATS);
formattedSize = data.getString(ATTR_PKG_SIZE_STR);
- int idx = mAppInfoAdapter.getIndex(pkgName);
- if (idx == -1) {
+ if (!mAppInfoAdapter.isInstalled(pkgName)) {
mAppInfoAdapter.addToList(pkgName, size, formattedSize);
} else {
mAppInfoAdapter.updatePackage(pkgName, size, formattedSize);
@@ -565,7 +563,9 @@ public class ManageApplications extends ListActivity implements
Set existingList = new HashSet();
boolean ret = false;
// Loop over new list and find out common elements between old and new lists
- for (ApplicationInfo info : newList) {
+ int N = newList.size();
+ for (int i = (N-1); i >= 0; i--) {
+ ApplicationInfo info = newList.get(i);
String pkgName = info.packageName;
AppInfo aInfo = mCache.getEntry(pkgName);
if (aInfo != null) {
@@ -574,10 +574,14 @@ public class ManageApplications extends ListActivity implements
// New package. update info by refreshing
if (localLOGV) Log.i(TAG, "New pkg :"+pkgName+" installed when paused");
updatePackageList(Intent.ACTION_PACKAGE_ADDED, pkgName);
+ // Remove from current list so that the newly added package can
+ // be handled later
+ newList.remove(i);
ret = true;
}
}
- // Loop over old list and figure out state entries
+
+ // Loop over old list and figure out stale entries
List deletedList = null;
Set staleList = mCache.getPkgList();
for (String pkgName : staleList) {
@@ -592,6 +596,7 @@ public class ManageApplications extends ListActivity implements
}
// Delete right away
if (deletedList != null) {
+ if (localLOGV) Log.i(TAG, "Deleting right away");
mAppInfoAdapter.removeFromList(deletedList);
}
return ret;
@@ -653,19 +658,29 @@ public class ManageApplications extends ListActivity implements
return installedAppList;
}
}
+
+ private static boolean matchFilter(boolean filter, Map filterMap, String pkg) {
+ boolean add = true;
+ if (filter) {
+ if (filterMap == null || !filterMap.containsKey(pkg)) {
+ add = false;
+ }
+ }
+ return add;
+ }
/*
* Utility method used to figure out list of apps based on filterOption
* If the framework supports an additional flag to indicate running apps
* we can get away with some code here.
*/
- List getFilteredApps(List pAppList, int filterOption) {
+ List getFilteredApps(List pAppList, int filterOption, boolean filter,
+ Map filterMap) {
List retList = new ArrayList();
if(pAppList == null) {
return retList;
}
if (filterOption == FILTER_APPS_THIRD_PARTY) {
- List appList =new ArrayList ();
for (ApplicationInfo appInfo : pAppList) {
boolean flag = false;
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
@@ -676,15 +691,16 @@ public class ManageApplications extends ListActivity implements
flag = true;
}
if (flag) {
- appList.add(appInfo);
+ if (matchFilter(filter, filterMap, appInfo.packageName)) {
+ retList.add(appInfo);
+ }
}
}
- return appList;
+ return retList;
} else if (filterOption == FILTER_APPS_RUNNING) {
- List appList =new ArrayList ();
List procList = getRunningAppProcessesList();
if ((procList == null) || (procList.size() == 0)) {
- return appList;
+ return retList;
}
// Retrieve running processes from ActivityManager
HashMap runningMap =
@@ -700,15 +716,22 @@ public class ManageApplications extends ListActivity implements
// Query list to find running processes in current list
for (ApplicationInfo appInfo : pAppList) {
if (runningMap.get(appInfo.packageName) != null) {
- appList.add(appInfo);
+ if (matchFilter(filter, filterMap, appInfo.packageName)) {
+ retList.add(appInfo);
+ }
}
}
- return appList;
+ return retList;
} else {
- return pAppList;
+ for (ApplicationInfo appInfo : pAppList) {
+ if (matchFilter(filter, filterMap, appInfo.packageName)) {
+ retList.add(appInfo);
+ }
+ }
+ return retList;
}
}
-
+
private List getRunningAppProcessesList() {
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
return am.getRunningAppProcesses();
@@ -750,20 +773,9 @@ public class ManageApplications extends ListActivity implements
}
}
- private void showEmptyViewIfListEmpty() {
- if (localLOGV) Log.i(TAG, "Checking for empty view");
- if (mAppInfoAdapter.getCount() > 0) {
- mListView.setVisibility(View.VISIBLE);
- mEmptyView.setVisibility(View.GONE);
- } else {
- mListView.setVisibility(View.GONE);
- mEmptyView.setVisibility(View.VISIBLE);
- }
- }
-
// internal structure used to track added and deleted packages when
// the activity has focus
- class AddRemoveInfo {
+ static class AddRemoveInfo {
String pkgName;
boolean add;
public AddRemoveInfo(String pPkgName, boolean pAdd) {
@@ -847,7 +859,7 @@ public class ManageApplications extends ListActivity implements
/* Internal class representing an application or packages displayable attributes
*
*/
- class AppInfo {
+ static private class AppInfo {
public String pkgName;
int index;
public CharSequence appName;
@@ -927,11 +939,63 @@ public class ManageApplications extends ListActivity implements
* the getId methods via the package name into the internal maps and indices.
* The order of applications in the list is mirrored in mAppLocalList
*/
- class AppInfoAdapter extends BaseAdapter {
+ class AppInfoAdapter extends BaseAdapter implements Filterable {
private List mAppList;
private List mAppLocalList;
+ private Map mFilterMap = new HashMap();
AlphaComparator mAlphaComparator = new AlphaComparator();
SizeComparator mSizeComparator = new SizeComparator();
+ private Filter mAppFilter = new AppFilter();
+ final private Object mFilterLock = new Object();
+ private Map mCurrentFilterMap = null;
+
+ private void generateFilterListLocked(List list) {
+ mAppLocalList = new ArrayList(list);
+ synchronized(mFilterLock) {
+ for (ApplicationInfo info : mAppLocalList) {
+ String label = info.packageName;
+ AppInfo aInfo = mCache.getEntry(info.packageName);
+ if ((aInfo != null) && (aInfo.appName != null)) {
+ label = aInfo.appName.toString();
+ }
+ mFilterMap.put(info.packageName, label.toLowerCase());
+ }
+ }
+ }
+
+ private void addFilterListLocked(int newIdx, ApplicationInfo info, CharSequence pLabel) {
+ mAppLocalList.add(newIdx, info);
+ synchronized (mFilterLock) {
+ String label = info.packageName;
+ if (pLabel != null) {
+ label = pLabel.toString();
+ }
+ mFilterMap.put(info.packageName, label.toLowerCase());
+ }
+ }
+
+ private boolean removeFilterListLocked(String removePkg) {
+ // Remove from filtered list
+ int N = mAppLocalList.size();
+ int i;
+ for (i = (N-1); i >= 0; i--) {
+ ApplicationInfo info = mAppLocalList.get(i);
+ if (info.packageName.equalsIgnoreCase(removePkg)) {
+ if (localLOGV) Log.i(TAG, "Removing " + removePkg + " from local list");
+ mAppLocalList.remove(i);
+ synchronized (mFilterLock) {
+ mFilterMap.remove(removePkg);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void reverseGenerateList() {
+ generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
+ sortListInner(mSortOrder);
+ }
// Make sure the cache or map contains entries for all elements
// in appList for a valid sort.
@@ -942,11 +1006,11 @@ public class ManageApplications extends ListActivity implements
// Just refresh the list
appList = mAppList;
} else {
- mAppList = pAppList;
+ mAppList = new ArrayList(pAppList);
appList = pAppList;
notify = true;
}
- mAppLocalList = getFilteredApps(appList, filterOption);
+ generateFilterListLocked(getFilteredApps(appList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
// This loop verifies and creates new entries for new packages in list
int imax = appList.size();
for (int i = 0; i < imax; i++) {
@@ -977,24 +1041,19 @@ public class ManageApplications extends ListActivity implements
return mAppLocalList.get(position);
}
- /*
- * This method returns the index of the package position in the application list
- */
- public int getIndex(String pkgName) {
+ public boolean isInstalled(String pkgName) {
if(pkgName == null) {
- Log.w(TAG, "Getting index of null package in List Adapter");
+ if (localLOGV) Log.w(TAG, "Null pkg name when checking if installed");
+ return false;
}
- int imax = mAppLocalList.size();
- ApplicationInfo appInfo;
- for(int i = 0; i < imax; i++) {
- appInfo = mAppLocalList.get(i);
- if(appInfo.packageName.equalsIgnoreCase(pkgName)) {
- return i;
+ for (ApplicationInfo info : mAppList) {
+ if (info.packageName.equalsIgnoreCase(pkgName)) {
+ return true;
}
}
- return -1;
+ return false;
}
-
+
public ApplicationInfo getApplicationInfo(int position) {
int imax = mAppLocalList.size();
if( (position < 0) || (position >= imax)) {
@@ -1083,7 +1142,7 @@ public class ManageApplications extends ListActivity implements
public void sortBaseList(int sortOrder) {
if (localLOGV) Log.i(TAG, "Sorting base list based on sortOrder = "+sortOrder);
sortAppList(mAppList, sortOrder);
- mAppLocalList = getFilteredApps(mAppList, mFilterApps);
+ generateFilterListLocked(getFilteredApps(mAppList, mFilterApps, mCurrentFilterMap!= null, mCurrentFilterMap));
adjustIndex();
}
@@ -1106,7 +1165,7 @@ public class ManageApplications extends ListActivity implements
*/
public boolean resetAppList(int filterOption) {
// Change application list based on filter option
- mAppLocalList = getFilteredApps(mAppList, filterOption);
+ generateFilterListLocked(getFilteredApps(mAppList, filterOption, mCurrentFilterMap!= null, mCurrentFilterMap));
// Check for all properties in map before sorting. Populate values from cache
for(ApplicationInfo applicationInfo : mAppLocalList) {
AppInfo appInfo = mCache.getEntry(applicationInfo.packageName);
@@ -1119,7 +1178,6 @@ public class ManageApplications extends ListActivity implements
} else {
notifyDataSetChanged();
}
- showEmptyViewIfListEmpty();
return true;
}
@@ -1202,7 +1260,6 @@ public class ManageApplications extends ListActivity implements
if (pkgName == null) {
return;
}
- boolean notInList = true;
// Get ApplicationInfo
ApplicationInfo info = null;
try {
@@ -1216,29 +1273,38 @@ public class ManageApplications extends ListActivity implements
Log.i(TAG, "Null ApplicationInfo for package:"+pkgName);
return;
}
- // Add entry to local list
+ // Add entry to base list
mAppList.add(info);
// Add entry to map. Note that the index gets adjusted later on based on
// whether the newly added package is part of displayed list
+ CharSequence label = info.loadLabel(mPm);
mCache.addEntry(new AppInfo(pkgName, -1,
- info.loadLabel(mPm), info.loadIcon(mPm), size, formattedSize));
+ label, info.loadIcon(mPm), size, formattedSize));
+ if (addLocalEntry(info, label)) {
+ notifyDataSetChanged();
+ }
+ }
+
+ private boolean addLocalEntry(ApplicationInfo info, CharSequence label) {
+ String pkgName = info.packageName;
// Add to list
- if (notInList && (shouldBeInList(mFilterApps, info))) {
+ if (shouldBeInList(mFilterApps, info)) {
// Binary search returns a negative index (ie -index) of the position where
// this might be inserted.
int newIdx = Collections.binarySearch(mAppLocalList, info,
getAppComparator(mSortOrder));
if(newIdx >= 0) {
- Log.i(TAG, "Strange. Package:"+pkgName+" is not new");
- return;
+ if (localLOGV) Log.i(TAG, "Strange. Package:" + pkgName + " is not new");
+ return false;
}
// New entry
newIdx = -newIdx-1;
- mAppLocalList.add(newIdx, info);
+ addFilterListLocked(newIdx, info, label);
// Adjust index
adjustIndex();
- notifyDataSetChanged();
+ return true;
}
+ return false;
}
public void updatePackage(String pkgName,
@@ -1252,9 +1318,13 @@ public class ManageApplications extends ListActivity implements
}
AppInfo aInfo = mCache.getEntry(pkgName);
if (aInfo != null) {
- aInfo.refreshLabel(info.loadLabel(mPm));
+ CharSequence label = info.loadLabel(mPm);
+ aInfo.refreshLabel(label);
aInfo.refreshIcon(info.loadIcon(mPm));
aInfo.setSize(size, formattedSize);
+ // Check if the entry has to be added to the displayed list
+ addLocalEntry(info, label);
+ // Refresh list since size might have changed
notifyDataSetChanged();
}
}
@@ -1286,15 +1356,8 @@ public class ManageApplications extends ListActivity implements
if (localLOGV) Log.i(TAG, "Removing " + pkg + " from cache");
mCache.removeEntry(pkg);
// Remove from filtered list
- int i = 0;
- for (ApplicationInfo info : mAppLocalList) {
- if (info.packageName.equalsIgnoreCase(pkg)) {
- mAppLocalList.remove(i);
- if (localLOGV) Log.i(TAG, "Removing " + pkg + " from local list");
- found = true;
- break;
- }
- i++;
+ if (removeFilterListLocked(pkg)) {
+ found = true;
}
}
// Adjust indices of list entries
@@ -1324,6 +1387,50 @@ public class ManageApplications extends ListActivity implements
notifyDataSetChanged();
}
}
+
+ public Filter getFilter() {
+ return mAppFilter;
+ }
+
+ private class AppFilter extends Filter {
+ @Override
+ protected FilterResults performFiltering(CharSequence prefix) {
+ FilterResults results = new FilterResults();
+ if (prefix == null || prefix.length() == 0) {
+ synchronized (mFilterLock) {
+ results.values = new HashMap(mFilterMap);
+ results.count = mFilterMap.size();
+ }
+ } else {
+ final String prefixString = prefix.toString().toLowerCase();
+ Map newMap = new HashMap();
+ synchronized (mFilterLock) {
+ Map localMap = mFilterMap;
+ Set keys = mFilterMap.keySet();
+ for (String key : keys) {
+ String label = localMap.get(key);
+ if (label.indexOf(prefixString) != -1) {
+ newMap.put(key, label);
+ }
+ }
+ }
+ results.values = newMap;
+ results.count = newMap.size();
+ }
+ return results;
+ }
+
+ @Override
+ protected void publishResults(CharSequence constraint, FilterResults results) {
+ mCurrentFilterMap = (Map) results.values;
+ reverseGenerateList();
+ if (results.count > 0) {
+ notifyDataSetChanged();
+ } else {
+ notifyDataSetInvalidated();
+ }
+ }
+ }
}
/*
@@ -1455,6 +1562,7 @@ public class ManageApplications extends ListActivity implements
String action = intent.getAction();
if (action.equals(Intent.ACTION_MANAGE_PACKAGE_STORAGE)) {
mSortOrder = SORT_ORDER_SIZE;
+ mFilterApps = FILTER_APPS_ALL;
mSizesFirst = true;
}
mPm = getPackageManager();
@@ -1471,7 +1579,6 @@ public class ManageApplications extends ListActivity implements
// initialize the inflater
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mReceiver = new PackageIntentReceiver();
- mEmptyView = (TextView) findViewById(R.id.empty_view);
mObserver = new PkgSizeObserver();
// Create adapter and list view here
List appList = getInstalledApps(mSortOrder);
@@ -1481,6 +1588,7 @@ public class ManageApplications extends ListActivity implements
lv.setSaveEnabled(true);
lv.setItemsCanFocus(true);
lv.setOnItemClickListener(this);
+ lv.setTextFilterEnabled(true);
mListView = lv;
if (DEBUG_TIME) {
Log.i(TAG, "Total time in Activity.create:: " +
@@ -1829,6 +1937,8 @@ public class ManageApplications extends ListActivity implements
if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) {
sendMessageToHandler(REORDER_LIST, menuId);
} else if (menuId == FILTER_OPTIONS) {
+ // Pick up the selection value from the list of added choice items.
+ int selection = mFilterApps - MENU_OPTIONS_BASE;
if (mAlertDlg == null) {
mAlertDlg = new AlertDialog.Builder(this).
setTitle(R.string.filter_dlg_title).
@@ -1836,7 +1946,7 @@ public class ManageApplications extends ListActivity implements
setSingleChoiceItems(new CharSequence[] {getText(R.string.filter_apps_all),
getText(R.string.filter_apps_running),
getText(R.string.filter_apps_third_party)},
- -1, this).
+ selection, this).
create();
}
mAlertDlg.show();
@@ -1861,18 +1971,16 @@ public class ManageApplications extends ListActivity implements
switch (which) {
// Make sure that values of 0, 1, 2 match options all, running, third_party when
// created via the AlertDialog.Builder
- case 0:
- newOption = FILTER_APPS_ALL;
+ case FILTER_APPS_ALL:
break;
- case 1:
- newOption = FILTER_APPS_RUNNING;
+ case FILTER_APPS_RUNNING:
break;
- case 2:
- newOption = FILTER_APPS_THIRD_PARTY;
+ case FILTER_APPS_THIRD_PARTY:
break;
default:
return;
}
+ newOption = which;
mAlertDlg.dismiss();
sendMessageToHandler(REORDER_LIST, newOption);
}
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
new file mode 100644
index 00000000000..2edb3284055
--- /dev/null
+++ b/src/com/android/settings/PrivacySettings.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.backup.IBackupManager;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.text.method.LinkMovementMethod;
+import android.widget.TextView;
+
+/**
+ * Gesture lock pattern settings.
+ */
+public class PrivacySettings extends PreferenceActivity implements
+ DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
+
+ private static final String PREFS_NAME = "location_prefs";
+ private static final String PREFS_USE_LOCATION = "use_location";
+
+ // Vendor specific
+ private static final String GSETTINGS_PROVIDER = "com.google.android.providers.settings";
+ private static final String LOCATION_CATEGORY = "location_category";
+ private static final String SETTINGS_CATEGORY = "settings_category";
+ private static final String USE_LOCATION = "use_location";
+ private static final String BACKUP_SETTINGS = "backup_settings";
+ private static final String KEY_DONE_USE_LOCATION = "doneLocation";
+ private CheckBoxPreference mUseLocation;
+ private CheckBoxPreference mBackup;
+ private boolean mOkClicked;
+ private Dialog mConfirmDialog;
+
+ private static final int DIALOG_USE_LOCATION = 1;
+ private static final int DIALOG_ERASE_BACKUP = 2;
+ private int mDialogType;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.privacy_settings);
+
+ mUseLocation = (CheckBoxPreference) getPreferenceScreen().findPreference(USE_LOCATION);
+ mBackup = (CheckBoxPreference) getPreferenceScreen().findPreference(BACKUP_SETTINGS);
+
+ // Vendor specific
+ try {
+ if (mUseLocation != null) {
+ getPackageManager().getPackageInfo(GSETTINGS_PROVIDER, 0);
+ }
+ } catch (NameNotFoundException nnfe) {
+ getPreferenceScreen().removePreference(findPreference(LOCATION_CATEGORY));
+ getPreferenceScreen().removePreference(findPreference(SETTINGS_CATEGORY));
+ }
+ updateToggles();
+
+ boolean doneUseLocation = savedInstanceState == null
+ ? false : savedInstanceState.getBoolean(KEY_DONE_USE_LOCATION, true);
+ if (!doneUseLocation && (getIntent().getBooleanExtra("SHOW_USE_LOCATION", false)
+ || savedInstanceState != null)) {
+ showUseLocationDialog(true);
+ }
+ }
+
+ @Override
+ public void onStop() {
+ if (mConfirmDialog != null && mConfirmDialog.isShowing()) {
+ mConfirmDialog.dismiss();
+ }
+ mConfirmDialog = null;
+ mDialogType = 0;
+ super.onStop();
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle icicle) {
+ if (mConfirmDialog != null && mConfirmDialog.isShowing()
+ && mDialogType == DIALOG_USE_LOCATION) {
+ icicle.putBoolean(KEY_DONE_USE_LOCATION, false);
+ }
+ super.onSaveInstanceState(icicle);
+ }
+
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
+ Preference preference) {
+ if (preference == mUseLocation) {
+ //normally called on the toggle click
+ if (mUseLocation.isChecked()) {
+ showUseLocationDialog(false);
+ } else {
+ updateUseLocation();
+ }
+ } else if (preference == mBackup) {
+ if (!mBackup.isChecked()) {
+ showEraseBackupDialog();
+ } else {
+ setBackupEnabled(true);
+ }
+ }
+
+ return false;
+ }
+
+ private void showUseLocationDialog(boolean force) {
+ // Show a warning to the user that location data will be shared
+ mOkClicked = false;
+ if (force) {
+ mUseLocation.setChecked(true);
+ }
+
+ if (hasAgreedToUseLocation()) {
+ updateUseLocation();
+ return;
+ }
+
+ mDialogType = DIALOG_USE_LOCATION;
+ CharSequence msg = getResources().getText(R.string.use_location_warning_message);
+ mConfirmDialog = new AlertDialog.Builder(this).setMessage(msg)
+ .setTitle(R.string.use_location_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setPositiveButton(R.string.agree, this)
+ .setNegativeButton(R.string.disagree, this)
+ .show();
+ ((TextView)mConfirmDialog.findViewById(android.R.id.message))
+ .setMovementMethod(LinkMovementMethod.getInstance());
+ mConfirmDialog.setOnDismissListener(this);
+ }
+
+ private void showEraseBackupDialog() {
+ // Show a warning to the user that location data will be shared
+ mOkClicked = false;
+ mBackup.setChecked(true);
+
+ mDialogType = DIALOG_ERASE_BACKUP;
+ CharSequence msg = getResources().getText(R.string.backup_erase_dialog_message);
+ mConfirmDialog = new AlertDialog.Builder(this).setMessage(msg)
+ .setTitle(R.string.backup_erase_dialog_title)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setPositiveButton(android.R.string.ok, this)
+ .setNegativeButton(android.R.string.cancel, this)
+ .show();
+ mConfirmDialog.setOnDismissListener(this);
+ }
+
+ /*
+ * Creates toggles for each available location provider
+ */
+ private void updateToggles() {
+ ContentResolver res = getContentResolver();
+ mUseLocation.setChecked(Settings.Secure.getInt(res,
+ Settings.Secure.USE_LOCATION_FOR_SERVICES, 2) == 1);
+ mBackup.setChecked(Settings.Secure.getInt(res,
+ Settings.Secure.BACKUP_ENABLED, 0) == 1);
+ }
+
+ private void updateUseLocation() {
+ boolean use = mUseLocation.isChecked();
+ Settings.Secure.putInt(getContentResolver(),
+ Settings.Secure.USE_LOCATION_FOR_SERVICES, use ? 1 : 0);
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ //updateProviders();
+ mOkClicked = true;
+ if (mDialogType == DIALOG_USE_LOCATION) {
+ setAgreedToUseLocation(true);
+ } else if (mDialogType == DIALOG_ERASE_BACKUP) {
+ setBackupEnabled(false);
+ }
+ } else {
+ if (mDialogType == DIALOG_USE_LOCATION) {
+ // Reset the toggle
+ mUseLocation.setChecked(false);
+ } else if (mDialogType == DIALOG_ERASE_BACKUP) {
+ mBackup.setChecked(true);
+ }
+ }
+ updateUseLocation();
+ mDialogType = 0;
+ }
+
+ public void onDismiss(DialogInterface dialog) {
+ // Assuming that onClick gets called first
+ if (!mOkClicked) {
+ if (mDialogType == DIALOG_USE_LOCATION) {
+ mUseLocation.setChecked(false);
+ }
+ }
+ }
+
+ /**
+ * Checks if the user has agreed to the dialog in the past.
+ */
+ private boolean hasAgreedToUseLocation() {
+ SharedPreferences sp = getSharedPreferences(PREFS_NAME, 0);
+ if (sp == null) {
+ return false;
+ }
+ return sp.getBoolean(PREFS_USE_LOCATION, false);
+ }
+
+ /**
+ * Notes that the user has agreed to the dialog and won't need to be prompted in the
+ * future.
+ */
+ private void setAgreedToUseLocation(boolean agreed) {
+ if (agreed) {
+ SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
+ SharedPreferences.Editor editor = settings.edit();
+ editor.putBoolean(PREFS_USE_LOCATION, true);
+ editor.commit();
+ }
+ }
+
+ /**
+ * Informs the BackupManager of a change in backup state - if backup is disabled,
+ * the data on the server will be erased.
+ * @param enable whether to enable backup
+ */
+ private void setBackupEnabled(boolean enable) {
+ IBackupManager bm = IBackupManager.Stub.asInterface(
+ ServiceManager.getService(Context.BACKUP_SERVICE));
+ if (bm != null) {
+ try {
+ bm.setBackupEnabled(enable);
+ } catch (RemoteException e) {
+ mBackup.setChecked(!enable);
+ return;
+ }
+ }
+ mBackup.setChecked(enable);
+ }
+}
diff --git a/src/com/android/settings/RadioInfo.java b/src/com/android/settings/RadioInfo.java
index 257122bbdf6..ce236fd2244 100644
--- a/src/com/android/settings/RadioInfo.java
+++ b/src/com/android/settings/RadioInfo.java
@@ -37,6 +37,7 @@ import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.NeighboringCellInfo;
+import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.format.DateUtils;
import android.util.Log;
@@ -51,6 +52,7 @@ import android.widget.Spinner;
import android.widget.TextView;
import android.widget.EditText;
+import com.android.internal.telephony.DataConnection;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.PhoneStateIntentReceiver;
@@ -72,7 +74,7 @@ import java.util.List;
public class RadioInfo extends Activity {
private final String TAG = "phone";
-
+
private static final int EVENT_PHONE_STATE_CHANGED = 100;
private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200;
private static final int EVENT_SERVICE_STATE_CHANGED = 300;
@@ -200,7 +202,7 @@ public class RadioInfo extends Activity {
int type = ((int[])ar.result)[0];
preferredNetworkType.setSelection(type, true);
} else {
- preferredNetworkType.setSelection(3, true);
+ preferredNetworkType.setSelection(8, true);
}
break;
case EVENT_SET_PREFERRED_TYPE_DONE:
@@ -222,7 +224,7 @@ public class RadioInfo extends Activity {
ar= (AsyncResult) msg.obj;
if (ar.exception == null) {
mQxdmLogEnabled = !mQxdmLogEnabled;
-
+
updateQxdmState(mQxdmLogEnabled);
displayQxdmEnableResult();
}
@@ -256,22 +258,22 @@ public class RadioInfo extends Activity {
}
};
- private class OemCommands {
+ static private class OemCommands {
- public final int OEM_QXDM_SDLOG_DEFAULT_FILE_SIZE = 32;
- public final int OEM_QXDM_SDLOG_DEFAULT_MASK = 0;
- public final int OEM_QXDM_SDLOG_DEFAULT_MAX_INDEX = 8;
+ public static final int OEM_QXDM_SDLOG_DEFAULT_FILE_SIZE = 32;
+ public static final int OEM_QXDM_SDLOG_DEFAULT_MASK = 0;
+ public static final int OEM_QXDM_SDLOG_DEFAULT_MAX_INDEX = 8;
- final int SIZE_OF_INT = 4;
- final int OEM_FEATURE_ENABLE = 1;
- final int OEM_FEATURE_DISABLE = 0;
- final int OEM_SIMPE_FEAUTURE_LEN = 1;
+ static final int SIZE_OF_INT = 4;
+ static final int OEM_FEATURE_ENABLE = 1;
+ static final int OEM_FEATURE_DISABLE = 0;
+ static final int OEM_SIMPE_FEAUTURE_LEN = 1;
+
+ static final int OEM_QXDM_SDLOG_FUNCTAG = 0x00010000;
+ static final int OEM_QXDM_SDLOG_LEN = 4;
+ static final int OEM_PS_AUTO_ATTACH_FUNCTAG = 0x00020000;
+ static final int OEM_CIPHERING_FUNCTAG = 0x00020001;
- final int OEM_QXDM_SDLOG_FUNCTAG = 0x00010000;
- final int OEM_QXDM_SDLOG_LEN = 4;
- final int OEM_PS_AUTO_ATTACH_FUNCTAG = 0x00020000;
- final int OEM_CIPHERING_FUNCTAG = 0x00020001;
-
/**
* The OEM interface to store QXDM to SD.
*
@@ -342,7 +344,7 @@ public class RadioInfo extends Activity {
byte[] getCipheringData(boolean enable) {
return getSimpleFeatureData(OEM_CIPHERING_FUNCTAG, enable);
}
-
+
private byte[] getSimpleFeatureData(int tag, boolean enable) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
@@ -407,7 +409,7 @@ public class RadioInfo extends Activity {
preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
ArrayAdapter adapter = new ArrayAdapter (this,
android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
- adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
preferredNetworkType.setAdapter(adapter);
preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
@@ -427,12 +429,12 @@ public class RadioInfo extends Activity {
refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
-
+
mPhoneStateReceiver = new PhoneStateIntentReceiver(this, mHandler);
mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED);
mPhoneStateReceiver.notifyServiceState(EVENT_SERVICE_STATE_CHANGED);
mPhoneStateReceiver.notifyPhoneCallState(EVENT_PHONE_STATE_CHANGED);
-
+
updateQxdmState(null);
mOem = new OemCommands();
@@ -544,7 +546,7 @@ public class RadioInfo extends Activity {
private boolean isRadioOn() {
return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
}
-
+
private void updatePowerState() {
String buttonText = isRadioOn() ?
getString(R.string.turn_off_radio) :
@@ -553,18 +555,18 @@ public class RadioInfo extends Activity {
}
private void updateQxdmState(Boolean newQxdmStatus) {
- SharedPreferences sp =
+ SharedPreferences sp =
PreferenceManager.getDefaultSharedPreferences(phone.getContext());
mQxdmLogEnabled = sp.getBoolean("qxdmstatus", false);
// This is called from onCreate, onResume, and the handler when the status
- // is updated.
+ // is updated.
if (newQxdmStatus != null) {
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean("qxdmstatus", newQxdmStatus);
editor.commit();
mQxdmLogEnabled = newQxdmStatus;
}
-
+
String buttonText = mQxdmLogEnabled ?
getString(R.string.turn_off_qxdm) :
getString(R.string.turn_on_qxdm);
@@ -620,38 +622,59 @@ public class RadioInfo extends Activity {
}
private final void updateLocation(CellLocation location) {
- int lac = -1;
- int cid = -1;
+ Resources r = getResources();
if (location instanceof GsmCellLocation) {
GsmCellLocation loc = (GsmCellLocation)location;
- lac = loc.getLac();
- cid = loc.getCid();
+ int lac = loc.getLac();
+ int cid = loc.getCid();
+ mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
+ + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
+ + " "
+ + r.getString(R.string.radioInfo_cid) + " = "
+ + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
+ } else if (location instanceof CdmaCellLocation) {
+ CdmaCellLocation loc = (CdmaCellLocation)location;
+ int bid = loc.getBaseStationId();
+ int sid = loc.getSystemId();
+ int nid = loc.getNetworkId();
+ int lat = loc.getBaseStationLatitude();
+ int lon = loc.getBaseStationLongitude();
+ mLocation.setText("BID = "
+ + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
+ + " "
+ + "SID = "
+ + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
+ + " "
+ + "NID = "
+ + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
+ + "\n"
+ + "LAT = "
+ + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
+ + " "
+ + "LONG = "
+ + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
+ } else {
+ mLocation.setText("unknown");
}
- Resources r = getResources();
- mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
- + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
- + " "
- + r.getString(R.string.radioInfo_cid) + " = "
- + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
}
private final void updateNeighboringCids(ArrayList cids) {
- String neighborings = "";
+ StringBuilder sb = new StringBuilder();
+
if (cids != null) {
if ( cids.isEmpty() ) {
- neighborings = "no neighboring cells";
+ sb.append("no neighboring cells");
} else {
for (NeighboringCellInfo cell : cids) {
- neighborings += "{" + Integer.toHexString(cell.getCid())
- + "@" + cell.getRssi() + "} ";
+ sb.append(cell.toString()).append(" ");
}
}
} else {
- neighborings = "unknown";
+ sb.append("unknown");
}
- mNeighboringCids.setText(neighborings);
+ mNeighboringCids.setText(sb.toString());
}
private final void
@@ -671,7 +694,7 @@ public class RadioInfo extends Activity {
int state = serviceState.getState();
Resources r = getResources();
String display = r.getString(R.string.radioInfo_unknown);
-
+
switch (state) {
case ServiceState.STATE_IN_SERVICE:
display = r.getString(R.string.radioInfo_service_in);
@@ -684,9 +707,9 @@ public class RadioInfo extends Activity {
display = r.getString(R.string.radioInfo_service_off);
break;
}
-
+
gsmState.setText(display);
-
+
if (serviceState.getRoaming()) {
roamingState.setText(R.string.radioInfo_roaming_in);
} else {
@@ -737,7 +760,7 @@ public class RadioInfo extends Activity {
display = r.getString(R.string.radioInfo_data_suspended);
break;
}
-
+
gprsState.setText(display);
}
@@ -755,12 +778,12 @@ public class RadioInfo extends Activity {
Resources r = getResources();
s = phone.getDeviceId();
- if (s == null) s = r.getString(R.string.radioInfo_unknown);
+ if (s == null) s = r.getString(R.string.radioInfo_unknown);
mDeviceId.setText(s);
-
+
s = phone.getLine1Number();
- if (s == null) s = r.getString(R.string.radioInfo_unknown);
+ if (s == null) s = r.getString(R.string.radioInfo_unknown);
number.setText(s);
}
@@ -791,10 +814,10 @@ public class RadioInfo extends Activity {
long rxPackets = netstat.getMobileRxPackets();
long txBytes = netstat.getMobileTxBytes();
long rxBytes = netstat.getMobileRxBytes();
-
+
String packets = r.getString(R.string.radioInfo_display_packets);
String bytes = r.getString(R.string.radioInfo_display_bytes);
-
+
sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
} catch (RemoteException e) {
@@ -828,7 +851,7 @@ public class RadioInfo extends Activity {
*/
private final void pingHostname() {
try {
- Process p = Runtime.getRuntime().exec("ping -c 1 www.google.com");
+ Process p = Runtime.getRuntime().exec("ping -c 1 www.google.com");
int status = p.waitFor();
if (status == 0) {
mPingHostnameResult = "Pass";
@@ -916,20 +939,24 @@ public class RadioInfo extends Activity {
private final void updatePdpList() {
StringBuilder sb = new StringBuilder("========DATA=======\n");
- List pdps = phone.getCurrentPdpList();
+ List dcs = phone.getCurrentDataConnectionList();
- for (PdpConnection pdp : pdps) {
- sb.append(" State: ").append(pdp.getState().toString()).append("\n");
- if (pdp.getState().isActive()) {
+ for (DataConnection dc : dcs) {
+ sb.append(" State: ").append(dc.getState().toString()).append("\n");
+ if (dc.getState().isActive()) {
long timeElapsed =
- (System.currentTimeMillis() - pdp.getConnectionTime())/1000;
+ (System.currentTimeMillis() - dc.getConnectionTime())/1000;
sb.append(" connected at ")
- .append(DateUtils.timeString(pdp.getConnectionTime()))
+ .append(DateUtils.timeString(dc.getConnectionTime()))
.append(" and elapsed ")
- .append(DateUtils.formatElapsedTime(timeElapsed))
- .append("\n to ")
- .append(pdp.getApn().toString())
- .append("\ninterface: ")
+ .append(DateUtils.formatElapsedTime(timeElapsed));
+
+ if (dc instanceof PdpConnection) {
+ PdpConnection pdp = (PdpConnection)dc;
+ sb.append("\n to ")
+ .append(pdp.getApn().toString());
+ }
+ sb.append("\ninterface: ")
.append(phone.getInterfaceName(phone.getActiveApnTypes()[0]))
.append("\naddress: ")
.append(phone.getIpAddress(phone.getActiveApnTypes()[0]))
@@ -939,14 +966,19 @@ public class RadioInfo extends Activity {
if (dns != null) {
sb.append("\ndns: ").append(dns[0]).append(", ").append(dns[1]);
}
- } else if (pdp.getState().isInactive()) {
+ } else if (dc.getState().isInactive()) {
sb.append(" disconnected with last try at ")
- .append(DateUtils.timeString(pdp.getLastFailTime()))
+ .append(DateUtils.timeString(dc.getLastFailTime()))
.append("\n fail because ")
- .append(pdp.getLastFailCause().toString());
+ .append(dc.getLastFailCause().toString());
} else {
- sb.append(" is connecting to ")
- .append(pdp.getApn().toString());
+ if (dc instanceof PdpConnection) {
+ PdpConnection pdp = (PdpConnection)dc;
+ sb.append(" is connecting to ")
+ .append(pdp.getApn().toString());
+ } else {
+ sb.append(" is connecting");
+ }
}
sb.append("\n===================");
}
@@ -958,8 +990,7 @@ public class RadioInfo extends Activity {
private void displayQxdmEnableResult() {
String status = mQxdmLogEnabled ? "Start QXDM Log" : "Stop QXDM Log";
- DialogInterface mProgressPanel = new AlertDialog.
- Builder(this).setMessage(status).show();
+ new AlertDialog.Builder(this).setMessage(status).show();
mHandler.postDelayed(
new Runnable() {
@@ -1036,7 +1067,7 @@ public class RadioInfo extends Activity {
return true;
}
};
-
+
private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
int state = mTelephonyManager.getDataState();
@@ -1082,7 +1113,7 @@ public class RadioInfo extends Activity {
public void onClick(View v) {
mCipherOn = !getCiphPref();
byte[] data = mOem.getCipheringData(mCipherOn);
-
+
if (data == null)
return;
@@ -1091,14 +1122,14 @@ public class RadioInfo extends Activity {
mHandler.obtainMessage(EVENT_SET_CIPHER_DONE));
}
};
-
+
OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
public void onClick(View v) {
phone.disableDnsCheck(!phone.isDnsCheckDisabled());
updateDnsCheckState();
}
};
-
+
OnClickListener mPingButtonHandler = new OnClickListener() {
public void onClick(View v) {
updatePingState();
@@ -1149,5 +1180,13 @@ public class RadioInfo extends Activity {
};
private String[] mPreferredNetworkLabels = {
- "WCDMA preferred", "GSM only", "WCDMA only", "Unknown"};
+ "WCDMA preferred",
+ "GSM only",
+ "WCDMA only",
+ "GSM auto (PRL)",
+ "CDMA auto (PRL)",
+ "CDMA only",
+ "EvDo only",
+ "GSM/CDMA auto (PRL)",
+ "Unknown"};
}
diff --git a/src/com/android/settings/RingerVolumePreference.java b/src/com/android/settings/RingerVolumePreference.java
index 2d21ec6e997..0d01965732f 100644
--- a/src/com/android/settings/RingerVolumePreference.java
+++ b/src/com/android/settings/RingerVolumePreference.java
@@ -16,10 +16,12 @@
package com.android.settings;
+import android.app.Dialog;
import android.content.Context;
import android.media.AudioManager;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.preference.VolumePreference;
-import android.preference.VolumePreference.SeekBarVolumizer;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.View;
@@ -121,9 +123,79 @@ public class RingerVolumePreference extends VolumePreference implements
private void cleanup() {
if (mNotificationSeekBarVolumizer != null) {
+ Dialog dialog = getDialog();
+ if (dialog != null && dialog.isShowing()) {
+ // Stopped while dialog was showing, revert changes
+ mNotificationSeekBarVolumizer.revertVolume();
+ }
mNotificationSeekBarVolumizer.stop();
mNotificationSeekBarVolumizer = null;
}
}
-
+
+ @Override
+ protected Parcelable onSaveInstanceState() {
+ final Parcelable superState = super.onSaveInstanceState();
+ if (isPersistent()) {
+ // No need to save instance state since it's persistent
+ return superState;
+ }
+
+ final SavedState myState = new SavedState(superState);
+ if (mNotificationSeekBarVolumizer != null) {
+ mNotificationSeekBarVolumizer.onSaveInstanceState(myState.getVolumeStore());
+ }
+ return myState;
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Parcelable state) {
+ if (state == null || !state.getClass().equals(SavedState.class)) {
+ // Didn't save state for us in onSaveInstanceState
+ super.onRestoreInstanceState(state);
+ return;
+ }
+
+ SavedState myState = (SavedState) state;
+ super.onRestoreInstanceState(myState.getSuperState());
+ if (mNotificationSeekBarVolumizer != null) {
+ mNotificationSeekBarVolumizer.onRestoreInstanceState(myState.getVolumeStore());
+ }
+ }
+
+ private static class SavedState extends BaseSavedState {
+ VolumeStore mVolumeStore = new VolumeStore();
+
+ public SavedState(Parcel source) {
+ super(source);
+ mVolumeStore.volume = source.readInt();
+ mVolumeStore.originalVolume = source.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(mVolumeStore.volume);
+ dest.writeInt(mVolumeStore.originalVolume);
+ }
+
+ VolumeStore getVolumeStore() {
+ return mVolumeStore;
+ }
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ public static final Parcelable.Creator CREATOR =
+ new Parcelable.Creator() {
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
}
diff --git a/src/com/android/settings/RunningServices.java b/src/com/android/settings/RunningServices.java
new file mode 100644
index 00000000000..6c11ea0ce37
--- /dev/null
+++ b/src/com/android/settings/RunningServices.java
@@ -0,0 +1,953 @@
+/*
+ * Copyright (C) 2006 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;
+
+import com.android.settings.R;
+import android.app.ActivityManager;
+import android.app.ActivityManagerNative;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ListActivity;
+import android.app.PendingIntent;
+import android.content.ActivityNotFoundException;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.Debug;
+import android.os.Handler;
+import android.os.Message;
+import android.os.RemoteException;
+import android.os.SystemClock;
+import android.os.SystemProperties;
+import android.text.format.DateUtils;
+import android.text.format.Formatter;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.SparseArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+public class RunningServices extends ListActivity
+ implements AbsListView.RecyclerListener,
+ DialogInterface.OnClickListener {
+ static final String TAG = "RunningServices";
+
+ /** Maximum number of services to retrieve */
+ static final int MAX_SERVICES = 100;
+
+ static final int MSG_UPDATE_TIMES = 1;
+ static final int MSG_UPDATE_CONTENTS = 2;
+
+ static final long TIME_UPDATE_DELAY = 1000;
+ static final long CONTENTS_UPDATE_DELAY = 2000;
+
+ // Memory pages are 4K.
+ static final long PAGE_SIZE = 4*1024;
+
+ long SECONDARY_SERVER_MEM;
+
+ final HashMap mActiveItems = new HashMap();
+
+ ActivityManager mAm;
+
+ State mState;
+
+ StringBuilder mBuilder = new StringBuilder(128);
+
+ BaseItem mCurSelected;
+
+ int mProcessBgColor;
+
+ TextView mBackgroundProcessText;
+ TextView mForegroundProcessText;
+
+ int mLastNumBackgroundProcesses = -1;
+ int mLastNumForegroundProcesses = -1;
+ long mLastBackgroundProcessMemory = -1;
+ long mLastForegroundProcessMemory = -1;
+ long mLastAvailMemory = -1;
+
+ Dialog mCurDialog;
+
+ byte[] mBuffer = new byte[1024];
+
+ class ActiveItem {
+ View mRootView;
+ BaseItem mItem;
+ ActivityManager.RunningServiceInfo mService;
+ ViewHolder mHolder;
+ long mFirstRunTime;
+
+ void updateTime(Context context) {
+ if (mItem.mIsProcess) {
+ String size = mItem.mSizeStr != null ? mItem.mSizeStr : "";
+ if (!size.equals(mItem.mCurSizeStr)) {
+ mItem.mCurSizeStr = size;
+ mHolder.size.setText(size);
+ }
+ } else {
+ if (mItem.mActiveSince >= 0) {
+ mHolder.size.setText(DateUtils.formatElapsedTime(mBuilder,
+ (SystemClock.uptimeMillis()-mFirstRunTime)/1000));
+ } else {
+ mHolder.size.setText(context.getResources().getText(
+ R.string.service_restarting));
+ }
+ }
+ }
+ }
+
+ static class BaseItem {
+ final boolean mIsProcess;
+
+ PackageItemInfo mPackageInfo;
+ CharSequence mDisplayLabel;
+ String mLabel;
+ String mDescription;
+
+ int mCurSeq;
+
+ long mActiveSince;
+ long mSize;
+ String mSizeStr;
+ String mCurSizeStr;
+ boolean mNeedDivider;
+
+ public BaseItem(boolean isProcess) {
+ mIsProcess = isProcess;
+ }
+ }
+
+ static class ServiceItem extends BaseItem {
+ ActivityManager.RunningServiceInfo mRunningService;
+ ServiceInfo mServiceInfo;
+ boolean mShownAsStarted;
+
+ public ServiceItem() {
+ super(false);
+ }
+ }
+
+ static class ProcessItem extends BaseItem {
+ final HashMap mServices
+ = new HashMap();
+ final SparseArray mDependentProcesses
+ = new SparseArray();
+
+ final int mUid;
+ final String mProcessName;
+ int mPid;
+
+ ProcessItem mClient;
+ int mLastNumDependentProcesses;
+
+ int mRunningSeq;
+ ActivityManager.RunningAppProcessInfo mRunningProcessInfo;
+
+ public ProcessItem(Context context, int uid, String processName) {
+ super(true);
+ mDescription = context.getResources().getString(
+ R.string.service_process_name, processName);
+ mUid = uid;
+ mProcessName = processName;
+ }
+
+ void ensureLabel(PackageManager pm) {
+ if (mLabel != null) {
+ return;
+ }
+
+ try {
+ ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0);
+ if (ai.uid == mUid) {
+ mDisplayLabel = ai.loadLabel(pm);
+ mLabel = mDisplayLabel.toString();
+ mPackageInfo = ai;
+ return;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+
+ // If we couldn't get information about the overall
+ // process, try to find something about the uid.
+ String[] pkgs = pm.getPackagesForUid(mUid);
+
+ // If there is one package with this uid, that is what we want.
+ if (pkgs.length == 1) {
+ try {
+ ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+ mDisplayLabel = ai.loadLabel(pm);
+ mLabel = mDisplayLabel.toString();
+ mPackageInfo = ai;
+ return;
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+
+ // If there are multiple, see if one gives us the official name
+ // for this uid.
+ for (String name : pkgs) {
+ try {
+ PackageInfo pi = pm.getPackageInfo(name, 0);
+ if (pi.sharedUserLabel != 0) {
+ CharSequence nm = pm.getText(name,
+ pi.sharedUserLabel, pi.applicationInfo);
+ if (nm != null) {
+ mDisplayLabel = nm;
+ mLabel = nm.toString();
+ mPackageInfo = pi.applicationInfo;
+ return;
+ }
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+
+ // If still don't have anything to display, just use the
+ // service info.
+ if (mServices.size() > 0) {
+ mPackageInfo = mServices.values().iterator().next()
+ .mServiceInfo.applicationInfo;
+ mDisplayLabel = mPackageInfo.loadLabel(pm);
+ mLabel = mDisplayLabel.toString();
+ return;
+ }
+
+ // Finally... whatever, just pick the first package's name.
+ try {
+ ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0);
+ mDisplayLabel = ai.loadLabel(pm);
+ mLabel = mDisplayLabel.toString();
+ mPackageInfo = ai;
+ return;
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+
+ boolean updateService(Context context,
+ ActivityManager.RunningServiceInfo service) {
+ final PackageManager pm = context.getPackageManager();
+
+ boolean changed = false;
+ ServiceItem si = mServices.get(service.service);
+ if (si == null) {
+ changed = true;
+ si = new ServiceItem();
+ si.mRunningService = service;
+ try {
+ si.mServiceInfo = pm.getServiceInfo(service.service, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ if (si.mServiceInfo != null && (si.mServiceInfo.labelRes != 0
+ || si.mServiceInfo.nonLocalizedLabel != null)) {
+ si.mDisplayLabel = si.mServiceInfo.loadLabel(pm);
+ si.mLabel = si.mDisplayLabel.toString();
+ } else {
+ si.mLabel = si.mRunningService.service.getClassName();
+ int tail = si.mLabel.lastIndexOf('.');
+ if (tail >= 0) {
+ si.mLabel = si.mLabel.substring(tail+1, si.mLabel.length());
+ }
+ si.mDisplayLabel = si.mLabel;
+ }
+ si.mPackageInfo = si.mServiceInfo.applicationInfo;
+ mServices.put(service.service, si);
+ }
+ si.mCurSeq = mCurSeq;
+ si.mRunningService = service;
+ long activeSince = service.restarting == 0 ? service.activeSince : -1;
+ if (si.mActiveSince != activeSince) {
+ si.mActiveSince = activeSince;
+ changed = true;
+ }
+ if (service.clientPackage != null && service.clientLabel != 0) {
+ if (si.mShownAsStarted) {
+ si.mShownAsStarted = false;
+ changed = true;
+ }
+ try {
+ Resources clientr = pm.getResourcesForApplication(service.clientPackage);
+ String label = clientr.getString(service.clientLabel);
+ si.mDescription = context.getResources().getString(
+ R.string.service_client_name, label);
+ } catch (PackageManager.NameNotFoundException e) {
+ si.mDescription = null;
+ }
+ } else {
+ if (!si.mShownAsStarted) {
+ si.mShownAsStarted = true;
+ changed = true;
+ }
+ si.mDescription = context.getResources().getString(
+ R.string.service_started_by_app);
+ }
+
+ return changed;
+ }
+
+ boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) {
+ mSize = ((long)mem.getTotalPss()) * 1024;
+ if (mCurSeq == curSeq) {
+ String sizeStr = Formatter.formatShortFileSize(
+ context, mSize);
+ if (!sizeStr.equals(mSizeStr)){
+ mSizeStr = sizeStr;
+ // We update this on the second tick where we update just
+ // the text in the current items, so no need to say we
+ // changed here.
+ return false;
+ }
+ }
+ return false;
+ }
+
+ boolean buildDependencyChain(Context context, PackageManager pm, int curSeq) {
+ final int NP = mDependentProcesses.size();
+ boolean changed = false;
+ for (int i=0; i dest,
+ ArrayList destProc) {
+ final int NP = mDependentProcesses.size();
+ for (int i=0; i 0) {
+ destProc.add(proc);
+ }
+ }
+ }
+ }
+
+ static class State {
+ final SparseArray> mProcesses
+ = new SparseArray>();
+ final SparseArray mActiveProcesses
+ = new SparseArray();
+
+ // Temporary for finding process dependencies.
+ final SparseArray mRunningProcesses
+ = new SparseArray();
+
+ final ArrayList mItems = new ArrayList();
+ final ArrayList mProcessItems = new ArrayList();
+ final ArrayList mAllProcessItems = new ArrayList();
+
+ int mSequence = 0;
+
+ int mNumBackgroundProcesses;
+ long mBackgroundProcessMemory;
+ int mNumForegroundProcesses;
+ long mForegroundProcessMemory;
+
+ boolean update(Context context, ActivityManager am) {
+ final PackageManager pm = context.getPackageManager();
+
+ mSequence++;
+
+ boolean changed = false;
+
+ List services
+ = am.getRunningServices(MAX_SERVICES);
+ final int NS = services != null ? services.size() : 0;
+ for (int i=0; i procs = mProcesses.get(si.uid);
+ if (procs == null) {
+ procs = new HashMap();
+ mProcesses.put(si.uid, procs);
+ }
+ ProcessItem proc = procs.get(si.process);
+ if (proc == null) {
+ changed = true;
+ proc = new ProcessItem(context, si.uid, si.process);
+ procs.put(si.process, proc);
+ }
+
+ if (proc.mCurSeq != mSequence) {
+ int pid = si.restarting == 0 ? si.pid : 0;
+ if (pid != proc.mPid) {
+ changed = true;
+ if (proc.mPid != pid) {
+ if (proc.mPid != 0) {
+ mActiveProcesses.remove(proc.mPid);
+ }
+ if (pid != 0) {
+ mActiveProcesses.put(pid, proc);
+ }
+ proc.mPid = pid;
+ }
+ }
+ proc.mDependentProcesses.clear();
+ proc.mCurSeq = mSequence;
+ }
+ changed |= proc.updateService(context, si);
+ }
+
+ // Now update the map of other processes that are running (but
+ // don't have services actively running inside them).
+ List processes
+ = am.getRunningAppProcesses();
+ final int NP = processes != null ? processes.size() : 0;
+ for (int i=0; i procs = mProcesses.valueAt(i);
+ Iterator pit = procs.values().iterator();
+ while (pit.hasNext()) {
+ ProcessItem pi = pit.next();
+ if (pi.mCurSeq == mSequence) {
+ pi.ensureLabel(pm);
+ if (pi.mPid == 0) {
+ // Sanity: a non-process can't be dependent on
+ // anything.
+ pi.mDependentProcesses.clear();
+ }
+ } else {
+ changed = true;
+ pit.remove();
+ if (procs.size() == 0) {
+ mProcesses.remove(mProcesses.keyAt(i));
+ }
+ if (pi.mPid != 0) {
+ mActiveProcesses.remove(pi.mPid);
+ }
+ continue;
+ }
+ Iterator sit = pi.mServices.values().iterator();
+ while (sit.hasNext()) {
+ ServiceItem si = sit.next();
+ if (si.mCurSeq != mSequence) {
+ changed = true;
+ sit.remove();
+ }
+ }
+ }
+ }
+
+ if (changed) {
+ mItems.clear();
+ mProcessItems.clear();
+ for (int i=0; i 0) {
+ mProcessItems.add(pi);
+ }
+ // And finally the services running in it.
+ boolean needDivider = false;
+ for (ServiceItem si : pi.mServices.values()) {
+ si.mNeedDivider = needDivider;
+ needDivider = true;
+ mItems.add(si);
+ }
+ }
+ }
+ }
+
+ // Count number of interesting other (non-active) processes, and
+ // build a list of all processes we will retrieve memory for.
+ mAllProcessItems.clear();
+ mAllProcessItems.addAll(mProcessItems);
+ mNumBackgroundProcesses = 0;
+ mNumForegroundProcesses = 0;
+ NRP = mRunningProcesses.size();
+ for (int i=0; i=
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
+ mNumBackgroundProcesses++;
+ mAllProcessItems.add(proc);
+ } else if (proc.mRunningProcessInfo.importance <=
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+ mNumForegroundProcesses++;
+ mAllProcessItems.add(proc);
+ }
+ }
+ }
+
+ try {
+ mBackgroundProcessMemory = 0;
+ mForegroundProcessMemory = 0;
+ final int numProc = mAllProcessItems.size();
+ int[] pids = new int[numProc];
+ for (int i=0; i=0; i--) {
+ ProcessItem proc = mAllProcessItems.get(i);
+ changed |= proc.updateSize(context, mem[i], mSequence);
+ if (proc.mCurSeq == mSequence) {
+ continue;
+ }
+ if (proc.mRunningProcessInfo.importance >=
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
+ mBackgroundProcessMemory += proc.mSize;
+ } else if (proc.mRunningProcessInfo.importance <=
+ ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
+ mForegroundProcessMemory += proc.mSize;
+ }
+ }
+ } catch (RemoteException e) {
+ }
+
+ return changed;
+ }
+ }
+
+ static class TimeTicker extends TextView {
+ public TimeTicker(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+ }
+
+ static class ViewHolder {
+ ImageView separator;
+ ImageView icon;
+ TextView name;
+ TextView description;
+ TextView size;
+ }
+
+ class ServiceListAdapter extends BaseAdapter {
+ final State mState;
+ final LayoutInflater mInflater;
+
+ ServiceListAdapter(State state) {
+ mState = state;
+ mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ }
+
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ public int getCount() {
+ return mState.mItems.size();
+ }
+
+ public Object getItem(int position) {
+ return mState.mItems.get(position);
+ }
+
+ public long getItemId(int position) {
+ return position;
+ }
+
+ public boolean areAllItemsEnabled() {
+ return false;
+ }
+
+ public boolean isEnabled(int position) {
+ return !mState.mItems.get(position).mIsProcess;
+ }
+
+ public View getView(int position, View convertView, ViewGroup parent) {
+ View v;
+ if (convertView == null) {
+ v = newView(parent);
+ } else {
+ v = convertView;
+ }
+ bindView(v, position);
+ return v;
+ }
+
+ public View newView(ViewGroup parent) {
+ View v = mInflater.inflate(R.layout.running_services_item, parent, false);
+ ViewHolder h = new ViewHolder();
+ h.separator = (ImageView)v.findViewById(R.id.separator);
+ h.icon = (ImageView)v.findViewById(R.id.icon);
+ h.name = (TextView)v.findViewById(R.id.name);
+ h.description = (TextView)v.findViewById(R.id.description);
+ h.size = (TextView)v.findViewById(R.id.size);
+ v.setTag(h);
+ return v;
+ }
+
+ public void bindView(View view, int position) {
+ ViewHolder vh = (ViewHolder) view.getTag();
+ BaseItem item = mState.mItems.get(position);
+ vh.name.setText(item.mDisplayLabel);
+ vh.separator.setVisibility(item.mNeedDivider
+ ? View.VISIBLE : View.INVISIBLE);
+ ActiveItem ai = new ActiveItem();
+ ai.mRootView = view;
+ ai.mItem = item;
+ ai.mHolder = vh;
+ ai.mFirstRunTime = item.mActiveSince;
+ vh.description.setText(item.mDescription);
+ if (item.mIsProcess) {
+ view.setBackgroundColor(mProcessBgColor);
+ vh.icon.setImageDrawable(null);
+ vh.icon.setVisibility(View.GONE);
+ vh.description.setText(item.mDescription);
+ item.mCurSizeStr = null;
+ } else {
+ view.setBackgroundDrawable(null);
+ vh.icon.setImageDrawable(item.mPackageInfo.loadIcon(getPackageManager()));
+ vh.icon.setVisibility(View.VISIBLE);
+ vh.description.setText(item.mDescription);
+ ai.mFirstRunTime = item.mActiveSince;
+ }
+ ai.updateTime(RunningServices.this);
+ mActiveItems.put(view, ai);
+ }
+ }
+
+ final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_UPDATE_TIMES:
+ Iterator it = mActiveItems.values().iterator();
+ while (it.hasNext()) {
+ ActiveItem ai = it.next();
+ if (ai.mRootView.getWindowToken() == null) {
+ // Clean out any dead views, just in case.
+ it.remove();
+ continue;
+ }
+ ai.updateTime(RunningServices.this);
+ }
+ removeMessages(MSG_UPDATE_TIMES);
+ msg = obtainMessage(MSG_UPDATE_TIMES);
+ sendMessageDelayed(msg, TIME_UPDATE_DELAY);
+ break;
+ case MSG_UPDATE_CONTENTS:
+ updateList();
+ removeMessages(MSG_UPDATE_CONTENTS);
+ msg = obtainMessage(MSG_UPDATE_CONTENTS);
+ sendMessageDelayed(msg, CONTENTS_UPDATE_DELAY);
+ break;
+ }
+ }
+ };
+
+ private boolean matchText(byte[] buffer, int index, String text) {
+ int N = text.length();
+ if ((index+N) >= buffer.length) {
+ return false;
+ }
+ for (int i=0; i= '0' && buffer[index] <= '9') {
+ int start = index;
+ index++;
+ while (index < buffer.length && buffer[index] >= '0'
+ && buffer[index] <= '9') {
+ index++;
+ }
+ String str = new String(buffer, 0, start, index-start);
+ return ((long)Integer.parseInt(str)) * 1024;
+ }
+ index++;
+ }
+ return 0;
+ }
+
+ private long readAvailMem() {
+ try {
+ long memFree = 0;
+ long memCached = 0;
+ FileInputStream is = new FileInputStream("/proc/meminfo");
+ int len = is.read(mBuffer);
+ is.close();
+ final int BUFLEN = mBuffer.length;
+ for (int i=0; i 3) {
+ showError(dialog, R.string.credentials_wrong_password);
+ } else if (count == 1) {
+ showError(dialog, R.string.credentials_reset_warning);
+ } else {
+ showError(dialog, R.string.credentials_reset_warning_plural, count);
}
-
return true;
}
- // returns true if the password is long enough and does not contain
- // characters that we don't like
- private boolean verifyPassword(String passwd) {
- if (passwd == null) {
- showError(R.string.cstor_passwords_empty_error);
- return false;
- } else if ((passwd.length() < CSTOR_MIN_PASSWORD_LENGTH)
- || passwd.contains(" ")) {
- showError(R.string.cstor_password_verification_error);
- return false;
- } else {
- return true;
- }
+ private String getText(Dialog dialog, int viewId) {
+ TextView view = (TextView) dialog.findViewById(viewId);
+ return (view == null || view.getVisibility() == View.GONE) ? null :
+ view.getText().toString();
}
- // returns true if the password is ok
- private boolean checkUnlockPassword(Dialog d) {
- hideError();
-
- String passwd = getText(R.id.cstor_password);
- if (TextUtils.isEmpty(passwd)) {
- showError(R.string.cstor_password_empty_error);
- return false;
- }
-
- int count = unlockCstor(passwd);
- if (count > 0) {
- showResetWarning(count);
- return false;
- } else {
- // done or reset
- return true;
- }
- }
-
- // returns true if the passwords are ok
- private boolean checkPasswords(Dialog d) {
- hideError();
-
- String oldPasswd = getText(R.id.cstor_old_password);
- String newPasswd = getText(R.id.cstor_new_password);
- String confirmPasswd = getText(R.id.cstor_confirm_password);
-
- if ((mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG)
- && TextUtils.isEmpty(oldPasswd)) {
- showError(R.string.cstor_password_empty_error);
- return false;
- }
-
- if (TextUtils.isEmpty(newPasswd)
- && TextUtils.isEmpty(confirmPasswd)) {
- showError(R.string.cstor_passwords_empty_error);
- return false;
- }
-
- if (!verifyPassword(newPasswd)) {
- return false;
- } else if (!newPasswd.equals(confirmPasswd)) {
- showError(R.string.cstor_passwords_error);
- return false;
- }
-
- if (mDialogId == CSTOR_CHANGE_PASSWORD_DIALOG) {
- int count = changeCstorPassword(oldPasswd, newPasswd);
- if (count > 0) {
- showResetWarning(count);
- return false;
+ private void showError(Dialog dialog, int stringId, Object... formatArgs) {
+ TextView view = (TextView) dialog.findViewById(R.id.error);
+ if (view != null) {
+ if (formatArgs == null || formatArgs.length == 0) {
+ view.setText(stringId);
} else {
- // done or reset
- return true;
+ view.setText(dialog.getContext().getString(stringId, formatArgs));
}
- } else {
- initCstor(newPasswd);
- return true;
+ view.setVisibility(View.VISIBLE);
}
}
- private TextView showError(int messageId) {
- TextView v = (TextView) mView.findViewById(R.id.cstor_error);
- v.setText(messageId);
- if (v != null) v.setVisibility(View.VISIBLE);
- return v;
+ private void createPreferences(PreferenceCategory category) {
+ mAccessCheckBox = new CheckBoxPreference(SecuritySettings.this);
+ mAccessCheckBox.setTitle(R.string.credentials_access);
+ mAccessCheckBox.setSummary(R.string.credentials_access_summary);
+ mAccessCheckBox.setOnPreferenceChangeListener(this);
+ category.addPreference(mAccessCheckBox);
+
+ mInstallButton = new Preference(SecuritySettings.this);
+ mInstallButton.setTitle(R.string.credentials_install_certificates);
+ mInstallButton.setSummary(R.string.credentials_install_certificates_summary);
+ mInstallButton.setOnPreferenceClickListener(this);
+ category.addPreference(mInstallButton);
+
+ mPasswordButton = new Preference(SecuritySettings.this);
+ mPasswordButton.setTitle(R.string.credentials_set_password);
+ mPasswordButton.setSummary(R.string.credentials_set_password_summary);
+ mPasswordButton.setOnPreferenceClickListener(this);
+ category.addPreference(mPasswordButton);
+
+ mResetButton = new Preference(SecuritySettings.this);
+ mResetButton.setTitle(R.string.credentials_reset);
+ mResetButton.setSummary(R.string.credentials_reset_summary);
+ mResetButton.setOnPreferenceClickListener(this);
+ category.addPreference(mResetButton);
}
- private void hide(int viewId) {
- View v = mView.findViewById(viewId);
- if (v != null) v.setVisibility(View.GONE);
- }
+ private void updatePreferences(int state) {
+ mAccessCheckBox.setEnabled(state != KeyStore.UNINITIALIZED);
+ mAccessCheckBox.setChecked(state == KeyStore.NO_ERROR);
+ mResetButton.setEnabled(state != KeyStore.UNINITIALIZED);
- private void hideError() {
- hide(R.id.cstor_error);
- }
-
- private String getText(int viewId) {
- return ((TextView) mView.findViewById(viewId)).getText().toString();
- }
-
- private void setText(int viewId, String text) {
- TextView v = (TextView) mView.findViewById(viewId);
- if (v != null) v.setText(text);
- }
-
- private void setText(int viewId, int textId) {
- TextView v = (TextView) mView.findViewById(viewId);
- if (v != null) v.setText(textId);
- }
-
- private void enablePreferences(boolean enabled) {
- mAccessCheckBox.setEnabled(enabled);
- mResetButton.setEnabled(enabled);
- }
-
- private Preference createAccessCheckBox(int state) {
- CheckBoxPreference pref = new CheckBoxPreference(
- SecuritySettings.this);
- pref.setTitle(R.string.cstor_access_title);
- pref.setSummary(R.string.cstor_access_summary);
- pref.setEnabled(state != Keystore.UNINITIALIZED);
- pref.setChecked(state == Keystore.UNLOCKED);
- pref.setOnPreferenceChangeListener(
- new Preference.OnPreferenceChangeListener() {
- public boolean onPreferenceChange(
- Preference pref, Object value) {
- if (((Boolean) value)) {
- showCstorDialog(CSTOR_UNLOCK_DIALOG);
- } else {
- lockCstor();
- }
- return true;
- }
- });
- mAccessCheckBox = pref;
- return pref;
- }
-
- private Preference createSetPasswordPreference() {
- Preference pref = new Preference(SecuritySettings.this);
- pref.setTitle(R.string.cstor_set_passwd_title);
- pref.setSummary(R.string.cstor_set_passwd_summary);
- pref.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference pref) {
- showCstorDialog(isCstorInitialized()
- ? CSTOR_CHANGE_PASSWORD_DIALOG
- : CSTOR_INIT_DIALOG);
- return true;
- }
- });
- return pref;
- }
-
- private Preference createResetPreference(int state) {
- Preference pref = new Preference(SecuritySettings.this);
- pref.setTitle(R.string.cstor_reset_title);
- pref.setSummary(R.string.cstor_reset_summary);
- pref.setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(Preference pref) {
- showCstorDialog(CSTOR_RESET_DIALOG);
- return true;
- }
- });
- pref.setEnabled(state != Keystore.UNINITIALIZED);
- mResetButton = pref;
- return pref;
+ // Show a toast message if the state is changed.
+ if (mState == state) {
+ return;
+ } else if (state == KeyStore.NO_ERROR) {
+ Toast.makeText(SecuritySettings.this, R.string.credentials_enabled,
+ Toast.LENGTH_SHORT).show();
+ } else if (state == KeyStore.UNINITIALIZED) {
+ Toast.makeText(SecuritySettings.this, R.string.credentials_erased,
+ Toast.LENGTH_SHORT).show();
+ } else if (state == KeyStore.LOCKED) {
+ Toast.makeText(SecuritySettings.this, R.string.credentials_disabled,
+ Toast.LENGTH_SHORT).show();
+ }
+ mState = state;
}
private Dialog createUnlockDialog() {
- mView = View.inflate(SecuritySettings.this,
- R.layout.cstor_unlock_dialog_view, null);
- hideError();
+ View view = View.inflate(SecuritySettings.this,
+ R.layout.credentials_unlock_dialog, null);
// show extra hint only when the action comes from outside
- if ((mSpecialIntent == null)
- && (mCstorAddCredentialHelper == null)) {
- hide(R.id.cstor_access_dialog_hint_from_action);
+ if (mExternalIntent != null) {
+ view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
}
- Dialog d = new AlertDialog.Builder(SecuritySettings.this)
- .setView(mView)
- .setTitle(R.string.cstor_access_dialog_title)
+ Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
+ .setView(view)
+ .setTitle(R.string.credentials_unlock)
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
.create();
- d.setOnDismissListener(this);
- return d;
+ dialog.setOnDismissListener(this);
+ return dialog;
}
- private Dialog createSetPasswordDialog(int id) {
- mView = View.inflate(SecuritySettings.this,
- R.layout.cstor_set_password_dialog_view, null);
- hideError();
+ private Dialog createPasswordDialog() {
+ View view = View.inflate(SecuritySettings.this,
+ R.layout.credentials_password_dialog, null);
- // show extra hint only when the action comes from outside
- if ((mSpecialIntent != null)
- || (mCstorAddCredentialHelper != null)) {
- setText(R.id.cstor_first_time_hint,
- R.string.cstor_first_time_hint_from_action);
+ if (mState == KeyStore.UNINITIALIZED) {
+ view.findViewById(R.id.hint).setVisibility(View.VISIBLE);
+ } else {
+ view.findViewById(R.id.old_password_prompt).setVisibility(View.VISIBLE);
+ view.findViewById(R.id.old_password).setVisibility(View.VISIBLE);
}
- switch (id) {
- case CSTOR_INIT_DIALOG:
- mView.findViewById(R.id.cstor_old_password_block)
- .setVisibility(View.GONE);
- break;
-
- case CSTOR_CHANGE_PASSWORD_DIALOG:
- mView.findViewById(R.id.cstor_first_time_hint)
- .setVisibility(View.GONE);
- break;
-
- default:
- throw new RuntimeException(
- "Unknown dialog id: " + mDialogId);
- }
-
- Dialog d = new AlertDialog.Builder(SecuritySettings.this)
- .setView(mView)
- .setTitle(R.string.cstor_set_passwd_dialog_title)
+ Dialog dialog = new AlertDialog.Builder(SecuritySettings.this)
+ .setView(view)
+ .setTitle(R.string.credentials_set_password)
.setPositiveButton(android.R.string.ok, this)
.setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
.create();
- d.setOnDismissListener(this);
- return d;
+ dialog.setOnDismissListener(this);
+ return dialog;
}
private Dialog createResetDialog() {
return new AlertDialog.Builder(SecuritySettings.this)
.setTitle(android.R.string.dialog_alert_title)
.setIcon(android.R.drawable.ic_dialog_alert)
- .setMessage(R.string.cstor_reset_hint)
- .setPositiveButton(getString(android.R.string.ok), this)
+ .setMessage(R.string.credentials_reset_hint)
+ .setNeutralButton(getString(android.R.string.ok), this)
.setNegativeButton(getString(android.R.string.cancel), this)
.create();
}
-
- private Dialog createNameCredentialDialog() {
- mView = View.inflate(SecuritySettings.this,
- R.layout.cstor_name_credential_dialog_view, null);
- if (mCstorAddCredentialHelper != null) {
- mCstorAddCredentialHelper.mView = mView;
- }
-
- hideError();
- if (!mCstorAddCredentialHelper.isPkcs12Keystore()) {
- hide(R.id.cstor_credential_password_container);
- }
-
- setText(R.id.cstor_credential_name_title,
- R.string.cstor_credential_name);
- setText(R.id.cstor_credential_info_title,
- R.string.cstor_credential_info);
- setText(R.id.cstor_credential_info,
- mCstorAddCredentialHelper.getDescription().toString());
-
- Dialog d = new AlertDialog.Builder(SecuritySettings.this)
- .setView(mView)
- .setTitle(R.string.cstor_name_credential_dialog_title)
- .setPositiveButton(android.R.string.ok, this)
- .setNegativeButton(android.R.string.cancel, this)
- .setOnCancelListener(this)
- .create();
- d.setOnDismissListener(this);
- return d;
- }
- }
-
- private class CstorAddCredentialHelper {
- private String mTypeName;
- private List mItemList;
- private List mNamespaceList;
- private String mDescription;
- private String mName;
- private String mPassword;
- private View mView;
-
- CstorAddCredentialHelper(Intent intent) {
- parse(intent);
- }
-
- String getTypeName() {
- return mTypeName;
- }
-
- boolean isPkcs12Keystore() {
- return CertTool.TITLE_PKCS12_KEYSTORE.equals(mTypeName);
- }
-
- CharSequence getDescription() {
- return Html.fromHtml(mDescription);
- }
-
- void setName(String name) {
- mName = name;
- }
-
- String getName() {
- return mName;
- }
-
- void setPassword(String password) {
- mPassword = password;
- }
-
- String getPassword() {
- return mPassword;
- }
-
- int saveToStorage() {
- if (isPkcs12Keystore()) {
- return CertTool.getInstance().addPkcs12Keystore(
- mItemList.get(0), mPassword, mName);
- } else {
- Keystore ks = Keystore.getInstance();
- for (int i = 0, count = mItemList.size(); i < count; i++) {
- byte[] blob = mItemList.get(i);
- int ret = ks.put(mNamespaceList.get(i), mName,
- new String(blob));
- if (ret != 0) return ret;
- }
- }
- return 0;
- }
-
- private void parse(Intent intent) {
- mTypeName = intent.getStringExtra(KEY_CSTOR_TYPE_NAME);
- mItemList = new ArrayList();
- mNamespaceList = new ArrayList();
- for (int i = 0; ; i++) {
- byte[] blob = intent.getByteArrayExtra(KEY_CSTOR_ITEM + i);
- if (blob == null) break;
- mItemList.add(blob);
- mNamespaceList.add(intent.getStringExtra(
- KEY_CSTOR_NAMESPACE + i));
- }
-
- // build description string
- StringBuilder sb = new StringBuilder();
- for (int i = 0; ; i++) {
- String s = intent.getStringExtra(KEY_CSTOR_DESCRIPTION + i);
- if (s == null) break;
- sb.append(s).append(" ");
- }
- mDescription = sb.toString();
- }
}
}
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 4f888ff2375..c0a86135770 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -20,6 +20,7 @@ import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceGroup;
import android.provider.Settings.System;
+import android.telephony.TelephonyManager;
public class Settings extends PreferenceActivity {
@@ -34,6 +35,8 @@ public class Settings extends PreferenceActivity {
addPreferencesFromResource(R.xml.settings);
+ int activePhoneType = TelephonyManager.getDefault().getPhoneType();
+
PreferenceGroup parent = (PreferenceGroup) findPreference(KEY_PARENT);
Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SYNC_SETTINGS, 0);
Utils.updatePreferenceToSpecificActivityOrRemove(this, parent, KEY_SEARCH_SETTINGS, 0);
diff --git a/src/com/android/settings/SettingsSafetyLegalActivity.java b/src/com/android/settings/SettingsSafetyLegalActivity.java
new file mode 100644
index 00000000000..619dc945f67
--- /dev/null
+++ b/src/com/android/settings/SettingsSafetyLegalActivity.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import android.content.DialogInterface;
+
+/**
+ * The "dialog" that shows from "Safety information" in the Settings app.
+ */
+public class SettingsSafetyLegalActivity extends AlertActivity
+ implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener {
+ private static final String PROPERTY_LSAFETYLEGAL_URL = "ro.url.safetylegal";
+
+ private WebView mWebView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ String userSafetylegalUrl = SystemProperties.get(PROPERTY_LSAFETYLEGAL_URL);
+
+ final Configuration configuration = getResources().getConfiguration();
+ final String language = configuration.locale.getLanguage();
+ final String country = configuration.locale.getCountry();
+
+ String loc = String.format("locale=%s-%s", language, country);
+
+ userSafetylegalUrl = String.format("%s&%s", userSafetylegalUrl, loc);
+
+ mWebView = new WebView(this);
+
+ // Begin accessing
+ mWebView.getSettings().setJavaScriptEnabled(true);
+ mWebView.loadUrl(userSafetylegalUrl);
+ mWebView.setWebViewClient(new WebViewClient() {
+ @Override
+ public void onPageFinished(WebView view, String url) {
+ // Change from 'Loading...' to the real title
+ mAlert.setTitle(getString(R.string.settings_safetylegal_activity_title));
+ }
+
+ @Override
+ public void onReceivedError(WebView view, int errorCode,
+ String description, String failingUrl) {
+ showErrorAndFinish(failingUrl);
+ }
+ });
+
+ final AlertController.AlertParams p = mAlertParams;
+ p.mTitle = getString(R.string.settings_safetylegal_activity_loading);
+ p.mView = mWebView;
+ p.mForceInverseBackground = true;
+ setupAlert();
+ }
+
+ private void showErrorAndFinish(String url) {
+ new AlertDialog.Builder(this)
+ .setMessage(getResources()
+ .getString(R.string.settings_safetylegal_activity_unreachable, url))
+ .setTitle(R.string.settings_safetylegal_activity_title)
+ .setPositiveButton(android.R.string.ok, this)
+ .setOnCancelListener(this)
+ .setCancelable(true)
+ .show();
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
+ && event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (mWebView.canGoBack()) {
+ mWebView.goBack();
+ return true;
+ }
+ }
+ return super.dispatchKeyEvent(event);
+ }
+
+ public void onClick(DialogInterface dialog, int whichButton) {
+ finish();
+ }
+
+ public void onCancel(DialogInterface dialog) {
+ finish();
+ }
+}
diff --git a/src/com/android/settings/SoundAndDisplaySettings.java b/src/com/android/settings/SoundAndDisplaySettings.java
index 4417f240c33..92297de9180 100644
--- a/src/com/android/settings/SoundAndDisplaySettings.java
+++ b/src/com/android/settings/SoundAndDisplaySettings.java
@@ -52,6 +52,7 @@ public class SoundAndDisplaySettings extends PreferenceActivity implements
private static final String KEY_SCREEN_TIMEOUT = "screen_timeout";
private static final String KEY_DTMF_TONE = "dtmf_tone";
private static final String KEY_SOUND_EFFECTS = "sound_effects";
+ private static final String KEY_HAPTIC_FEEDBACK = "haptic_feedback";
private static final String KEY_ANIMATIONS = "animations";
private static final String KEY_ACCELEROMETER = "accelerometer";
private static final String KEY_PLAY_MEDIA_NOTIFICATION_SOUNDS = "play_media_notification_sounds";
@@ -73,7 +74,8 @@ public class SoundAndDisplaySettings extends PreferenceActivity implements
private CheckBoxPreference mVibrate;
private CheckBoxPreference mDtmfTone;
private CheckBoxPreference mSoundEffects;
- private CheckBoxPreference mAnimations;
+ private CheckBoxPreference mHapticFeedback;
+ private ListPreference mAnimations;
private CheckBoxPreference mAccelerometer;
private float[] mAnimationScales;
@@ -118,8 +120,12 @@ public class SoundAndDisplaySettings extends PreferenceActivity implements
mSoundEffects.setPersistent(false);
mSoundEffects.setChecked(Settings.System.getInt(resolver,
Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
- mAnimations = (CheckBoxPreference) findPreference(KEY_ANIMATIONS);
- mAnimations.setPersistent(false);
+ mHapticFeedback = (CheckBoxPreference) findPreference(KEY_HAPTIC_FEEDBACK);
+ mHapticFeedback.setPersistent(false);
+ mHapticFeedback.setChecked(Settings.System.getInt(resolver,
+ Settings.System.HAPTIC_FEEDBACK_ENABLED, 0) != 0);
+ mAnimations = (ListPreference) findPreference(KEY_ANIMATIONS);
+ mAnimations.setOnPreferenceChangeListener(this);
mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
mAccelerometer.setPersistent(false);
@@ -187,29 +193,49 @@ public class SoundAndDisplaySettings extends PreferenceActivity implements
R.string.silent_mode_incl_alarm_summary :
R.string.silent_mode_summary);
- boolean animations = true;
+ int animations = 0;
try {
mAnimationScales = mWindowManager.getAnimationScales();
} catch (RemoteException e) {
}
if (mAnimationScales != null) {
- // We will leave the window animations alone (always set),
- // and only use this to change the transition animations.
- for (int i=1; i= 1) {
+ animations = ((int)(mAnimationScales[0]+.5f)) % 10;
+ }
+ if (mAnimationScales.length >= 2) {
+ animations += (((int)(mAnimationScales[1]+.5f)) & 0x7) * 10;
}
}
- if (animations != mAnimations.isChecked() || force) {
- mAnimations.setChecked(animations);
+ int idx = 0;
+ int best = 0;
+ CharSequence[] aents = mAnimations.getEntryValues();
+ for (int i=0; i best) {
+ best = val;
+ idx = i;
+ }
}
+ mAnimations.setValueIndex(idx);
+ updateAnimationsSummary(mAnimations.getValue());
mAccelerometer.setChecked(Settings.System.getInt(
getContentResolver(),
Settings.System.ACCELEROMETER_ROTATION, 0) != 0);
}
+ private void updateAnimationsSummary(Object value) {
+ CharSequence[] summaries = getResources().getTextArray(R.array.animations_summaries);
+ CharSequence[] values = mAnimations.getEntryValues();
+ for (int i=0; i 0) {
- // Window animations are always on.
- mAnimationScales[0] = 1;
- }
- for (int i=1; i= 1) {
+ mAnimationScales[0] = value%10;
+ }
+ if (mAnimationScales.length >= 2) {
+ mAnimationScales[1] = (value/10)%10;
+ }
+ try {
+ mWindowManager.setAnimationScales(mAnimationScales);
+ } catch (RemoteException e) {
+ }
+ updateAnimationsSummary(objValue);
+ } catch (NumberFormatException e) {
+ Log.e(TAG, "could not persist animation setting", e);
+ }
+
+ }
if (KEY_SCREEN_TIMEOUT.equals(preference.getKey())) {
int value = Integer.parseInt((String) objValue);
try {
diff --git a/src/com/android/settings/TextToSpeechSettings.java b/src/com/android/settings/TextToSpeechSettings.java
index d3d59fa2605..f60d0f25d5b 100644
--- a/src/com/android/settings/TextToSpeechSettings.java
+++ b/src/com/android/settings/TextToSpeechSettings.java
@@ -55,6 +55,10 @@ public class TextToSpeechSettings extends PreferenceActivity implements
private static final String KEY_TTS_DEFAULT_LANG = "tts_default_lang";
private static final String KEY_TTS_DEFAULT_COUNTRY = "tts_default_country";
private static final String KEY_TTS_DEFAULT_VARIANT = "tts_default_variant";
+ // TODO move default Locale values to TextToSpeech.Engine
+ private static final String DEFAULT_LANG_VAL = "eng";
+ private static final String DEFAULT_COUNTRY_VAL = "USA";
+ private static final String DEFAULT_VARIANT_VAL = "";
private static final String LOCALE_DELIMITER = "-";
@@ -70,6 +74,12 @@ public class TextToSpeechSettings extends PreferenceActivity implements
private String mDefaultCountry = null;
private String mDefaultLocVariant = null;
private String mDefaultEng = "";
+ private int mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
+
+ // Array of strings used to demonstrate TTS in the different languages.
+ private String[] mDemoStrings;
+ // Index of the current string to use for the demo.
+ private int mDemoStringIndex = 0;
private boolean mEnableDemo = false;
@@ -80,11 +90,6 @@ public class TextToSpeechSettings extends PreferenceActivity implements
* startActivityForResult.
*/
private static final int VOICE_DATA_INTEGRITY_CHECK = 1977;
- /**
- * Request code (arbitrary value) for voice data installation through
- * startActivityForResult.
- */
- private static final int VOICE_DATA_INSTALLATION = 1980;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -92,6 +97,8 @@ public class TextToSpeechSettings extends PreferenceActivity implements
addPreferencesFromResource(R.xml.tts_settings);
+ mDemoStrings = getResources().getStringArray(R.array.tts_demo_strings);
+
setVolumeControlStream(TextToSpeech.Engine.DEFAULT_STREAM);
mEnableDemo = false;
@@ -132,21 +139,21 @@ public class TextToSpeechSettings extends PreferenceActivity implements
private void initDefaultSettings() {
ContentResolver resolver = getContentResolver();
- int intVal = 0;
// Find the default TTS values in the settings, initialize and store the
// settings if they are not found.
// "Use Defaults"
+ int useDefault = 0;
mUseDefaultPref = (CheckBoxPreference) findPreference(KEY_TTS_USE_DEFAULT);
try {
- intVal = Settings.Secure.getInt(resolver, TTS_USE_DEFAULTS);
+ useDefault = Settings.Secure.getInt(resolver, TTS_USE_DEFAULTS);
} catch (SettingNotFoundException e) {
// "use default" setting not found, initialize it
- intVal = TextToSpeech.Engine.USE_DEFAULTS;
- Settings.Secure.putInt(resolver, TTS_USE_DEFAULTS, intVal);
+ useDefault = TextToSpeech.Engine.USE_DEFAULTS;
+ Settings.Secure.putInt(resolver, TTS_USE_DEFAULTS, useDefault);
}
- mUseDefaultPref.setChecked(intVal == 1);
+ mUseDefaultPref.setChecked(useDefault == 1);
mUseDefaultPref.setOnPreferenceChangeListener(this);
// Default engine
@@ -161,59 +168,19 @@ public class TextToSpeechSettings extends PreferenceActivity implements
// Default rate
mDefaultRatePref = (ListPreference) findPreference(KEY_TTS_DEFAULT_RATE);
try {
- intVal = Settings.Secure.getInt(resolver, TTS_DEFAULT_RATE);
+ mDefaultRate = Settings.Secure.getInt(resolver, TTS_DEFAULT_RATE);
} catch (SettingNotFoundException e) {
// default rate setting not found, initialize it
- intVal = TextToSpeech.Engine.DEFAULT_RATE;
- Settings.Secure.putInt(resolver, TTS_DEFAULT_RATE, intVal);
+ mDefaultRate = TextToSpeech.Engine.DEFAULT_RATE;
+ Settings.Secure.putInt(resolver, TTS_DEFAULT_RATE, mDefaultRate);
}
- mDefaultRatePref.setValue(String.valueOf(intVal));
+ mDefaultRatePref.setValue(String.valueOf(mDefaultRate));
mDefaultRatePref.setOnPreferenceChangeListener(this);
// Default language / country / variant : these three values map to a single ListPref
// representing the matching Locale
- String language = null;
- String country = null;
- String variant = null;
mDefaultLocPref = (ListPreference) findPreference(KEY_TTS_DEFAULT_LANG);
- language = Settings.Secure.getString(resolver, TTS_DEFAULT_LANG);
- if (language == null) {
- // the default language property isn't set, use that of the current locale
- Locale currentLocale = Locale.getDefault();
- language = currentLocale.getISO3Language();
- country = currentLocale.getISO3Country();
- variant = currentLocale.getVariant();
- Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, language);
- Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, country);
- Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, variant);
- }
- mDefaultLanguage = language;
- if (country == null) {
- // country wasn't initialized yet because a default language was found
- country = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_COUNTRY);
- if (country == null) {
- // default country setting not found, initialize it, as well as the variant;
- Locale currentLocale = Locale.getDefault();
- country = currentLocale.getISO3Country();
- variant = currentLocale.getVariant();
- Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, country);
- Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, variant);
- }
- }
- mDefaultCountry = country;
- if (variant == null) {
- // variant wasn't initialized yet because a default country was found
- variant = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_VARIANT);
- if (variant == null) {
- // default variant setting not found, initialize it
- Locale currentLocale = Locale.getDefault();
- variant = currentLocale.getVariant();
- Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, variant);
- }
- }
- mDefaultLocVariant = variant;
-
- setDefaultLocalePref(language, country, variant);
+ initDefaultLang();
mDefaultLocPref.setOnPreferenceChangeListener(this);
}
@@ -246,13 +213,14 @@ public class TextToSpeechSettings extends PreferenceActivity implements
PackageManager pm = getPackageManager();
Intent intent = new Intent();
intent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
List resolveInfos = pm.queryIntentActivities(intent, 0);
// query only the package that matches that of the default engine
for (int i = 0; i < resolveInfos.size(); i++) {
ActivityInfo currentActivityInfo = resolveInfos.get(i).activityInfo;
if (mDefaultEng.equals(currentActivityInfo.packageName)) {
intent.setClassName(mDefaultEng, currentActivityInfo.name);
- this.startActivityForResult(intent, VOICE_DATA_INSTALLATION);
+ this.startActivity(intent);
}
}
}
@@ -265,6 +233,8 @@ public class TextToSpeechSettings extends PreferenceActivity implements
if (status == TextToSpeech.SUCCESS) {
Log.v(TAG, "TTS engine for settings screen initialized.");
mEnableDemo = true;
+ mTts.setLanguage(new Locale(mDefaultLanguage, mDefaultCountry));
+ mTts.setSpeechRate((float)(mDefaultRate/100.0f));
} else {
Log.v(TAG, "TTS engine for settings screen failed to initialize successfully.");
mEnableDemo = false;
@@ -282,7 +252,6 @@ public class TextToSpeechSettings extends PreferenceActivity implements
Log.v(TAG, "Voice data check passed");
if (mTts == null) {
mTts = new TextToSpeech(this, this);
- mTts.setLanguage(Locale.getDefault());
}
} else {
Log.v(TAG, "Voice data check failed");
@@ -302,14 +271,14 @@ public class TextToSpeechSettings extends PreferenceActivity implements
Log.i(TAG, "TTS use default settings is "+objValue.toString());
} else if (KEY_TTS_DEFAULT_RATE.equals(preference.getKey())) {
// Default rate
- int value = Integer.parseInt((String) objValue);
+ mDefaultRate = Integer.parseInt((String) objValue);
try {
Settings.Secure.putInt(getContentResolver(),
- TTS_DEFAULT_RATE, value);
+ TTS_DEFAULT_RATE, mDefaultRate);
if (mTts != null) {
- mTts.setSpeechRate((float)(value/100.0f));
+ mTts.setSpeechRate((float)(mDefaultRate/100.0f));
}
- Log.i(TAG, "TTS default rate is "+value);
+ Log.i(TAG, "TTS default rate is " + mDefaultRate);
} catch (NumberFormatException e) {
Log.e(TAG, "could not persist default TTS rate setting", e);
}
@@ -325,6 +294,9 @@ public class TextToSpeechSettings extends PreferenceActivity implements
if (mTts != null) {
mTts.setLanguage(new Locale(mDefaultLanguage, mDefaultCountry));
}
+ int newIndex = mDefaultLocPref.findIndexOfValue((String)objValue);
+ Log.v("Settings", " selected is " + newIndex);
+ mDemoStringIndex = newIndex > -1 ? newIndex : 0;
}
return true;
@@ -338,8 +310,7 @@ public class TextToSpeechSettings extends PreferenceActivity implements
if (preference == mPlayExample) {
// Play example
if (mTts != null) {
- mTts.speak(getResources().getString(R.string.tts_demo),
- TextToSpeech.QUEUE_FLUSH, null);
+ mTts.speak(mDemoStrings[mDemoStringIndex], TextToSpeech.QUEUE_FLUSH, null);
}
return true;
}
@@ -380,25 +351,77 @@ public class TextToSpeechSettings extends PreferenceActivity implements
}
- private void setDefaultLocalePref(String language, String country, String variant) {
- // build a string from the default lang/country/variant trio,
- String localeString = new String(language);
- if (country.compareTo("") != 0) {
- localeString += LOCALE_DELIMITER + country;
- } else {
- localeString += LOCALE_DELIMITER + " ";
- }
- if (variant.compareTo("") != 0) {
- localeString += LOCALE_DELIMITER + variant;
+ /**
+ * Initialize the default language in the UI and in the preferences.
+ * After this method has been invoked, the default language is a supported Locale.
+ */
+ private void initDefaultLang() {
+ // if there isn't already a default language preference
+ if (!hasLangPref()) {
+ // if the current Locale is supported
+ if (isCurrentLocSupported()) {
+ // then use the current Locale as the default language
+ useCurrentLocAsDefault();
+ } else {
+ // otherwise use a default supported Locale as the default language
+ useSupportedLocAsDefault();
+ }
}
- if (mDefaultLocPref.findIndexOfValue(localeString) > -1) {
- mDefaultLocPref.setValue(localeString);
- } else {
- mDefaultLocPref.setValueIndex(0);
- }
+ // Update the language preference list with the default language and the matching
+ // demo string (at this stage there is a default language pref)
+ ContentResolver resolver = getContentResolver();
+ mDefaultLanguage = Settings.Secure.getString(resolver, TTS_DEFAULT_LANG);
+ mDefaultCountry = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_COUNTRY);
+ mDefaultLocVariant = Settings.Secure.getString(resolver, KEY_TTS_DEFAULT_VARIANT);
- Log.v(TAG, "In initDefaultSettings: localeString=" + localeString);
+ // update the demo string
+ mDemoStringIndex = mDefaultLocPref.findIndexOfValue(mDefaultLanguage + LOCALE_DELIMITER
+ + mDefaultCountry);
+ mDefaultLocPref.setValueIndex(mDemoStringIndex);
+ }
+
+ /**
+ * (helper function for initDefaultLang() )
+ * Returns whether there is a default language in the TTS settings.
+ */
+ private boolean hasLangPref() {
+ String language = Settings.Secure.getString(getContentResolver(), TTS_DEFAULT_LANG);
+ return (language != null);
+ }
+
+ /**
+ * (helper function for initDefaultLang() )
+ * Returns whether the current Locale is supported by this Settings screen
+ */
+ private boolean isCurrentLocSupported() {
+ String currentLocID = Locale.getDefault().getISO3Language() + LOCALE_DELIMITER
+ + Locale.getDefault().getISO3Country();
+ return (mDefaultLocPref.findIndexOfValue(currentLocID) > -1);
+ }
+
+ /**
+ * (helper function for initDefaultLang() )
+ * Sets the default language in TTS settings to be the current Locale.
+ * This should only be used after checking that the current Locale is supported.
+ */
+ private void useCurrentLocAsDefault() {
+ Locale currentLocale = Locale.getDefault();
+ ContentResolver resolver = getContentResolver();
+ Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, currentLocale.getISO3Language());
+ Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, currentLocale.getISO3Country());
+ Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, currentLocale.getVariant());
+ }
+
+ /**
+ * (helper function for initDefaultLang() )
+ * Sets the default language in TTS settings to be one known to be supported
+ */
+ private void useSupportedLocAsDefault() {
+ ContentResolver resolver = getContentResolver();
+ Settings.Secure.putString(resolver, TTS_DEFAULT_LANG, DEFAULT_LANG_VAL);
+ Settings.Secure.putString(resolver, TTS_DEFAULT_COUNTRY, DEFAULT_COUNTRY_VAL);
+ Settings.Secure.putString(resolver, TTS_DEFAULT_VARIANT, DEFAULT_VARIANT_VAL);
}
}
diff --git a/src/com/android/settings/UsageStats.java b/src/com/android/settings/UsageStats.java
index 89caa5485ef..fcb699026e3 100755
--- a/src/com/android/settings/UsageStats.java
+++ b/src/com/android/settings/UsageStats.java
@@ -187,7 +187,7 @@ public class UsageStats extends Activity implements OnItemSelectedListener {
holder.launchCount.setText(String.valueOf(pkgStats.launchCount));
holder.usageTime.setText(String.valueOf(pkgStats.usageTime)+" ms");
} else {
- Log.w(TAG, "No usage stats info for package:"+pkgStats.packageName);
+ Log.w(TAG, "No usage stats info for package:" + position);
}
return convertView;
}
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index ef22ee14d3e..4b30b5333bd 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -29,6 +29,7 @@ import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AlphabetIndexer;
import android.widget.EditText;
@@ -195,7 +196,7 @@ public class UserDictionarySettings extends ListActivity {
return mCursor.getString(
mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
}
-
+
@Override
protected Dialog onCreateDialog(int id) {
View content = getLayoutInflater().inflate(R.layout.dialog_edittext, null);
@@ -204,7 +205,7 @@ public class UserDictionarySettings extends ListActivity {
editText.setInputType(InputType.TYPE_CLASS_TEXT
| InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);
- return new AlertDialog.Builder(this)
+ AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle(mDialogEditingWord != null
? R.string.user_dict_settings_edit_dialog_title
: R.string.user_dict_settings_add_dialog_title)
@@ -219,7 +220,11 @@ public class UserDictionarySettings extends ListActivity {
if (mAutoReturn) finish();
}})
.create();
+ dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
+ return dialog;
}
+
@Override
protected void onPrepareDialog(int id, Dialog d) {
AlertDialog dialog = (AlertDialog) d;
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index d1129150b99..22417bb3804 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -16,23 +16,62 @@
package com.android.settings;
-import com.android.settings.bluetooth.BluetoothEnabler;
-import com.android.settings.wifi.WifiEnabler;
-
+import android.bluetooth.BluetoothAdapter;
+import android.content.Intent;
import android.net.wifi.WifiManager;
import android.os.Bundle;
-import android.preference.PreferenceActivity;
+import android.os.IBinder;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+
+import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyProperties;
+import com.android.settings.bluetooth.BluetoothEnabler;
+import com.android.settings.wifi.WifiEnabler;
public class WirelessSettings extends PreferenceActivity {
private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
private static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth";
private static final String KEY_TOGGLE_WIFI = "toggle_wifi";
+ private static final String KEY_WIFI_SETTINGS = "wifi_settings";
+ private static final String KEY_BT_SETTINGS = "bt_settings";
+ private static final String KEY_VPN_SETTINGS = "vpn_settings";
+ public static final String EXIT_ECM_RESULT = "exit_ecm_result";
+ public static final int REQUEST_CODE_EXIT_ECM = 1;
private WifiEnabler mWifiEnabler;
private AirplaneModeEnabler mAirplaneModeEnabler;
private BluetoothEnabler mBtEnabler;
+ private CheckBoxPreference mAirplaneModePreference;
+
+ /**
+ * Invoked on each preference click in this hierarchy, overrides
+ * PreferenceActivity's implementation. Used to make sure we track the
+ * preference click events.
+ */
+ @Override
+ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
+ if ( (preference == mAirplaneModePreference) &&
+ (Boolean.parseBoolean(
+ SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE))) ) {
+ // In ECM mode launch ECM app dialog
+ startActivityForResult(
+ new Intent(TelephonyIntents.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS, null),
+ REQUEST_CODE_EXIT_ECM);
+
+ return true;
+ }
+ else {
+ // Let the intents be launched by the Preference manager
+ return false;
+ }
+ }
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -41,6 +80,7 @@ public class WirelessSettings extends PreferenceActivity {
addPreferencesFromResource(R.xml.wireless_settings);
initToggles();
+ mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
}
@Override
@@ -48,8 +88,8 @@ public class WirelessSettings extends PreferenceActivity {
super.onResume();
mWifiEnabler.resume();
- mAirplaneModeEnabler.resume();
mBtEnabler.resume();
+ mAirplaneModeEnabler.resume();
}
@Override
@@ -63,18 +103,50 @@ public class WirelessSettings extends PreferenceActivity {
private void initToggles() {
+ Preference airplanePreference = findPreference(KEY_TOGGLE_AIRPLANE);
+ Preference wifiPreference = findPreference(KEY_TOGGLE_WIFI);
+ Preference btPreference = findPreference(KEY_TOGGLE_BLUETOOTH);
+ Preference wifiSettings = findPreference(KEY_WIFI_SETTINGS);
+ Preference vpnSettings = findPreference(KEY_VPN_SETTINGS);
+
+ IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE);
+ if (b == null) {
+ // Disable BT Settings if BT service is not available.
+ Preference btSettings = findPreference(KEY_BT_SETTINGS);
+ btSettings.setEnabled(false);
+ }
+
mWifiEnabler = new WifiEnabler(
- this,
- (WifiManager) getSystemService(WIFI_SERVICE),
- (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));
-
+ this, (WifiManager) getSystemService(WIFI_SERVICE),
+ (CheckBoxPreference) wifiPreference);
mAirplaneModeEnabler = new AirplaneModeEnabler(
- this,
- (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE));
-
- mBtEnabler = new BluetoothEnabler(
- this,
- (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH));
+ this, (CheckBoxPreference) airplanePreference);
+ mBtEnabler = new BluetoothEnabler(this, (CheckBoxPreference) btPreference);
+
+ // manually set up dependencies for Wifi if its radio is not toggleable in airplane mode
+ String toggleableRadios = Settings.System.getString(getContentResolver(),
+ Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ if (toggleableRadios == null || !toggleableRadios.contains(Settings.System.RADIO_WIFI)) {
+ wifiPreference.setDependency(airplanePreference.getKey());
+ wifiSettings.setDependency(airplanePreference.getKey());
+ vpnSettings.setDependency(airplanePreference.getKey());
+ }
}
-
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ switch(requestCode) {
+ case REQUEST_CODE_EXIT_ECM:
+ Boolean isChoiceYes =
+ data.getBooleanExtra(EXIT_ECM_RESULT, false);
+ // Set Airplane mode based on the return value and checkbox state
+ mAirplaneModeEnabler.setAirplaneModeInECM(isChoiceYes,
+ mAirplaneModePreference.isChecked());
+ break;
+
+ default:
+ break;
+ }
+ }
+
}
diff --git a/src/com/android/settings/ZoneList.java b/src/com/android/settings/ZoneList.java
index 2877f0039f0..aaaf9894914 100644
--- a/src/com/android/settings/ZoneList.java
+++ b/src/com/android/settings/ZoneList.java
@@ -160,7 +160,7 @@ public class ZoneList extends ListActivity {
try {
XmlResourceParser xrp = getResources().getXml(R.xml.timezones);
while (xrp.next() != XmlResourceParser.START_TAG)
- ;
+ continue;
xrp.next();
while (xrp.getEventType() != XmlResourceParser.END_TAG) {
while (xrp.getEventType() != XmlResourceParser.START_TAG) {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index 7053ff5fd74..5b0218fd801 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -28,20 +28,20 @@ import android.widget.ImageView;
* BluetoothDevicePreference is the preference type used to display each remote
* Bluetooth device in the Bluetooth Settings screen.
*/
-public class BluetoothDevicePreference extends Preference implements LocalBluetoothDevice.Callback {
+public class BluetoothDevicePreference extends Preference implements CachedBluetoothDevice.Callback {
private static final String TAG = "BluetoothDevicePreference";
private static int sDimAlpha = Integer.MIN_VALUE;
-
- private LocalBluetoothDevice mLocalDevice;
-
+
+ private CachedBluetoothDevice mCachedDevice;
+
/**
* Cached local copy of whether the device is busy. This is only updated
- * from {@link #onDeviceAttributesChanged(LocalBluetoothDevice)}.
- */
+ * from {@link #onDeviceAttributesChanged(CachedBluetoothDevice)}.
+ */
private boolean mIsBusy;
-
- public BluetoothDevicePreference(Context context, LocalBluetoothDevice localDevice) {
+
+ public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
super(context);
if (sDimAlpha == Integer.MIN_VALUE) {
@@ -49,67 +49,71 @@ public class BluetoothDevicePreference extends Preference implements LocalBlueto
context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
sDimAlpha = (int) (outValue.getFloat() * 255);
}
-
- mLocalDevice = localDevice;
-
+
+ mCachedDevice = cachedDevice;
+
setLayoutResource(R.layout.preference_bluetooth);
-
- localDevice.registerCallback(this);
-
- onDeviceAttributesChanged(localDevice);
+
+ cachedDevice.registerCallback(this);
+
+ onDeviceAttributesChanged(cachedDevice);
}
-
- public LocalBluetoothDevice getDevice() {
- return mLocalDevice;
+
+ public CachedBluetoothDevice getCachedDevice() {
+ return mCachedDevice;
}
@Override
protected void onPrepareForRemoval() {
super.onPrepareForRemoval();
- mLocalDevice.unregisterCallback(this);
+ mCachedDevice.unregisterCallback(this);
}
- public void onDeviceAttributesChanged(LocalBluetoothDevice device) {
+ public void onDeviceAttributesChanged(CachedBluetoothDevice cachedDevice) {
/*
* The preference framework takes care of making sure the value has
* changed before proceeding.
*/
-
- setTitle(mLocalDevice.getName());
-
+
+ setTitle(mCachedDevice.getName());
+
/*
* TODO: Showed "Paired" even though it was "Connected". This may be
* related to BluetoothHeadset not bound to the actual
* BluetoothHeadsetService when we got here.
*/
- setSummary(mLocalDevice.getSummary());
+ setSummary(mCachedDevice.getSummary());
// Used to gray out the item
- mIsBusy = mLocalDevice.isBusy();
-
+ mIsBusy = mCachedDevice.isBusy();
+
// Data has changed
notifyChanged();
-
+
// This could affect ordering, so notify that also
notifyHierarchyChanged();
}
@Override
public boolean isEnabled() {
+ // Temp fix until we have 2053751 fixed in the framework
+ setEnabled(true);
return super.isEnabled() && !mIsBusy;
}
@Override
protected void onBindView(View view) {
+ // Disable this view if the bluetooth enable/disable preference view is off
+ if (null != findPreferenceInHierarchy("bt_checkbox")){
+ setDependency("bt_checkbox");
+ }
+
super.onBindView(view);
- // Disable this view if the bluetooth enable/disable preference view is off
- setDependency("bt_checkbox");
-
ImageView btClass = (ImageView) view.findViewById(R.id.btClass);
- btClass.setImageResource(mLocalDevice.getBtClassDrawable());
- btClass.setAlpha(isEnabled() ? 255 : sDimAlpha);
+ btClass.setImageResource(mCachedDevice.getBtClassDrawable());
+ btClass.setAlpha(isEnabled() ? 255 : sDimAlpha);
}
@Override
@@ -118,8 +122,8 @@ public class BluetoothDevicePreference extends Preference implements LocalBlueto
// Put other preference types above us
return 1;
}
-
- return mLocalDevice.compareTo(((BluetoothDevicePreference) another).mLocalDevice);
+
+ return mCachedDevice.compareTo(((BluetoothDevicePreference) another).mCachedDevice);
}
-
+
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
index 58fb5690aaf..eec0ad8efe9 100644
--- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -18,9 +18,7 @@ package com.android.settings.bluetooth;
import com.android.settings.R;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothError;
-import android.bluetooth.BluetoothIntent;
+import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -38,26 +36,27 @@ import android.preference.CheckBoxPreference;
*/
public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChangeListener {
private static final String TAG = "BluetoothDiscoverableEnabler";
-
+
private static final String SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT =
"debug.bt.discoverable_time";
- private static final int DISCOVERABLE_TIMEOUT = 120;
+ /* package */ static final int DEFAULT_DISCOVERABLE_TIMEOUT = 120;
- private static final String SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP =
+ /* package */ static final String SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP =
"discoverable_end_timestamp";
-
+
private final Context mContext;
private final Handler mUiHandler;
private final CheckBoxPreference mCheckBoxPreference;
-
+
private final LocalBluetoothManager mLocalManager;
-
+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (BluetoothIntent.SCAN_MODE_CHANGED_ACTION.equals(intent.getAction())) {
- int mode = intent.getIntExtra(BluetoothIntent.SCAN_MODE, BluetoothError.ERROR);
- if (mode != BluetoothError.ERROR) {
+ if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(intent.getAction())) {
+ int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,
+ BluetoothAdapter.ERROR);
+ if (mode != BluetoothAdapter.ERROR) {
handleModeChanged(mode);
}
}
@@ -66,17 +65,17 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
private final Runnable mUpdateCountdownSummaryRunnable = new Runnable() {
public void run() {
- updateCountdownSummary();
- }
+ updateCountdownSummary();
+ }
};
public BluetoothDiscoverableEnabler(Context context, CheckBoxPreference checkBoxPreference) {
mContext = context;
mUiHandler = new Handler();
mCheckBoxPreference = checkBoxPreference;
-
+
checkBoxPreference.setPersistent(false);
-
+
mLocalManager = LocalBluetoothManager.getInstance(context);
if (mLocalManager == null) {
// Bluetooth not supported
@@ -89,33 +88,33 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
return;
}
- IntentFilter filter = new IntentFilter(BluetoothIntent.SCAN_MODE_CHANGED_ACTION);
+ IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
mContext.registerReceiver(mReceiver, filter);
mCheckBoxPreference.setOnPreferenceChangeListener(this);
-
- handleModeChanged(mLocalManager.getBluetoothManager().getScanMode());
+
+ handleModeChanged(mLocalManager.getBluetoothAdapter().getScanMode());
}
-
+
public void pause() {
if (mLocalManager == null) {
return;
}
-
+
mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
mCheckBoxPreference.setOnPreferenceChangeListener(null);
mContext.unregisterReceiver(mReceiver);
}
-
+
public boolean onPreferenceChange(Preference preference, Object value) {
// Turn on/off BT discoverability
setEnabled((Boolean) value);
-
+
return true;
}
-
+
private void setEnabled(final boolean enable) {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
-
+ BluetoothAdapter manager = mLocalManager.getBluetoothAdapter();
+
if (enable) {
int timeout = getDiscoverableTimeout();
@@ -126,19 +125,19 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
long endTimestamp = System.currentTimeMillis() + timeout * 1000;
persistDiscoverableEndTimestamp(endTimestamp);
-
- manager.setScanMode(BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
+
+ manager.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE);
} else {
- manager.setScanMode(BluetoothDevice.SCAN_MODE_CONNECTABLE);
+ manager.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE);
}
}
private int getDiscoverableTimeout() {
int timeout = SystemProperties.getInt(SYSTEM_PROPERTY_DISCOVERABLE_TIMEOUT, -1);
if (timeout <= 0) {
- timeout = DISCOVERABLE_TIMEOUT;
+ timeout = DEFAULT_DISCOVERABLE_TIMEOUT;
}
-
+
return timeout;
}
@@ -147,44 +146,44 @@ public class BluetoothDiscoverableEnabler implements Preference.OnPreferenceChan
editor.putLong(SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, endTimestamp);
editor.commit();
}
-
+
private void handleModeChanged(int mode) {
- if (mode == BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
+ if (mode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
mCheckBoxPreference.setChecked(true);
updateCountdownSummary();
-
+
} else {
mCheckBoxPreference.setChecked(false);
}
}
-
+
private void updateCountdownSummary() {
- int mode = mLocalManager.getBluetoothManager().getScanMode();
- if (mode != BluetoothDevice.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
+ int mode = mLocalManager.getBluetoothAdapter().getScanMode();
+ if (mode != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
return;
}
-
+
long currentTimestamp = System.currentTimeMillis();
long endTimestamp = mLocalManager.getSharedPreferences().getLong(
SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, 0);
-
+
if (currentTimestamp > endTimestamp) {
// We're still in discoverable mode, but maybe there isn't a timeout.
mCheckBoxPreference.setSummaryOn(null);
return;
}
-
+
String formattedTimeLeft = String.valueOf((endTimestamp - currentTimestamp) / 1000);
-
+
mCheckBoxPreference.setSummaryOn(
mContext.getResources().getString(R.string.bluetooth_is_discoverable,
formattedTimeLeft));
-
+
synchronized (this) {
mUiHandler.removeCallbacks(mUpdateCountdownSummaryRunnable);
mUiHandler.postDelayed(mUpdateCountdownSummaryRunnable, 1000);
}
}
-
-
+
+
}
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index af2722f8575..b872916b4ee 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -18,9 +18,7 @@ package com.android.settings.bluetooth;
import com.android.settings.R;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothError;
-import android.bluetooth.BluetoothIntent;
+import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -36,21 +34,20 @@ import android.util.Config;
* preference reflects the current state.
*/
public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
-
+
private static final boolean LOCAL_LOGD = Config.LOGD || false;
private static final String TAG = "BluetoothEnabler";
-
- private final Context mContext;
+
+ private final Context mContext;
private final CheckBoxPreference mCheckBoxPreference;
private final CharSequence mOriginalSummary;
-
+
private final LocalBluetoothManager mLocalManager;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- int state = intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
- BluetoothError.ERROR);
+ int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
handleStateChanged(state);
}
};
@@ -58,10 +55,10 @@ public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
public BluetoothEnabler(Context context, CheckBoxPreference checkBoxPreference) {
mContext = context;
mCheckBoxPreference = checkBoxPreference;
-
+
mOriginalSummary = checkBoxPreference.getSummary();
checkBoxPreference.setPersistent(false);
-
+
mLocalManager = LocalBluetoothManager.getInstance(context);
if (mLocalManager == null) {
// Bluetooth not supported
@@ -73,60 +70,68 @@ public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
if (mLocalManager == null) {
return;
}
-
+
int state = mLocalManager.getBluetoothState();
// This is the widget enabled state, not the preference toggled state
- mCheckBoxPreference.setEnabled(state == BluetoothDevice.BLUETOOTH_STATE_ON ||
- state == BluetoothDevice.BLUETOOTH_STATE_OFF);
+ mCheckBoxPreference.setEnabled(state == BluetoothAdapter.STATE_ON ||
+ state == BluetoothAdapter.STATE_OFF);
// BT state is not a sticky broadcast, so set it manually
handleStateChanged(state);
-
- mContext.registerReceiver(mReceiver,
- new IntentFilter(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION));
+
+ mContext.registerReceiver(mReceiver,
+ new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
mCheckBoxPreference.setOnPreferenceChangeListener(this);
}
-
+
public void pause() {
if (mLocalManager == null) {
return;
}
-
+
mContext.unregisterReceiver(mReceiver);
mCheckBoxPreference.setOnPreferenceChangeListener(null);
}
-
+
public boolean onPreferenceChange(Preference preference, Object value) {
// Turn on/off BT
setEnabled((Boolean) value);
-
+
// Don't update UI to opposite state until we're sure
return false;
}
-
+
private void setEnabled(final boolean enable) {
// Disable preference
mCheckBoxPreference.setEnabled(false);
-
+
mLocalManager.setBluetoothEnabled(enable);
}
-
+
private void handleStateChanged(int state) {
- if (state == BluetoothDevice.BLUETOOTH_STATE_OFF ||
- state == BluetoothDevice.BLUETOOTH_STATE_ON) {
- mCheckBoxPreference.setChecked(state == BluetoothDevice.BLUETOOTH_STATE_ON);
- mCheckBoxPreference.setSummary(state == BluetoothDevice.BLUETOOTH_STATE_OFF ?
+ if (state == BluetoothAdapter.STATE_OFF ||
+ state == BluetoothAdapter.STATE_ON) {
+ mCheckBoxPreference.setChecked(state == BluetoothAdapter.STATE_ON);
+ mCheckBoxPreference.setSummary(state == BluetoothAdapter.STATE_OFF ?
mOriginalSummary :
null);
-
- mCheckBoxPreference.setEnabled(isEnabledByDependency());
-
- } else if (state == BluetoothDevice.BLUETOOTH_STATE_TURNING_ON ||
- state == BluetoothDevice.BLUETOOTH_STATE_TURNING_OFF) {
- mCheckBoxPreference.setSummary(state == BluetoothDevice.BLUETOOTH_STATE_TURNING_ON
+
+ /*
+ * Don't ever disable the preference. Only enable here. Disablement
+ * is taken care of by the dependency code. If this is disabled
+ * here, it may not be re-enabled from the framework when dependency
+ * is met. http://b/issue?id=2053751
+ */
+ if (isEnabledByDependency()) {
+ mCheckBoxPreference.setEnabled(true);
+ }
+
+ } else if (state == BluetoothAdapter.STATE_TURNING_ON ||
+ state == BluetoothAdapter.STATE_TURNING_OFF) {
+ mCheckBoxPreference.setSummary(state == BluetoothAdapter.STATE_TURNING_ON
? R.string.wifi_starting
: R.string.wifi_stopping);
-
+
} else {
mCheckBoxPreference.setChecked(false);
mCheckBoxPreference.setSummary(R.string.wifi_error);
@@ -139,17 +144,17 @@ public class BluetoothEnabler implements Preference.OnPreferenceChangeListener {
if (dep == null) {
return true;
}
-
+
return !dep.shouldDisableDependents();
}
-
+
private Preference getDependencyPreference() {
String depKey = mCheckBoxPreference.getDependency();
if (TextUtils.isEmpty(depKey)) {
return null;
}
-
+
return mCheckBoxPreference.getPreferenceManager().findPreference(depKey);
}
-
+
}
diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
index af64c98f1b5..6c408346a83 100644
--- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
+++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
@@ -17,16 +17,17 @@
package com.android.settings.bluetooth;
import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothError;
import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
+import com.android.settings.R;
import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
/**
@@ -36,78 +37,81 @@ import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
*/
public class BluetoothEventRedirector {
private static final String TAG = "BluetoothEventRedirector";
- private static final boolean V = LocalBluetoothManager.V;
-
+
private LocalBluetoothManager mManager;
-
+
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (V) {
- Log.v(TAG, "Received " + intent.getAction());
- }
-
+ Log.v(TAG, "Received " + intent.getAction());
+
String action = intent.getAction();
- String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
-
- if (action.equals(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION)) {
- int state = intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
- BluetoothError.ERROR);
+ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+
+ if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+ int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
+ BluetoothAdapter.ERROR);
mManager.setBluetoothStateInt(state);
- } else if (action.equals(BluetoothIntent.DISCOVERY_STARTED_ACTION)) {
+ } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_STARTED)) {
mManager.onScanningStateChanged(true);
-
- } else if (action.equals(BluetoothIntent.DISCOVERY_COMPLETED_ACTION)) {
+
+ } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
mManager.onScanningStateChanged(false);
-
- } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION)) {
- short rssi = intent.getShortExtra(BluetoothIntent.RSSI, Short.MIN_VALUE);
- mManager.getLocalDeviceManager().onDeviceAppeared(address, rssi);
-
- } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION)) {
- mManager.getLocalDeviceManager().onDeviceDisappeared(address);
-
- } else if (action.equals(BluetoothIntent.REMOTE_NAME_UPDATED_ACTION)) {
- mManager.getLocalDeviceManager().onDeviceNameUpdated(address);
-
- } else if (action.equals(BluetoothIntent.BOND_STATE_CHANGED_ACTION)) {
- int bondState = intent.getIntExtra(BluetoothIntent.BOND_STATE,
- BluetoothError.ERROR);
- mManager.getLocalDeviceManager().onBondingStateChanged(address, bondState);
- if (bondState == BluetoothDevice.BOND_NOT_BONDED) {
- int reason = intent.getIntExtra(BluetoothIntent.REASON, BluetoothError.ERROR);
- if (reason == BluetoothDevice.UNBOND_REASON_AUTH_FAILED ||
- reason == BluetoothDevice.UNBOND_REASON_AUTH_REJECTED ||
- reason == BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN) {
- mManager.getLocalDeviceManager().onBondingError(address, reason);
- }
+
+ } else if (action.equals(BluetoothDevice.ACTION_FOUND)) {
+ short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);
+ BluetoothClass btClass = intent.getParcelableExtra(BluetoothDevice.EXTRA_CLASS);
+ String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
+ // TODO Pick up UUID. They should be available for 2.1 devices.
+ // Skip for now, there's a bluez problem and we are not getting uuids even for 2.1.
+ mManager.getCachedDeviceManager().onDeviceAppeared(device, rssi, btClass, name);
+
+ } else if (action.equals(BluetoothDevice.ACTION_DISAPPEARED)) {
+ mManager.getCachedDeviceManager().onDeviceDisappeared(device);
+
+ } else if (action.equals(BluetoothDevice.ACTION_NAME_CHANGED)) {
+ mManager.getCachedDeviceManager().onDeviceNameUpdated(device);
+
+ } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) {
+ int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
+ BluetoothDevice.ERROR);
+ mManager.getCachedDeviceManager().onBondingStateChanged(device, bondState);
+ if (bondState == BluetoothDevice.BOND_NONE) {
+ int reason = intent.getIntExtra(BluetoothDevice.EXTRA_REASON, BluetoothDevice.ERROR);
+ mManager.getCachedDeviceManager().showUnbondMessage(device, reason);
}
-
- } else if (action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION)) {
- int newState = intent.getIntExtra(BluetoothIntent.HEADSET_STATE, 0);
- int oldState = intent.getIntExtra(BluetoothIntent.HEADSET_PREVIOUS_STATE, 0);
+
+ } else if (action.equals(BluetoothHeadset.ACTION_STATE_CHANGED)) {
+ int newState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, 0);
+ int oldState = intent.getIntExtra(BluetoothHeadset.EXTRA_PREVIOUS_STATE, 0);
if (newState == BluetoothHeadset.STATE_DISCONNECTED &&
oldState == BluetoothHeadset.STATE_CONNECTING) {
Log.i(TAG, "Failed to connect BT headset");
}
- mManager.getLocalDeviceManager().onProfileStateChanged(address,
+ mManager.getCachedDeviceManager().onProfileStateChanged(device,
Profile.HEADSET, newState);
- } else if (action.equals(BluetoothA2dp.SINK_STATE_CHANGED_ACTION)) {
- int newState = intent.getIntExtra(BluetoothA2dp.SINK_STATE, 0);
- int oldState = intent.getIntExtra(BluetoothA2dp.SINK_PREVIOUS_STATE, 0);
+ } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
+ int newState = intent.getIntExtra(BluetoothA2dp.EXTRA_SINK_STATE, 0);
+ int oldState = intent.getIntExtra(BluetoothA2dp.EXTRA_PREVIOUS_SINK_STATE, 0);
if (newState == BluetoothA2dp.STATE_DISCONNECTED &&
oldState == BluetoothA2dp.STATE_CONNECTING) {
Log.i(TAG, "Failed to connect BT A2DP");
}
- mManager.getLocalDeviceManager().onProfileStateChanged(address,
+ mManager.getCachedDeviceManager().onProfileStateChanged(device,
Profile.A2DP, newState);
- } else if (action.equals(BluetoothIntent.REMOTE_DEVICE_CLASS_UPDATED_ACTION)) {
- mManager.getLocalDeviceManager().onBtClassChanged(address);
-
+ } else if (action.equals(BluetoothDevice.ACTION_CLASS_CHANGED)) {
+ mManager.getCachedDeviceManager().onBtClassChanged(device);
+
+ } else if (action.equals(BluetoothDevice.ACTION_UUID)) {
+ mManager.getCachedDeviceManager().onUuidChanged(device);
+
+ } else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
+ int errorMsg = R.string.bluetooth_pairing_error_message;
+ mManager.showError(device, R.string.bluetooth_error_title, errorMsg);
}
}
};
@@ -118,29 +122,31 @@ public class BluetoothEventRedirector {
public void start() {
IntentFilter filter = new IntentFilter();
-
+
// Bluetooth on/off broadcasts
- filter.addAction(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION);
-
+ filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+
// Discovery broadcasts
- filter.addAction(BluetoothIntent.DISCOVERY_STARTED_ACTION);
- filter.addAction(BluetoothIntent.DISCOVERY_COMPLETED_ACTION);
- filter.addAction(BluetoothIntent.REMOTE_DEVICE_DISAPPEARED_ACTION);
- filter.addAction(BluetoothIntent.REMOTE_DEVICE_FOUND_ACTION);
- filter.addAction(BluetoothIntent.REMOTE_NAME_UPDATED_ACTION);
-
+ filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
+ filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
+ filter.addAction(BluetoothDevice.ACTION_DISAPPEARED);
+ filter.addAction(BluetoothDevice.ACTION_FOUND);
+ filter.addAction(BluetoothDevice.ACTION_NAME_CHANGED);
+
// Pairing broadcasts
- filter.addAction(BluetoothIntent.BOND_STATE_CHANGED_ACTION);
-
+ filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
+ filter.addAction(BluetoothDevice.ACTION_PAIRING_CANCEL);
+
// Fine-grained state broadcasts
- filter.addAction(BluetoothA2dp.SINK_STATE_CHANGED_ACTION);
- filter.addAction(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION);
- filter.addAction(BluetoothIntent.REMOTE_DEVICE_CLASS_UPDATED_ACTION);
-
+ filter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
+ filter.addAction(BluetoothHeadset.ACTION_STATE_CHANGED);
+ filter.addAction(BluetoothDevice.ACTION_CLASS_CHANGED);
+ filter.addAction(BluetoothDevice.ACTION_UUID);
+
mManager.getContext().registerReceiver(mBroadcastReceiver, filter);
}
-
+
public void stop() {
- mManager.getContext().unregisterReceiver(mBroadcastReceiver);
+ mManager.getContext().unregisterReceiver(mBroadcastReceiver);
}
}
diff --git a/src/com/android/settings/bluetooth/BluetoothNamePreference.java b/src/com/android/settings/bluetooth/BluetoothNamePreference.java
index 40bab2ccae8..7a9a0c1d881 100644
--- a/src/com/android/settings/bluetooth/BluetoothNamePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothNamePreference.java
@@ -16,72 +16,124 @@
package com.android.settings.bluetooth;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothError;
-import android.bluetooth.BluetoothIntent;
+import android.app.AlertDialog;
+import android.app.Dialog;
+
+import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.preference.EditTextPreference;
-import android.preference.PreferenceManager;
+import android.text.Editable;
+import android.text.InputFilter;
+import android.text.TextWatcher;
+import android.text.InputFilter.LengthFilter;
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 class BluetoothNamePreference extends EditTextPreference {
+public class BluetoothNamePreference extends EditTextPreference implements TextWatcher {
private static final String TAG = "BluetoothNamePreference";
+ // TODO(): Investigate bluetoothd/dbus crash when length is set to 248, limit as per spec.
+ private static final int BLUETOOTH_NAME_MAX_LENGTH = 200;
private LocalBluetoothManager mLocalManager;
-
+
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
- if (action.equals(BluetoothIntent.NAME_CHANGED_ACTION)) {
+ if (action.equals(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED)) {
setSummaryToName();
- } else if (action.equals(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION) &&
- (intent.getIntExtra(BluetoothIntent.BLUETOOTH_STATE,
- BluetoothError.ERROR) == BluetoothDevice.BLUETOOTH_STATE_ON)) {
+ } 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);
-
+
mLocalManager = LocalBluetoothManager.getInstance(context);
-
- setSummaryToName();
+
+ setSummaryToName();
}
public void resume() {
IntentFilter filter = new IntentFilter();
- filter.addAction(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION);
- filter.addAction(BluetoothIntent.NAME_CHANGED_ACTION);
+ 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();
+ et.setFilters(new InputFilter[] {new LengthFilter(BLUETOOTH_NAME_MAX_LENGTH)});
+ if (et != null) {
+ 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() {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
- if (manager.isEnabled()) {
- setSummary(manager.getName());
+ BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter();
+ if (adapter.isEnabled()) {
+ setSummary(adapter.getName());
}
}
@Override
protected boolean persistString(String value) {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
- manager.setName(value);
- return true;
+ BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter();
+ adapter.setName(value);
+ return true;
+ }
+
+ @Override
+ protected void onClick() {
+ super.onClick();
+
+ // The dialog should be created by now
+ EditText et = getEditText();
+ if (et != null) {
+ et.setText(mLocalManager.getBluetoothAdapter().getName());
+ }
+ }
+
+ // TextWatcher interface
+ public void afterTextChanged(Editable s) {
+ Dialog d = getDialog();
+ if (d instanceof AlertDialog) {
+ ((AlertDialog) d).getButton(AlertDialog.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
}
-
}
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialog.java b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
new file mode 100644
index 00000000000..7004ba0fa93
--- /dev/null
+++ b/src/com/android/settings/bluetooth/BluetoothPairingDialog.java
@@ -0,0 +1,279 @@
+/*
+ * 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.bluetooth.BluetoothDevice;
+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.InputType;
+import android.text.TextWatcher;
+import android.text.InputFilter.LengthFilter;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.settings.R;
+
+/**
+ * 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.
+ */
+public class BluetoothPairingDialog extends AlertActivity implements DialogInterface.OnClickListener,
+ TextWatcher {
+ private static final String TAG = "BluetoothPairingDialog";
+
+ private final int BLUETOOTH_PIN_MAX_LENGTH = 16;
+ private final int BLUETOOTH_PASSKEY_MAX_LENGTH = 6;
+ private LocalBluetoothManager mLocalManager;
+ private BluetoothDevice mDevice;
+ private int mType;
+ private String mPasskey;
+ private EditText mPairingView;
+ private Button mOkButton;
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(intent.getAction())) {
+ int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
+ BluetoothDevice.ERROR);
+ if (bondState == BluetoothDevice.BOND_BONDED ||
+ bondState == BluetoothDevice.BOND_NONE) {
+ dismissDialog();
+ }
+ } else if(BluetoothDevice.ACTION_PAIRING_CANCEL.equals(intent.getAction())) {
+ BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ if (device == null || device.equals(mDevice)) {
+ dismissDialog();
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Intent intent = getIntent();
+ if (!intent.getAction().equals(BluetoothDevice.ACTION_PAIRING_REQUEST))
+ {
+ Log.e(TAG,
+ "Error: this activity may be started only with intent " +
+ BluetoothDevice.ACTION_PAIRING_REQUEST);
+ finish();
+ }
+
+ mLocalManager = LocalBluetoothManager.getInstance(this);
+ mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ mType = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, BluetoothDevice.ERROR);
+ if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {
+ createUserEntryDialog();
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) {
+ createUserEntryDialog();
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION){
+ int passkey =
+ intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
+ if (passkey == BluetoothDevice.ERROR) {
+ Log.e(TAG, "Invalid ConfirmationPasskey received, not showing any dialog");
+ return;
+ }
+ mPasskey = String.format("%06d", passkey);
+ createConfirmationDialog();
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
+ createConsentDialog();
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
+ int passkey =
+ intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
+ if (passkey == BluetoothDevice.ERROR) {
+ Log.e(TAG, "Invalid ConfirmationPasskey received, not showing any dialog");
+ return;
+ }
+ mPasskey = String.format("%06d", passkey);
+ createDisplayPasskeyDialog();
+ } else {
+ Log.e(TAG, "Incorrect pairing type received, not showing any dialog");
+ }
+
+ /*
+ * Leave this registered through pause/resume since we still want to
+ * finish the activity in the background if pairing is canceled.
+ */
+ registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_PAIRING_CANCEL));
+ registerReceiver(mReceiver, new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED));
+ }
+
+ private void createUserEntryDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_pairing_request);
+ p.mView = createView();
+ p.mPositiveButtonText = getString(android.R.string.ok);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(android.R.string.cancel);
+ p.mNegativeButtonListener = this;
+ setupAlert();
+
+ mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
+ mOkButton.setEnabled(false);
+ }
+
+ private View createView() {
+ View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
+
+ String name = mLocalManager.getCachedDeviceManager().getName(mDevice);
+ TextView messageView = (TextView) view.findViewById(R.id.message);
+ mPairingView = (EditText) view.findViewById(R.id.text);
+ mPairingView.addTextChangedListener(this);
+
+ if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {
+ messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name));
+ // Maximum of 16 characters in a PIN adb sync
+ mPairingView.setFilters(new InputFilter[] {
+ new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) });
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY){
+ messageView.setText(getString(R.string.bluetooth_enter_passkey_msg, name));
+ // Maximum of 6 digits for passkey
+ mPairingView.setInputType(InputType.TYPE_CLASS_NUMBER |
+ InputType.TYPE_NUMBER_FLAG_SIGNED);
+ mPairingView.setFilters(new InputFilter[] {
+ new LengthFilter(BLUETOOTH_PASSKEY_MAX_LENGTH)});
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
+ mPairingView.setVisibility(View.GONE);
+ messageView.setText(getString(R.string.bluetooth_confirm_passkey_msg, name,
+ mPasskey));
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
+ mPairingView.setVisibility(View.GONE);
+ messageView.setText(getString(R.string.bluetooth_incoming_pairing_msg, name));
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
+ mPairingView.setVisibility(View.GONE);
+ messageView.setText(getString(R.string.bluetooth_display_passkey_msg, name, mPasskey));
+ } else {
+ Log.e(TAG, "Incorrect pairing type received, not creating view");
+ }
+ return view;
+ }
+
+ private void createConfirmationDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_pairing_request);
+ p.mView = createView();
+ p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(R.string.bluetooth_pairing_decline);
+ p.mNegativeButtonListener = this;
+ setupAlert();
+ }
+
+ private void createConsentDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_pairing_request);
+ p.mView = createView();
+ p.mPositiveButtonText = getString(R.string.bluetooth_pairing_accept);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(R.string.bluetooth_pairing_decline);
+ p.mNegativeButtonListener = this;
+ setupAlert();
+ }
+
+ private void createDisplayPasskeyDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_pairing_request);
+ p.mView = createView();
+ p.mPositiveButtonText = getString(android.R.string.ok);
+ p.mPositiveButtonListener = this;
+ setupAlert();
+
+ // Since its only a notification, send an OK to the framework,
+ // indicating that the dialog has been displayed.
+ mDevice.setPairingConfirmation(true);
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ public void afterTextChanged(Editable s) {
+ if (s.length() > 0) {
+ mOkButton.setEnabled(true);
+ }
+ }
+
+ private void dismissDialog() {
+ this.dismiss();
+ }
+
+ private void onPair(String value) {
+ if (mType == BluetoothDevice.PAIRING_VARIANT_PIN) {
+ byte[] pinBytes = BluetoothDevice.convertPinToBytes(value);
+ if (pinBytes == null) {
+ return;
+ }
+ mDevice.setPin(pinBytes);
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY) {
+ int passkey = Integer.parseInt(value);
+ mDevice.setPasskey(passkey);
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION) {
+ mDevice.setPairingConfirmation(true);
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_CONSENT) {
+ mDevice.setPairingConfirmation(true);
+ } else if (mType == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
+ // Do Nothing.
+ } else {
+ Log.e(TAG, "Incorrect pairing type received");
+ }
+ }
+
+ private void onCancel() {
+ mDevice.cancelPairingUserInput();
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case DialogInterface.BUTTON_POSITIVE:
+ onPair(mPairingView.getText().toString());
+ break;
+
+ case DialogInterface.BUTTON_NEGATIVE:
+ onCancel();
+ break;
+ }
+ }
+
+ /* 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) {
+ }
+
+}
diff --git a/src/com/android/settings/bluetooth/BluetoothPinRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
similarity index 57%
rename from src/com/android/settings/bluetooth/BluetoothPinRequest.java
rename to src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 619052d87fb..4253c5d24ed 100644
--- a/src/com/android/settings/bluetooth/BluetoothPinRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -22,7 +22,6 @@ import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -30,35 +29,45 @@ import android.content.res.Resources;
import android.text.TextUtils;
/**
- * BluetoothPinRequest is a receiver for any Bluetooth pairing PIN request. It
- * checks if the Bluetooth Settings is currently visible and brings up the PIN
- * entry dialog. Otherwise it puts a Notification in the status bar, which can
- * be clicked to bring up the PIN entry dialog.
+ * BluetoothPairingRequest is a receiver for any Bluetooth pairing request. It
+ * checks if the Bluetooth Settings is currently visible and brings up the PIN, the passkey or a
+ * confirmation entry dialog. Otherwise it puts a Notification in the status bar, which can
+ * be clicked to bring up the Pairing entry dialog.
*/
-public class BluetoothPinRequest extends BroadcastReceiver {
+public class BluetoothPairingRequest extends BroadcastReceiver {
public static final int NOTIFICATION_ID = android.R.drawable.stat_sys_data_bluetooth;
-
+
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
- if (action.equals(BluetoothIntent.PAIRING_REQUEST_ACTION)) {
+ if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
- LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(context);
-
- String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
- Intent pinIntent = new Intent();
- pinIntent.setClass(context, BluetoothPinDialog.class);
- pinIntent.putExtra(BluetoothIntent.ADDRESS, address);
- pinIntent.setAction(BluetoothIntent.PAIRING_REQUEST_ACTION);
- pinIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
- if (localManager.getForegroundActivity() != null) {
+ LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(context);
+
+ BluetoothDevice device =
+ intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ int type = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
+ BluetoothDevice.ERROR);
+ Intent pairingIntent = new Intent();
+ pairingIntent.setClass(context, BluetoothPairingDialog.class);
+ pairingIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+ pairingIntent.putExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, type);
+ if (type == BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION ||
+ type == BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY) {
+ int passkey = intent.getIntExtra(BluetoothDevice.EXTRA_PASSKEY, BluetoothDevice.ERROR);
+ pairingIntent.putExtra(BluetoothDevice.EXTRA_PASSKEY, passkey);
+ }
+ pairingIntent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
+ pairingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ String deviceAddress = device != null ? device.getAddress() : null;
+ if (localManager.shouldShowDialogInForeground(deviceAddress)) {
// Since the BT-related activity is in the foreground, just open the dialog
- context.startActivity(pinIntent);
-
+ context.startActivity(pairingIntent);
+
} else {
-
+
// Put up a notification that leads to the dialog
Resources res = context.getResources();
Notification notification = new Notification(
@@ -66,27 +75,27 @@ public class BluetoothPinRequest extends BroadcastReceiver {
res.getString(R.string.bluetooth_notif_ticker),
System.currentTimeMillis());
- PendingIntent pending = PendingIntent.getActivity(context, 0,
- pinIntent, PendingIntent.FLAG_ONE_SHOT);
-
- String name = intent.getStringExtra(BluetoothIntent.NAME);
+ PendingIntent pending = PendingIntent.getActivity(context, 0,
+ pairingIntent, PendingIntent.FLAG_ONE_SHOT);
+
+ String name = intent.getStringExtra(BluetoothDevice.EXTRA_NAME);
if (TextUtils.isEmpty(name)) {
- name = localManager.getLocalDeviceManager().getName(address);
+ name = device.getName();
}
-
- notification.setLatestEventInfo(context,
- res.getString(R.string.bluetooth_notif_title),
- res.getString(R.string.bluetooth_notif_message) + name,
+
+ notification.setLatestEventInfo(context,
+ res.getString(R.string.bluetooth_notif_title),
+ res.getString(R.string.bluetooth_notif_message) + name,
pending);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
-
- NotificationManager manager = (NotificationManager)
+
+ NotificationManager manager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID, notification);
}
-
- } else if (action.equals(BluetoothIntent.PAIRING_CANCEL_ACTION)) {
-
+
+ } else if (action.equals(BluetoothDevice.ACTION_PAIRING_CANCEL)) {
+
// Remove the notification
NotificationManager manager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
diff --git a/src/com/android/settings/bluetooth/BluetoothPinDialog.java b/src/com/android/settings/bluetooth/BluetoothPinDialog.java
deleted file mode 100644
index 087fbb291c6..00000000000
--- a/src/com/android/settings/bluetooth/BluetoothPinDialog.java
+++ /dev/null
@@ -1,203 +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.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothIntent;
-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.text.InputFilter.LengthFilter;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.TextView;
-
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-import com.android.settings.R;
-
-/**
- * BluetoothPinDialog asks the user to enter a PIN for pairing with a remote
- * Bluetooth device. It is an activity that appears as a dialog.
- */
-public class BluetoothPinDialog extends AlertActivity implements DialogInterface.OnClickListener,
- TextWatcher {
- private static final String TAG = "BluetoothPinDialog";
-
- private final int BLUETOOTH_PIN_MAX_LENGTH = 16;
- private LocalBluetoothManager mLocalManager;
- private String mAddress;
- private EditText mPinView;
- private Button mOkButton;
-
- private static final String INSTANCE_KEY_PAIRING_CANCELED = "received_pairing_canceled";
- private boolean mReceivedPairingCanceled;
-
- private BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (!BluetoothIntent.PAIRING_CANCEL_ACTION.equals(intent.getAction())) {
- return;
- }
-
- String address = intent.getStringExtra(BluetoothIntent.ADDRESS);
- if (address == null || address.equals(mAddress)) {
- onReceivedPairingCanceled();
- }
- }
- };
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- Intent intent = getIntent();
- if (!intent.getAction().equals(BluetoothIntent.PAIRING_REQUEST_ACTION))
- {
- Log.e(TAG,
- "Error: this activity may be started only with intent " +
- BluetoothIntent.PAIRING_REQUEST_ACTION);
- finish();
- }
-
- mLocalManager = LocalBluetoothManager.getInstance(this);
- mAddress = intent.getStringExtra(BluetoothIntent.ADDRESS);
-
- // Set up the "dialog"
- final AlertController.AlertParams p = mAlertParams;
- p.mIconId = android.R.drawable.ic_dialog_info;
- p.mTitle = getString(R.string.bluetooth_pin_entry);
- p.mView = createView();
- p.mPositiveButtonText = getString(android.R.string.ok);
- p.mPositiveButtonListener = this;
- p.mNegativeButtonText = getString(android.R.string.cancel);
- p.mNegativeButtonListener = this;
- setupAlert();
-
- mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
- mOkButton.setEnabled(false);
-
- /*
- * Leave this registered through pause/resume since we still want to
- * finish the activity in the background if pairing is canceled.
- */
- registerReceiver(mReceiver, new IntentFilter(BluetoothIntent.PAIRING_CANCEL_ACTION));
- }
-
- @Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
-
- mReceivedPairingCanceled = savedInstanceState.getBoolean(INSTANCE_KEY_PAIRING_CANCELED);
- if (mReceivedPairingCanceled) {
- onReceivedPairingCanceled();
- }
- }
-
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
-
- outState.putBoolean(INSTANCE_KEY_PAIRING_CANCELED, mReceivedPairingCanceled);
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
-
- unregisterReceiver(mReceiver);
- }
-
- private View createView() {
- View view = getLayoutInflater().inflate(R.layout.bluetooth_pin_entry, null);
-
- String name = mLocalManager.getLocalDeviceManager().getName(mAddress);
- TextView messageView = (TextView) view.findViewById(R.id.message);
- messageView.setText(getString(R.string.bluetooth_enter_pin_msg, name));
-
- mPinView = (EditText) view.findViewById(R.id.text);
- mPinView.addTextChangedListener(this);
- // Maximum of 16 characters in a PIN
- mPinView.setFilters(new InputFilter[] { new LengthFilter(BLUETOOTH_PIN_MAX_LENGTH) });
-
- return view;
- }
-
- public void afterTextChanged(Editable s) {
- if (s.length() > 0) {
- mOkButton.setEnabled(true);
- }
- }
-
- private void onReceivedPairingCanceled() {
- mReceivedPairingCanceled = true;
-
- TextView messageView = (TextView) findViewById(R.id.message);
- messageView.setText(getString(R.string.bluetooth_pairing_error_message,
- mLocalManager.getLocalDeviceManager().getName(mAddress)));
-
- mPinView.setVisibility(View.GONE);
- mPinView.clearFocus();
- mPinView.removeTextChangedListener(this);
-
- mOkButton.setEnabled(true);
- mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).setVisibility(View.GONE);
- }
-
- private void onPair(String pin) {
- byte[] pinBytes = BluetoothDevice.convertPinToBytes(pin);
-
- if (pinBytes == null) {
- return;
- }
-
- mLocalManager.getBluetoothManager().setPin(mAddress, pinBytes);
- }
-
- private void onCancel() {
- mLocalManager.getBluetoothManager().cancelBondProcess(mAddress);
- }
-
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case DialogInterface.BUTTON_POSITIVE:
- onPair(mPinView.getText().toString());
- break;
-
- case DialogInterface.BUTTON_NEGATIVE:
- onCancel();
- break;
- }
- }
-
- /* 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) {
- }
-
-}
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index e6ac5fdb3c8..8a0795be8ab 100644
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -19,16 +19,17 @@ package com.android.settings.bluetooth;
import com.android.settings.ProgressCategory;
import com.android.settings.R;
-import java.util.List;
-import java.util.WeakHashMap;
-
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothIntent;
+import android.bluetooth.BluetoothDevicePicker;
+import android.bluetooth.BluetoothUuid;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
+import android.os.ParcelUuid;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
@@ -40,6 +41,9 @@ import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView.AdapterContextMenuInfo;
+import java.util.List;
+import java.util.WeakHashMap;
+
/**
* BluetoothSettings is the Settings screen for Bluetooth configuration and
* connection management.
@@ -50,30 +54,56 @@ public class BluetoothSettings extends PreferenceActivity
private static final String TAG = "BluetoothSettings";
private static final int MENU_SCAN = Menu.FIRST;
-
+
private static final String KEY_BT_CHECKBOX = "bt_checkbox";
private static final String KEY_BT_DISCOVERABLE = "bt_discoverable";
private static final String KEY_BT_DEVICE_LIST = "bt_device_list";
private static final String KEY_BT_NAME = "bt_name";
private static final String KEY_BT_SCAN = "bt_scan";
-
+
+ private static final int SCREEN_TYPE_SETTINGS = 0;
+ private static final int SCREEN_TYPE_DEVICEPICKER = 1;
+
+ private int mScreenType;
+ private int mFilterType;
+ private boolean mNeedAuth;
+ private String mLaunchPackage;
+ private String mLaunchClass;
+
+ private BluetoothDevice mSelectedDevice= null;
+
private LocalBluetoothManager mLocalManager;
-
+
private BluetoothEnabler mEnabler;
private BluetoothDiscoverableEnabler mDiscoverableEnabler;
-
+
private BluetoothNamePreference mNamePreference;
-
+
private ProgressCategory mDeviceList;
-
- private WeakHashMap mDevicePreferenceMap =
- new WeakHashMap();
-
+
+ private WeakHashMap mDevicePreferenceMap =
+ new WeakHashMap();
+
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: put this in callback instead of receiving
- onBluetoothStateChanged(mLocalManager.getBluetoothState());
+
+ if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
+ onBluetoothStateChanged(mLocalManager.getBluetoothState());
+ } else if (intent.getAction().equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)
+ && mScreenType == SCREEN_TYPE_DEVICEPICKER) {
+ int bondState = intent
+ .getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
+ if (bondState == BluetoothDevice.BOND_BONDED) {
+ BluetoothDevice device = intent
+ .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
+ if (device.equals(mSelectedDevice)) {
+ sendDevicePickedIntent(device);
+ finish();
+ }
+ }
+ }
}
};
@@ -82,69 +112,104 @@ public class BluetoothSettings extends PreferenceActivity
super.onCreate(savedInstanceState);
mLocalManager = LocalBluetoothManager.getInstance(this);
- if (mLocalManager == null) finish();
-
- addPreferencesFromResource(R.xml.bluetooth_settings);
-
- mEnabler = new BluetoothEnabler(
- this,
- (CheckBoxPreference) findPreference(KEY_BT_CHECKBOX));
-
- mDiscoverableEnabler = new BluetoothDiscoverableEnabler(
- this,
- (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE));
-
- mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME);
-
+ if (mLocalManager == null) finish();
+
+ // Note:
+ // If an application wish to show the BT device list, it can send an
+ // intent to Settings application with below extra data:
+ // -DEVICE_PICKER_FILTER_TYPE: the type of BT devices that want to show.
+ // -DEVICE_PICKER_LAUNCH_PACKAGE: the package which the application belongs to.
+ // -DEVICE_PICKER_LAUNCH_CLASS: the class which will receive user's selected
+ // result from the BT list.
+ // -DEVICE_PICKER_NEED_AUTH: to show if bonding procedure needed.
+
+ mFilterType = BluetoothDevicePicker.FILTER_TYPE_ALL;
+ Intent intent = getIntent();
+ String action = intent.getAction();
+
+ if (action.equals(BluetoothDevicePicker.ACTION_LAUNCH)) {
+ mScreenType = SCREEN_TYPE_DEVICEPICKER;
+ mNeedAuth = intent.getBooleanExtra(BluetoothDevicePicker.EXTRA_NEED_AUTH, false);
+ mFilterType = intent.getIntExtra(BluetoothDevicePicker.EXTRA_FILTER_TYPE,
+ BluetoothDevicePicker.FILTER_TYPE_ALL);
+ mLaunchPackage = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_PACKAGE);
+ mLaunchClass = intent.getStringExtra(BluetoothDevicePicker.EXTRA_LAUNCH_CLASS);
+
+ setTitle(getString(R.string.device_picker));
+ addPreferencesFromResource(R.xml.device_picker);
+ } else {
+ addPreferencesFromResource(R.xml.bluetooth_settings);
+
+ mEnabler = new BluetoothEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_BT_CHECKBOX));
+
+ mDiscoverableEnabler = new BluetoothDiscoverableEnabler(
+ this,
+ (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE));
+
+ mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME);
+
+ mDeviceList = (ProgressCategory) findPreference(KEY_BT_DEVICE_LIST);
+ }
+
mDeviceList = (ProgressCategory) findPreference(KEY_BT_DEVICE_LIST);
-
+
registerForContextMenu(getListView());
}
@Override
protected void onResume() {
super.onResume();
-
+
// Repopulate (which isn't too bad since it's cached in the settings
// bluetooth manager
mDevicePreferenceMap.clear();
mDeviceList.removeAll();
addDevices();
- mEnabler.resume();
- mDiscoverableEnabler.resume();
- mNamePreference.resume();
+ if (mScreenType == SCREEN_TYPE_SETTINGS) {
+ mEnabler.resume();
+ mDiscoverableEnabler.resume();
+ mNamePreference.resume();
+ }
+
mLocalManager.registerCallback(this);
-
+
+ mDeviceList.setProgress(mLocalManager.getBluetoothAdapter().isDiscovering());
mLocalManager.startScanning(false);
- registerReceiver(mReceiver,
- new IntentFilter(BluetoothIntent.BLUETOOTH_STATE_CHANGED_ACTION));
-
+ IntentFilter intentFilter = new IntentFilter();
+ intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
+ intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
+ registerReceiver(mReceiver, intentFilter);
mLocalManager.setForegroundActivity(this);
}
-
+
@Override
protected void onPause() {
super.onPause();
mLocalManager.setForegroundActivity(null);
-
+
unregisterReceiver(mReceiver);
-
+
mLocalManager.unregisterCallback(this);
- mNamePreference.pause();
- mDiscoverableEnabler.pause();
- mEnabler.pause();
+ if (mScreenType == SCREEN_TYPE_SETTINGS) {
+ mNamePreference.pause();
+ mDiscoverableEnabler.pause();
+ mEnabler.pause();
+ }
}
private void addDevices() {
- List devices = mLocalManager.getLocalDeviceManager().getDevicesCopy();
- for (LocalBluetoothDevice device : devices) {
- onDeviceAdded(device);
+ List cachedDevices =
+ mLocalManager.getCachedDeviceManager().getCachedDevicesCopy();
+ for (CachedBluetoothDevice cachedDevice : cachedDevices) {
+ onDeviceAdded(cachedDevice);
}
}
-
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, MENU_SCAN, 0, R.string.bluetooth_scan_for_devices)
@@ -155,18 +220,18 @@ public class BluetoothSettings extends PreferenceActivity
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
- menu.findItem(MENU_SCAN).setEnabled(mLocalManager.getBluetoothManager().isEnabled());
+ menu.findItem(MENU_SCAN).setEnabled(mLocalManager.getBluetoothAdapter().isEnabled());
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
-
+
case MENU_SCAN:
mLocalManager.startScanning(true);
return true;
-
+
default:
return false;
}
@@ -180,39 +245,57 @@ public class BluetoothSettings extends PreferenceActivity
mLocalManager.startScanning(true);
return true;
}
-
+
if (preference instanceof BluetoothDevicePreference) {
- BluetoothDevicePreference btPreference = (BluetoothDevicePreference) preference;
- btPreference.getDevice().onClicked();
+ BluetoothDevicePreference btPreference = (BluetoothDevicePreference)preference;
+ if (mScreenType == SCREEN_TYPE_SETTINGS) {
+ btPreference.getCachedDevice().onClicked();
+ } else if (mScreenType == SCREEN_TYPE_DEVICEPICKER) {
+ CachedBluetoothDevice device = btPreference.getCachedDevice();
+
+ mSelectedDevice = device.getDevice();
+ mLocalManager.persistSelectedDeviceInPicker(mSelectedDevice.getAddress());
+ if ((device.getBondState() == BluetoothDevice.BOND_BONDED) ||
+ (mNeedAuth == false)) {
+ sendDevicePickedIntent(mSelectedDevice);
+ finish();
+ } else {
+ btPreference.getCachedDevice().onClicked();
+ }
+ }
return true;
}
-
+
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
-
+
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
- LocalBluetoothDevice device = getDeviceFromMenuInfo(menuInfo);
- if (device == null) return;
-
- device.onCreateContextMenu(menu);
+ //For device picker, disable Context Menu
+ if (mScreenType != SCREEN_TYPE_SETTINGS) {
+ return;
+ }
+ CachedBluetoothDevice cachedDevice = getDeviceFromMenuInfo(menuInfo);
+ if (cachedDevice == null) return;
+
+ cachedDevice.onCreateContextMenu(menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
- LocalBluetoothDevice device = getDeviceFromMenuInfo(item.getMenuInfo());
- if (device == null) return false;
-
- device.onContextItemSelected(item);
+ CachedBluetoothDevice cachedDevice = getDeviceFromMenuInfo(item.getMenuInfo());
+ if (cachedDevice == null) return false;
+
+ cachedDevice.onContextItemSelected(item);
return true;
}
- private LocalBluetoothDevice getDeviceFromMenuInfo(ContextMenuInfo menuInfo) {
+ private CachedBluetoothDevice getDeviceFromMenuInfo(ContextMenuInfo menuInfo) {
if ((menuInfo == null) || !(menuInfo instanceof AdapterContextMenuInfo)) {
return null;
}
-
+
AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
Preference pref = (Preference) getPreferenceScreen().getRootAdapter().getItem(
adapterMenuInfo.position);
@@ -220,26 +303,58 @@ public class BluetoothSettings extends PreferenceActivity
return null;
}
- return ((BluetoothDevicePreference) pref).getDevice();
+ return ((BluetoothDevicePreference) pref).getCachedDevice();
}
-
- public void onDeviceAdded(LocalBluetoothDevice device) {
- if (mDevicePreferenceMap.get(device) != null) {
- throw new IllegalStateException("Got onDeviceAdded, but device already exists");
+ public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
+
+ if (mDevicePreferenceMap.get(cachedDevice) != null) {
+ throw new IllegalStateException("Got onDeviceAdded, but cachedDevice already exists");
}
-
- createDevicePreference(device);
+
+ if (addDevicePreference(cachedDevice)) {
+ createDevicePreference(cachedDevice);
+ }
+ }
+
+ private boolean addDevicePreference(CachedBluetoothDevice cachedDevice) {
+ ParcelUuid[] uuids = cachedDevice.getDevice().getUuids();
+ BluetoothClass bluetoothClass = cachedDevice.getDevice().getBluetoothClass();
+
+ switch(mFilterType) {
+ case BluetoothDevicePicker.FILTER_TYPE_TRANSFER:
+ if (uuids != null)
+ if (BluetoothUuid.containsAnyUuid(uuids,
+ LocalBluetoothProfileManager.OPP_PROFILE_UUIDS)) return true;
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_OPP)) return true;
+ break;
+ case BluetoothDevicePicker.FILTER_TYPE_AUDIO:
+ if (uuids != null) {
+ if (BluetoothUuid.containsAnyUuid(uuids,
+ LocalBluetoothProfileManager.A2DP_PROFILE_UUIDS)) return true;
+
+ if (BluetoothUuid.containsAnyUuid(uuids,
+ LocalBluetoothProfileManager.HEADSET_PROFILE_UUIDS)) return true;
+ } else {
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) return true;
+
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) return true;
+ }
+ break;
+ default:
+ return true;
+ }
+ return false;
}
- private void createDevicePreference(LocalBluetoothDevice device) {
- BluetoothDevicePreference preference = new BluetoothDevicePreference(this, device);
+ private void createDevicePreference(CachedBluetoothDevice cachedDevice) {
+ BluetoothDevicePreference preference = new BluetoothDevicePreference(this, cachedDevice);
mDeviceList.addPreference(preference);
- mDevicePreferenceMap.put(device, preference);
+ mDevicePreferenceMap.put(cachedDevice, preference);
}
-
- public void onDeviceDeleted(LocalBluetoothDevice device) {
- BluetoothDevicePreference preference = mDevicePreferenceMap.remove(device);
+
+ public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+ BluetoothDevicePreference preference = mDevicePreferenceMap.remove(cachedDevice);
if (preference != null) {
mDeviceList.removePreference(preference);
}
@@ -248,14 +363,23 @@ public class BluetoothSettings extends PreferenceActivity
public void onScanningStateChanged(boolean started) {
mDeviceList.setProgress(started);
}
-
+
private void onBluetoothStateChanged(int bluetoothState) {
// When bluetooth is enabled (and we are in the activity, which we are),
// we should start a scan
- if (bluetoothState == BluetoothDevice.BLUETOOTH_STATE_ON) {
+ if (bluetoothState == BluetoothAdapter.STATE_ON) {
mLocalManager.startScanning(false);
- } else if (bluetoothState == BluetoothDevice.BLUETOOTH_STATE_OFF) {
+ } else if (bluetoothState == BluetoothAdapter.STATE_OFF) {
mDeviceList.setProgress(false);
}
}
+
+ private void sendDevicePickedIntent(BluetoothDevice device) {
+ Intent intent = new Intent(BluetoothDevicePicker.ACTION_DEVICE_SELECTED);
+ if (mLaunchPackage != null && mLaunchClass != null) {
+ intent.setClassName(mLaunchPackage, mLaunchClass);
+ }
+ intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+ sendBroadcast(intent);
+ }
}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
similarity index 66%
rename from src/com/android/settings/bluetooth/LocalBluetoothDevice.java
rename to src/com/android/settings/bluetooth/CachedBluetoothDevice.java
index 5259d7b391f..03328b5fb31 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
@@ -17,12 +17,15 @@
package com.android.settings.bluetooth;
import android.app.AlertDialog;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
+import android.os.ParcelUuid;
+import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
@@ -40,25 +43,26 @@ import java.util.LinkedList;
import java.util.List;
/**
- * LocalBluetoothDevice represents a remote Bluetooth device. It contains
+ * CachedBluetoothDevice represents a remote Bluetooth device. It contains
* attributes of the device (such as the address, name, RSSI, etc.) and
* functionality that can be performed on the device (connect, pair, disconnect,
* etc.).
*/
-public class LocalBluetoothDevice implements Comparable {
- private static final String TAG = "LocalBluetoothDevice";
+public class CachedBluetoothDevice implements Comparable {
+ private static final String TAG = "CachedBluetoothDevice";
private static final boolean D = LocalBluetoothManager.D;
private static final boolean V = LocalBluetoothManager.V;
+ private static final boolean DEBUG = false;
private static final int CONTEXT_ITEM_CONNECT = Menu.FIRST + 1;
private static final int CONTEXT_ITEM_DISCONNECT = Menu.FIRST + 2;
private static final int CONTEXT_ITEM_UNPAIR = Menu.FIRST + 3;
private static final int CONTEXT_ITEM_CONNECT_ADVANCED = Menu.FIRST + 4;
- private final String mAddress;
+ private final BluetoothDevice mDevice;
private String mName;
private short mRssi;
- private int mBtClass = BluetoothClass.ERROR;
+ private BluetoothClass mBtClass;
private List mProfiles = new ArrayList();
@@ -74,6 +78,17 @@ public class LocalBluetoothDevice implements Comparable {
*/
private boolean mIsConnectingErrorPossible;
+ /**
+ * Last time a bt profile auto-connect was attempted.
+ * If an ACTION_UUID intent comes in within
+ * MAX_UUID_DELAY_FOR_AUTO_CONNECT milliseconds, we will try auto-connect
+ * again with the new UUIDs
+ */
+ private long mConnectAttempted;
+
+ // See mConnectAttempted
+ private static final long MAX_UUID_DELAY_FOR_AUTO_CONNECT = 5000;
+
// Max time to hold the work queue if we don't get or missed a response
// from the bt framework.
private static final long MAX_WAIT_TIME_FOR_FRAMEWORK = 25 * 1000;
@@ -82,26 +97,26 @@ public class LocalBluetoothDevice implements Comparable {
CONNECT, DISCONNECT,
}
- class BluetoothJob {
+ static class BluetoothJob {
final BluetoothCommand command; // CONNECT, DISCONNECT
- final LocalBluetoothDevice device;
+ final CachedBluetoothDevice cachedDevice;
final Profile profile; // HEADSET, A2DP, etc
// 0 means this command was not been sent to the bt framework.
long timeSent;
public BluetoothJob(BluetoothCommand command,
- LocalBluetoothDevice device, Profile profile) {
+ CachedBluetoothDevice cachedDevice, Profile profile) {
this.command = command;
- this.device = device;
+ this.cachedDevice = cachedDevice;
this.profile = profile;
this.timeSent = 0;
}
-
+
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(command.name());
- sb.append(" Address:").append(device.mAddress);
+ sb.append(" Address:").append(cachedDevice.mDevice);
sb.append(" Profile:").append(profile.name());
sb.append(" TimeSent:");
if (timeSent == 0) {
@@ -147,7 +162,7 @@ public class LocalBluetoothDevice implements Comparable {
}
}
}
-
+
private boolean pruneQueue(BluetoothJob job) {
boolean removedStaleItems = false;
long now = System.currentTimeMillis();
@@ -159,7 +174,7 @@ public class LocalBluetoothDevice implements Comparable {
if (job != null && job.command == BluetoothCommand.DISCONNECT) {
if (existingJob.timeSent == 0
&& existingJob.command == BluetoothCommand.CONNECT
- && existingJob.device.mAddress.equals(job.device.mAddress)
+ && existingJob.cachedDevice.mDevice.equals(job.cachedDevice.mDevice)
&& existingJob.profile == job.profile) {
if (D) {
Log.d(TAG, "Removed because of a pending disconnect. " + existingJob);
@@ -186,13 +201,13 @@ public class LocalBluetoothDevice implements Comparable {
private boolean processCommand(BluetoothJob job) {
boolean successful = false;
if (job.timeSent == 0) {
- job.timeSent = System.currentTimeMillis();
+ job.timeSent = System.currentTimeMillis();
switch (job.command) {
case CONNECT:
- successful = connectInt(job.device, job.profile);
+ successful = connectInt(job.cachedDevice, job.profile);
break;
case DISCONNECT:
- successful = disconnectInt(job.device, job.profile);
+ successful = disconnectInt(job.cachedDevice, job.profile);
break;
}
@@ -230,12 +245,12 @@ public class LocalBluetoothDevice implements Comparable {
BluetoothJob job = workQueue.peek();
if (job == null) {
return;
- } else if (job.device.mAddress != mAddress) {
+ } else if (!job.cachedDevice.mDevice.equals(mDevice)) {
// This can happen in 2 cases: 1) BT device initiated pairing and
// 2) disconnects of one headset that's triggered by connects of
// another.
if (D) {
- Log.d(TAG, "mAddresses:" + mAddress + " != head:" + job.toString());
+ Log.d(TAG, "mDevice:" + mDevice + " != head:" + job.toString());
}
// Check to see if we need to remove the stale items from the queue
@@ -281,14 +296,14 @@ public class LocalBluetoothDevice implements Comparable {
}
}
- LocalBluetoothDevice(Context context, String address) {
+ CachedBluetoothDevice(Context context, BluetoothDevice device) {
mLocalManager = LocalBluetoothManager.getInstance(context);
if (mLocalManager == null) {
throw new IllegalStateException(
- "Cannot use LocalBluetoothDevice without Bluetooth hardware");
+ "Cannot use CachedBluetoothDevice without Bluetooth hardware");
}
- mAddress = address;
+ mDevice = device;
fillData();
}
@@ -300,7 +315,7 @@ public class LocalBluetoothDevice implements Comparable {
askDisconnect();
} else if (bondState == BluetoothDevice.BOND_BONDED) {
connect();
- } else if (bondState == BluetoothDevice.BOND_NOT_BONDED) {
+ } else if (bondState == BluetoothDevice.BOND_NONE) {
pair();
}
}
@@ -315,12 +330,12 @@ public class LocalBluetoothDevice implements Comparable {
queueCommand(new BluetoothJob(BluetoothCommand.DISCONNECT, this, profile));
}
- private boolean disconnectInt(LocalBluetoothDevice device, Profile profile) {
+ private boolean disconnectInt(CachedBluetoothDevice cachedDevice, Profile profile) {
LocalBluetoothProfileManager profileManager =
LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
- int status = profileManager.getConnectionStatus(device.mAddress);
+ int status = profileManager.getConnectionStatus(cachedDevice.mDevice);
if (SettingsBtStatus.isConnectionStatusConnected(status)) {
- if (profileManager.disconnect(device.mAddress) == BluetoothDevice.RESULT_SUCCESS) {
+ if (profileManager.disconnect(cachedDevice.mDevice)) {
return true;
}
}
@@ -349,7 +364,7 @@ public class LocalBluetoothDevice implements Comparable {
}
};
- AlertDialog ad = new AlertDialog.Builder(context)
+ new AlertDialog.Builder(context)
.setTitle(getName())
.setMessage(message)
.setPositiveButton(android.R.string.ok, disconnectListener)
@@ -360,59 +375,80 @@ public class LocalBluetoothDevice implements Comparable {
public void connect() {
if (!ensurePaired()) return;
- // Reset the only-show-one-error-dialog tracking variable
- mIsConnectingErrorPossible = true;
+ mConnectAttempted = SystemClock.elapsedRealtime();
- Context context = mLocalManager.getContext();
- boolean hasAtLeastOnePreferredProfile = false;
- for (Profile profile : mProfiles) {
- LocalBluetoothProfileManager profileManager =
- LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
- if (profileManager.isPreferred(mAddress)) {
- hasAtLeastOnePreferredProfile = true;
- queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+ connectWithoutResettingTimer();
+ }
+
+ private void connectWithoutResettingTimer() {
+ // Try to initialize the profiles if there were not.
+ if (mProfiles.size() == 0) {
+ if (!updateProfiles()) {
+ // If UUIDs are not available yet, connect will be happen
+ // upon arrival of the ACTION_UUID intent.
+ if (DEBUG) Log.d(TAG, "No profiles. Maybe we will connect later");
+ return;
}
}
- if (!hasAtLeastOnePreferredProfile) {
- connectAndPreferAllProfiles();
+ // Reset the only-show-one-error-dialog tracking variable
+ mIsConnectingErrorPossible = true;
+
+ int preferredProfiles = 0;
+ for (Profile profile : mProfiles) {
+ if (isConnectableProfile(profile)) {
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mLocalManager, profile);
+ if (profileManager.isPreferred(mDevice)) {
+ ++preferredProfiles;
+ queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+ }
+ }
+ }
+ if (DEBUG) Log.d(TAG, "Preferred profiles = " + preferredProfiles);
+
+ if (preferredProfiles == 0) {
+ connectAllProfiles();
}
}
- private void connectAndPreferAllProfiles() {
+ private void connectAllProfiles() {
if (!ensurePaired()) return;
// Reset the only-show-one-error-dialog tracking variable
mIsConnectingErrorPossible = true;
- Context context = mLocalManager.getContext();
for (Profile profile : mProfiles) {
- LocalBluetoothProfileManager profileManager =
- LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
- profileManager.setPreferred(mAddress, true);
- queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+ if (isConnectableProfile(profile)) {
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mLocalManager, profile);
+ profileManager.setPreferred(mDevice, false);
+ queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
+ }
}
}
public void connect(Profile profile) {
+ mConnectAttempted = SystemClock.elapsedRealtime();
// Reset the only-show-one-error-dialog tracking variable
mIsConnectingErrorPossible = true;
queueCommand(new BluetoothJob(BluetoothCommand.CONNECT, this, profile));
}
- private boolean connectInt(LocalBluetoothDevice device, Profile profile) {
- if (!device.ensurePaired()) return false;
+ private boolean connectInt(CachedBluetoothDevice cachedDevice, Profile profile) {
+ if (!cachedDevice.ensurePaired()) return false;
LocalBluetoothProfileManager profileManager =
LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile);
- int status = profileManager.getConnectionStatus(device.mAddress);
+ int status = profileManager.getConnectionStatus(cachedDevice.mDevice);
if (!SettingsBtStatus.isConnectionStatusConnected(status)) {
- if (profileManager.connect(device.mAddress) == BluetoothDevice.RESULT_SUCCESS) {
+ if (profileManager.connect(cachedDevice.mDevice)) {
return true;
}
- Log.i(TAG, "Failed to connect " + profile.toString() + " to " + device.mName);
+ Log.i(TAG, "Failed to connect " + profile.toString() + " to " + cachedDevice.mName);
+ } else {
+ Log.i(TAG, "Already connected");
}
- Log.i(TAG, "Not connected");
return false;
}
@@ -420,12 +456,12 @@ public class LocalBluetoothDevice implements Comparable {
if (!mIsConnectingErrorPossible) return;
mIsConnectingErrorPossible = false;
- mLocalManager.showError(mAddress, R.string.bluetooth_error_title,
+ mLocalManager.showError(mDevice, R.string.bluetooth_error_title,
R.string.bluetooth_connecting_error_message);
}
private boolean ensurePaired() {
- if (getBondState() == BluetoothDevice.BOND_NOT_BONDED) {
+ if (getBondState() == BluetoothDevice.BOND_NONE) {
pair();
return false;
} else {
@@ -434,15 +470,15 @@ public class LocalBluetoothDevice implements Comparable {
}
public void pair() {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
+ BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter();
// Pairing is unreliable while scanning, so cancel discovery
- if (manager.isDiscovering()) {
- manager.cancelDiscovery();
+ if (adapter.isDiscovering()) {
+ adapter.cancelDiscovery();
}
- if (!mLocalManager.getBluetoothManager().createBond(mAddress)) {
- mLocalManager.showError(mAddress, R.string.bluetooth_error_title,
+ if (!mDevice.createBond()) {
+ mLocalManager.showError(mDevice, R.string.bluetooth_error_title,
R.string.bluetooth_pairing_error_message);
}
}
@@ -450,11 +486,11 @@ public class LocalBluetoothDevice implements Comparable {
public void unpair() {
synchronized (workQueue) {
// Remove any pending commands for this device
- boolean processNow = false;
+ boolean processNow = false;
Iterator it = workQueue.iterator();
while (it.hasNext()) {
BluetoothJob job = it.next();
- if (job.device.mAddress.equals(this.mAddress)) {
+ if (job.cachedDevice.mDevice.equals(this.mDevice)) {
it.remove();
if (job.timeSent != 0) {
processNow = true;
@@ -466,48 +502,57 @@ public class LocalBluetoothDevice implements Comparable {
}
}
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
-
switch (getBondState()) {
case BluetoothDevice.BOND_BONDED:
- manager.removeBond(mAddress);
+ mDevice.removeBond();
break;
case BluetoothDevice.BOND_BONDING:
- manager.cancelBondProcess(mAddress);
+ mDevice.cancelBondProcess();
break;
}
}
private void fillData() {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
-
fetchName();
fetchBtClass();
+ updateProfiles();
mVisible = false;
dispatchAttributesChanged();
}
- public String getAddress() {
- return mAddress;
+ public BluetoothDevice getDevice() {
+ return mDevice;
}
public String getName() {
return mName;
}
+ public void setName(String name) {
+ if (!mName.equals(name)) {
+ if (TextUtils.isEmpty(name)) {
+ mName = mDevice.getAddress();
+ } else {
+ mName = name;
+ }
+ dispatchAttributesChanged();
+ }
+ }
+
public void refreshName() {
fetchName();
dispatchAttributesChanged();
}
private void fetchName() {
- mName = mLocalManager.getBluetoothManager().getRemoteName(mAddress);
+ mName = mDevice.getName();
if (TextUtils.isEmpty(mName)) {
- mName = mAddress;
+ mName = mDevice.getAddress();
+ if (DEBUG) Log.d(TAG, "Default to address. Device has no name (yet) " + mName);
}
}
@@ -527,7 +572,7 @@ public class LocalBluetoothDevice implements Comparable {
}
public int getBondState() {
- return mLocalManager.getBluetoothManager().getBondState(mAddress);
+ return mDevice.getBondState();
}
void setRssi(short rssi) {
@@ -545,7 +590,7 @@ public class LocalBluetoothDevice implements Comparable {
public boolean isConnected() {
for (Profile profile : mProfiles) {
int status = LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile)
- .getConnectionStatus(mAddress);
+ .getConnectionStatus(mDevice);
if (SettingsBtStatus.isConnectionStatusConnected(status)) {
return true;
}
@@ -557,7 +602,7 @@ public class LocalBluetoothDevice implements Comparable {
public boolean isBusy() {
for (Profile profile : mProfiles) {
int status = LocalBluetoothProfileManager.getProfileManager(mLocalManager, profile)
- .getConnectionStatus(mAddress);
+ .getConnectionStatus(mDevice);
if (SettingsBtStatus.isConnectionStatusBusy(status)) {
return true;
}
@@ -571,35 +616,82 @@ public class LocalBluetoothDevice implements Comparable {
}
public int getBtClassDrawable() {
+ if (mBtClass != null) {
+ switch (mBtClass.getMajorDeviceClass()) {
+ case BluetoothClass.Device.Major.COMPUTER:
+ return R.drawable.ic_bt_laptop;
- // First try looking at profiles
- if (mProfiles.contains(Profile.A2DP)) {
- return R.drawable.ic_bt_headphones_a2dp;
- } else if (mProfiles.contains(Profile.HEADSET)) {
- return R.drawable.ic_bt_headset_hfp;
+ case BluetoothClass.Device.Major.PHONE:
+ return R.drawable.ic_bt_cellphone;
+ }
+ } else {
+ Log.w(TAG, "mBtClass is null");
}
- // Fallback on class
- switch (BluetoothClass.Device.Major.getDeviceMajor(mBtClass)) {
- case BluetoothClass.Device.Major.COMPUTER:
- return R.drawable.ic_bt_laptop;
+ if (mProfiles.size() > 0) {
+ if (mProfiles.contains(Profile.A2DP)) {
+ return R.drawable.ic_bt_headphones_a2dp;
+ } else if (mProfiles.contains(Profile.HEADSET)) {
+ return R.drawable.ic_bt_headset_hfp;
+ }
+ } else if (mBtClass != null) {
+ if (mBtClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
+ return R.drawable.ic_bt_headphones_a2dp;
- case BluetoothClass.Device.Major.PHONE:
- return R.drawable.ic_bt_cellphone;
-
- default:
- return 0;
+ }
+ if (mBtClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
+ return R.drawable.ic_bt_headset_hfp;
+ }
}
+ return 0;
}
/**
* Fetches a new value for the cached BT class.
*/
private void fetchBtClass() {
- mBtClass = mLocalManager.getBluetoothManager().getRemoteClass(mAddress);
- if (mBtClass != BluetoothClass.ERROR) {
- LocalBluetoothProfileManager.fill(mBtClass, mProfiles);
+ mBtClass = mDevice.getBluetoothClass();
+ }
+
+ private boolean updateProfiles() {
+ ParcelUuid[] uuids = mDevice.getUuids();
+ if (uuids == null) return false;
+
+ LocalBluetoothProfileManager.updateProfiles(uuids, mProfiles);
+
+ if (DEBUG) {
+ Log.e(TAG, "updating profiles for " + mDevice.getName());
+
+ boolean printUuids = true;
+ BluetoothClass bluetoothClass = mDevice.getBluetoothClass();
+
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET) !=
+ mProfiles.contains(Profile.HEADSET)) {
+ Log.v(TAG, "headset classbits != uuid");
+ printUuids = true;
+ }
+
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_A2DP) !=
+ mProfiles.contains(Profile.A2DP)) {
+ Log.v(TAG, "a2dp classbits != uuid");
+ printUuids = true;
+ }
+
+ if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_OPP) !=
+ mProfiles.contains(Profile.OPP)) {
+ Log.v(TAG, "opp classbits != uuid");
+ printUuids = true;
+ }
+
+ if (printUuids) {
+ Log.v(TAG, "Class: " + bluetoothClass.toString());
+ Log.v(TAG, "UUID:");
+ for (int i = 0; i < uuids.length; i++) {
+ Log.v(TAG, " " + uuids[i]);
+ }
+ }
}
+ return true;
}
/**
@@ -611,6 +703,43 @@ public class LocalBluetoothDevice implements Comparable {
dispatchAttributesChanged();
}
+ /**
+ * Refreshes the UI when framework alerts us of a UUID change.
+ */
+ public void onUuidChanged() {
+ updateProfiles();
+
+ if (DEBUG) {
+ Log.e(TAG, "onUuidChanged: Time since last connect"
+ + (SystemClock.elapsedRealtime() - mConnectAttempted));
+ }
+
+ /*
+ * If a connect was attempted earlier without any UUID, we will do the
+ * connect now.
+ */
+ if (mProfiles.size() > 0
+ && (mConnectAttempted + MAX_UUID_DELAY_FOR_AUTO_CONNECT) > SystemClock
+ .elapsedRealtime()) {
+ connectWithoutResettingTimer();
+ }
+ dispatchAttributesChanged();
+ }
+
+ public void onBondingStateChanged(int bondState) {
+ if (bondState == BluetoothDevice.BOND_NONE) {
+ mProfiles.clear();
+ }
+ refresh();
+ }
+
+ public void setBtClass(BluetoothClass btClass) {
+ if (btClass != null && mBtClass != btClass) {
+ mBtClass = btClass;
+ dispatchAttributesChanged();
+ }
+ }
+
public int getSummary() {
// TODO: clean up
int oneOffSummary = getOneOffSummary();
@@ -621,7 +750,7 @@ public class LocalBluetoothDevice implements Comparable {
for (Profile profile : mProfiles) {
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
.getProfileManager(mLocalManager, profile);
- int connectionStatus = profileManager.getConnectionStatus(mAddress);
+ int connectionStatus = profileManager.getConnectionStatus(mDevice);
if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus) ||
connectionStatus == SettingsBtStatus.CONNECTION_STATUS_CONNECTING ||
@@ -645,17 +774,17 @@ public class LocalBluetoothDevice implements Comparable {
if (mProfiles.contains(Profile.A2DP)) {
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
.getProfileManager(mLocalManager, Profile.A2DP);
- isConnecting = profileManager.getConnectionStatus(mAddress) ==
+ isConnecting = profileManager.getConnectionStatus(mDevice) ==
SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
- isA2dpConnected = profileManager.isConnected(mAddress);
+ isA2dpConnected = profileManager.isConnected(mDevice);
}
if (mProfiles.contains(Profile.HEADSET)) {
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
.getProfileManager(mLocalManager, Profile.HEADSET);
- isConnecting |= profileManager.getConnectionStatus(mAddress) ==
+ isConnecting |= profileManager.getConnectionStatus(mDevice) ==
SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
- isHeadsetConnected = profileManager.isConnected(mAddress);
+ isHeadsetConnected = profileManager.isConnected(mDevice);
}
if (isConnecting) {
@@ -673,40 +802,59 @@ public class LocalBluetoothDevice implements Comparable {
}
}
- public List getProfiles() {
- return new ArrayList(mProfiles);
+ public List getConnectableProfiles() {
+ ArrayList connectableProfiles = new ArrayList();
+ for (Profile profile : mProfiles) {
+ if (isConnectableProfile(profile)) {
+ connectableProfiles.add(profile);
+ }
+ }
+ return connectableProfiles;
+ }
+
+ private boolean isConnectableProfile(Profile profile) {
+ return profile.equals(Profile.HEADSET) || profile.equals(Profile.A2DP);
}
public void onCreateContextMenu(ContextMenu menu) {
// No context menu if it is busy (none of these items are applicable if busy)
- if (isBusy()) return;
+ if (mLocalManager.getBluetoothState() != BluetoothAdapter.STATE_ON || isBusy()) {
+ return;
+ }
int bondState = getBondState();
boolean isConnected = isConnected();
- boolean hasProfiles = mProfiles.size() > 0;
+ boolean hasConnectableProfiles = false;
+
+ for (Profile profile : mProfiles) {
+ if (isConnectableProfile(profile)) {
+ hasConnectableProfiles = true;
+ break;
+ }
+ }
menu.setHeaderTitle(getName());
- if (isConnected) {
- menu.add(0, CONTEXT_ITEM_DISCONNECT, 0, R.string.bluetooth_device_context_disconnect);
- } else if (hasProfiles) {
- // For connection action, show either "Connect" or "Pair & connect"
- int connectString = (bondState == BluetoothDevice.BOND_NOT_BONDED)
- ? R.string.bluetooth_device_context_pair_connect
- : R.string.bluetooth_device_context_connect;
- menu.add(0, CONTEXT_ITEM_CONNECT, 0, connectString);
- }
-
- if (bondState == BluetoothDevice.BOND_BONDED) {
- // For unpair action, show either "Unpair" or "Disconnect & unpair"
- int unpairString = isConnected
- ? R.string.bluetooth_device_context_disconnect_unpair
- : R.string.bluetooth_device_context_unpair;
- menu.add(0, CONTEXT_ITEM_UNPAIR, 0, unpairString);
+ if (bondState == BluetoothDevice.BOND_NONE) { // Not paired and not connected
+ menu.add(0, CONTEXT_ITEM_CONNECT, 0, R.string.bluetooth_device_context_pair_connect);
+ } else { // Paired
+ if (isConnected) { // Paired and connected
+ menu.add(0, CONTEXT_ITEM_DISCONNECT, 0,
+ R.string.bluetooth_device_context_disconnect);
+ menu.add(0, CONTEXT_ITEM_UNPAIR, 0,
+ R.string.bluetooth_device_context_disconnect_unpair);
+ } else { // Paired but not connected
+ if (hasConnectableProfiles) {
+ menu.add(0, CONTEXT_ITEM_CONNECT, 0, R.string.bluetooth_device_context_connect);
+ }
+ menu.add(0, CONTEXT_ITEM_UNPAIR, 0, R.string.bluetooth_device_context_unpair);
+ }
// Show the connection options item
- menu.add(0, CONTEXT_ITEM_CONNECT_ADVANCED, 0,
- R.string.bluetooth_device_context_connect_advanced);
+ if (hasConnectableProfiles) {
+ menu.add(0, CONTEXT_ITEM_CONNECT_ADVANCED, 0,
+ R.string.bluetooth_device_context_connect_advanced);
+ }
}
}
@@ -726,7 +874,6 @@ public class LocalBluetoothDevice implements Comparable {
break;
case CONTEXT_ITEM_UNPAIR:
- mLocalManager.getBluetoothManager().disconnectRemoteDeviceAcl(mAddress);
unpair();
break;
@@ -740,7 +887,7 @@ public class LocalBluetoothDevice implements Comparable {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
intent.setClass(context, ConnectSpecificProfilesActivity.class);
- intent.putExtra(ConnectSpecificProfilesActivity.EXTRA_ADDRESS, mAddress);
+ intent.putExtra(ConnectSpecificProfilesActivity.EXTRA_DEVICE, mDevice);
context.startActivity(intent);
break;
}
@@ -768,24 +915,24 @@ public class LocalBluetoothDevice implements Comparable {
@Override
public String toString() {
- return mAddress;
+ return mDevice.toString();
}
@Override
public boolean equals(Object o) {
- if ((o == null) || !(o instanceof LocalBluetoothDevice)) {
+ if ((o == null) || !(o instanceof CachedBluetoothDevice)) {
throw new ClassCastException();
}
- return mAddress.equals(((LocalBluetoothDevice) o).mAddress);
+ return mDevice.equals(((CachedBluetoothDevice) o).mDevice);
}
@Override
public int hashCode() {
- return mAddress.hashCode();
+ return mDevice.getAddress().hashCode();
}
- public int compareTo(LocalBluetoothDevice another) {
+ public int compareTo(CachedBluetoothDevice another) {
int comparison;
// Connected above not connected
@@ -810,6 +957,6 @@ public class LocalBluetoothDevice implements Comparable {
}
public interface Callback {
- void onDeviceAttributesChanged(LocalBluetoothDevice device);
+ void onDeviceAttributesChanged(CachedBluetoothDevice cachedDevice);
}
}
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java b/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java
new file mode 100644
index 00000000000..c3dfc208bf8
--- /dev/null
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDeviceManager.java
@@ -0,0 +1,274 @@
+/*
+ * 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.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.util.Log;
+
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothManager.Callback;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices.
+ */
+public class CachedBluetoothDeviceManager {
+ private static final String TAG = "CachedBluetoothDeviceManager";
+
+ final LocalBluetoothManager mLocalManager;
+ final List mCallbacks;
+
+ final List mCachedDevices = new ArrayList();
+
+ public CachedBluetoothDeviceManager(LocalBluetoothManager localManager) {
+ mLocalManager = localManager;
+ mCallbacks = localManager.getCallbacks();
+ readPairedDevices();
+ }
+
+ private synchronized boolean readPairedDevices() {
+ BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter();
+ Set bondedDevices = adapter.getBondedDevices();
+ if (bondedDevices == null) return false;
+
+ boolean deviceAdded = false;
+ for (BluetoothDevice device : bondedDevices) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) {
+ cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device);
+ mCachedDevices.add(cachedDevice);
+ dispatchDeviceAdded(cachedDevice);
+ deviceAdded = true;
+ }
+ }
+
+ return deviceAdded;
+ }
+
+ public synchronized List getCachedDevicesCopy() {
+ return new ArrayList(mCachedDevices);
+ }
+
+ void onBluetoothStateChanged(boolean enabled) {
+ if (enabled) {
+ readPairedDevices();
+ }
+ }
+
+ public synchronized void onDeviceAppeared(BluetoothDevice device, short rssi,
+ BluetoothClass btClass, String name) {
+ boolean deviceAdded = false;
+
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) {
+ cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device);
+ mCachedDevices.add(cachedDevice);
+ deviceAdded = true;
+ }
+ cachedDevice.setRssi(rssi);
+ cachedDevice.setBtClass(btClass);
+ cachedDevice.setName(name);
+ cachedDevice.setVisible(true);
+
+ if (deviceAdded) {
+ dispatchDeviceAdded(cachedDevice);
+ }
+ }
+
+ public synchronized void onDeviceDisappeared(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) return;
+
+ cachedDevice.setVisible(false);
+ checkForDeviceRemoval(cachedDevice);
+ }
+
+ private void checkForDeviceRemoval(CachedBluetoothDevice cachedDevice) {
+ if (cachedDevice.getBondState() == BluetoothDevice.BOND_NONE &&
+ !cachedDevice.isVisible()) {
+ // If device isn't paired, remove it altogether
+ mCachedDevices.remove(cachedDevice);
+ dispatchDeviceDeleted(cachedDevice);
+ }
+ }
+
+ public synchronized void onDeviceNameUpdated(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice != null) {
+ cachedDevice.refreshName();
+ }
+ }
+
+ public synchronized CachedBluetoothDevice findDevice(BluetoothDevice device) {
+
+ for (int i = mCachedDevices.size() - 1; i >= 0; i--) {
+ CachedBluetoothDevice cachedDevice = mCachedDevices.get(i);
+
+ if (cachedDevice.getDevice().equals(device)) {
+ return cachedDevice;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Attempts to get the name of a remote device, otherwise returns the address.
+ *
+ * @param device The remote device.
+ * @return The name, or if unavailable, the address.
+ */
+ public String getName(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice != null) return cachedDevice.getName();
+
+ String name = device.getName();
+ if (name != null) return name;
+
+ return device.getAddress();
+ }
+
+ private void dispatchDeviceAdded(CachedBluetoothDevice cachedDevice) {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onDeviceAdded(cachedDevice);
+ }
+ }
+
+ // TODO: divider between prev paired/connected and scanned
+ }
+
+ private void dispatchDeviceDeleted(CachedBluetoothDevice cachedDevice) {
+ synchronized (mCallbacks) {
+ for (Callback callback : mCallbacks) {
+ callback.onDeviceDeleted(cachedDevice);
+ }
+ }
+ }
+
+ public synchronized void onBondingStateChanged(BluetoothDevice device, int bondState) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) {
+ if (!readPairedDevices()) {
+ Log.e(TAG, "Got bonding state changed for " + device +
+ ", but we have no record of that device.");
+ return;
+ }
+ cachedDevice = findDevice(device);
+ if (cachedDevice == null) {
+ Log.e(TAG, "Got bonding state changed for " + device +
+ "but device not added in cache");
+ return;
+ }
+ }
+
+ cachedDevice.onBondingStateChanged(bondState);
+
+ if (bondState == BluetoothDevice.BOND_BONDED) {
+ // Auto-connect after pairing
+ cachedDevice.connect();
+ }
+ }
+
+ /**
+ * Called when we have reached the un-bond state.
+ *
+ * @param device The remote device.
+ * @param reason The reason, one of the error reasons from
+ * BluetoothDevice.UNBOND_REASON_*
+ */
+ public synchronized void showUnbondMessage(BluetoothDevice device, int reason) {
+ int errorMsg;
+
+ switch(reason) {
+ case BluetoothDevice.UNBOND_REASON_AUTH_FAILED:
+ errorMsg = R.string.bluetooth_pairing_pin_error_message;
+ mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
+ break;
+ case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED:
+ errorMsg = R.string.bluetooth_pairing_rejected_error_message;
+ mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
+ break;
+ case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN:
+ errorMsg = R.string.bluetooth_pairing_device_down_error_message;
+ mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
+ break;
+ case BluetoothDevice.UNBOND_REASON_DISCOVERY_IN_PROGRESS:
+ case BluetoothDevice.UNBOND_REASON_AUTH_TIMEOUT:
+ case BluetoothDevice.UNBOND_REASON_REPEATED_ATTEMPTS:
+ case BluetoothDevice.UNBOND_REASON_REMOTE_AUTH_CANCELED:
+ errorMsg = R.string.bluetooth_pairing_error_message;
+ mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg);
+ break;
+ default:
+ Log.w(TAG, "showUnbondMessage: Not displaying any message for reason:" + reason);
+ break;
+ }
+ }
+
+ public synchronized void onProfileStateChanged(BluetoothDevice device, Profile profile,
+ int newProfileState) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) return;
+
+ cachedDevice.onProfileStateChanged(profile, newProfileState);
+ cachedDevice.refresh();
+ }
+
+ public synchronized void onConnectingError(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice == null) return;
+
+ /*
+ * Go through the device's delegate so we don't spam the user with
+ * errors connecting to different profiles, and instead make sure the
+ * user sees a single error for his single 'connect' action.
+ */
+ cachedDevice.showConnectingError();
+ }
+
+ public synchronized void onScanningStateChanged(boolean started) {
+ if (!started) return;
+
+ // If starting a new scan, clear old visibility
+ for (int i = mCachedDevices.size() - 1; i >= 0; i--) {
+ CachedBluetoothDevice cachedDevice = mCachedDevices.get(i);
+ cachedDevice.setVisible(false);
+ checkForDeviceRemoval(cachedDevice);
+ }
+ }
+
+ public synchronized void onBtClassChanged(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice != null) {
+ cachedDevice.refreshBtClass();
+ }
+ }
+
+ public synchronized void onUuidChanged(BluetoothDevice device) {
+ CachedBluetoothDevice cachedDevice = findDevice(device);
+ if (cachedDevice != null) {
+ cachedDevice.onUuidChanged();
+ }
+ }
+}
diff --git a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
index 7dd1b706d7b..08534f3b85f 100644
--- a/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
+++ b/src/com/android/settings/bluetooth/ConnectSpecificProfilesActivity.java
@@ -16,9 +16,7 @@
package com.android.settings.bluetooth;
-import com.android.settings.R;
-import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
-
+import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
@@ -28,24 +26,27 @@ import android.preference.PreferenceGroup;
import android.text.TextUtils;
import android.util.Log;
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
/**
* ConnectSpecificProfilesActivity presents the user with all of the profiles
* for a particular device, and allows him to choose which should be connected
* (or disconnected).
*/
public class ConnectSpecificProfilesActivity extends PreferenceActivity
- implements LocalBluetoothDevice.Callback, Preference.OnPreferenceChangeListener {
+ implements CachedBluetoothDevice.Callback, Preference.OnPreferenceChangeListener {
private static final String TAG = "ConnectSpecificProfilesActivity";
private static final String KEY_ONLINE_MODE = "online_mode";
private static final String KEY_TITLE = "title";
private static final String KEY_PROFILE_CONTAINER = "profile_container";
- public static final String EXTRA_ADDRESS = "address";
-
+ public static final String EXTRA_DEVICE = "device";
+
private LocalBluetoothManager mManager;
- private LocalBluetoothDevice mDevice;
-
+ private CachedBluetoothDevice mCachedDevice;
+
private PreferenceGroup mProfileContainer;
private CheckBoxPreference mOnlineModePreference;
@@ -57,42 +58,42 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
* profile.
*/
private boolean mOnlineMode;
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
- String address;
+
+ BluetoothDevice device;
if (savedInstanceState != null) {
- address = savedInstanceState.getString(EXTRA_ADDRESS);
+ device = savedInstanceState.getParcelable(EXTRA_DEVICE);
} else {
Intent intent = getIntent();
- address = intent.getStringExtra(EXTRA_ADDRESS);
+ device = intent.getParcelableExtra(EXTRA_DEVICE);
}
- if (TextUtils.isEmpty(address)) {
- Log.w(TAG, "Activity started without address");
+ if (device == null) {
+ Log.w(TAG, "Activity started without a remote blueototh device");
finish();
}
-
+
mManager = LocalBluetoothManager.getInstance(this);
- mDevice = mManager.getLocalDeviceManager().findDevice(address);
- if (mDevice == null) {
+ mCachedDevice = mManager.getCachedDeviceManager().findDevice(device);
+ if (mCachedDevice == null) {
Log.w(TAG, "Device not found, cannot connect to it");
finish();
}
addPreferencesFromResource(R.xml.bluetooth_device_advanced);
mProfileContainer = (PreferenceGroup) findPreference(KEY_PROFILE_CONTAINER);
-
+
// Set the title of the screen
findPreference(KEY_TITLE).setTitle(
- getString(R.string.bluetooth_device_advanced_title, mDevice.getName()));
+ getString(R.string.bluetooth_device_advanced_title, mCachedDevice.getName()));
// Listen for check/uncheck of the online mode checkbox
mOnlineModePreference = (CheckBoxPreference) findPreference(KEY_ONLINE_MODE);
mOnlineModePreference.setOnPreferenceChangeListener(this);
-
+
// Add a preference for each profile
addPreferencesForProfiles();
}
@@ -100,16 +101,16 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
-
- outState.putString(EXTRA_ADDRESS, mDevice.getAddress());
+
+ outState.putParcelable(EXTRA_DEVICE, mCachedDevice.getDevice());
}
@Override
protected void onResume() {
super.onResume();
-
+
mManager.setForegroundActivity(this);
- mDevice.registerCallback(this);
+ mCachedDevice.registerCallback(this);
refresh();
}
@@ -117,13 +118,13 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
@Override
protected void onPause() {
super.onPause();
-
- mDevice.unregisterCallback(this);
+
+ mCachedDevice.unregisterCallback(this);
mManager.setForegroundActivity(null);
}
private void addPreferencesForProfiles() {
- for (Profile profile : mDevice.getProfiles()) {
+ for (Profile profile : mCachedDevice.getConnectableProfiles()) {
Preference pref = createProfilePreference(profile);
mProfileContainer.addPreference(pref);
}
@@ -132,7 +133,7 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
/**
* Creates a checkbox preference for the particular profile. The key will be
* the profile's name.
- *
+ *
* @param profile The profile for which the preference controls.
* @return A preference that allows the user to choose whether this profile
* will be connected to.
@@ -144,18 +145,26 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
pref.setPersistent(false);
pref.setOnPreferenceChangeListener(this);
+ LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
+ .getProfileManager(mManager, profile);
+
+ /**
+ * Gray out checkbox while connecting and disconnecting
+ */
+ pref.setEnabled(!mCachedDevice.isBusy());
+
refreshProfilePreference(pref, profile);
-
+
return pref;
}
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (TextUtils.isEmpty(key) || newValue == null) return true;
-
+
if (key.equals(KEY_ONLINE_MODE)) {
onOnlineModeCheckedStateChanged((Boolean) newValue);
-
+
} else {
Profile profile = getProfileOf(preference);
if (profile == null) return false;
@@ -168,68 +177,68 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
private void onOnlineModeCheckedStateChanged(boolean checked) {
setOnlineMode(checked, true);
}
-
+
private void onProfileCheckedStateChanged(Profile profile, boolean checked) {
if (mOnlineMode) {
if (checked) {
- mDevice.connect(profile);
+ mCachedDevice.connect(profile);
} else {
- mDevice.disconnect(profile);
+ mCachedDevice.disconnect(profile);
}
}
-
+
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
.getProfileManager(mManager, profile);
- profileManager.setPreferred(mDevice.getAddress(), checked);
+ profileManager.setPreferred(mCachedDevice.getDevice(), checked);
}
-
- public void onDeviceAttributesChanged(LocalBluetoothDevice device) {
+
+ public void onDeviceAttributesChanged(CachedBluetoothDevice cachedDevice) {
refresh();
}
private void refresh() {
// We are in 'online mode' if we are connected, connecting, or disconnecting
- setOnlineMode(mDevice.isConnected() || mDevice.isBusy(), false);
+ setOnlineMode(mCachedDevice.isConnected() || mCachedDevice.isBusy(), false);
refreshProfiles();
}
/**
* Switches between online/offline mode.
- *
+ *
* @param onlineMode Whether to be in online mode, or offline mode.
* @param takeAction Whether to take action (i.e., connect or disconnect)
* based on the new online mode.
*/
private void setOnlineMode(boolean onlineMode, boolean takeAction) {
mOnlineMode = onlineMode;
-
+
if (takeAction) {
if (onlineMode) {
- mDevice.connect();
+ mCachedDevice.connect();
} else {
- mDevice.disconnect();
+ mCachedDevice.disconnect();
}
}
-
+
refreshOnlineModePreference();
}
-
+
private void refreshOnlineModePreference() {
mOnlineModePreference.setChecked(mOnlineMode);
/* Gray out checkbox while connecting and disconnecting */
- mOnlineModePreference.setEnabled(!mDevice.isBusy());
+ mOnlineModePreference.setEnabled(!mCachedDevice.isBusy());
/**
* If the device is online, show status. Otherwise, show a summary that
* describes what the checkbox does.
*/
- mOnlineModePreference.setSummary(mOnlineMode ? mDevice.getSummary()
+ mOnlineModePreference.setSummary(mOnlineMode ? mCachedDevice.getSummary()
: R.string.bluetooth_device_advanced_online_mode_summary);
}
-
+
private void refreshProfiles() {
- for (Profile profile : mDevice.getProfiles()) {
+ for (Profile profile : mCachedDevice.getConnectableProfiles()) {
CheckBoxPreference profilePref =
(CheckBoxPreference) findPreference(profile.toString());
if (profilePref == null) {
@@ -240,28 +249,29 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
}
}
}
-
+
private void refreshProfilePreference(CheckBoxPreference profilePref, Profile profile) {
- String address = mDevice.getAddress();
+ BluetoothDevice device = mCachedDevice.getDevice();
LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
.getProfileManager(mManager, profile);
-
- int connectionStatus = profileManager.getConnectionStatus(address);
- /* Gray out checkbox while connecting and disconnecting */
- profilePref.setEnabled(!mDevice.isBusy());
+ int connectionStatus = profileManager.getConnectionStatus(device);
- profilePref.setSummary(getProfileSummary(profileManager, profile, address,
+ /*
+ * Gray out checkbox while connecting and disconnecting
+ */
+ profilePref.setEnabled(!mCachedDevice.isBusy());
+ profilePref.setSummary(getProfileSummary(profileManager, profile, device,
connectionStatus, mOnlineMode));
-
- profilePref.setChecked(profileManager.isPreferred(address));
+
+ profilePref.setChecked(profileManager.isPreferred(device));
}
private Profile getProfileOf(Preference pref) {
if (!(pref instanceof CheckBoxPreference)) return null;
String key = pref.getKey();
if (TextUtils.isEmpty(key)) return null;
-
+
try {
return Profile.valueOf(pref.getKey());
} catch (IllegalArgumentException e) {
@@ -270,17 +280,17 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
}
private static int getProfileSummary(LocalBluetoothProfileManager profileManager,
- Profile profile, String address, int connectionStatus, boolean onlineMode) {
+ Profile profile, BluetoothDevice device, int connectionStatus, boolean onlineMode) {
if (!onlineMode || connectionStatus == SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED) {
return getProfileSummaryForSettingPreference(profile);
} else {
- return profileManager.getSummary(address);
+ return profileManager.getSummary(device);
}
}
-
+
/**
* Gets the summary that describes when checked, it will become a preferred profile.
- *
+ *
* @param profile The profile to get the summary for.
* @return The summary.
*/
@@ -294,5 +304,5 @@ public class ConnectSpecificProfilesActivity extends PreferenceActivity
return 0;
}
}
-
+
}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java b/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
deleted file mode 100644
index 2c70fd2c84b..00000000000
--- a/src/com/android/settings/bluetooth/LocalBluetoothDeviceManager.java
+++ /dev/null
@@ -1,241 +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.bluetooth.BluetoothDevice;
-import android.util.Log;
-
-import com.android.settings.R;
-import com.android.settings.bluetooth.LocalBluetoothManager.Callback;
-import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * LocalBluetoothDeviceManager manages the set of remote Bluetooth devices.
- */
-public class LocalBluetoothDeviceManager {
- private static final String TAG = "LocalBluetoothDeviceManager";
-
- final LocalBluetoothManager mLocalManager;
- final List mCallbacks;
-
- final List mDevices = new ArrayList();
-
- public LocalBluetoothDeviceManager(LocalBluetoothManager localManager) {
- mLocalManager = localManager;
- mCallbacks = localManager.getCallbacks();
- readPairedDevices();
- }
-
- private synchronized boolean readPairedDevices() {
- BluetoothDevice manager = mLocalManager.getBluetoothManager();
- String[] bondedAddresses = manager.listBonds();
- if (bondedAddresses == null) return false;
-
- boolean deviceAdded = false;
- for (String address : bondedAddresses) {
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) {
- device = new LocalBluetoothDevice(mLocalManager.getContext(), address);
- mDevices.add(device);
- dispatchDeviceAdded(device);
- deviceAdded = true;
- }
- }
-
- return deviceAdded;
- }
-
- public synchronized List getDevicesCopy() {
- return new ArrayList(mDevices);
- }
-
- void onBluetoothStateChanged(boolean enabled) {
- if (enabled) {
- readPairedDevices();
- }
- }
-
- public synchronized void onDeviceAppeared(String address, short rssi) {
- boolean deviceAdded = false;
-
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) {
- device = new LocalBluetoothDevice(mLocalManager.getContext(), address);
- mDevices.add(device);
- deviceAdded = true;
- }
-
- device.setRssi(rssi);
- device.setVisible(true);
-
- if (deviceAdded) {
- dispatchDeviceAdded(device);
- }
- }
-
- public synchronized void onDeviceDisappeared(String address) {
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) return;
-
- device.setVisible(false);
- checkForDeviceRemoval(device);
- }
-
- private void checkForDeviceRemoval(LocalBluetoothDevice device) {
- if (device.getBondState() == BluetoothDevice.BOND_NOT_BONDED &&
- !device.isVisible()) {
- // If device isn't paired, remove it altogether
- mDevices.remove(device);
- dispatchDeviceDeleted(device);
- }
- }
-
- public synchronized void onDeviceNameUpdated(String address) {
- LocalBluetoothDevice device = findDevice(address);
- if (device != null) {
- device.refreshName();
- }
- }
-
- public synchronized LocalBluetoothDevice findDevice(String address) {
-
- for (int i = mDevices.size() - 1; i >= 0; i--) {
- LocalBluetoothDevice device = mDevices.get(i);
-
- if (device.getAddress().equals(address)) {
- return device;
- }
- }
-
- return null;
- }
-
- /**
- * Attempts to get the name of a remote device, otherwise returns the address.
- *
- * @param address The address.
- * @return The name, or if unavailable, the address.
- */
- public String getName(String address) {
- LocalBluetoothDevice device = findDevice(address);
- return device != null ? device.getName() : address;
- }
-
- private void dispatchDeviceAdded(LocalBluetoothDevice device) {
- synchronized (mCallbacks) {
- for (Callback callback : mCallbacks) {
- callback.onDeviceAdded(device);
- }
- }
-
- // TODO: divider between prev paired/connected and scanned
- }
-
- private void dispatchDeviceDeleted(LocalBluetoothDevice device) {
- synchronized (mCallbacks) {
- for (Callback callback : mCallbacks) {
- callback.onDeviceDeleted(device);
- }
- }
- }
-
- public synchronized void onBondingStateChanged(String address, int bondState) {
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) {
- if (!readPairedDevices()) {
- Log.e(TAG, "Got bonding state changed for " + address +
- ", but we have no record of that device.");
- }
- return;
- }
-
- device.refresh();
-
- if (bondState == BluetoothDevice.BOND_BONDED) {
- // Auto-connect after pairing
- device.connect();
- }
- }
-
- /**
- * Called when there is a bonding error.
- *
- * @param address The address of the remote device.
- * @param reason The reason, one of the error reasons from
- * BluetoothDevice.UNBOND_REASON_*
- */
- public synchronized void onBondingError(String address, int reason) {
- int errorMsg;
-
- switch(reason) {
- case BluetoothDevice.UNBOND_REASON_AUTH_FAILED:
- errorMsg = R.string.bluetooth_pairing_pin_error_message;
- break;
- case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED:
- errorMsg = R.string.bluetooth_pairing_rejected_error_message;
- break;
- case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN:
- errorMsg = R.string.bluetooth_pairing_device_down_error_message;
- break;
- default:
- errorMsg = R.string.bluetooth_pairing_error_message;
- }
- mLocalManager.showError(address, R.string.bluetooth_error_title, errorMsg);
- }
-
- public synchronized void onProfileStateChanged(String address, Profile profile,
- int newProfileState) {
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) return;
-
- device.onProfileStateChanged(profile, newProfileState);
- device.refresh();
- }
-
- public synchronized void onConnectingError(String address) {
- LocalBluetoothDevice device = findDevice(address);
- if (device == null) return;
-
- /*
- * Go through the device's delegate so we don't spam the user with
- * errors connecting to different profiles, and instead make sure the
- * user sees a single error for his single 'connect' action.
- */
- device.showConnectingError();
- }
-
- public synchronized void onScanningStateChanged(boolean started) {
- if (!started) return;
-
- // If starting a new scan, clear old visibility
- for (int i = mDevices.size() - 1; i >= 0; i--) {
- LocalBluetoothDevice device = mDevices.get(i);
- device.setVisible(false);
- checkForDeviceRemoval(device);
- }
- }
-
- public synchronized void onBtClassChanged(String address) {
- LocalBluetoothDevice device = findDevice(address);
- if (device != null) {
- device.refreshBtClass();
- }
- }
-}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
index 2e843386cc2..acab88ca525 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -18,22 +18,21 @@ package com.android.settings.bluetooth;
import com.android.settings.R;
-import java.util.ArrayList;
-import java.util.List;
-
import android.app.Activity;
import android.app.AlertDialog;
import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothError;
-import android.bluetooth.BluetoothIntent;
import android.content.Context;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Config;
import android.util.Log;
import android.widget.Toast;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
// TODO: have some notion of shutting down. Maybe a minute after they leave BT settings?
/**
* LocalBluetoothManager provides a simplified interface on top of a subset of
@@ -42,43 +41,57 @@ import android.widget.Toast;
public class LocalBluetoothManager {
private static final String TAG = "LocalBluetoothManager";
static final boolean V = Config.LOGV;
- static final boolean D = Config.LOGD && false;
-
+ static final boolean D = Config.LOGD;
+
private static final String SHARED_PREFERENCES_NAME = "bluetooth_settings";
-
+
private static LocalBluetoothManager INSTANCE;
/** Used when obtaining a reference to the singleton instance. */
private static Object INSTANCE_LOCK = new Object();
private boolean mInitialized;
-
+
private Context mContext;
/** If a BT-related activity is in the foreground, this will be it. */
private Activity mForegroundActivity;
private AlertDialog mErrorDialog = null;
- private BluetoothDevice mManager;
+ private BluetoothAdapter mAdapter;
- private LocalBluetoothDeviceManager mLocalDeviceManager;
+ private CachedBluetoothDeviceManager mCachedDeviceManager;
private BluetoothEventRedirector mEventRedirector;
private BluetoothA2dp mBluetoothA2dp;
-
- private int mState = BluetoothError.ERROR;
+
+ private int mState = BluetoothAdapter.ERROR;
private List mCallbacks = new ArrayList();
-
+
private static final int SCAN_EXPIRATION_MS = 5 * 60 * 1000; // 5 mins
+
+ // If a device was picked from the device picker or was in discoverable mode
+ // in the last 60 seconds, show the pairing dialogs in foreground instead
+ // of raising notifications
+ private static long GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND = 60 * 1000;
+
+ private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE =
+ "last_selected_device";
+
+ private static final String SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME =
+ "last_selected_device_time";
+
private long mLastScan;
-
+
public static LocalBluetoothManager getInstance(Context context) {
synchronized (INSTANCE_LOCK) {
if (INSTANCE == null) {
INSTANCE = new LocalBluetoothManager();
}
-
+
if (!INSTANCE.init(context)) {
return null;
}
-
+
+ LocalBluetoothProfileManager.init(INSTANCE);
+
return INSTANCE;
}
}
@@ -86,16 +99,16 @@ public class LocalBluetoothManager {
private boolean init(Context context) {
if (mInitialized) return true;
mInitialized = true;
-
+
// This will be around as long as this process is
mContext = context.getApplicationContext();
-
- mManager = (BluetoothDevice) context.getSystemService(Context.BLUETOOTH_SERVICE);
- if (mManager == null) {
+
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
+ if (mAdapter == null) {
return false;
}
-
- mLocalDeviceManager = new LocalBluetoothDeviceManager(this);
+
+ mCachedDeviceManager = new CachedBluetoothDeviceManager(this);
mEventRedirector = new BluetoothEventRedirector(this);
mEventRedirector.start();
@@ -104,11 +117,11 @@ public class LocalBluetoothManager {
return true;
}
-
- public BluetoothDevice getBluetoothManager() {
- return mManager;
+
+ public BluetoothAdapter getBluetoothAdapter() {
+ return mAdapter;
}
-
+
public Context getContext() {
return mContext;
}
@@ -116,7 +129,7 @@ public class LocalBluetoothManager {
public Activity getForegroundActivity() {
return mForegroundActivity;
}
-
+
public void setForegroundActivity(Activity activity) {
if (mErrorDialog != null) {
mErrorDialog.dismiss();
@@ -124,39 +137,39 @@ public class LocalBluetoothManager {
}
mForegroundActivity = activity;
}
-
+
public SharedPreferences getSharedPreferences() {
return mContext.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
}
-
- public LocalBluetoothDeviceManager getLocalDeviceManager() {
- return mLocalDeviceManager;
+
+ public CachedBluetoothDeviceManager getCachedDeviceManager() {
+ return mCachedDeviceManager;
}
-
+
List getCallbacks() {
return mCallbacks;
}
-
+
public void registerCallback(Callback callback) {
synchronized (mCallbacks) {
mCallbacks.add(callback);
}
}
-
+
public void unregisterCallback(Callback callback) {
synchronized (mCallbacks) {
mCallbacks.remove(callback);
}
}
-
+
public void startScanning(boolean force) {
- if (mManager.isDiscovering()) {
+ if (mAdapter.isDiscovering()) {
/*
* Already discovering, but give the callback that information.
* Note: we only call the callbacks, not the same path as if the
* scanning state had really changed (in that case the device
* manager would clear its list of unpaired scanned devices).
- */
+ */
dispatchScanningStateChanged(true);
} else {
if (!force) {
@@ -167,48 +180,49 @@ public class LocalBluetoothManager {
}
// If we are playing music, don't scan unless forced.
- List sinks = mBluetoothA2dp.listConnectedSinks();
+ Set sinks = mBluetoothA2dp.getConnectedSinks();
if (sinks != null) {
- for (String address : sinks) {
- if (mBluetoothA2dp.getSinkState(address) == BluetoothA2dp.STATE_PLAYING) {
+ for (BluetoothDevice sink : sinks) {
+ if (mBluetoothA2dp.getSinkState(sink) == BluetoothA2dp.STATE_PLAYING) {
return;
}
}
}
}
-
- if (mManager.startDiscovery(true)) {
+
+ if (mAdapter.startDiscovery()) {
mLastScan = System.currentTimeMillis();
}
}
}
-
+
public int getBluetoothState() {
-
- if (mState == BluetoothError.ERROR) {
+
+ if (mState == BluetoothAdapter.ERROR) {
syncBluetoothState();
}
-
+
return mState;
}
-
+
void setBluetoothStateInt(int state) {
mState = state;
- if (state == BluetoothDevice.BLUETOOTH_STATE_ON ||
- state == BluetoothDevice.BLUETOOTH_STATE_OFF) {
- mLocalDeviceManager.onBluetoothStateChanged(state == BluetoothDevice.BLUETOOTH_STATE_ON);
+ if (state == BluetoothAdapter.STATE_ON ||
+ state == BluetoothAdapter.STATE_OFF) {
+ mCachedDeviceManager.onBluetoothStateChanged(state ==
+ BluetoothAdapter.STATE_ON);
}
}
-
+
private void syncBluetoothState() {
int bluetoothState;
- if (mManager != null) {
- bluetoothState = mManager.isEnabled()
- ? BluetoothDevice.BLUETOOTH_STATE_ON
- : BluetoothDevice.BLUETOOTH_STATE_OFF;
+ if (mAdapter != null) {
+ bluetoothState = mAdapter.isEnabled()
+ ? BluetoothAdapter.STATE_ON
+ : BluetoothAdapter.STATE_OFF;
} else {
- bluetoothState = BluetoothError.ERROR;
+ bluetoothState = BluetoothAdapter.ERROR;
}
setBluetoothStateInt(bluetoothState);
@@ -216,33 +230,33 @@ public class LocalBluetoothManager {
public void setBluetoothEnabled(boolean enabled) {
boolean wasSetStateSuccessful = enabled
- ? mManager.enable()
- : mManager.disable();
-
+ ? mAdapter.enable()
+ : mAdapter.disable();
+
if (wasSetStateSuccessful) {
setBluetoothStateInt(enabled
- ? BluetoothDevice.BLUETOOTH_STATE_TURNING_ON
- : BluetoothDevice.BLUETOOTH_STATE_TURNING_OFF);
+ ? BluetoothAdapter.STATE_TURNING_ON
+ : BluetoothAdapter.STATE_TURNING_OFF);
} else {
if (V) {
Log.v(TAG,
"setBluetoothEnabled call, manager didn't return success for enabled: "
+ enabled);
}
-
+
syncBluetoothState();
}
}
-
+
/**
* @param started True if scanning started, false if scanning finished.
*/
void onScanningStateChanged(boolean started) {
// TODO: have it be a callback (once we switch bluetooth state changed to callback)
- mLocalDeviceManager.onScanningStateChanged(started);
+ mCachedDeviceManager.onScanningStateChanged(started);
dispatchScanningStateChanged(started);
}
-
+
private void dispatchScanningStateChanged(boolean started) {
synchronized (mCallbacks) {
for (Callback callback : mCallbacks) {
@@ -251,11 +265,18 @@ public class LocalBluetoothManager {
}
}
- public void showError(String address, int titleResId, int messageResId) {
- LocalBluetoothDevice device = mLocalDeviceManager.findDevice(address);
- if (device == null) return;
+ public void showError(BluetoothDevice device, int titleResId, int messageResId) {
+ CachedBluetoothDevice cachedDevice = mCachedDeviceManager.findDevice(device);
+ String name = null;
+ if (cachedDevice == null) {
+ if (device != null) name = device.getName();
- String name = device.getName();
+ if (name == null) {
+ name = mContext.getString(R.string.bluetooth_remote_device);
+ }
+ } else {
+ name = cachedDevice.getName();
+ }
String message = mContext.getString(messageResId, name);
if (mForegroundActivity != null) {
@@ -267,15 +288,55 @@ public class LocalBluetoothManager {
.setPositiveButton(android.R.string.ok, null)
.show();
} else {
- // Fallback on a toast
- Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+ // Fallback on a toast
+ Toast.makeText(mContext, message, Toast.LENGTH_LONG).show();
}
}
public interface Callback {
void onScanningStateChanged(boolean started);
- void onDeviceAdded(LocalBluetoothDevice device);
- void onDeviceDeleted(LocalBluetoothDevice device);
+ void onDeviceAdded(CachedBluetoothDevice cachedDevice);
+ void onDeviceDeleted(CachedBluetoothDevice cachedDevice);
+ }
+
+ public boolean shouldShowDialogInForeground(String deviceAddress) {
+ // If Bluetooth Settings is visible
+ if (mForegroundActivity != null) return true;
+
+ long currentTimeMillis = System.currentTimeMillis();
+ SharedPreferences sharedPreferences = getSharedPreferences();
+
+ // If the device was in discoverable mode recently
+ long lastDiscoverableEndTime = sharedPreferences.getLong(
+ BluetoothDiscoverableEnabler.SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, 0);
+ if ((lastDiscoverableEndTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND)
+ > currentTimeMillis) {
+ return true;
+ }
+
+ // If the device was picked in the device picker recently
+ if (deviceAddress != null) {
+ String lastSelectedDevice = sharedPreferences.getString(
+ SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE, null);
+
+ if (deviceAddress.equals(lastSelectedDevice)) {
+ long lastDeviceSelectedTime = sharedPreferences.getLong(
+ SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME, 0);
+ if ((lastDeviceSelectedTime + GRACE_PERIOD_TO_SHOW_DIALOGS_IN_FOREGROUND)
+ > currentTimeMillis) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ void persistSelectedDeviceInPicker(String deviceAddress) {
+ SharedPreferences.Editor editor = getSharedPreferences().edit();
+ editor.putString(LocalBluetoothManager.SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE,
+ deviceAddress);
+ editor.putLong(LocalBluetoothManager.SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME,
+ System.currentTimeMillis());
+ editor.commit();
}
-
}
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
index b396732178d..a6258e24a2c 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -17,145 +17,176 @@
package com.android.settings.bluetooth;
import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothError;
+import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
+import android.bluetooth.BluetoothUuid;
+import android.os.ParcelUuid;
import android.os.Handler;
-import android.text.TextUtils;
+import android.util.Log;
import com.android.settings.R;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* LocalBluetoothProfileManager is an abstract class defining the basic
* functionality related to a profile.
*/
public abstract class LocalBluetoothProfileManager {
+ private static final String TAG = "LocalBluetoothProfileManager";
+
+ /* package */ static final ParcelUuid[] HEADSET_PROFILE_UUIDS = new ParcelUuid[] {
+ BluetoothUuid.HSP,
+ BluetoothUuid.Handsfree,
+ };
+
+ /* package */ static final ParcelUuid[] A2DP_PROFILE_UUIDS = new ParcelUuid[] {
+ BluetoothUuid.AudioSink,
+ BluetoothUuid.AdvAudioDist,
+ };
+
+ /* package */ static final ParcelUuid[] OPP_PROFILE_UUIDS = new ParcelUuid[] {
+ BluetoothUuid.ObexObjectPush
+ };
// TODO: close profiles when we're shutting down
private static Map sProfileMap =
- new HashMap();
-
+ new HashMap();
+
protected LocalBluetoothManager mLocalManager;
-
- public static LocalBluetoothProfileManager getProfileManager(LocalBluetoothManager localManager,
- Profile profile) {
-
- LocalBluetoothProfileManager profileManager;
-
+
+ public static void init(LocalBluetoothManager localManager) {
synchronized (sProfileMap) {
- profileManager = sProfileMap.get(profile);
-
- if (profileManager == null) {
- switch (profile) {
- case A2DP:
- profileManager = new A2dpProfileManager(localManager);
- break;
-
- case HEADSET:
- profileManager = new HeadsetProfileManager(localManager);
- break;
- }
-
- sProfileMap.put(profile, profileManager);
+ if (sProfileMap.size() == 0) {
+ LocalBluetoothProfileManager profileManager;
+
+ profileManager = new A2dpProfileManager(localManager);
+ sProfileMap.put(Profile.A2DP, profileManager);
+
+ profileManager = new HeadsetProfileManager(localManager);
+ sProfileMap.put(Profile.HEADSET, profileManager);
+
+ profileManager = new OppProfileManager(localManager);
+ sProfileMap.put(Profile.OPP, profileManager);
}
}
-
- return profileManager;
+ }
+
+ public static LocalBluetoothProfileManager getProfileManager(LocalBluetoothManager localManager,
+ Profile profile) {
+ // Note: This code assumes that "localManager" is same as the
+ // LocalBluetoothManager that was used to initialize the sProfileMap.
+ // If that every changes, we can't just keep one copy of sProfileMap.
+ synchronized (sProfileMap) {
+ LocalBluetoothProfileManager profileManager = sProfileMap.get(profile);
+ if (profileManager == null) {
+ Log.e(TAG, "profileManager can't be found for " + profile.toString());
+ }
+ return profileManager;
+ }
}
/**
* Temporary method to fill profiles based on a device's class.
- *
+ *
* NOTE: This list happens to define the connection order. We should put this logic in a more
* well known place when this method is no longer temporary.
- *
- * @param btClass The class
+ * @param uuids of the remote device
* @param profiles The list of profiles to fill
*/
- public static void fill(int btClass, List profiles) {
+ public static void updateProfiles(ParcelUuid[] uuids, List profiles) {
profiles.clear();
- if (BluetoothHeadset.doesClassMatch(btClass)) {
+ if (uuids == null) {
+ return;
+ }
+
+ if (BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS)) {
profiles.add(Profile.HEADSET);
}
-
- if (BluetoothA2dp.doesClassMatchSink(btClass)) {
+
+ if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS)) {
profiles.add(Profile.A2DP);
}
+
+ if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS)) {
+ profiles.add(Profile.OPP);
+ }
}
protected LocalBluetoothProfileManager(LocalBluetoothManager localManager) {
mLocalManager = localManager;
}
-
- public abstract int connect(String address);
-
- public abstract int disconnect(String address);
-
- public abstract int getConnectionStatus(String address);
- public abstract int getSummary(String address);
+ public abstract boolean connect(BluetoothDevice device);
+
+ public abstract boolean disconnect(BluetoothDevice device);
+
+ public abstract int getConnectionStatus(BluetoothDevice device);
+
+ public abstract int getSummary(BluetoothDevice device);
public abstract int convertState(int a2dpState);
-
- public abstract boolean isPreferred(String address);
- public abstract void setPreferred(String address, boolean preferred);
+ public abstract boolean isPreferred(BluetoothDevice device);
- public boolean isConnected(String address) {
- return SettingsBtStatus.isConnectionStatusConnected(getConnectionStatus(address));
+ public abstract void setPreferred(BluetoothDevice device, boolean preferred);
+
+ public boolean isConnected(BluetoothDevice device) {
+ return SettingsBtStatus.isConnectionStatusConnected(getConnectionStatus(device));
}
-
+
// TODO: int instead of enum
public enum Profile {
HEADSET(R.string.bluetooth_profile_headset),
- A2DP(R.string.bluetooth_profile_a2dp);
-
+ A2DP(R.string.bluetooth_profile_a2dp),
+ OPP(R.string.bluetooth_profile_opp);
+
public final int localizedString;
-
+
private Profile(int localizedString) {
this.localizedString = localizedString;
}
}
/**
- * A2dpProfileManager is an abstraction for the {@link BluetoothA2dp} service.
+ * A2dpProfileManager is an abstraction for the {@link BluetoothA2dp} service.
*/
private static class A2dpProfileManager extends LocalBluetoothProfileManager {
private BluetoothA2dp mService;
-
+
public A2dpProfileManager(LocalBluetoothManager localManager) {
super(localManager);
mService = new BluetoothA2dp(localManager.getContext());
}
@Override
- public int connect(String address) {
- List sinks = mService.listConnectedSinks();
+ public boolean connect(BluetoothDevice device) {
+ Set sinks = mService.getConnectedSinks();
if (sinks != null) {
- for (String sinkAddress : sinks) {
- mService.disconnectSink(sinkAddress);
+ for (BluetoothDevice sink : sinks) {
+ mService.disconnectSink(sink);
}
}
- return mService.connectSink(address);
+ return mService.connectSink(device);
}
@Override
- public int disconnect(String address) {
- return mService.disconnectSink(address);
+ public boolean disconnect(BluetoothDevice device) {
+ return mService.disconnectSink(device);
}
-
+
@Override
- public int getConnectionStatus(String address) {
- return convertState(mService.getSinkState(address));
+ public int getConnectionStatus(BluetoothDevice device) {
+ return convertState(mService.getSinkState(device));
}
-
+
@Override
- public int getSummary(String address) {
- int connectionStatus = getConnectionStatus(address);
+ public int getSummary(BluetoothDevice device) {
+ int connectionStatus = getConnectionStatus(device);
if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus)) {
return R.string.bluetooth_a2dp_profile_summary_connected;
@@ -165,13 +196,13 @@ public abstract class LocalBluetoothProfileManager {
}
@Override
- public boolean isPreferred(String address) {
- return mService.getSinkPriority(address) > BluetoothA2dp.PRIORITY_OFF;
+ public boolean isPreferred(BluetoothDevice device) {
+ return mService.getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF;
}
@Override
- public void setPreferred(String address, boolean preferred) {
- mService.setSinkPriority(address,
+ public void setPreferred(BluetoothDevice device, boolean preferred) {
+ mService.setSinkPriority(device,
preferred ? BluetoothA2dp.PRIORITY_AUTO : BluetoothA2dp.PRIORITY_OFF);
}
@@ -193,15 +224,15 @@ public abstract class LocalBluetoothProfileManager {
}
}
}
-
+
/**
- * HeadsetProfileManager is an abstraction for the {@link BluetoothHeadset} service.
+ * HeadsetProfileManager is an abstraction for the {@link BluetoothHeadset} service.
*/
private static class HeadsetProfileManager extends LocalBluetoothProfileManager
implements BluetoothHeadset.ServiceListener {
private BluetoothHeadset mService;
private Handler mUiHandler = new Handler();
-
+
public HeadsetProfileManager(LocalBluetoothManager localManager) {
super(localManager);
mService = new BluetoothHeadset(localManager.getContext(), this);
@@ -215,11 +246,11 @@ public abstract class LocalBluetoothProfileManager {
* We just bound to the service, so refresh the UI of the
* headset device.
*/
- String address = mService.getHeadsetAddress();
- if (TextUtils.isEmpty(address)) return;
- mLocalManager.getLocalDeviceManager()
- .onProfileStateChanged(address, Profile.HEADSET,
- BluetoothHeadset.STATE_CONNECTED);
+ BluetoothDevice device = mService.getCurrentHeadset();
+ if (device == null) return;
+ mLocalManager.getCachedDeviceManager()
+ .onProfileStateChanged(device, Profile.HEADSET,
+ BluetoothHeadset.STATE_CONNECTED);
}
});
}
@@ -228,35 +259,34 @@ public abstract class LocalBluetoothProfileManager {
}
@Override
- public int connect(String address) {
+ public boolean connect(BluetoothDevice device) {
// Since connectHeadset fails if already connected to a headset, we
// disconnect from any headset first
mService.disconnectHeadset();
- return mService.connectHeadset(address)
- ? BluetoothError.SUCCESS : BluetoothError.ERROR;
+ return mService.connectHeadset(device);
}
@Override
- public int disconnect(String address) {
- if (mService.getHeadsetAddress().equals(address)) {
- return mService.disconnectHeadset() ? BluetoothError.SUCCESS : BluetoothError.ERROR;
+ public boolean disconnect(BluetoothDevice device) {
+ if (mService.getCurrentHeadset().equals(device)) {
+ return mService.disconnectHeadset();
} else {
- return BluetoothError.SUCCESS;
+ return false;
}
}
-
+
@Override
- public int getConnectionStatus(String address) {
- String headsetAddress = mService.getHeadsetAddress();
- return headsetAddress != null && headsetAddress.equals(address)
+ public int getConnectionStatus(BluetoothDevice device) {
+ BluetoothDevice currentDevice = mService.getCurrentHeadset();
+ return currentDevice != null && currentDevice.equals(device)
? convertState(mService.getState())
: SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
}
-
+
@Override
- public int getSummary(String address) {
- int connectionStatus = getConnectionStatus(address);
-
+ public int getSummary(BluetoothDevice device) {
+ int connectionStatus = getConnectionStatus(device);
+
if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus)) {
return R.string.bluetooth_headset_profile_summary_connected;
} else {
@@ -265,13 +295,13 @@ public abstract class LocalBluetoothProfileManager {
}
@Override
- public boolean isPreferred(String address) {
- return mService.getPriority(address) > BluetoothHeadset.PRIORITY_OFF;
+ public boolean isPreferred(BluetoothDevice device) {
+ return mService.getPriority(device) > BluetoothHeadset.PRIORITY_OFF;
}
@Override
- public void setPreferred(String address, boolean preferred) {
- mService.setPriority(address,
+ public void setPreferred(BluetoothDevice device, boolean preferred) {
+ mService.setPriority(device,
preferred ? BluetoothHeadset.PRIORITY_AUTO : BluetoothHeadset.PRIORITY_OFF);
}
@@ -289,4 +319,63 @@ public abstract class LocalBluetoothProfileManager {
}
}
}
+
+ /**
+ * OppProfileManager
+ */
+ private static class OppProfileManager extends LocalBluetoothProfileManager {
+
+ public OppProfileManager(LocalBluetoothManager localManager) {
+ super(localManager);
+ }
+
+ @Override
+ public boolean connect(BluetoothDevice device) {
+ return false;
+ }
+
+ @Override
+ public boolean disconnect(BluetoothDevice device) {
+ return false;
+ }
+
+ @Override
+ public int getConnectionStatus(BluetoothDevice device) {
+ return -1;
+ }
+
+ @Override
+ public int getSummary(BluetoothDevice device) {
+ int connectionStatus = getConnectionStatus(device);
+
+ if (SettingsBtStatus.isConnectionStatusConnected(connectionStatus)) {
+ return R.string.bluetooth_opp_profile_summary_connected;
+ } else {
+ return R.string.bluetooth_opp_profile_summary_not_connected;
+ }
+ }
+
+ @Override
+ public boolean isPreferred(BluetoothDevice device) {
+ return false;
+ }
+
+ @Override
+ public void setPreferred(BluetoothDevice device, boolean preferred) {
+ }
+
+ @Override
+ public int convertState(int oppState) {
+ switch (oppState) {
+ case 0:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTED;
+ case 1:
+ return SettingsBtStatus.CONNECTION_STATUS_CONNECTING;
+ case 2:
+ return SettingsBtStatus.CONNECTION_STATUS_DISCONNECTED;
+ default:
+ return SettingsBtStatus.CONNECTION_STATUS_UNKNOWN;
+ }
+ }
+ }
}
diff --git a/src/com/android/settings/bluetooth/RequestPermissionActivity.java b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
new file mode 100644
index 00000000000..9fdb33860ff
--- /dev/null
+++ b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2009 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 com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.settings.R;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * RequestPermissionActivity asks the user whether to enable discovery. This is
+ * usually started by an application wanted to start bluetooth and or discovery
+ */
+public class RequestPermissionActivity extends AlertActivity implements
+ DialogInterface.OnClickListener {
+ // Command line to test this
+ // adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE
+ // adb shell am start -a android.bluetooth.adapter.action.REQUEST_DISCOVERABLE
+
+ private static final String TAG = "RequestPermissionActivity";
+
+ private static final int MAX_DISCOVERABLE_TIMEOUT = 300;
+
+ // Non-error return code: BT is starting or has started successfully. Used
+ // by this Activity and RequestPermissionHelperActivity
+ /* package */ static final int RESULT_BT_STARTING_OR_STARTED = -1000;
+
+ private static final int REQUEST_CODE_START_BT = 1;
+
+ private LocalBluetoothManager mLocalManager;
+
+ private int mTimeout = BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT;
+
+ /*
+ * True if bluetooth wasn't enabled and RequestPermissionHelperActivity was
+ * started to ask the user and start bt.
+ *
+ * If/when that activity returns successfully, display please wait msg then
+ * go away when bt has started and discovery mode has been enabled.
+ */
+ private boolean mNeededToEnableBluetooth;
+
+ // True if requesting BT to be turned on
+ // False if requesting BT to be turned on + discoverable mode
+ private boolean mEnableOnly = false;
+
+ private boolean mUserConfirmed = false;
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null)
+ return;
+ if (mNeededToEnableBluetooth
+ && BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
+ int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothDevice.ERROR);
+ if (state == BluetoothAdapter.STATE_ON) {
+ if (mUserConfirmed) {
+ proceedAndFinish(false);
+ }
+ }
+ }
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (parseIntent()) {
+ finish();
+ return;
+ }
+
+ int btState = mLocalManager.getBluetoothState();
+
+ switch (btState) {
+ case BluetoothAdapter.STATE_OFF:
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ case BluetoothAdapter.STATE_TURNING_ON:
+ /*
+ * Strictly speaking STATE_TURNING_ON belong with STATE_ON;
+ * however, BT may not be ready when the user clicks yes and we
+ * would fail to turn on discovery mode. By kicking this to the
+ * RequestPermissionHelperActivity, this class will handle that
+ * case via the broadcast receiver.
+ */
+
+ /*
+ * Start the helper activity to:
+ * 1) ask the user about enabling bt AND discovery
+ * 2) enable BT upon confirmation
+ */
+ registerReceiver(mReceiver,
+ new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
+ Intent i = new Intent();
+ i.setClass(this, RequestPermissionHelperActivity.class);
+ if (mEnableOnly) {
+ i.setAction(RequestPermissionHelperActivity.ACTION_INTERNAL_REQUEST_BT_ON);
+ } else {
+ i.setAction(RequestPermissionHelperActivity.
+ ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE);
+ i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, mTimeout);
+ }
+ startActivityForResult(i, REQUEST_CODE_START_BT);
+ mNeededToEnableBluetooth = true;
+ break;
+ case BluetoothAdapter.STATE_ON:
+ if (mEnableOnly) {
+ // Nothing to do. Already enabled.
+ proceedAndFinish(false);
+ return;
+ } else {
+ // Ask the user about enabling discovery mode
+ createDialog();
+ break;
+ }
+ }
+ }
+
+ private void createDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_permission_request);
+
+ View view = getLayoutInflater().inflate(R.layout.bluetooth_discoverable, null);
+ p.mView = view;
+ TextView tv = (TextView) view.findViewById(R.id.message);
+
+ if (mNeededToEnableBluetooth) {
+ // RequestPermissionHelperActivity has gotten confirmation from user
+ // to turn on BT
+ tv.setText(getString(R.string.bluetooth_turning_on));
+ } else {
+ // Ask the user whether to turn on discovery mode or not
+ tv.setText(getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout));
+ p.mPositiveButtonText = getString(R.string.yes);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(R.string.no);
+ p.mNegativeButtonListener = this;
+ }
+
+ setupAlert();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode != REQUEST_CODE_START_BT) {
+ Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
+ setResult(Activity.RESULT_CANCELED);
+ finish();
+ return;
+ }
+ if (resultCode != RESULT_BT_STARTING_OR_STARTED) {
+ setResult(resultCode);
+ finish();
+ }
+
+ // Back from RequestPermissionHelperActivity. User confirmed to enable
+ // BT and discoverable mode.
+ mUserConfirmed = true;
+
+ if (mLocalManager.getBluetoothState() == BluetoothAdapter.STATE_ON) {
+ proceedAndFinish(false);
+ } else {
+ // If BT is not up yet, show "Turning on Bluetooth..."
+ createDialog();
+ }
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case DialogInterface.BUTTON_POSITIVE:
+ proceedAndFinish(true);
+ break;
+
+ case DialogInterface.BUTTON_NEGATIVE:
+ setResult(Activity.RESULT_CANCELED);
+ break;
+ }
+ }
+
+ private void proceedAndFinish(boolean buttonPressed) {
+ int returnCode;
+
+ if (mEnableOnly) {
+ // BT enabled. Done
+ returnCode = Activity.RESULT_OK;
+ } else if (mLocalManager.getBluetoothAdapter().setScanMode(
+ BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, mTimeout)) {
+ // If already in discoverable mode, this will extend the timeout.
+ persistDiscoverableEndTimestamp(System.currentTimeMillis() + mTimeout * 1000);
+ returnCode = mTimeout;
+ // Activity.RESULT_FIRST_USER should be 1
+ if (returnCode < Activity.RESULT_FIRST_USER) {
+ returnCode = Activity.RESULT_FIRST_USER;
+ }
+ } else {
+ returnCode = Activity.RESULT_CANCELED;
+ }
+
+ setResult(returnCode);
+ if (!buttonPressed) {
+ finish();
+ }
+ }
+
+ private boolean parseIntent() {
+ Intent intent = getIntent();
+ if (intent != null && intent.getAction().equals(BluetoothAdapter.ACTION_REQUEST_ENABLE)) {
+ mEnableOnly = true;
+ } else if (intent != null
+ && intent.getAction().equals(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE)) {
+ mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
+ BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT);
+
+ Log.e(TAG, "Timeout = " + mTimeout);
+
+ if (mTimeout > MAX_DISCOVERABLE_TIMEOUT) {
+ mTimeout = MAX_DISCOVERABLE_TIMEOUT;
+ } else if (mTimeout <= 0) {
+ mTimeout = BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT;
+ }
+ } else {
+ Log.e(TAG, "Error: this activity may be started only with intent "
+ + BluetoothAdapter.ACTION_REQUEST_ENABLE + " or "
+ + BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+ setResult(Activity.RESULT_CANCELED);
+ return true;
+ }
+
+ mLocalManager = LocalBluetoothManager.getInstance(this);
+ if (mLocalManager == null) {
+ Log.e(TAG, "Error: there's a problem starting bluetooth");
+ setResult(Activity.RESULT_CANCELED);
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mNeededToEnableBluetooth) unregisterReceiver(mReceiver);
+ }
+
+ private void persistDiscoverableEndTimestamp(long endTimestamp) {
+ SharedPreferences.Editor editor = mLocalManager.getSharedPreferences().edit();
+ editor.putLong(
+ BluetoothDiscoverableEnabler.SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP,
+ endTimestamp);
+ editor.commit();
+ }
+
+ @Override
+ public void onBackPressed() {
+ setResult(Activity.RESULT_CANCELED);
+ super.onBackPressed();
+ }
+}
diff --git a/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java b/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
new file mode 100644
index 00000000000..c8698687f05
--- /dev/null
+++ b/src/com/android/settings/bluetooth/RequestPermissionHelperActivity.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2009 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 com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.settings.R;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * RequestPermissionHelperActivity asks the user whether to enable discovery.
+ * This is usually started by RequestPermissionActivity.
+ */
+public class RequestPermissionHelperActivity extends AlertActivity implements
+ DialogInterface.OnClickListener {
+ private static final String TAG = "RequestPermissionHelperActivity";
+
+ public static final String ACTION_INTERNAL_REQUEST_BT_ON =
+ "com.android.settings.bluetooth.ACTION_INTERNAL_REQUEST_BT_ON";
+
+ public static final String ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE =
+ "com.android.settings.bluetooth.ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE";
+
+ private LocalBluetoothManager mLocalManager;
+
+ private int mTimeout;
+
+ // True if requesting BT to be turned on
+ // False if requesting BT to be turned on + discoverable mode
+ private boolean mEnableOnly;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (parseIntent()) {
+ finish();
+ return;
+ }
+
+ createDialog();
+ }
+
+ void createDialog() {
+ final AlertController.AlertParams p = mAlertParams;
+ p.mIconId = android.R.drawable.ic_dialog_info;
+ p.mTitle = getString(R.string.bluetooth_permission_request);
+
+ View view = getLayoutInflater().inflate(R.layout.bluetooth_discoverable, null);
+ p.mView = view;
+ TextView tv = (TextView) view.findViewById(R.id.message);
+
+ if (mEnableOnly) {
+ tv.setText(getString(R.string.bluetooth_ask_enablement));
+ } else {
+ tv.setText(getString(R.string.bluetooth_ask_enablement_and_discovery, mTimeout));
+ }
+
+ p.mPositiveButtonText = getString(R.string.yes);
+ p.mPositiveButtonListener = this;
+ p.mNegativeButtonText = getString(R.string.no);
+ p.mNegativeButtonListener = this;
+
+ setupAlert();
+ }
+
+ public void onClick(DialogInterface dialog, int which) {
+ int returnCode;
+ switch (which) {
+ case DialogInterface.BUTTON_POSITIVE:
+ int btState = 0;
+
+ try {
+ // TODO There's a better way.
+ int retryCount = 30;
+ do {
+ btState = mLocalManager.getBluetoothState();
+ Thread.sleep(100);
+ } while (btState == BluetoothAdapter.STATE_TURNING_OFF && --retryCount > 0);
+ } catch (InterruptedException e) {
+ // don't care
+ }
+
+ if (btState == BluetoothAdapter.STATE_TURNING_ON
+ || btState == BluetoothAdapter.STATE_ON
+ || mLocalManager.getBluetoothAdapter().enable()) {
+ returnCode = RequestPermissionActivity.RESULT_BT_STARTING_OR_STARTED;
+ } else {
+ returnCode = Activity.RESULT_CANCELED;
+ }
+ break;
+
+ case DialogInterface.BUTTON_NEGATIVE:
+ returnCode = Activity.RESULT_CANCELED;
+ break;
+ default:
+ return;
+ }
+ setResult(returnCode);
+ }
+
+ private boolean parseIntent() {
+ Intent intent = getIntent();
+ if (intent != null && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON)) {
+ mEnableOnly = true;
+ } else if (intent != null
+ && intent.getAction().equals(ACTION_INTERNAL_REQUEST_BT_ON_AND_DISCOVERABLE)) {
+ mEnableOnly = false;
+ // Value used for display purposes. Not range checking.
+ mTimeout = intent.getIntExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION,
+ BluetoothDiscoverableEnabler.DEFAULT_DISCOVERABLE_TIMEOUT);
+ } else {
+ setResult(Activity.RESULT_CANCELED);
+ return true;
+ }
+
+ mLocalManager = LocalBluetoothManager.getInstance(this);
+ if (mLocalManager == null) {
+ Log.e(TAG, "Error: there's a problem starting bluetooth");
+ setResult(Activity.RESULT_CANCELED);
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public void onBackPressed() {
+ setResult(Activity.RESULT_CANCELED);
+ super.onBackPressed();
+ }
+}
diff --git a/src/com/android/settings/bluetooth/SettingsBtStatus.java b/src/com/android/settings/bluetooth/SettingsBtStatus.java
index d2cbef5c53e..e2285e9bca0 100644
--- a/src/com/android/settings/bluetooth/SettingsBtStatus.java
+++ b/src/com/android/settings/bluetooth/SettingsBtStatus.java
@@ -26,9 +26,9 @@ import com.android.settings.R;
*/
public class SettingsBtStatus {
private static final String TAG = "SettingsBtStatus";
-
+
// Connection status
-
+
public static final int CONNECTION_STATUS_UNKNOWN = 0;
public static final int CONNECTION_STATUS_ACTIVE = 1;
/** Use {@link #isConnected} to check for the connected state */
@@ -55,24 +55,24 @@ public class SettingsBtStatus {
return 0;
}
}
-
+
public static final boolean isConnectionStatusConnected(int connectionStatus) {
return connectionStatus == CONNECTION_STATUS_ACTIVE
|| connectionStatus == CONNECTION_STATUS_CONNECTED;
}
-
+
public static final boolean isConnectionStatusBusy(int connectionStatus) {
return connectionStatus == CONNECTION_STATUS_CONNECTING
|| connectionStatus == CONNECTION_STATUS_DISCONNECTING;
}
-
+
public static final int getPairingStatusSummary(int bondState) {
switch (bondState) {
case BluetoothDevice.BOND_BONDED:
return R.string.bluetooth_paired;
case BluetoothDevice.BOND_BONDING:
return R.string.bluetooth_pairing;
- case BluetoothDevice.BOND_NOT_BONDED:
+ case BluetoothDevice.BOND_NONE:
return R.string.bluetooth_not_connected;
default:
return 0;
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 7d22d913a85..a736cc06e49 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -16,7 +16,7 @@
package com.android.settings.deviceinfo;
-import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothAdapter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -377,7 +377,7 @@ public class Status extends PreferenceActivity {
}
private void setBtStatus() {
- BluetoothDevice bluetooth = (BluetoothDevice) getSystemService(BLUETOOTH_SERVICE);
+ BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
Preference btAddressPref = findPreference(KEY_BT_ADDRESS);
if (bluetooth == null) {
@@ -393,7 +393,6 @@ public class Status extends PreferenceActivity {
void updateTimes() {
long at = SystemClock.uptimeMillis() / 1000;
long ut = SystemClock.elapsedRealtime() / 1000;
- long st = ut - at;
if (ut == 0) {
ut = 1;
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 10c9a43054e..10ab2d00f40 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -295,7 +295,12 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
private void processAppUsage() {
SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
final int which = mStatsType;
- final double powerCpuNormal = mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_NORMAL);
+ final int speedSteps = mPowerProfile.getNumSpeedSteps();
+ final double[] powerCpuNormal = new double[speedSteps];
+ final long[] cpuSpeedStepTimes = new long[speedSteps];
+ for (int p = 0; p < speedSteps; p++) {
+ powerCpuNormal[p] = mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_ACTIVE, p);
+ }
final double averageCostPerByte = getAverageDataCost();
long uSecTime = mStats.computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which);
updateStatsPeriod(uSecTime);
@@ -322,7 +327,19 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
final long foregroundTime = ps.getForegroundTime(which);
cpuFgTime += foregroundTime * 10; // convert to millis
final long tmpCpuTime = (userTime + systemTime) * 10; // convert to millis
- final double processPower = tmpCpuTime * powerCpuNormal;
+ int totalTimeAtSpeeds = 0;
+ // Get the total first
+ for (int step = 0; step < speedSteps; step++) {
+ cpuSpeedStepTimes[step] = ps.getTimeAtCpuSpeedStep(step, which);
+ totalTimeAtSpeeds += cpuSpeedStepTimes[step];
+ }
+ if (totalTimeAtSpeeds == 0) totalTimeAtSpeeds = 1;
+ // Then compute the ratio of time spent at each speed
+ double processPower = 0;
+ for (int step = 0; step < speedSteps; step++) {
+ double ratio = (double) cpuSpeedStepTimes[step] / totalTimeAtSpeeds;
+ processPower += ratio * tmpCpuTime * powerCpuNormal[step];
+ }
cpuTime += tmpCpuTime;
power += processPower;
if (highestDrain < processPower) {
@@ -394,7 +411,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
double phoneOnPower = mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE)
* phoneOnTimeMs / 1000;
addEntry(getString(R.string.power_phone), DrainType.PHONE, phoneOnTimeMs,
- android.R.drawable.ic_menu_call, phoneOnPower);
+ R.drawable.ic_settings_voice_calls, phoneOnPower);
}
private void addScreenUsage(long uSecNow) {
@@ -415,7 +432,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
}
power /= 1000; // To seconds
addEntry(getString(R.string.power_screen), DrainType.SCREEN, screenOnTimeMs,
- android.R.drawable.ic_menu_view, power);
+ R.drawable.ic_settings_display, power);
}
private void addRadioUsage(long uSecNow) {
@@ -428,9 +445,12 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
* mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ON, i);
signalTimeMs += strengthTimeMs;
}
+ long scanningTimeMs = mStats.getPhoneSignalScanningTime(uSecNow, mStatsType) / 1000;
+ power += scanningTimeMs / 1000 * mPowerProfile.getAveragePower(
+ PowerProfile.POWER_RADIO_SCANNING);
BatterySipper bs =
addEntry(getString(R.string.power_cell), DrainType.CELL, signalTimeMs,
- android.R.drawable.ic_menu_sort_by_size, power);
+ R.drawable.ic_settings_cell_standby, power);
if (signalTimeMs != 0) {
bs.noCoveragePercent = mStats.getPhoneSignalStrengthTime(0, uSecNow, mStatsType)
/ 1000 * 100.0 / signalTimeMs;
@@ -444,7 +464,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
* mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)
+ runningTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_WIFI_ON)) / 1000;
addEntry(getString(R.string.power_wifi), DrainType.WIFI, runningTimeMs,
- R.drawable.ic_wifi_signal_4, wifiPower);
+ R.drawable.ic_settings_wifi, wifiPower);
}
private void addIdleUsage(long uSecNow) {
@@ -452,7 +472,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
double idlePower = (idleTimeMs * mPowerProfile.getAveragePower(PowerProfile.POWER_CPU_IDLE))
/ 1000;
addEntry(getString(R.string.power_idle), DrainType.IDLE, idleTimeMs,
- android.R.drawable.ic_lock_power_off, idlePower);
+ R.drawable.ic_settings_phone_idle, idlePower);
}
private void addBluetoothUsage(long uSecNow) {
@@ -464,7 +484,7 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
* mPowerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_AT_CMD)) / 1000;
addEntry(getString(R.string.power_bluetooth), DrainType.BLUETOOTH, btOnTimeMs,
- com.android.internal.R.drawable.ic_volume_bluetooth_in_call, btPower);
+ R.drawable.ic_settings_bluetooth, btPower);
}
private double getAverageDataCost() {
@@ -602,6 +622,8 @@ public class PowerUsageSummary extends PreferenceActivity implements Runnable {
} else if ("mediaserver".equals(name)) {
name = getResources().getString(R.string.process_mediaserver_label);
}
+ iconId = R.drawable.ic_power_system;
+ icon = getResources().getDrawable(iconId);
return;
} else {
//name = packages[0];
diff --git a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
index 40316b567df..fb9fbcdea0d 100644
--- a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
+++ b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
@@ -226,8 +226,7 @@ public class QuickLaunchSettings extends PreferenceActivity implements
Log.w(TAG, "Result from bookmark picker does not have an intent.");
return;
}
-
- String title = data.getStringExtra(BookmarkPicker.EXTRA_TITLE);
+
char shortcut = data.getCharExtra(BookmarkPicker.EXTRA_SHORTCUT, (char) 0);
updateShortcut(shortcut, data);
diff --git a/src/com/android/settings/vpn/L2tpEditor.java b/src/com/android/settings/vpn/L2tpEditor.java
index 29036f23b88..05d51d637cf 100644
--- a/src/com/android/settings/vpn/L2tpEditor.java
+++ b/src/com/android/settings/vpn/L2tpEditor.java
@@ -57,7 +57,7 @@ class L2tpEditor extends VpnProfileEditor {
final L2tpProfile profile = (L2tpProfile) getProfile();
CheckBoxPreference secret = mSecret = new CheckBoxPreference(c);
boolean enabled = profile.isSecretEnabled();
- setSecretTitle(secret, R.string.vpn_l2tp_secret, enabled);
+ setCheckBoxTitle(secret, R.string.vpn_l2tp_secret);
secret.setChecked(enabled);
setSecretSummary(secret, enabled);
secret.setOnPreferenceChangeListener(
@@ -67,8 +67,6 @@ class L2tpEditor extends VpnProfileEditor {
boolean enabled = (Boolean) newValue;
profile.setSecretEnabled(enabled);
mSecretHandler.getPreference().setEnabled(enabled);
- setSecretTitle(mSecret, R.string.vpn_l2tp_secret,
- enabled);
setSecretSummary(mSecret, enabled);
return true;
}
diff --git a/src/com/android/settings/vpn/L2tpIpsecEditor.java b/src/com/android/settings/vpn/L2tpIpsecEditor.java
index b14feb32d2c..276ee2fca6d 100644
--- a/src/com/android/settings/vpn/L2tpIpsecEditor.java
+++ b/src/com/android/settings/vpn/L2tpIpsecEditor.java
@@ -24,7 +24,8 @@ import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceGroup;
-import android.security.CertTool;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.text.TextUtils;
/**
@@ -33,6 +34,8 @@ import android.text.TextUtils;
class L2tpIpsecEditor extends L2tpEditor {
private static final String TAG = L2tpIpsecEditor.class.getSimpleName();
+ private KeyStore mKeyStore = KeyStore.getInstance();
+
private ListPreference mUserCertificate;
private ListPreference mCaCertificate;
@@ -67,7 +70,7 @@ class L2tpIpsecEditor extends L2tpEditor {
mUserCertificate = createListPreference(c,
R.string.vpn_user_certificate_title,
mProfile.getUserCertificate(),
- CertTool.getInstance().getAllUserCertificateKeys(),
+ mKeyStore.saw(Credentials.USER_CERTIFICATE),
new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(
Preference pref, Object newValue) {
@@ -86,7 +89,7 @@ class L2tpIpsecEditor extends L2tpEditor {
mCaCertificate = createListPreference(c,
R.string.vpn_ca_certificate_title,
mProfile.getCaCertificate(),
- CertTool.getInstance().getAllCaCertificateKeys(),
+ mKeyStore.saw(Credentials.CA_CERTIFICATE),
new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(
Preference pref, Object newValue) {
diff --git a/src/com/android/settings/vpn/PptpEditor.java b/src/com/android/settings/vpn/PptpEditor.java
index fafe6a76bb7..cfb3fa38710 100644
--- a/src/com/android/settings/vpn/PptpEditor.java
+++ b/src/com/android/settings/vpn/PptpEditor.java
@@ -45,7 +45,7 @@ class PptpEditor extends VpnProfileEditor {
final PptpProfile profile = (PptpProfile) getProfile();
CheckBoxPreference encryption = mEncryption = new CheckBoxPreference(c);
boolean enabled = profile.isEncryptionEnabled();
- setSecretTitle(encryption, R.string.vpn_pptp_encryption_title, enabled);
+ setCheckBoxTitle(encryption, R.string.vpn_pptp_encryption_title);
encryption.setChecked(enabled);
setEncryptionSummary(encryption, enabled);
encryption.setOnPreferenceChangeListener(
@@ -54,8 +54,6 @@ class PptpEditor extends VpnProfileEditor {
Preference pref, Object newValue) {
boolean enabled = (Boolean) newValue;
profile.setEncryptionEnabled(enabled);
- setSecretTitle(mEncryption,
- R.string.vpn_pptp_encryption_title, enabled);
setEncryptionSummary(mEncryption, enabled);
return true;
}
diff --git a/src/com/android/settings/vpn/VpnProfileEditor.java b/src/com/android/settings/vpn/VpnProfileEditor.java
index 8dc36431769..100b78e7e75 100644
--- a/src/com/android/settings/vpn/VpnProfileEditor.java
+++ b/src/com/android/settings/vpn/VpnProfileEditor.java
@@ -174,12 +174,9 @@ class VpnProfileEditor {
: v);
}
- protected void setSecretTitle(
- CheckBoxPreference pref, int fieldNameId, boolean enabled) {
+ protected void setCheckBoxTitle(CheckBoxPreference pref, int fieldNameId) {
Context c = pref.getContext();
- String formatString = enabled
- ? c.getString(R.string.vpn_disable_field)
- : c.getString(R.string.vpn_enable_field);
+ String formatString = c.getString(R.string.vpn_enable_field);
pref.setTitle(String.format(formatString, c.getString(fieldNameId)));
}
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index 7d4ea2516a0..d3803752555 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -47,8 +47,8 @@ import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.preference.Preference.OnPreferenceClickListener;
-import android.security.CertTool;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
@@ -104,20 +104,13 @@ public class VpnSettings extends PreferenceActivity implements
private static final int CONNECT_BUTTON = DialogInterface.BUTTON1;
private static final int OK_BUTTON = DialogInterface.BUTTON1;
- private static final int DIALOG_CONNECT = 1;
- private static final int DIALOG_RECONNECT = 2;
- private static final int DIALOG_AUTH_ERROR = 3;
- private static final int DIALOG_UNKNOWN_SERVER = 4;
- private static final int DIALOG_SECRET_NOT_SET = 5;
- private static final int DIALOG_CHALLENGE_ERROR = 6;
- private static final int DIALOG_REMOTE_HUNG_UP_ERROR = 7;
- private static final int DIALOG_CONNECTION_LOST = 8;
+ private static final int DIALOG_CONNECT = VpnManager.VPN_ERROR_LARGEST + 1;
+ private static final int DIALOG_SECRET_NOT_SET = DIALOG_CONNECT + 1;
- private static final int NO_ERROR = 0;
+ private static final int NO_ERROR = VpnManager.VPN_ERROR_NO_ERROR;
- private static final String NAMESPACE_VPN = "vpn";
- private static final String KEY_PREFIX_IPSEC_PSK = "ipsk000";
- private static final String KEY_PREFIX_L2TP_SECRET = "lscrt000";
+ private static final String KEY_PREFIX_IPSEC_PSK = Credentials.VPN + 'i';
+ private static final String KEY_PREFIX_L2TP_SECRET = Credentials.VPN + 'l';
private PreferenceScreen mAddVpn;
private PreferenceCategory mVpnListContainer;
@@ -135,6 +128,8 @@ public class VpnSettings extends PreferenceActivity implements
// states saved for unlocking keystore
private Runnable mUnlockAction;
+ private KeyStore mKeyStore = KeyStore.getInstance();
+
private VpnManager mVpnManager = new VpnManager(this);
private ConnectivityReceiver mConnectivityReceiver =
@@ -178,7 +173,7 @@ public class VpnSettings extends PreferenceActivity implements
public void onResume() {
super.onResume();
- if ((mUnlockAction != null) && isKeystoreUnlocked()) {
+ if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
Runnable action = mUnlockAction;
mUnlockAction = null;
runOnUiThread(action);
@@ -201,29 +196,17 @@ public class VpnSettings extends PreferenceActivity implements
case DIALOG_CONNECT:
return createConnectDialog();
- case DIALOG_RECONNECT:
- return createReconnectDialog();
-
- case DIALOG_AUTH_ERROR:
- return createAuthErrorDialog();
-
- case DIALOG_REMOTE_HUNG_UP_ERROR:
- return createRemoteHungUpErrorDialog();
-
- case DIALOG_CHALLENGE_ERROR:
- return createChallengeErrorDialog();
-
- case DIALOG_UNKNOWN_SERVER:
- return createUnknownServerDialog();
-
case DIALOG_SECRET_NOT_SET:
return createSecretNotSetDialog();
- case DIALOG_CONNECTION_LOST:
- return createConnectionLostDialog();
+ case VpnManager.VPN_ERROR_CHALLENGE:
+ case VpnManager.VPN_ERROR_UNKNOWN_SERVER:
+ case VpnManager.VPN_ERROR_PPP_NEGOTIATION_FAILED:
+ return createEditDialog(id);
default:
- return super.onCreateDialog(id);
+ Log.d(TAG, "create reconnect dialog for event " + id);
+ return createReconnectDialog(id);
}
}
@@ -239,40 +222,56 @@ public class VpnSettings extends PreferenceActivity implements
.setOnCancelListener(new DialogInterface.OnCancelListener() {
public void onCancel(DialogInterface dialog) {
removeDialog(DIALOG_CONNECT);
- onIdle();
+ changeState(mActiveProfile, VpnState.IDLE);
}
})
.create();
}
- private Dialog createReconnectDialog() {
- return createCommonDialogBuilder()
- .setMessage(R.string.vpn_confirm_reconnect)
- .create();
+ private Dialog createReconnectDialog(int id) {
+ int msgId;
+ switch (id) {
+ case VpnManager.VPN_ERROR_AUTH:
+ msgId = R.string.vpn_auth_error_dialog_msg;
+ break;
+
+ case VpnManager.VPN_ERROR_REMOTE_HUNG_UP:
+ msgId = R.string.vpn_remote_hung_up_error_dialog_msg;
+ break;
+
+ case VpnManager.VPN_ERROR_CONNECTION_LOST:
+ msgId = R.string.vpn_reconnect_from_lost;
+ break;
+
+ case VpnManager.VPN_ERROR_REMOTE_PPP_HUNG_UP:
+ msgId = R.string.vpn_remote_ppp_hung_up_error_dialog_msg;
+ break;
+
+ default:
+ msgId = R.string.vpn_confirm_reconnect;
+ }
+ return createCommonDialogBuilder().setMessage(msgId).create();
}
- private Dialog createAuthErrorDialog() {
- return createCommonDialogBuilder()
- .setMessage(R.string.vpn_auth_error_dialog_msg)
- .create();
- }
+ private Dialog createEditDialog(int id) {
+ int msgId;
+ switch (id) {
+ case VpnManager.VPN_ERROR_CHALLENGE:
+ msgId = R.string.vpn_challenge_error_dialog_msg;
+ break;
- private Dialog createRemoteHungUpErrorDialog() {
- return createCommonDialogBuilder()
- .setMessage(R.string.vpn_remote_hung_up_error_dialog_msg)
- .create();
- }
+ case VpnManager.VPN_ERROR_UNKNOWN_SERVER:
+ msgId = R.string.vpn_unknown_server_dialog_msg;
+ break;
- private Dialog createChallengeErrorDialog() {
- return createCommonEditDialogBuilder()
- .setMessage(R.string.vpn_challenge_error_dialog_msg)
- .create();
- }
+ case VpnManager.VPN_ERROR_PPP_NEGOTIATION_FAILED:
+ msgId = R.string.vpn_ppp_negotiation_failed_dialog_msg;
+ break;
- private Dialog createUnknownServerDialog() {
- return createCommonEditDialogBuilder()
- .setMessage(R.string.vpn_unknown_server_dialog_msg)
- .create();
+ default:
+ return null;
+ }
+ return createCommonEditDialogBuilder().setMessage(msgId).create();
}
private Dialog createSecretNotSetDialog() {
@@ -299,12 +298,6 @@ public class VpnSettings extends PreferenceActivity implements
});
}
- private Dialog createConnectionLostDialog() {
- return createCommonDialogBuilder()
- .setMessage(R.string.vpn_reconnect_from_lost)
- .create();
- }
-
private AlertDialog.Builder createCommonDialogBuilder() {
return new AlertDialog.Builder(this)
.setTitle(android.R.string.dialog_alert_title)
@@ -410,13 +403,13 @@ public class VpnSettings extends PreferenceActivity implements
return;
}
- if (needKeystoreToSave(p)) {
+ if (needKeyStoreToSave(p)) {
Runnable action = new Runnable() {
public void run() {
onActivityResult(requestCode, resultCode, data);
}
};
- if (!unlockKeystore(p, action)) return;
+ if (!unlockKeyStore(p, action)) return;
}
try {
@@ -451,7 +444,6 @@ public class VpnSettings extends PreferenceActivity implements
Dialog d = (Dialog) dialog;
String error = mConnectingActor.validateInputs(d);
if (error == null) {
- changeState(mActiveProfile, VpnState.CONNECTING);
mConnectingActor.connect(d);
removeDialog(DIALOG_CONNECT);
return;
@@ -475,7 +467,7 @@ public class VpnSettings extends PreferenceActivity implements
}
} else {
removeDialog(DIALOG_CONNECT);
- onIdle();
+ changeState(mActiveProfile, VpnState.IDLE);
}
}
@@ -619,22 +611,26 @@ public class VpnSettings extends PreferenceActivity implements
startActivityForResult(intent, REQUEST_SELECT_VPN_TYPE);
}
- private boolean isKeystoreUnlocked() {
- return (Keystore.getInstance().getState() == Keystore.UNLOCKED);
- }
-
-
- // Returns true if the profile needs to access keystore
- private boolean needKeystoreToSave(VpnProfile p) {
- return needKeystoreToConnect(p);
+ private boolean isKeyStoreUnlocked() {
+ return mKeyStore.test() == KeyStore.NO_ERROR;
}
// Returns true if the profile needs to access keystore
- private boolean needKeystoreToEdit(VpnProfile p) {
+ private boolean needKeyStoreToSave(VpnProfile p) {
switch (p.getType()) {
- case L2TP_IPSEC:
case L2TP_IPSEC_PSK:
- return true;
+ L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
+ String presharedKey = pskProfile.getPresharedKey();
+ if (!TextUtils.isEmpty(presharedKey)) return true;
+ // pass through
+
+ case L2TP:
+ L2tpProfile l2tpProfile = (L2tpProfile) p;
+ if (l2tpProfile.isSecretEnabled() &&
+ !TextUtils.isEmpty(l2tpProfile.getSecretString())) {
+ return true;
+ }
+ // pass through
default:
return false;
@@ -642,7 +638,7 @@ public class VpnSettings extends PreferenceActivity implements
}
// Returns true if the profile needs to access keystore
- private boolean needKeystoreToConnect(VpnProfile p) {
+ private boolean needKeyStoreToConnect(VpnProfile p) {
switch (p.getType()) {
case L2TP_IPSEC:
case L2TP_IPSEC_PSK:
@@ -657,46 +653,34 @@ public class VpnSettings extends PreferenceActivity implements
}
// Returns true if keystore is unlocked or keystore is not a concern
- private boolean unlockKeystore(VpnProfile p, Runnable action) {
- if (isKeystoreUnlocked()) return true;
+ private boolean unlockKeyStore(VpnProfile p, Runnable action) {
+ if (isKeyStoreUnlocked()) return true;
mUnlockAction = action;
- startActivity(
- new Intent(SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ Credentials.getInstance().unlock(this);
return false;
}
private void startVpnEditor(final VpnProfile profile) {
- if (needKeystoreToEdit(profile)) {
- Runnable action = new Runnable() {
- public void run() {
- startVpnEditor(profile);
- }
- };
- if (!unlockKeystore(profile, action)) return;
- }
-
Intent intent = new Intent(this, VpnEditor.class);
intent.putExtra(KEY_VPN_PROFILE, (Parcelable) profile);
startActivityForResult(intent, REQUEST_ADD_OR_EDIT_PROFILE);
}
private synchronized void connect(final VpnProfile p) {
- if (needKeystoreToConnect(p)) {
+ if (needKeyStoreToConnect(p)) {
Runnable action = new Runnable() {
public void run() {
connect(p);
}
};
- if (!unlockKeystore(p, action)) return;
+ if (!unlockKeyStore(p, action)) return;
}
- mConnectingActor = getActor(p);
- mActiveProfile = p;
if (!checkSecrets(p)) return;
+ changeState(p, VpnState.CONNECTING);
if (mConnectingActor.isConnectDialogNeeded()) {
showDialog(DIALOG_CONNECT);
} else {
- changeState(p, VpnState.CONNECTING);
mConnectingActor.connect(null);
}
}
@@ -737,7 +721,10 @@ public class VpnSettings extends PreferenceActivity implements
break;
case CONNECTING:
+ mConnectingActor = getActor(p);
+ // pass through
case DISCONNECTING:
+ mActiveProfile = p;
disableProfilePreferencesIfOneActive();
break;
@@ -748,36 +735,12 @@ public class VpnSettings extends PreferenceActivity implements
case IDLE:
assert(mActiveProfile == p);
- switch (mConnectingErrorCode) {
- case NO_ERROR:
- onIdle();
- break;
-
- case VpnManager.VPN_ERROR_AUTH:
- showDialog(DIALOG_AUTH_ERROR);
- break;
-
- case VpnManager.VPN_ERROR_REMOTE_HUNG_UP:
- showDialog(DIALOG_REMOTE_HUNG_UP_ERROR);
- break;
-
- case VpnManager.VPN_ERROR_CHALLENGE:
- showDialog(DIALOG_CHALLENGE_ERROR);
- break;
-
- case VpnManager.VPN_ERROR_UNKNOWN_SERVER:
- showDialog(DIALOG_UNKNOWN_SERVER);
- break;
-
- case VpnManager.VPN_ERROR_CONNECTION_LOST:
- showDialog(DIALOG_CONNECTION_LOST);
- break;
-
- default:
- showDialog(DIALOG_RECONNECT);
- break;
+ if (mConnectingErrorCode == NO_ERROR) {
+ onIdle();
+ } else {
+ showDialog(mConnectingErrorCode);
+ mConnectingErrorCode = NO_ERROR;
}
- mConnectingErrorCode = NO_ERROR;
break;
}
}
@@ -920,43 +883,32 @@ public class VpnSettings extends PreferenceActivity implements
return mVpnManager.createVpnProfile(Enum.valueOf(VpnType.class, type));
}
- private String keyNameForDaemon(String keyName) {
- return NAMESPACE_VPN + "_" + keyName;
- }
-
private boolean checkSecrets(VpnProfile p) {
- Keystore ks = Keystore.getInstance();
- HashSet secretSet = new HashSet();
boolean secretMissing = false;
if (p instanceof L2tpIpsecProfile) {
L2tpIpsecProfile certProfile = (L2tpIpsecProfile) p;
- CertTool certTool = CertTool.getInstance();
- Collections.addAll(secretSet, certTool.getAllCaCertificateKeys());
+
String cert = certProfile.getCaCertificate();
- if (TextUtils.isEmpty(cert) || !secretSet.contains(cert)) {
+ if (TextUtils.isEmpty(cert) ||
+ !mKeyStore.contains(Credentials.CA_CERTIFICATE + cert)) {
certProfile.setCaCertificate(null);
secretMissing = true;
}
- secretSet.clear();
- Collections.addAll(secretSet, certTool.getAllUserCertificateKeys());
cert = certProfile.getUserCertificate();
- if (TextUtils.isEmpty(cert) || !secretSet.contains(cert)) {
+ if (TextUtils.isEmpty(cert) ||
+ !mKeyStore.contains(Credentials.USER_CERTIFICATE + cert)) {
certProfile.setUserCertificate(null);
secretMissing = true;
}
}
- secretSet.clear();
- Collections.addAll(secretSet, ks.listKeys(NAMESPACE_VPN));
-
if (p instanceof L2tpIpsecPskProfile) {
L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
String presharedKey = pskProfile.getPresharedKey();
- String keyName = KEY_PREFIX_IPSEC_PSK + p.getId();
- if (TextUtils.isEmpty(presharedKey)
- || !secretSet.contains(keyName)) {
+ String key = KEY_PREFIX_IPSEC_PSK + p.getId();
+ if (TextUtils.isEmpty(presharedKey) || !mKeyStore.contains(key)) {
pskProfile.setPresharedKey(null);
secretMissing = true;
}
@@ -966,9 +918,8 @@ public class VpnSettings extends PreferenceActivity implements
L2tpProfile l2tpProfile = (L2tpProfile) p;
if (l2tpProfile.isSecretEnabled()) {
String secret = l2tpProfile.getSecretString();
- String keyName = KEY_PREFIX_L2TP_SECRET + p.getId();
- if (TextUtils.isEmpty(secret)
- || !secretSet.contains(keyName)) {
+ String key = KEY_PREFIX_L2TP_SECRET + p.getId();
+ if (TextUtils.isEmpty(secret) || !mKeyStore.contains(key)) {
l2tpProfile.setSecretString(null);
secretMissing = true;
}
@@ -976,6 +927,7 @@ public class VpnSettings extends PreferenceActivity implements
}
if (secretMissing) {
+ mActiveProfile = p;
showDialog(DIALOG_SECRET_NOT_SET);
return false;
} else {
@@ -984,35 +936,31 @@ public class VpnSettings extends PreferenceActivity implements
}
private void processSecrets(VpnProfile p) {
- Keystore ks = Keystore.getInstance();
switch (p.getType()) {
case L2TP_IPSEC_PSK:
L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
String presharedKey = pskProfile.getPresharedKey();
- String keyName = KEY_PREFIX_IPSEC_PSK + p.getId();
- if (!TextUtils.isEmpty(presharedKey)) {
- int ret = ks.put(NAMESPACE_VPN, keyName, presharedKey);
- if (ret != 0) {
- Log.e(TAG, "keystore write failed: key=" + keyName);
- }
+ String key = KEY_PREFIX_IPSEC_PSK + p.getId();
+ if (!TextUtils.isEmpty(presharedKey) &&
+ !mKeyStore.put(key, presharedKey)) {
+ Log.e(TAG, "keystore write failed: key=" + key);
}
- pskProfile.setPresharedKey(keyNameForDaemon(keyName));
+ pskProfile.setPresharedKey(key);
// pass through
+ case L2TP_IPSEC:
case L2TP:
L2tpProfile l2tpProfile = (L2tpProfile) p;
- keyName = KEY_PREFIX_L2TP_SECRET + p.getId();
+ key = KEY_PREFIX_L2TP_SECRET + p.getId();
if (l2tpProfile.isSecretEnabled()) {
String secret = l2tpProfile.getSecretString();
- if (!TextUtils.isEmpty(secret)) {
- int ret = ks.put(NAMESPACE_VPN, keyName, secret);
- if (ret != 0) {
- Log.e(TAG, "keystore write failed: key=" + keyName);
- }
+ if (!TextUtils.isEmpty(secret) &&
+ !mKeyStore.put(key, secret)) {
+ Log.e(TAG, "keystore write failed: key=" + key);
}
- l2tpProfile.setSecretString(keyNameForDaemon(keyName));
+ l2tpProfile.setSecretString(key);
} else {
- ks.remove(NAMESPACE_VPN, keyName);
+ mKeyStore.delete(key);
}
break;
}
diff --git a/src/com/android/settings/vpn/VpnTypeSelection.java b/src/com/android/settings/vpn/VpnTypeSelection.java
index e74fb43b2a4..aa4bc5e30be 100644
--- a/src/com/android/settings/vpn/VpnTypeSelection.java
+++ b/src/com/android/settings/vpn/VpnTypeSelection.java
@@ -60,7 +60,7 @@ public class VpnTypeSelection extends PreferenceActivity {
Preference pref = new Preference(this);
pref.setTitle(message);
- pref.setSummary(t.getDescription());
+ pref.setSummary(t.getDescriptionId());
root.addPreference(pref);
}
}
diff --git a/src/com/android/settings/widget/SettingsAppWidgetProvider.java b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
index d8747c939b3..3db90cfe236 100644
--- a/src/com/android/settings/widget/SettingsAppWidgetProvider.java
+++ b/src/com/android/settings/widget/SettingsAppWidgetProvider.java
@@ -19,7 +19,7 @@ package com.android.settings.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
-import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -30,12 +30,13 @@ import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.net.wifi.WifiManager;
-import android.os.IHardwareService;
+import android.os.IPowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.RemoteViews;
+import android.widget.Toast;
import com.android.settings.R;
import com.android.settings.bluetooth.LocalBluetoothManager;
@@ -143,39 +144,51 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
private static void updateButtons(RemoteViews views, Context context) {
switch (getWifiState(context)) {
case STATE_DISABLED:
- views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_off);
+ views.setImageViewResource(R.id.img_wifi, R.drawable.ic_appwidget_settings_wifi_off);
+ views.setImageViewResource(R.id.ind_wifi, R.drawable.appwidget_settings_ind_off_l);
break;
case STATE_ENABLED:
- views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi);
+ views.setImageViewResource(R.id.img_wifi, R.drawable.ic_appwidget_settings_wifi_on);
+ views.setImageViewResource(R.id.ind_wifi, R.drawable.appwidget_settings_ind_on_l);
break;
case STATE_INTERMEDIATE:
- views.setImageViewResource(R.id.btn_wifi, R.drawable.widget_btn_wifi_gray);
+ views.setImageViewResource(R.id.img_wifi, R.drawable.ic_appwidget_settings_wifi_off);
+ views.setImageViewResource(R.id.ind_wifi, R.drawable.appwidget_settings_ind_mid_l);
break;
}
if (getBrightness(context)) {
- views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness);
+ views.setImageViewResource(R.id.img_brightness, R.drawable.ic_appwidget_settings_brightness_on);
+ views.setImageViewResource(R.id.ind_brightness, R.drawable.appwidget_settings_ind_on_r);
} else {
- views.setImageViewResource(R.id.btn_brightness, R.drawable.widget_btn_brightness_off);
+ views.setImageViewResource(R.id.img_brightness, R.drawable.ic_appwidget_settings_brightness_off);
+ views.setImageViewResource(R.id.ind_brightness, R.drawable.appwidget_settings_ind_off_r);
}
- if (getBackgroundDataState(context)) {
- views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync);
+ if (getSync(context)) {
+ views.setImageViewResource(R.id.img_sync, R.drawable.ic_appwidget_settings_sync_on);
+ views.setImageViewResource(R.id.ind_sync, R.drawable.appwidget_settings_ind_on_c);
} else {
- views.setImageViewResource(R.id.btn_sync, R.drawable.widget_btn_sync_off);
+ views.setImageViewResource(R.id.img_sync, R.drawable.ic_appwidget_settings_sync_off);
+ views.setImageViewResource(R.id.ind_sync, R.drawable.appwidget_settings_ind_off_c);
}
if (getGpsState(context)) {
- views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps);
+ views.setImageViewResource(R.id.img_gps, R.drawable.ic_appwidget_settings_gps_on);
+ views.setImageViewResource(R.id.ind_gps, R.drawable.appwidget_settings_ind_on_c);
} else {
- views.setImageViewResource(R.id.btn_gps, R.drawable.widget_btn_gps_off);
+ views.setImageViewResource(R.id.img_gps, R.drawable.ic_appwidget_settings_gps_off);
+ views.setImageViewResource(R.id.ind_gps, R.drawable.appwidget_settings_ind_off_c);
}
switch (getBluetoothState(context)) {
case STATE_DISABLED:
- views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth_off);
+ views.setImageViewResource(R.id.img_bluetooth, R.drawable.ic_appwidget_settings_bluetooth_off);
+ views.setImageViewResource(R.id.ind_bluetooth, R.drawable.appwidget_settings_ind_off_c);
break;
case STATE_ENABLED:
- views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth);
+ views.setImageViewResource(R.id.img_bluetooth, R.drawable.ic_appwidget_settings_bluetooth_on);
+ views.setImageViewResource(R.id.ind_bluetooth, R.drawable.appwidget_settings_ind_on_c);
break;
case STATE_INTERMEDIATE:
- views.setImageViewResource(R.id.btn_bluetooth, R.drawable.widget_btn_bluetooth_gray);
+ views.setImageViewResource(R.id.img_bluetooth, R.drawable.ic_appwidget_settings_bluetooth_off);
+ views.setImageViewResource(R.id.ind_bluetooth, R.drawable.appwidget_settings_ind_mid_c);
break;
}
}
@@ -187,7 +200,8 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
* @param appWidgetId
* @return
*/
- private static PendingIntent getLaunchPendingIntent(Context context, int appWidgetId, int buttonId) {
+ private static PendingIntent getLaunchPendingIntent(Context context, int appWidgetId,
+ int buttonId) {
Intent launchIntent = new Intent();
launchIntent.setClass(context, SettingsAppWidgetProvider.class);
launchIntent.addCategory(Intent.CATEGORY_ALTERNATIVE);
@@ -214,7 +228,7 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
} else if (buttonId == BUTTON_BRIGHTNESS) {
toggleBrightness(context);
} else if (buttonId == BUTTON_SYNC) {
- toggleBackgroundData(context);
+ toggleSync(context);
} else if (buttonId == BUTTON_GPS) {
toggleGps(context);
} else if (buttonId == BUTTON_BLUETOOTH) {
@@ -256,6 +270,7 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
} else if (wifiState == STATE_DISABLED) {
wifiManager.setWifiEnabled(true);
}
+ Toast.makeText(context, R.string.gadget_toggle_wifi, Toast.LENGTH_SHORT).show();
}
/**
@@ -265,25 +280,56 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
* @return true if enabled
*/
private static boolean getBackgroundDataState(Context context) {
- ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ ConnectivityManager connManager =
+ (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connManager.getBackgroundDataSetting();
}
/**
- * Toggle background data and sync tickles.
+ * Gets the state of auto-sync.
+ *
+ * @param context
+ * @return true if enabled
+ */
+ private static boolean getSync(Context context) {
+ boolean backgroundData = getBackgroundDataState(context);
+ boolean sync = ContentResolver.getMasterSyncAutomatically();
+ return backgroundData && sync;
+ }
+
+ /**
+ * Toggle auto-sync
*
* @param context
*/
- private void toggleBackgroundData(Context context) {
- ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- boolean sync = getBackgroundDataState(context);
- connManager.setBackgroundDataSetting(!sync);
+ private void toggleSync(Context context) {
+ ConnectivityManager connManager =
+ (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+ boolean backgroundData = getBackgroundDataState(context);
+ boolean sync = ContentResolver.getMasterSyncAutomatically();
- IContentService contentService = ContentResolver.getContentService();
- try {
- contentService.setListenForNetworkTickles(!sync);
- } catch (RemoteException e) {
- Log.d(TAG, "toggleBackgroundData: " + e);
+ // four cases to handle:
+ // setting toggled from off to on:
+ // 1. background data was off, sync was off: turn on both
+ if (!backgroundData && !sync) {
+ connManager.setBackgroundDataSetting(true);
+ ContentResolver.setMasterSyncAutomatically(true);
+ }
+
+ // 2. background data was off, sync was on: turn on background data
+ if (!backgroundData && sync) {
+ connManager.setBackgroundDataSetting(true);
+ }
+
+ // 3. background data was on, sync was off: turn on sync
+ if (backgroundData && !sync) {
+ ContentResolver.setMasterSyncAutomatically(true);
+ }
+
+ // setting toggled from on to off:
+ // 4. background data was on, sync was on: turn off sync
+ if (backgroundData && sync) {
+ ContentResolver.setMasterSyncAutomatically(false);
}
}
@@ -306,7 +352,8 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
private void toggleGps(Context context) {
ContentResolver resolver = context.getContentResolver();
boolean enabled = getGpsState(context);
- Settings.Secure.setLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER, !enabled);
+ Settings.Secure.setLocationProviderEnabled(resolver, LocationManager.GPS_PROVIDER,
+ !enabled);
}
/**
@@ -317,9 +364,9 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
*/
private static boolean getBrightness(Context context) {
try {
- IHardwareService hardware = IHardwareService.Stub.asInterface(
- ServiceManager.getService("hardware"));
- if (hardware != null) {
+ IPowerManager power = IPowerManager.Stub.asInterface(
+ ServiceManager.getService("power"));
+ if (power != null) {
int brightness = Settings.System.getInt(context.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS);
return brightness > 100;
@@ -337,9 +384,9 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
*/
private void toggleBrightness(Context context) {
try {
- IHardwareService hardware = IHardwareService.Stub.asInterface(
- ServiceManager.getService("hardware"));
- if (hardware != null) {
+ IPowerManager power = IPowerManager.Stub.asInterface(
+ ServiceManager.getService("power"));
+ if (power != null) {
ContentResolver cr = context.getContentResolver();
int brightness = Settings.System.getInt(cr,
Settings.System.SCREEN_BRIGHTNESS);
@@ -352,10 +399,17 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
} else {
brightness = MINIMUM_BACKLIGHT;
}
- hardware.setBacklights(brightness);
+ power.setBacklightBrightness(brightness);
Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS, brightness);
- brightness = Settings.System.getInt(cr,
- Settings.System.SCREEN_BRIGHTNESS);
+ if (context.getResources().getBoolean(
+ com.android.internal.R.bool.config_automatic_brightness_available)) {
+ // Disable automatic brightness
+ Settings.System.putInt(context.getContentResolver(),
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+ // Set it again in case auto brightness was on
+ power.setBacklightBrightness(brightness);
+ }
}
} catch (RemoteException e) {
Log.d(TAG, "toggleBrightness: " + e);
@@ -378,9 +432,9 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
}
}
int state = mLocalBluetoothManager.getBluetoothState();
- if (state == BluetoothDevice.BLUETOOTH_STATE_OFF) {
+ if (state == BluetoothAdapter.STATE_OFF) {
return STATE_DISABLED;
- } else if (state == BluetoothDevice.BLUETOOTH_STATE_ON) {
+ } else if (state == BluetoothAdapter.STATE_ON) {
return STATE_ENABLED;
} else {
return STATE_INTERMEDIATE;
@@ -399,5 +453,6 @@ public class SettingsAppWidgetProvider extends AppWidgetProvider {
} else if (state == STATE_DISABLED) {
mLocalBluetoothManager.setBluetoothEnabled(true);
}
+ Toast.makeText(context, R.string.gadget_toggle_bluetooth, Toast.LENGTH_SHORT).show();
}
}
diff --git a/src/com/android/settings/wifi/AccessPointDialog.java b/src/com/android/settings/wifi/AccessPointDialog.java
index 5851a184d01..4804d7837d5 100644
--- a/src/com/android/settings/wifi/AccessPointDialog.java
+++ b/src/com/android/settings/wifi/AccessPointDialog.java
@@ -17,15 +17,14 @@
package com.android.settings.wifi;
import com.android.settings.R;
-import com.android.settings.SecuritySettings;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
-import android.security.CertTool;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
@@ -74,17 +73,15 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
private static final int SECURITY_AUTO = 0;
private static final int SECURITY_NONE = 1;
private static final int SECURITY_WEP = 2;
- private static final int SECURITY_WPA_PERSONAL = 3;
- private static final int SECURITY_WPA2_PERSONAL = 4;
- private static final int SECURITY_WPA_EAP = 5;
- private static final int SECURITY_IEEE8021X = 6;
+ private static final int SECURITY_PSK = 3;
+ private static final int SECURITY_EAP = 4;
private static final int[] WEP_TYPE_VALUES = {
AccessPointState.WEP_PASSWORD_AUTO, AccessPointState.WEP_PASSWORD_ASCII,
AccessPointState.WEP_PASSWORD_HEX
};
private static final String NOT_APPLICABLE = "N/A";
- private static final String BLOB_HEADER = "blob://";
+ private static final String KEYSTORE_HEADER = "keystore://";
// Button positions, default to impossible values
private int mConnectButtonPos = Integer.MAX_VALUE;
@@ -119,8 +116,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
private Spinner mCaCertSpinner;
private TextView mClientCertText;
private Spinner mClientCertSpinner;
- private TextView mPrivateKeyPasswdText;
- private EditText mPrivateKeyPasswdEdit;
private EditText[] mEnterpriseTextFields;
@@ -133,13 +128,13 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
private TextView mSecurityText;
private Spinner mSecuritySpinner;
private Spinner mWepTypeSpinner;
- private CertTool mCertTool;
+ private KeyStore mKeyStore;
public AccessPointDialog(Context context, WifiLayer wifiLayer) {
super(context);
mWifiLayer = wifiLayer;
- mCertTool = CertTool.getInstance();
+ mKeyStore = KeyStore.getInstance();
}
@Override
@@ -222,7 +217,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
updateCertificateSelection();
setGenericPasswordVisible(true);
// Both WPA and WPA2 show the same caption, so either is ok
- updatePasswordCaption(AccessPointState.WPA);
+ updatePasswordCaption(AccessPointState.PSK);
}
/** Called after flags are set, the dialog's layout/etc should be set up here */
@@ -347,18 +342,22 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
private String[] getAllCaCertificateKeys() {
- return appendEmptyInSelection(mCertTool.getAllCaCertificateKeys());
+ return appendEmptyInSelection(mKeyStore.saw(Credentials.CA_CERTIFICATE));
}
private String[] getAllUserCertificateKeys() {
- return appendEmptyInSelection(mCertTool.getAllUserCertificateKeys());
+ return appendEmptyInSelection(mKeyStore.saw(Credentials.USER_CERTIFICATE));
}
private String[] appendEmptyInSelection(String[] keys) {
- String[] selections = new String[keys.length + 1];
- System.arraycopy(keys, 0, selections, 0, keys.length);
- selections[keys.length] = NOT_APPLICABLE;
- return selections;
+ if (keys == null) {
+ return new String[] {NOT_APPLICABLE};
+ } else {
+ String[] selections = new String[keys.length + 1];
+ System.arraycopy(keys, 0, selections, 0, keys.length);
+ selections[keys.length] = NOT_APPLICABLE;
+ return selections;
+ }
}
private void setEnterpriseFields(View view) {
@@ -371,8 +370,6 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
mClientCertText =
(TextView) view.findViewById(R.id.client_certificate_text);
mCaCertText = (TextView) view.findViewById(R.id.ca_certificate_text);
- mPrivateKeyPasswdEdit =
- (EditText) view.findViewById(R.id.private_key_passwd_edit);
mEapText = (TextView) view.findViewById(R.id.eap_text);
mEapSpinner = (Spinner) view.findViewById(R.id.eap_spinner);
mEapSpinner.setOnItemSelectedListener(this);
@@ -399,7 +396,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
setSpinnerAdapter(mCaCertSpinner, getAllCaCertificateKeys());
mEnterpriseTextFields = new EditText[] {
- mIdentityEdit, mAnonymousIdentityEdit, mPrivateKeyPasswdEdit
+ mIdentityEdit, mAnonymousIdentityEdit
};
}
@@ -455,12 +452,12 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
private void updatePasswordCaption(String security) {
-
- if (mPasswordText != null && security != null
- && security.equals(AccessPointState.WEP)) {
- mPasswordText.setText(R.string.please_type_hex_key);
- } else {
- mPasswordText.setText(R.string.please_type_passphrase);
+ if (mPasswordText != null) {
+ if (security != null && security.equals(AccessPointState.WEP)) {
+ mPasswordText.setText(R.string.please_type_hex_key);
+ } else {
+ mPasswordText.setText(R.string.please_type_passphrase);
+ }
}
}
@@ -518,9 +515,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
if (mState.isEnterprise()) {
if(!mState.configured) {
- updateEnterpriseFields(
- AccessPointState.WPA_EAP.equals(mState.security) ?
- SECURITY_WPA_EAP : SECURITY_IEEE8021X);
+ updateEnterpriseFields();
}
}
updatePasswordField();
@@ -576,13 +571,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
switch (securityType) {
- case SECURITY_WPA_PERSONAL: {
- mState.setSecurity(AccessPointState.WPA);
- break;
- }
-
- case SECURITY_WPA2_PERSONAL: {
- mState.setSecurity(AccessPointState.WPA2);
+ case SECURITY_PSK: {
+ mState.setSecurity(AccessPointState.PSK);
break;
}
@@ -597,12 +587,8 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
break;
}
- case SECURITY_WPA_EAP:
- mState.setSecurity(AccessPointState.WPA_EAP);
- break;
-
- case SECURITY_IEEE8021X:
- mState.setSecurity(AccessPointState.IEEE8021X);
+ case SECURITY_EAP:
+ mState.setSecurity(AccessPointState.EAP);
break;
case SECURITY_NONE:
@@ -612,9 +598,7 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
}
if (mState.isEnterprise() && !mState.configured) {
- updateEnterpriseFields(
- AccessPointState.WPA_EAP.equals(mState.security) ?
- SECURITY_WPA_EAP : SECURITY_IEEE8021X);
+ updateEnterpriseFields();
}
if (!mWifiLayer.saveNetwork(mState)) {
@@ -642,57 +626,35 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
getContext().getResources().getStringArray(arrayResId), selection);
}
- private void updateEnterpriseFields(int securityType) {
+ private void updateEnterpriseFields() {
int i;
String value;
for (i = AccessPointState.IDENTITY ;
- i <= AccessPointState.PRIVATE_KEY_PASSWD ; i++) {
+ i <= AccessPointState.ANONYMOUS_IDENTITY ; i++) {
value = mEnterpriseTextFields[i].getText().toString();
- if (!TextUtils.isEmpty(value) ||
- (i == AccessPointState.PRIVATE_KEY_PASSWD)) {
+ if (!TextUtils.isEmpty(value)) {
mState.setEnterpriseField(i, value);
}
}
Spinner spinner = mClientCertSpinner;
int index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = (String)spinner.getSelectedItem();
- value = mCertTool.getUserCertificate(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.CLIENT_CERT,
- BLOB_HEADER + value);
- }
- value = mCertTool.getUserPrivateKey(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.PRIVATE_KEY,
- BLOB_HEADER + value);
- }
+ String key = (String) spinner.getSelectedItem();
+ mState.setEnterpriseField(AccessPointState.CLIENT_CERT,
+ KEYSTORE_HEADER + Credentials.USER_CERTIFICATE + key);
+ mState.setEnterpriseField(AccessPointState.PRIVATE_KEY,
+ KEYSTORE_HEADER + Credentials.USER_PRIVATE_KEY + key);
}
spinner = mCaCertSpinner;
index = spinner.getSelectedItemPosition();
if (index != (spinner.getCount() - 1)) {
- String key = (String)spinner.getSelectedItem();
- value = mCertTool.getCaCertificate(key);
- if (!TextUtils.isEmpty(value)) {
- mState.setEnterpriseField(AccessPointState.CA_CERT,
- BLOB_HEADER + value);
- }
- }
- switch (securityType) {
- case SECURITY_IEEE8021X:
- case SECURITY_WPA_EAP: {
- if (securityType == SECURITY_WPA_EAP) {
- mState.setSecurity(AccessPointState.WPA_EAP);
- } else {
- mState.setSecurity(AccessPointState.IEEE8021X);
- }
- mState.setEap(mEapSpinner.getSelectedItemPosition());
- mState.setPhase2((String)mPhase2Spinner.getSelectedItem());
- break;
- }
- default:
- mState.setSecurity(AccessPointState.OPEN);
+ String key = (String) spinner.getSelectedItem();
+ mState.setEnterpriseField(AccessPointState.CA_CERT,
+ KEYSTORE_HEADER + Credentials.CA_CERTIFICATE + key);
}
+ mState.setSecurity(AccessPointState.EAP);
+ mState.setEap(mEapSpinner.getSelectedItemPosition());
+ mState.setPhase2((String) mPhase2Spinner.getSelectedItem());
}
/**
@@ -785,24 +747,21 @@ public class AccessPointDialog extends AlertDialog implements DialogInterface.On
setWepVisible(false);
setGenericPasswordVisible(mState.hasSecurity());
// Shows the generic 'wireless password'
- updatePasswordCaption(AccessPointState.WPA);
+ updatePasswordCaption(AccessPointState.PSK);
break;
}
-
- case SECURITY_WPA_PERSONAL:
- case SECURITY_WPA2_PERSONAL: {
+
+ case SECURITY_PSK: {
setWepVisible(false);
setGenericPasswordVisible(true);
// Both WPA and WPA2 show the same caption, so either is ok
- updatePasswordCaption(AccessPointState.WPA);
+ updatePasswordCaption(AccessPointState.PSK);
break;
}
- case SECURITY_WPA_EAP:
- case SECURITY_IEEE8021X: {
+ case SECURITY_EAP: {
// Unlock the keystore if it is not unlocked yet.
- if (Keystore.getInstance().getState() != Keystore.UNLOCKED) {
- getContext().startActivity(new Intent(
- SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ if (mKeyStore.test() != KeyStore.NO_ERROR) {
+ Credentials.getInstance().unlock(getContext());
return;
}
enableEnterpriseFields();
diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
index 10e09475e0d..6dd5492ec0b 100644
--- a/src/com/android/settings/wifi/AccessPointPreference.java
+++ b/src/com/android/settings/wifi/AccessPointPreference.java
@@ -33,14 +33,11 @@ public class AccessPointPreference extends Preference implements
// Signal strength indicator
private static final int UI_SIGNAL_LEVELS = 4;
- private WifiSettings mWifiSettings;
-
private AccessPointState mState;
public AccessPointPreference(WifiSettings wifiSettings, AccessPointState state) {
super(wifiSettings, null);
- mWifiSettings = wifiSettings;
mState = state;
setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
diff --git a/src/com/android/settings/wifi/AccessPointState.java b/src/com/android/settings/wifi/AccessPointState.java
index 899c3047a5f..5aefa557b27 100644
--- a/src/com/android/settings/wifi/AccessPointState.java
+++ b/src/com/android/settings/wifi/AccessPointState.java
@@ -38,15 +38,11 @@ public final class AccessPointState implements Comparable, Par
private static final String TAG = "AccessPointState";
// Constants used for different security types
- public static final String WPA2 = "WPA2";
- public static final String WPA = "WPA";
+ public static final String PSK = "PSK";
public static final String WEP = "WEP";
+ public static final String EAP = "EAP";
public static final String OPEN = "Open";
- /* For EAP Enterprise fields */
- public static final String WPA_EAP = "WPA-EAP";
- public static final String IEEE8021X = "IEEE8021X";
-
public static final String[] EAP_METHOD = { "PEAP", "TLS", "TTLS" };
/** String present in capabilities if the scan result is ad-hoc */
@@ -103,11 +99,10 @@ public final class AccessPointState implements Comparable, Par
/* Enterprise Fields */
public static final int IDENTITY = 0;
public static final int ANONYMOUS_IDENTITY = 1;
- public static final int PRIVATE_KEY_PASSWD = 2;
- public static final int CLIENT_CERT = 3;
- public static final int CA_CERT = 4;
- public static final int PRIVATE_KEY = 5;
- public static final int MAX_ENTRPRISE_FIELD = 6;
+ public static final int CLIENT_CERT = 2;
+ public static final int CA_CERT = 3;
+ public static final int PRIVATE_KEY = 4;
+ public static final int MAX_ENTRPRISE_FIELD = 5;
private String mEnterpriseFields[] = new String[MAX_ENTRPRISE_FIELD];
private String mEap;
private String mPhase2;
@@ -278,8 +273,7 @@ public final class AccessPointState implements Comparable, Par
}
public boolean isEnterprise() {
- return (WPA_EAP.equals(security) ||
- AccessPointState.IEEE8021X.equals(security));
+ return (AccessPointState.EAP.equals(security));
}
public void setSecurity(String security) {
@@ -296,10 +290,8 @@ public final class AccessPointState implements Comparable, Par
public String getHumanReadableSecurity() {
if (security.equals(OPEN)) return mContext.getString(R.string.wifi_security_open);
else if (security.equals(WEP)) return mContext.getString(R.string.wifi_security_wep);
- else if (security.equals(WPA)) return mContext.getString(R.string.wifi_security_wpa);
- else if (security.equals(WPA2)) return mContext.getString(R.string.wifi_security_wpa2);
- else if (security.equals(WPA_EAP)) return mContext.getString(R.string.wifi_security_wpa_eap);
- else if (security.equals(IEEE8021X)) return mContext.getString(R.string.wifi_security_ieee8021x);
+ else if (security.equals(PSK)) return mContext.getString(R.string.wifi_security_psk);
+ else if (security.equals(EAP)) return mContext.getString(R.string.wifi_security_eap);
return mContext.getString(R.string.wifi_security_unknown);
}
@@ -325,7 +317,7 @@ public final class AccessPointState implements Comparable, Par
*/
public static String getScanResultSecurity(ScanResult scanResult) {
final String cap = scanResult.capabilities;
- final String[] securityModes = { WEP, WPA, WPA2, WPA_EAP, IEEE8021X };
+ final String[] securityModes = { WEP, PSK, EAP };
for (int i = securityModes.length - 1; i >= 0; i--) {
if (cap.contains(securityModes[i])) {
return securityModes[i];
@@ -427,31 +419,14 @@ public final class AccessPointState implements Comparable, Par
* @return The security of a given {@link WifiConfiguration}.
*/
public static String getWifiConfigurationSecurity(WifiConfiguration wifiConfig) {
-
- if (wifiConfig.allowedKeyManagement.get(KeyMgmt.NONE)) {
- // If we never set group ciphers, wpa_supplicant puts all of them.
- // For open, we don't set group ciphers.
- // For WEP, we specifically only set WEP40 and WEP104, so CCMP
- // and TKIP should not be there.
- if (!wifiConfig.allowedGroupCiphers.get(GroupCipher.CCMP)
- && (wifiConfig.allowedGroupCiphers.get(GroupCipher.WEP40)
- || wifiConfig.allowedGroupCiphers.get(GroupCipher.WEP104))) {
- return WEP;
- } else {
- return OPEN;
- }
- } else if (wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
- return WPA_EAP;
- } else if (wifiConfig.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
- return IEEE8021X;
- } else if (wifiConfig.allowedProtocols.get(Protocol.RSN)) {
- return WPA2;
- } else if (wifiConfig.allowedProtocols.get(Protocol.WPA)) {
- return WPA;
- } else {
- Log.w(TAG, "Unknown security type from WifiConfiguration, falling back on open.");
- return OPEN;
+ if (!TextUtils.isEmpty(wifiConfig.eap.value())) {
+ return EAP;
+ } else if (!TextUtils.isEmpty(wifiConfig.preSharedKey)) {
+ return PSK;
+ } else if (!TextUtils.isEmpty(wifiConfig.wepKeys[0])) {
+ return WEP;
}
+ return OPEN;
}
public void updateFromWifiInfo(WifiInfo wifiInfo, NetworkInfo.DetailedState state) {
@@ -504,48 +479,42 @@ public final class AccessPointState implements Comparable, Par
config.priority = priority;
config.hiddenSSID = hiddenSsid;
config.SSID = convertToQuotedString(ssid);
- config.eap = mEap;
+ config.eap.setValue(mEap);
if (!TextUtils.isEmpty(mPhase2)) {
- config.phase2 = convertToQuotedString("auth=" + mPhase2);
+ config.phase2.setValue(convertToQuotedString("auth=" + mPhase2));
} else {
- config.phase2 = null;
+ config.phase2.setValue(null);
}
if (!TextUtils.isEmpty(mEnterpriseFields[IDENTITY])) {
- config.identity =
- convertToQuotedString(mEnterpriseFields[IDENTITY]);
+ config.identity.setValue(
+ convertToQuotedString(mEnterpriseFields[IDENTITY]));
} else {
- config.identity = null;
+ config.identity.setValue(null);
}
if (!TextUtils.isEmpty(mEnterpriseFields[ANONYMOUS_IDENTITY])) {
- config.anonymousIdentity = convertToQuotedString(
- mEnterpriseFields[ANONYMOUS_IDENTITY]);
+ config.anonymous_identity.setValue(convertToQuotedString(
+ mEnterpriseFields[ANONYMOUS_IDENTITY]));
} else {
- config.anonymousIdentity = null;
+ config.anonymous_identity.setValue(null);
}
if (!TextUtils.isEmpty(mEnterpriseFields[CLIENT_CERT])) {
- config.clientCert = convertToQuotedString(
- mEnterpriseFields[CLIENT_CERT]);
+ config.client_cert.setValue(convertToQuotedString(
+ mEnterpriseFields[CLIENT_CERT]));
} else {
- config.clientCert = null;
+ config.client_cert.setValue(null);
}
if (!TextUtils.isEmpty(mEnterpriseFields[CA_CERT])) {
- config.caCert = convertToQuotedString(
- mEnterpriseFields[CA_CERT]);
+ config.ca_cert.setValue(convertToQuotedString(
+ mEnterpriseFields[CA_CERT]));
} else {
- config.caCert = null;
+ config.ca_cert.setValue(null);
}
if (!TextUtils.isEmpty(mEnterpriseFields[PRIVATE_KEY])) {
- config.privateKey = convertToQuotedString(
- mEnterpriseFields[PRIVATE_KEY]);
+ config.private_key.setValue(convertToQuotedString(
+ mEnterpriseFields[PRIVATE_KEY]));
} else {
- config.privateKey = null;
- }
- if (!TextUtils.isEmpty(mEnterpriseFields[PRIVATE_KEY_PASSWD])) {
- config.privateKeyPasswd = convertToQuotedString(
- mEnterpriseFields[PRIVATE_KEY_PASSWD]);
- } else {
- config.privateKeyPasswd = null;
+ config.private_key.setValue(null);
}
setupSecurity(config);
}
@@ -563,7 +532,6 @@ public final class AccessPointState implements Comparable, Par
}
if (security.equals(WEP)) {
-
// If password is empty, it should be left untouched
if (!TextUtils.isEmpty(mPassword)) {
if (mWepPasswordType == WEP_PASSWORD_AUTO) {
@@ -578,28 +546,11 @@ public final class AccessPointState implements Comparable, Par
: mPassword;
}
}
-
- config.wepTxKeyIndex = 0;
-
config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
config.allowedAuthAlgorithms.set(AuthAlgorithm.SHARED);
-
config.allowedKeyManagement.set(KeyMgmt.NONE);
-
- config.allowedGroupCiphers.set(GroupCipher.WEP40);
- config.allowedGroupCiphers.set(GroupCipher.WEP104);
-
- } else if (security.equals(WPA) || security.equals(WPA2)){
- config.allowedGroupCiphers.set(GroupCipher.TKIP);
- config.allowedGroupCiphers.set(GroupCipher.CCMP);
-
- config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
-
- config.allowedPairwiseCiphers.set(PairwiseCipher.CCMP);
- config.allowedPairwiseCiphers.set(PairwiseCipher.TKIP);
-
- config.allowedProtocols.set(security.equals(WPA2) ? Protocol.RSN : Protocol.WPA);
-
+ config.wepTxKeyIndex = 0;
+ } else if (security.equals(PSK)){
// If password is empty, it should be left untouched
if (!TextUtils.isEmpty(mPassword)) {
if (mPassword.length() == 64 && isHex(mPassword)) {
@@ -610,20 +561,14 @@ public final class AccessPointState implements Comparable, Par
config.preSharedKey = convertToQuotedString(mPassword);
}
}
-
+ } else if (security.equals(EAP)) {
+ config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
+ config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
+ if (!TextUtils.isEmpty(mPassword)) {
+ config.password.setValue(convertToQuotedString(mPassword));
+ }
} else if (security.equals(OPEN)) {
config.allowedKeyManagement.set(KeyMgmt.NONE);
- } else if (security.equals(WPA_EAP) || security.equals(IEEE8021X)) {
- config.allowedGroupCiphers.set(GroupCipher.TKIP);
- config.allowedGroupCiphers.set(GroupCipher.CCMP);
- if (security.equals(WPA_EAP)) {
- config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
- } else {
- config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
- }
- if (!TextUtils.isEmpty(mPassword)) {
- config.password = convertToQuotedString(mPassword);
- }
}
}
@@ -825,16 +770,10 @@ public final class AccessPointState implements Comparable, Par
private String getVerboseSecurity() {
if (WEP.equals(security)) {
return mContext.getString(R.string.wifi_security_verbose_wep);
- } else if (WPA.equals(security)) {
- return mContext.getString(R.string.wifi_security_verbose_wpa);
- } else if (WPA2.equals(security)) {
- return mContext.getString(R.string.wifi_security_verbose_wpa2);
- } else if (OPEN.equals(security)) {
- return mContext.getString(R.string.wifi_security_verbose_open);
- } else if (WPA_EAP.equals(security)) {
- return mContext.getString(R.string.wifi_security_verbose_wpa_eap);
- } else if (IEEE8021X.equals(security)) {
- return mContext.getString(R.string.wifi_security_verbose_ieee8021x);
+ } else if (PSK.equals(security)) {
+ return mContext.getString(R.string.wifi_security_verbose_psk);
+ } else if (EAP.equals(security)) {
+ return mContext.getString(R.string.wifi_security_verbose_eap);
} else {
return null;
}
diff --git a/src/com/android/settings/wifi/AdvancedSettings.java b/src/com/android/settings/wifi/AdvancedSettings.java
index 323d5c77095..5906e70c2c4 100644
--- a/src/com/android/settings/wifi/AdvancedSettings.java
+++ b/src/com/android/settings/wifi/AdvancedSettings.java
@@ -64,11 +64,19 @@ public class AdvancedSettings extends PreferenceActivity
addPreferencesFromResource(R.xml.wifi_advanced_settings);
mUseStaticIpCheckBox = (CheckBoxPreference) findPreference(KEY_USE_STATIC_IP);
+ mUseStaticIpCheckBox.setOnPreferenceChangeListener(this);
for (int i = 0; i < mPreferenceKeys.length; i++) {
Preference preference = findPreference(mPreferenceKeys[i]);
preference.setOnPreferenceChangeListener(this);
}
+
+ /*
+ * Fix the Run-time IllegalStateException that ListPreference requires an entries
+ * array and an entryValues array, this exception occurs when user open/close the
+ * slider in the Regulatory domain dialog.
+ */
+ initNumChannelsPreference();
}
@Override
@@ -141,7 +149,7 @@ public class AdvancedSettings extends PreferenceActivity
try {
int numChannels = Integer.parseInt((String) newValue);
WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
- if (!wifiManager.setNumAllowedChannels(numChannels)) {
+ if (!wifiManager.setNumAllowedChannels(numChannels, true)) {
Toast.makeText(this, R.string.wifi_setting_num_channels_error,
Toast.LENGTH_SHORT).show();
}
@@ -160,7 +168,16 @@ public class AdvancedSettings extends PreferenceActivity
Toast.LENGTH_SHORT).show();
return false;
}
-
+
+ } else if (key.equals(KEY_USE_STATIC_IP)) {
+ boolean value = ((Boolean) newValue).booleanValue();
+
+ try {
+ Settings.System.putInt(getContentResolver(),
+ Settings.System.WIFI_USE_STATIC_IP, value ? 1 : 0);
+ } catch (NumberFormatException e) {
+ return false;
+ }
} else {
String value = (String) newValue;
@@ -170,6 +187,12 @@ public class AdvancedSettings extends PreferenceActivity
}
preference.setSummary(value);
+ for (int i = 0; i < mSettingNames.length; i++) {
+ if (key.equals(mPreferenceKeys[i])) {
+ Settings.System.putString(getContentResolver(), mSettingNames[i], value);
+ break;
+ }
+ }
}
return true;
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index 88cfe06b7de..10a672b5f57 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -23,6 +23,7 @@ import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING;
import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN;
import com.android.settings.R;
+import com.android.settings.AirplaneModeEnabler;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -32,6 +33,7 @@ import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.preference.Preference;
import android.preference.CheckBoxPreference;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.Config;
import android.util.Log;
@@ -121,7 +123,7 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener {
mWifiCheckBoxPref
.setSummary(wifiState == WIFI_STATE_DISABLED ? mOriginalSummary : null);
- mWifiCheckBoxPref.setEnabled(isEnabledByDependency());
+ mWifiCheckBoxPref.setEnabled(isWifiAllowed(mContext));
} else if (wifiState == WIFI_STATE_DISABLING || wifiState == WIFI_STATE_ENABLING) {
mWifiCheckBoxPref.setSummary(wifiState == WIFI_STATE_ENABLING ? R.string.wifi_starting
@@ -151,24 +153,23 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener {
}
}
- private boolean isEnabledByDependency() {
- Preference dep = getDependencyPreference();
- if (dep == null) {
+ private static boolean isWifiAllowed(Context context) {
+ // allowed if we are not in airplane mode
+ if (!AirplaneModeEnabler.isAirplaneModeOn(context)) {
return true;
}
-
- return !dep.shouldDisableDependents();
- }
-
- private Preference getDependencyPreference() {
- String depKey = mWifiCheckBoxPref.getDependency();
- if (TextUtils.isEmpty(depKey)) {
- return null;
+ // allowed if wifi is not in AIRPLANE_MODE_RADIOS
+ String radios = Settings.System.getString(context.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_RADIOS);
+ if (radios == null || !radios.contains(Settings.System.RADIO_WIFI)) {
+ return true;
}
-
- return mWifiCheckBoxPref.getPreferenceManager().findPreference(depKey);
+ // allowed if wifi is in AIRPLANE_MODE_TOGGLEABLE_RADIOS
+ radios = Settings.System.getString(context.getContentResolver(),
+ Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+ return (radios != null && radios.contains(Settings.System.RADIO_WIFI));
}
-
+
private static String getHumanReadableWifiState(int wifiState) {
switch (wifiState) {
case WIFI_STATE_DISABLED:
diff --git a/src/com/android/settings/wifi/WifiLayer.java b/src/com/android/settings/wifi/WifiLayer.java
index 5d896aaec2c..ce518e1d2a6 100644
--- a/src/com/android/settings/wifi/WifiLayer.java
+++ b/src/com/android/settings/wifi/WifiLayer.java
@@ -774,7 +774,9 @@ public class WifiLayer {
* We pass null for security since we have a network ID (i.e., it's
* not a wildcard), and rely on it matching.
*/
- return findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), ssid, null);
+ synchronized (this) {
+ return findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), ssid, null);
+ }
} else {
return null;
}
@@ -1013,8 +1015,10 @@ public class WifiLayer {
* We pass null for security since we have a network ID (i.e., it's
* not a wildcard), and rely on it matching.
*/
- ap = findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), wifiInfo
- .getSSID(), null);
+ synchronized (this) {
+ ap = findApLocked(wifiInfo.getNetworkId(), wifiInfo.getBSSID(), wifiInfo
+ .getSSID(), null);
+ }
}
if (ap != null) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index f18992a578a..cac77e3251f 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -18,7 +18,6 @@ package com.android.settings.wifi;
import com.android.settings.ProgressCategory;
import com.android.settings.R;
-import com.android.settings.SecuritySettings;
import android.app.Dialog;
import android.content.DialogInterface;
@@ -30,7 +29,8 @@ import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.preference.CheckBoxPreference;
import android.provider.Settings;
-import android.security.Keystore;
+import android.security.Credentials;
+import android.security.KeyStore;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
@@ -51,11 +51,11 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
DialogInterface.OnDismissListener {
private static final String TAG = "WifiSettings";
-
+
//============================
// Preference/activity member variables
//============================
-
+
private static final String INSTANCE_KEY_DIALOG_BUNDLE =
"com.android.settings.wifi.WifiSettings:dialogBundle";
/*
@@ -64,42 +64,44 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
* dialog management only creates once.
*/
private Dialog mDialog;
-
+
+ private static final String KEY_ONLY_ACCESS_POINTS = "only_access_points";
private static final String KEY_ADD_OTHER_NETWORK = "add_other_network";
private static final int CONTEXT_MENU_ID_CONNECT = Menu.FIRST;
private static final int CONTEXT_MENU_ID_FORGET = Menu.FIRST + 1;
private static final int CONTEXT_MENU_ID_CHANGE_PASSWORD = Menu.FIRST + 2;
- 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_SCAN = Menu.FIRST;
+ private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
+
private static final String KEY_WIFI_ENABLED = "wifi_enabled";
private static final String KEY_OPEN_NETWORK_NOTIFICATIONS_ENABLED =
"open_network_notifications_enabled";
private static final String KEY_ACCESS_POINTS = "access_points";
-
+
private ProgressCategory mApCategory;
private CheckBoxPreference mWifiEnabled;
private WifiEnabler mWifiEnabler;
- private CheckBoxPreference mOpenNetworkNotificationsEnabled;
+ private CheckBoxPreference mOpenNetworkNotificationsEnabled;
private Preference mAddOtherNetwork;
-
+
private WeakHashMap mAps;
+ private KeyStore mKeyStore = KeyStore.getInstance();
private AccessPointState mResumeState = null;
private int mResumeMode;
-
+
//============================
// Wifi member variables
//============================
-
+
private WifiLayer mWifiLayer;
-
+
//============================
// Activity lifecycle
//============================
-
+
public WifiSettings() {
mAps = new WeakHashMap();
mWifiLayer = new WifiLayer(this, this);
@@ -115,15 +117,23 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
onCreatedWifi();
mWifiLayer.onCreatedCallback();
}
-
+
+ private int getPreferenceResource() {
+ if (getIntent().getBooleanExtra(KEY_ONLY_ACCESS_POINTS, false)) {
+ return R.xml.wifi_access_points;
+ } else {
+ return R.xml.wifi_settings;
+ }
+ }
+
/**
* Shouldn't have any dependency on the wifi layer.
*/
private void onCreatePreferences() {
- addPreferencesFromResource(R.xml.wifi_settings);
-
+ addPreferencesFromResource(getPreferenceResource());
+
final PreferenceScreen preferenceScreen = getPreferenceScreen();
-
+
mApCategory = (ProgressCategory) preferenceScreen.findPreference(KEY_ACCESS_POINTS);
// We don't want the ordering to be the order preferences are added,
// instead we want*:
@@ -132,39 +142,43 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
// 3) preferred, APs out of range
// * this ordering logic is in AccessPointPreference's compareTo
mApCategory.setOrderingAsAdded(false);
-
- mWifiEnabled = (CheckBoxPreference) preferenceScreen.findPreference(KEY_WIFI_ENABLED);
- mWifiEnabler = new WifiEnabler(this, (WifiManager) getSystemService(WIFI_SERVICE),
- mWifiEnabled);
-
- mOpenNetworkNotificationsEnabled = (CheckBoxPreference) preferenceScreen
- .findPreference(KEY_OPEN_NETWORK_NOTIFICATIONS_ENABLED);
- mOpenNetworkNotificationsEnabled.setChecked(Settings.Secure.getInt(getContentResolver(),
- Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
-
+
+ if (!getIntent().getBooleanExtra(KEY_ONLY_ACCESS_POINTS, false)) {
+ mWifiEnabled = (CheckBoxPreference) preferenceScreen.findPreference(KEY_WIFI_ENABLED);
+ mWifiEnabler = new WifiEnabler(this, (WifiManager) getSystemService(WIFI_SERVICE),
+ mWifiEnabled);
+
+ mOpenNetworkNotificationsEnabled = (CheckBoxPreference) preferenceScreen
+ .findPreference(KEY_OPEN_NETWORK_NOTIFICATIONS_ENABLED);
+ mOpenNetworkNotificationsEnabled.setChecked(Settings.Secure.getInt(getContentResolver(),
+ Settings.Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1);
+ }
+
mAddOtherNetwork = preferenceScreen.findPreference(KEY_ADD_OTHER_NETWORK);
-
+
registerForContextMenu(getListView());
}
private void onCreatedWifi() {
}
-
+
@Override
protected void onResume() {
super.onResume();
mWifiLayer.onResume();
- mWifiEnabler.resume();
+ if (mWifiEnabler != null) {
+ mWifiEnabler.resume();
+ }
// do what we should have after keystore is unlocked.
if (mResumeState != null) {
- if (Keystore.getInstance().getState() == Keystore.UNLOCKED) {
+ if (mKeyStore.test() == KeyStore.NO_ERROR) {
showAccessPointDialog(mResumeState, mResumeMode);
}
mResumeMode = -1;
mResumeState = null;
} else {
if (mResumeMode == AccessPointDialog.MODE_CONFIGURE) {
- if (Keystore.getInstance().getState() == Keystore.UNLOCKED) {
+ if (mKeyStore.test() == KeyStore.NO_ERROR) {
((AccessPointDialog) mDialog).enableEnterpriseFields();
}
}
@@ -175,13 +189,15 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
protected void onPause() {
super.onPause();
mWifiLayer.onPause();
- mWifiEnabler.pause();
+ if (mWifiEnabler != null) {
+ mWifiEnabler.pause();
+ }
}
@Override
protected void onDestroy() {
super.onDestroy();
-
+
if (mDialog != null) {
mDialog.dismiss();
}
@@ -190,31 +206,31 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
-
+
menu.add(0, MENU_ID_SCAN, 0, R.string.scan_wifi)
.setIcon(R.drawable.ic_menu_scan_network);
-
+
menu.add(0, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced)
.setIcon(android.R.drawable.ic_menu_manage);
-
+
return true;
}
-
+
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
-
+
switch (item.getItemId()) {
case MENU_ID_SCAN:
mWifiLayer.attemptScan();
return true;
-
+
case MENU_ID_ADVANCED:
Intent intent = new Intent(this, AdvancedSettings.class);
startActivity(intent);
return true;
-
+
default:
return false;
}
@@ -223,7 +239,7 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
-
+
if (mDialog != null) {
Bundle dialogBundle = mDialog.onSaveInstanceState();
outState.putBundle(INSTANCE_KEY_DIALOG_BUNDLE, dialogBundle);
@@ -233,7 +249,7 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
-
+
Bundle dialogBundle = state.getBundle(INSTANCE_KEY_DIALOG_BUNDLE);
if (dialogBundle != null) {
mDialog = new AccessPointDialog(this, mWifiLayer);
@@ -255,21 +271,21 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
-
+
AccessPointState state = getStateFromMenuInfo(menuInfo);
if (state == null) {
return;
}
-
+
menu.setHeaderTitle(state.getHumanReadableSsid());
-
+
if (state.isConnectable()) {
menu.add(0, CONTEXT_MENU_ID_CONNECT, 0, R.string.wifi_context_menu_connect);
}
-
+
if (state.isForgetable()) {
menu.add(0, CONTEXT_MENU_ID_FORGET, 1, R.string.wifi_context_menu_forget);
-
+
if (state.hasPassword()) {
menu.add(0, CONTEXT_MENU_ID_CHANGE_PASSWORD, 2,
R.string.wifi_context_menu_change_password);
@@ -286,19 +302,19 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
}
switch (item.getItemId()) {
-
+
case CONTEXT_MENU_ID_CONNECT:
connectToNetwork(state);
return true;
-
+
case CONTEXT_MENU_ID_FORGET:
mWifiLayer.forgetNetwork(state);
return true;
-
+
case CONTEXT_MENU_ID_CHANGE_PASSWORD:
showAccessPointDialog(state, AccessPointDialog.MODE_CONFIGURE);
return true;
-
+
default:
return false;
}
@@ -316,12 +332,12 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
mWifiLayer.connectToNetwork(state);
}
}
-
+
private AccessPointState getStateFromMenuInfo(ContextMenuInfo menuInfo) {
if ((menuInfo == null) || !(menuInfo instanceof AdapterContextMenuInfo)) {
return null;
}
-
+
AdapterContextMenuInfo adapterMenuInfo = (AdapterContextMenuInfo) menuInfo;
Preference pref = (Preference) getPreferenceScreen().getRootAdapter().getItem(
adapterMenuInfo.position);
@@ -331,11 +347,11 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
return ((AccessPointPreference) pref).getAccessPointState();
}
-
+
//============================
// Preference callbacks
//============================
-
+
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -350,10 +366,10 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
AccessPointState state = ((AccessPointPreference) preference).getAccessPointState();
showAccessPointDialog(state, AccessPointDialog.MODE_INFO);
}
-
+
return false;
}
-
+
//============================
// Wifi-related
//============================
@@ -371,12 +387,10 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
mResumeMode = AccessPointDialog.MODE_CONFIGURE;
showDialog(dialog);
}
-
+
public void showAccessPointDialog(AccessPointState state, int mode) {
- if (state.isEnterprise() &&
- Keystore.getInstance().getState() != Keystore.UNLOCKED) {
- startActivity(new Intent(
- SecuritySettings.ACTION_UNLOCK_CREDENTIAL_STORAGE));
+ if (state.isEnterprise() && mKeyStore.test() != KeyStore.NO_ERROR) {
+ Credentials.getInstance().unlock(this);
mResumeState = state;
mResumeMode = mode;
return;
@@ -392,14 +406,14 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
if (mDialog != null) {
mDialog.dismiss();
}
-
+
mDialog = dialog;
- dialog.setOnDismissListener(this);
if (dialog != null) {
+ dialog.setOnDismissListener(this);
dialog.show();
}
}
-
+
//============================
// Wifi callbacks
//============================
@@ -410,36 +424,36 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
public void onScanningStatusChanged(boolean started) {
mApCategory.setProgress(started);
- }
+ }
public void onAccessPointSetChanged(AccessPointState ap, boolean added) {
AccessPointPreference pref = mAps.get(ap);
-
+
if (WifiLayer.LOGV) {
Log.v(TAG, "onAccessPointSetChanged with " + ap + " and "
+ (added ? "added" : "removed") + ", found pref " + pref);
}
-
+
if (added) {
-
+
if (pref == null) {
pref = new AccessPointPreference(this, ap);
mAps.put(ap, pref);
} else {
pref.setEnabled(true);
}
-
+
mApCategory.addPreference(pref);
-
+
} else {
mAps.remove(ap);
-
+
if (pref != null) {
mApCategory.removePreference(pref);
}
-
+
}
}
@@ -460,8 +474,8 @@ public class WifiSettings extends PreferenceActivity implements WifiLayer.Callba
// If we're already showing a dialog, ignore this request
return;
}
-
+
showAccessPointDialog(ap, AccessPointDialog.MODE_RETRY_PASSWORD);
}
-
+
}
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index cf2e03c0548..8a0ce218230 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -4,9 +4,9 @@
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.
@@ -17,8 +17,18 @@
+
+
+
+
+
+
+
+
+
-
+
diff --git a/tests/res/layout/bluetooth_request_permission_test.xml b/tests/res/layout/bluetooth_request_permission_test.xml
new file mode 100644
index 00000000000..8bb0daa7dac
--- /dev/null
+++ b/tests/res/layout/bluetooth_request_permission_test.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/res/values/strings.xml b/tests/res/values/strings.xml
new file mode 100644
index 00000000000..b06782feed9
--- /dev/null
+++ b/tests/res/values/strings.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+ Enable
+ Discoverable
+
diff --git a/tests/src/com/android/settings/tests/BluetoothRequestPermissionTest.java b/tests/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
new file mode 100644
index 00000000000..105c98e8ade
--- /dev/null
+++ b/tests/src/com/android/settings/tests/BluetoothRequestPermissionTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2009 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.tests;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+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.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+
+public class BluetoothRequestPermissionTest extends Activity {
+ private static final String TAG = "BluetoothRequestPermissionTest";
+
+ private ArrayAdapter mMsgAdapter;
+
+ private class BtOnClickListener implements OnClickListener {
+ final boolean mEnableOnly; // enable or enable + discoverable
+
+ public BtOnClickListener(boolean enableOnly) {
+ mEnableOnly = enableOnly;
+ }
+
+ public void onClick(View v) {
+ requestPermission(mEnableOnly);
+ }
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ setContentView(R.layout.bluetooth_request_permission_test);
+
+ Button enable = (Button) findViewById(R.id.enable);
+ enable.setOnClickListener(new BtOnClickListener(true /* enable */));
+
+ Button discover = (Button) findViewById(R.id.discover);
+ discover.setOnClickListener(new BtOnClickListener(false /* enable & discoverable */));
+
+ mMsgAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
+
+ ListView listView = (ListView) findViewById(R.id.msg_container);
+ listView.setAdapter(mMsgAdapter);
+
+ registerReceiver(mReceiver, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
+ addMsg("Initialized");
+ }
+
+ void requestPermission(boolean enableOnly) {
+ Intent i = new Intent();
+ if (enableOnly) {
+ addMsg("Starting activity to enable bt");
+ i.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+ } else {
+ addMsg("Starting activity to enable bt + discovery");
+ i.setAction(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
+ i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 20);
+ }
+ startActivityForResult(i, 1);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode != 1) {
+ Log.e(TAG, "Unexpected onActivityResult " + requestCode + " " + resultCode);
+ return;
+ }
+
+ if (resultCode == Activity.RESULT_CANCELED) {
+ addMsg("Result = RESULT_CANCELED");
+ } else if (resultCode == Activity.RESULT_OK) {
+ addMsg("Result = RESULT_OK (not expected for discovery)");
+ } else {
+ addMsg("Result = " + resultCode);
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ unregisterReceiver(mReceiver);
+ }
+
+ private void addMsg(String msg) {
+ mMsgAdapter.add(msg);
+ Log.d(TAG, "msg");
+ }
+
+ private BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent == null)
+ return;
+ if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) {
+ String stateStr = "???";
+ switch (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothDevice.ERROR)) {
+ case BluetoothAdapter.STATE_OFF:
+ stateStr = "off";
+ break;
+ case BluetoothAdapter.STATE_TURNING_ON:
+ stateStr = "turning on";
+ break;
+ case BluetoothAdapter.STATE_ON:
+ stateStr = "on";
+ break;
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ stateStr = "turning off";
+ break;
+ }
+ addMsg("Bluetooth status = " + stateStr);
+ }
+ }
+ };
+}