Merge "Wifi: Update message when scan result is empty"
diff --git a/res/layout/data_usage_header.xml b/res/layout/data_usage_header.xml
index aa2beb2..a7b12b7 100644
--- a/res/layout/data_usage_header.xml
+++ b/res/layout/data_usage_header.xml
@@ -45,17 +45,6 @@
         android:paddingRight="@*android:dimen/preference_item_padding_side"
         android:paddingTop="8dip"
         android:paddingBottom="8dip"
-        android:singleLine="true"
-        android:ellipsize="marquee"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
-
-    <TextView
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:paddingLeft="@*android:dimen/preference_item_padding_side"
-        android:paddingRight="@*android:dimen/preference_item_padding_side"
-        android:paddingBottom="8dip"
-        android:text="@string/data_usage_disclaimer"
         android:textAppearance="?android:attr/textAppearanceSmall" />
 
     <TextView
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 01592c8..f447487 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -1551,7 +1551,7 @@
     <string name="data_usage_received_sent" msgid="5039699009276621757">"<xliff:g id="RECEIVED">%1$s</xliff:g> ontvang, <xliff:g id="SENT">%2$s</xliff:g> gestuur"</string>
     <string name="data_usage_total_during_range" msgid="441648308264260691">"<xliff:g id="RANGE">%2$s</xliff:g> : ongeveer <xliff:g id="TOTAL">%1$s</xliff:g> gebruik"</string>
     <string name="data_usage_metered_title" msgid="7521278446526606838">"Duur netwerke"</string>
-    <string name="data_usage_metered_body" msgid="1805251707096571387">"Kies die netwerke wie se datagebruik duur is. Programme se gebruik van hierdie netwerke kan beperk word as in die agtergrond is. Programme kan ook waarsku voordat hierdie netwerke vir groot aflaaisels gebruik word."</string>
+    <string name="data_usage_metered_body" msgid="1805251707096571387">"Kies die netwerke wie se datagebruik duur is. Programme se gebruik van hierdie netwerke kan beperk word as hulle in die agtergrond is. Programme kan ook waarsku voordat hierdie netwerke vir groot aflaaisels gebruik word."</string>
     <string name="data_usage_metered_mobile" msgid="5423305619126978393">"Selnetwerke"</string>
     <string name="data_usage_metered_wifi" msgid="4151511616349458705">"Wi-Fi-netwerke"</string>
     <string name="cryptkeeper_emergency_call" msgid="198578731586097145">"Noodoproep"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 78d771c..d875c5f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Odpojit?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"Pokud se odpojíte, vaše spojení se zařízením <xliff:g id="PEER_NAME">%1$s</xliff:g> bude přerušeno."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"Pokud se odpojíte, bude spojení se zařízením <xliff:g id="PEER_NAME">%1$s</xliff:g> a s <xliff:g id="PEER_COUNT">%2$s</xliff:g> dalšími zařízeními přerušeno."</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Zrušit pozvánku?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Chcete zrušit pozvánku ke spojení s klientem <xliff:g id="PEER_NAME">%1$s</xliff:g>?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Přenosný hotspot Wi-Fi"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Přenosný hotspot <xliff:g id="NETWORK_SSID">%1$s</xliff:g> je aktivní"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Chyba přenosného hotspotu Wi-Fi"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 6dc14e5..146cc37 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -1183,7 +1183,7 @@
     <string name="accessibility_services_title" msgid="2592221829284342237">"Tjenester"</string>
     <string name="accessibility_system_title" msgid="7187919089874130484">"System"</string>
     <string name="accessibility_toggle_large_text_title" msgid="6618674985313017711">"Stor tekst"</string>
-    <string name="accessibility_power_button_ends_call_title" msgid="5468375366375940894">"Tænd/sluk afbryder opkald"</string>
+    <string name="accessibility_power_button_ends_call_title" msgid="5468375366375940894">"Afbryderknappen afslutter opkald"</string>
     <string name="accessibility_speak_password_title" msgid="3344423945644925355">"Indtal adgangskoder"</string>
     <string name="accessibility_touch_exploration_title" msgid="4171477646863806078">"Udforsk ved berøring"</string>
     <string name="accessibility_touch_exploration_summary" msgid="1163951209315238103">"Når Udforsk med berøring er slået til, kan du høre eller se beskrivelser af, hvad der er under din finger."\n\n"Denne funktion er til brugere med dårligt syn."</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 45c8ecb..1c40cc0 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -1630,7 +1630,7 @@
     <string name="user_information_heading" msgid="8728151075759863162">"Informations sur l\'utilisateur"</string>
     <string name="user_name_title" msgid="7563724675699398319">"Nom"</string>
     <string name="user_restrictions_heading" msgid="4426403050397418553">"Restrictions liées au contenu"</string>
-    <string name="user_market_requires_pin" msgid="3260702297207279414">"Exiger un code secret"</string>
+    <string name="user_market_requires_pin" msgid="3260702297207279414">"Exiger un code PIN"</string>
     <string name="user_max_content_rating" msgid="8297759970216482772">"Classification du contenu"</string>
     <string name="user_system_apps_heading" msgid="2408331798732183682">"Applications système"</string>
     <string name="user_market_apps_heading" msgid="4657387297168308251">"Applications installées"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 5ce743f..6ce923d 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -62,7 +62,7 @@
     <string name="small_font" msgid="2295331917424072635">"Kecil"</string>
     <string name="medium_font" msgid="2068475425515133701">"Sedang"</string>
     <string name="large_font" msgid="599055175160971446">"Besar"</string>
-    <string name="font_size_save" msgid="3450855718056759095">"OK"</string>
+    <string name="font_size_save" msgid="3450855718056759095">"Oke"</string>
     <string name="sdcard_setting" product="nosdcard" msgid="8281011784066476192">"Penyimpanan USB"</string>
     <string name="sdcard_setting" product="default" msgid="5922637503871474866">"Kartu SD"</string>
     <string name="battery_info_status_label" msgid="8109155295509700309">"Status baterai:"</string>
@@ -181,7 +181,7 @@
     <string name="proxy_hostname_label" msgid="8490171412999373362">"Nama host proksi"</string>
     <string name="proxy_hostname_hint" msgid="2076157057003936176">"proxy.example.com"</string>
     <string name="proxy_error" msgid="8926675299638611451">"Perhatian"</string>
-    <string name="proxy_error_dismiss" msgid="4993171795485460060">"OK"</string>
+    <string name="proxy_error_dismiss" msgid="4993171795485460060">"Oke"</string>
     <string name="proxy_error_invalid_host" msgid="8052095511862922213">"Nama host yang Anda ketikkan tidak valid."</string>
     <string name="proxy_error_invalid_exclusion_list" msgid="6467799485443290961">"Daftar pengecualian yang Anda ketikkan tidak diformat dengan benar. Ketikkan daftar pengecualian domain dengan dipisahkan koma."</string>
     <string name="proxy_error_empty_port" msgid="5539106187558215246">"Anda perlu melengkapi bidang port."</string>
@@ -398,7 +398,7 @@
     <item quantity="other" msgid="3952508584649046404">"Sandi paling tidak harus terdiri dari %d karakter bukan huruf."</item>
   </plurals>
     <string name="lockpassword_password_recently_used" msgid="6098087796784262081">"Administrator perangkat tidak mengizinkan penggunaan sandi terbaru."</string>
-    <string name="lockpassword_ok_label" msgid="313822574062553672">"OK"</string>
+    <string name="lockpassword_ok_label" msgid="313822574062553672">"Oke"</string>
     <string name="lockpassword_cancel_label" msgid="8818529276331121899">"Batal"</string>
     <string name="lockpattern_tutorial_cancel_label" msgid="6431583477570493261">"Batal"</string>
     <string name="lockpattern_tutorial_continue_label" msgid="3559793618653400434">"Selanjutnya"</string>
@@ -691,7 +691,7 @@
     <string name="sim_change_failed" msgid="304964924772218382">"Tidak dapat mengubah PIN."\n"PIN mungkin salah."</string>
     <string name="sim_change_succeeded" msgid="8556135413096489627">"PIN SIM berhasil diubah"</string>
     <string name="sim_lock_failed" msgid="5651596916127873626">"Tidak bisa mengubah status kunci kartu SIM."\n"PIN Mungkin salah."</string>
-    <string name="sim_enter_ok" msgid="6475946836899218919">"OK"</string>
+    <string name="sim_enter_ok" msgid="6475946836899218919">"Oke"</string>
     <string name="sim_enter_cancel" msgid="6240422158517208036">"Batal"</string>
     <string name="device_info_settings" product="tablet" msgid="1119755927536987178">"Status tablet"</string>
     <string name="device_info_settings" product="default" msgid="475872867864762157">"Status ponsel"</string>
@@ -1012,7 +1012,7 @@
     <string name="recompute_size" msgid="7722567982831691718">"Menghitung ulang ukuran..."</string>
     <string name="clear_data_dlg_title" msgid="5605258400134511197">"Hapus data apl?"</string>
     <string name="clear_data_dlg_text" msgid="8847257251846779938">"Semua data apl ini akan dihapus secara permanen, termasuk semua file, setelan, akun, basis data, dll."</string>
-    <string name="dlg_ok" msgid="2402639055725653590">"OK"</string>
+    <string name="dlg_ok" msgid="2402639055725653590">"Oke"</string>
     <string name="dlg_cancel" msgid="1674753358972975911">"Batal"</string>
     <string name="app_not_found_dlg_title" msgid="3127123411738434964"></string>
     <string name="app_not_found_dlg_text" msgid="8333723538280257243">"Apl tersebut tidak ditemukan di dalam daftar apl yang terpasang."</string>
@@ -1110,7 +1110,7 @@
     <string name="user_dict_settings_add_dialog_title" msgid="4702613990174126482">"Tambahkan ke kamus"</string>
     <string name="user_dict_settings_add_dialog_more_options" msgid="8848798370746019825">"Opsi lainnya"</string>
     <string name="user_dict_settings_add_dialog_less_options" msgid="2441785268726036101">"Sedikit opsi"</string>
-    <string name="user_dict_settings_add_dialog_confirm" msgid="6225823625332416144">"OK"</string>
+    <string name="user_dict_settings_add_dialog_confirm" msgid="6225823625332416144">"Oke"</string>
     <string name="user_dict_settings_add_word_option_name" msgid="7868879174905963135">"Kata:"</string>
     <string name="user_dict_settings_add_shortcut_option_name" msgid="660089258866063925">"Pintasan:"</string>
     <string name="user_dict_settings_add_locale_option_name" msgid="5696358317061318532">"Bahasa:"</string>
@@ -1131,7 +1131,7 @@
     <string name="quick_launch_shortcut" msgid="5090405067413522300">"Telusuri + <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g>"</string>
     <string name="quick_launch_clear_dialog_title" msgid="5546543501250320220">"Bersihkan"</string>
     <string name="quick_launch_clear_dialog_message" msgid="3921015601470260722">"Pintasan Anda untuk <xliff:g id="SHORTCUT_LETTER">%1$s</xliff:g> (<xliff:g id="APPLICATION_NAME">%2$s</xliff:g>) akan dihapus."</string>
-    <string name="quick_launch_clear_ok_button" msgid="2634568926597586716">"OK"</string>
+    <string name="quick_launch_clear_ok_button" msgid="2634568926597586716">"Oke"</string>
     <string name="quick_launch_clear_cancel_button" msgid="1892854652197747064">"Batal"</string>
     <string name="quick_launch_display_mode_applications" msgid="1734058461846126775">"Apl"</string>
     <string name="quick_launch_display_mode_shortcuts" msgid="4177934019174169042">"Pintasan"</string>
@@ -1201,7 +1201,7 @@
     <string name="accessibility_service_security_warning_summary" product="tablet" msgid="8558441850832543571">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> dapat mengumpulkan semua teks yang Anda ketik, kecuali sandi. Pengumpulan ini mencakup data pribadi seperti nomor kartu kredit. Layanan ini juga dapat mengumpulkan data tentang interaksi Anda dengan tablet."</string>
     <string name="accessibility_service_security_warning_summary" product="default" msgid="2869015914319424723">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> dapat mengumpulkan semua teks yang Anda ketik, kecuali sandi. Pengumpulan ini mencakup data pribadi seperti nomor kartu kredit. Layanan ini juga dapat mengumpulkan data tentang interaksi Anda dengan ponsel."</string>
     <string name="accessibility_service_disable_warning_title" msgid="3393956845814484859">"Hentikan <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
-    <string name="accessibility_service_disable_warning_summary" msgid="625013894287895398">"Menyentuh OK akan menghentikan <xliff:g id="SERVICE">%1$s</xliff:g>."</string>
+    <string name="accessibility_service_disable_warning_summary" msgid="625013894287895398">"Menyentuh Oke akan menghentikan <xliff:g id="SERVICE">%1$s</xliff:g>."</string>
     <string name="accessibility_no_services_installed" msgid="7200948194639038807">"Tidak ada layanan terpasang"</string>
     <string name="accessibility_service_no_apps_title" msgid="5124097563864109821">"Perlu pembaca layar?"</string>
     <string name="accessibility_service_no_apps_message" msgid="7751662416377046539">"TalkBack menyediakan masukan lisan untuk membantu pengguna yang buta dan tidak terlalu baik penglihatannya. Apakah Anda ingin memasangnya secara gratis dari Android Market?"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index abc76d4..0b0f60c 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -646,7 +646,7 @@
     <string name="sync_settings" msgid="9186125469300013491">"חשבונות וסינכרון"</string>
     <string name="search_settings" msgid="1910951467596035063">"חיפוש"</string>
     <string name="search_settings_summary" msgid="9205656546570654169">"ניהול הגדרות והיסטוריה של חיפוש"</string>
-    <string name="display_settings" msgid="7965901687241669598">",תצוגה"</string>
+    <string name="display_settings" msgid="7965901687241669598">"תצוגה"</string>
     <string name="accelerometer_title" msgid="7854608399547349157">"סיבוב אוטומטי של המסך"</string>
     <string name="accelerometer_summary_on" product="tablet" msgid="429982132339828942">"שנה כיוון באופן אוטומטי בעת סיבוב הטבלט"</string>
     <string name="accelerometer_summary_on" product="default" msgid="1133737282813048021">"שנה כיוון באופן אוטומטי בעת סיבוב הטלפון"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 60b20ef..247234f 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Putuskan sambungan?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"Jika anda menyahsambung, hubungan anda dengan <xliff:g id="PEER_NAME">%1$s</xliff:g> akan berakhir."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"Jika anda menyahsambung, sambungan anda dengan <xliff:g id="PEER_NAME">%1$s</xliff:g> dan <xliff:g id="PEER_COUNT">%2$s</xliff:g> peranti lain akan berakhir."</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Batalkan jemputan?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Adakah anda mahu membatalkan jemputan untuk berhubung dengan <xliff:g id="PEER_NAME">%1$s</xliff:g>?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Titik panas Wi-Fi mudah alih"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Titik panas mudah alih <xliff:g id="NETWORK_SSID">%1$s</xliff:g> aktif"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Ralat titik panas Wi-Fi mudah alih"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 55947a7..6530f92 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Rozłączyć?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"Po rozłączeniu Twoje połączenie z <xliff:g id="PEER_NAME">%1$s</xliff:g> zostanie zakończone."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"Po rozłączeniu Twoje połączenie z <xliff:g id="PEER_NAME">%1$s</xliff:g> i <xliff:g id="PEER_COUNT">%2$s</xliff:g> innymi urządzeniami zostanie zakończone."</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Anulować zaproszenie?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Czy chcesz anulować zaproszenie do połączenia z <xliff:g id="PEER_NAME">%1$s</xliff:g>?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Przenośny punkt Wi-Fi"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Przenośny punkt dostępu <xliff:g id="NETWORK_SSID">%1$s</xliff:g> jest aktywny"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Błąd przenośnego punktu dostępu Wi-Fi"</string>
@@ -1553,7 +1551,7 @@
     <string name="data_usage_received_sent" msgid="5039699009276621757">"Odebrano: <xliff:g id="RECEIVED">%1$s</xliff:g>, wysłano: <xliff:g id="SENT">%2$s</xliff:g>"</string>
     <string name="data_usage_total_during_range" msgid="441648308264260691">"<xliff:g id="RANGE">%2$s</xliff:g>: przesłano ok. <xliff:g id="TOTAL">%1$s</xliff:g>"</string>
     <string name="data_usage_metered_title" msgid="7521278446526606838">"Kosztowne sieci"</string>
-    <string name="data_usage_metered_body" msgid="1805251707096571387">"Wybierz sieci, w których transmisja danych jest kosztowna. Możesz ograniczyć aplikacjom działającym w tle dostęp do tych sieci. Aplikacje mogą też ostrzegać, nim skorzystają z tych sieci do pobrania dużych ilości danych."</string>
+    <string name="data_usage_metered_body" msgid="1805251707096571387">"Wybierz sieci, w których transmisja danych jest kosztowna. Możesz ograniczyć aplikacjom działającym w tle dostęp do tych sieci. Aplikacje mogą też ostrzegać, zanim skorzystają z tych sieci do pobrania dużych ilości danych."</string>
     <string name="data_usage_metered_mobile" msgid="5423305619126978393">"Sieci komórkowe"</string>
     <string name="data_usage_metered_wifi" msgid="4151511616349458705">"Sieci Wi-Fi"</string>
     <string name="cryptkeeper_emergency_call" msgid="198578731586097145">"Połączenie alarmowe"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 834b0cd..43b9553 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -591,8 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Отключиться?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"После отключения соединение с <xliff:g id="PEER_NAME">%1$s</xliff:g> будет прервано."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"После отключения соединение с \"<xliff:g id="PEER_NAME">%1$s</xliff:g>\" и другими устройствами (<xliff:g id="PEER_COUNT">%2$s</xliff:g>) будет прервано."</string>
-    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Отменить приглашение?"</string>
-    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Отменить приглашение на подключение к устройству \"<xliff:g id="PEER_NAME">%1$s</xliff:g>\"?"</string>
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Отмена приглашения"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Вы собираетесь отменить приглашение на подключение к устройству \"<xliff:g id="PEER_NAME">%1$s</xliff:g>\". Продолжить?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Точка доступа Wi-Fi"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Точка доступа <xliff:g id="NETWORK_SSID">%1$s</xliff:g> активна"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Ошибка подключения"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index d5b2846..d47be71 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -1541,7 +1541,7 @@
     <string name="data_usage_received_sent" msgid="5039699009276621757">"<xliff:g id="RECEIVED">%1$s</xliff:g>ilipokewa, <xliff:g id="SENT">%2$s</xliff:g>ilitumwa"</string>
     <string name="data_usage_total_during_range" msgid="441648308264260691">"<xliff:g id="RANGE">%2$s</xliff:g> : kuhusu <xliff:g id="TOTAL">%1$s</xliff:g> imetumika"</string>
     <string name="data_usage_metered_title" msgid="7521278446526606838">"Mitandao ghali"</string>
-    <string name="data_usage_metered_body" msgid="1805251707096571387">"Chagua mitandao ambayo matumizi ya data ni ghali. Programu zinaweza kuzuiwa dhidi ya kutumia mitandao hii ikiwa katika usuli. Huenda pia programu zikakuonya kabla ya kutumia mitandao hii kwa vipakuaji vikubwa."</string>
+    <string name="data_usage_metered_body" msgid="1805251707096571387">"Chagua mitandao ambayo matumizi ya data ni ghali. Programu zinaweza kuzuiwa dhidi ya kutumia mitandao hii zikiwa katika usuli. Huenda pia programu zikakuonya kabla ya kutumia mitandao hii kwa vipakuaji vikubwa."</string>
     <string name="data_usage_metered_mobile" msgid="5423305619126978393">"Mitandao ya simu"</string>
     <string name="data_usage_metered_wifi" msgid="4151511616349458705">"Mitandao ya Wi-Fi"</string>
     <string name="cryptkeeper_emergency_call" msgid="198578731586097145">"Simu ya dharura"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 0326c68..0a75d40 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"ตัดการเชื่อมต่อหรือไม่"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"หากคุณตัดการเชื่อมต่อ จะเป็นการสิ้นสุดการเชื่อมต่อของคุณกับ <xliff:g id="PEER_NAME">%1$s</xliff:g>"</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"หากคุณตัดการเชื่อมต่อ จะเป็นการสิ้นสุดการเชื่อมต่อของคุณกับ <xliff:g id="PEER_NAME">%1$s</xliff:g> และอุปกรณ์อื่นอีก <xliff:g id="PEER_COUNT">%2$s</xliff:g> รายการ"</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"ยกเลิกข้อความเชิญหรือไม่"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"คุณต้องการยกเลิกข้อความเชิญเพื่อเชื่อมต่อกับ <xliff:g id="PEER_NAME">%1$s</xliff:g> หรือไม่"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Wi-Fi ฮอตสปอตแบบพกพา"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"ฮอตสปอตแบบพกพาได้ <xliff:g id="NETWORK_SSID">%1$s</xliff:g> ทำงานอยู่"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"ข้อผิดพลาดของ Wi-Fi ฮอตสปอตแบบพกพา"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index a8cadc7..5964b59 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Idiskonekta?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"Kung magdiskonekta ka, magtatapos ang iyong koneksyon kay <xliff:g id="PEER_NAME">%1$s</xliff:g>."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"Kung magdiskonekta ka, magtatapos ang iyong koneksyon kay <xliff:g id="PEER_NAME">%1$s</xliff:g> at <xliff:g id="PEER_COUNT">%2$s</xliff:g> (na) iba pang mga device."</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Kanselahin ang imbitasyon?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"Nais mo bang kanselahin ang imbitasyong kumonekta kay <xliff:g id="PEER_NAME">%1$s</xliff:g>?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Portable na Wi-Fi hotspot"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Ang Portable na hotspot na <xliff:g id="NETWORK_SSID">%1$s</xliff:g> ay aktibo"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Error sa portable na hotspot ng Wi-Fi"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 42f2b84..5c68f36 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"Bağlantı kesilsin mi?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"Bağlantıyı keserseniz,  <xliff:g id="PEER_NAME">%1$s</xliff:g> ile olan bağlantınız sonlandırılır."</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"Bağlantıyı keserseniz,  <xliff:g id="PEER_NAME">%1$s</xliff:g> ve diğer <xliff:g id="PEER_COUNT">%2$s</xliff:g> cihazla bağlantınız sonlandırılır."</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"Davetiye iptal edilsin mi?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"<xliff:g id="PEER_NAME">%1$s</xliff:g> cihazına bağlanma davetiyesini iptal etmek istiyor musunuz?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"Taşınabilir kablosuz ortak erişim noktası"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"Taşınabilir ortak erişim noktası <xliff:g id="NETWORK_SSID">%1$s</xliff:g> etkin"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"Taşınabilir kablosuz ortak erişim noktası hatası"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index cb62190..a221110 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -591,10 +591,8 @@
     <string name="wifi_p2p_disconnect_title" msgid="3216846049677448420">"中斷連線?"</string>
     <string name="wifi_p2p_disconnect_message" msgid="8227342771610125771">"如果您中斷連線,即會結束您與「<xliff:g id="PEER_NAME">%1$s</xliff:g>」的連線。"</string>
     <string name="wifi_p2p_disconnect_multiple_message" msgid="3283805371034883105">"如果您中斷連線,即會結束您與「<xliff:g id="PEER_NAME">%1$s</xliff:g>」和其他 <xliff:g id="PEER_COUNT">%2$s</xliff:g> 個裝置的連線。"</string>
-    <!-- no translation found for wifi_p2p_cancel_connect_title (255267538099324413) -->
-    <skip />
-    <!-- no translation found for wifi_p2p_cancel_connect_message (7477756213423749402) -->
-    <skip />
+    <string name="wifi_p2p_cancel_connect_title" msgid="255267538099324413">"取消邀請?"</string>
+    <string name="wifi_p2p_cancel_connect_message" msgid="7477756213423749402">"您要取消連線至 <xliff:g id="PEER_NAME">%1$s</xliff:g> 的邀請?"</string>
     <string name="wifi_tether_checkbox_text" msgid="6961605862058056788">"可攜式 Wi-Fi 無線基地台"</string>
     <string name="wifi_tether_enabled_subtext" msgid="8948641212931906143">"可攜式無線基地台 <xliff:g id="NETWORK_SSID">%1$s</xliff:g> 已啟用"</string>
     <string name="wifi_tether_failed_subtext" msgid="2654888578056042315">"可攜式 Wi-Fi 無線基地台發生錯誤"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b5e2aeb..3270c19 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2615,11 +2615,19 @@
     card numbers.  It comes from the app
     <xliff:g id="spellchecker_application_name">%1$s</xliff:g>.
     Use this spell checker?</string>
+
     <!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to mouse and trackpad devices. [CHAR LIMIT=40] -->
     <string name="pointer_settings_category">Mouse/trackpad</string>
     <!-- On Language & input settings screen, setting summary.  Setting for mouse pointer speed. [CHAR LIMIT=35] -->
     <string name="pointer_speed">Pointer speed</string>
 
+    <!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to game controller devices. [CHAR LIMIT=40] -->
+    <string name="game_controller_settings_category">Game Controller</string>
+    <!-- On Language & input settings screen, setting title.  Setting to redirect vibration to input devices. [CHAR LIMIT=35] -->
+    <string name="vibrate_input_devices">Use vibrator</string>
+    <!-- On Language & input settings screen, setting summary.  Setting to redirect vibration to input devices. [CHAR LIMIT=100] -->
+    <string name="vibrate_input_devices_summary">Redirect vibrator to game controller when connected.</string>
+
     <!-- Keyboard Layout Picker --> <skip />
     <!-- Title for the keyboard layout picker activity. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_picker_title">Choose keyboard layout</string>
@@ -3628,10 +3636,8 @@
     <!-- Label for data usage occuring while application in background. [CHAR LIMIT=48] -->
     <string name="data_usage_label_background">Background</string>
 
-    <!-- Disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
-    <string name="data_usage_disclaimer" product="tablet">Measured by your tablet. Your carrier\'s data usage accounting may differ.</string>
-    <!-- Disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
-    <string name="data_usage_disclaimer" product="default">Measured by your phone. Your carrier\'s data usage accounting may differ.</string>
+    <!-- Label for application which has its data usage restricted. [CHAR LIMIT=16] -->
+    <string name="data_usage_app_restricted">restricted</string>
 
     <!-- Body of dialog shown to request confirmation that mobile data will be disabled. [CHAR LIMIT=NONE] -->
     <string name="data_usage_disable_mobile">Disable mobile data?</string>
@@ -3697,9 +3703,9 @@
     <!-- Title of dialog shown before user limits data usage. [CHAR LIMIT=48] -->
     <string name="data_usage_limit_dialog_title">Limiting data usage</string>
     <!-- Body of dialog shown before user limits mobile data usage. [CHAR LIMIT=NONE] -->
-    <string name="data_usage_limit_dialog" product="tablet">Your <xliff:g id="networks" example="mobile">%1$s</xliff:g> data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your tablet, and your carrier may account for usage differently, consider using a conservative limit.</string>
+    <string name="data_usage_limit_dialog_mobile" product="tablet">Your mobile data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your tablet, and your carrier may account for usage differently, consider using a conservative limit.</string>
     <!-- Body of dialog shown before user limits mobile data usage. [CHAR LIMIT=NONE] -->
-    <string name="data_usage_limit_dialog" product="default">Your <xliff:g id="networks" example="mobile">%1$s</xliff:g> data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your phone, and your carrier may account for usage differently, consider using a conservative limit.</string>
+    <string name="data_usage_limit_dialog_mobile" product="default">Your mobile data connection will be disabled when the specified limit is reached.\n\nSince data usage is measured by your phone, and your carrier may account for usage differently, consider using a conservative limit.</string>
 
     <!-- Title of dialog shown before user restricts background data usage. [CHAR LIMIT=48] -->
     <string name="data_usage_restrict_background_title">Restrict background data?</string>
@@ -3716,7 +3722,12 @@
     <!-- Combination of total network bytes sent and received by an application. [CHAR LIMIT=NONE] -->
     <string name="data_usage_received_sent"><xliff:g id="received" example="128KB">%1$s</xliff:g> received, <xliff:g id="sent" example="1.3GB">%2$s</xliff:g> sent</string>
     <!-- Label displaying total network data transferred during a specific time period. [CHAR LIMIT=64] -->
-    <string name="data_usage_total_during_range"><xliff:g id="range" example="Jul 1 - Jul 31">%2$s</xliff:g>: about <xliff:g id="total" example="128KB">%1$s</xliff:g> used</string>
+    <string name="data_usage_total_during_range"><xliff:g id="range" example="Jul 1 - Jul 31">%2$s</xliff:g>: about <xliff:g id="total" example="128KB">%1$s</xliff:g> used.</string>
+
+    <!-- Label displaying total network data transferred during a specific time period, including a disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
+    <string name="data_usage_total_during_range_mobile" product="tablet"><xliff:g id="range" example="Jul 1 - Jul 31">%2$s</xliff:g>: about <xliff:g id="total" example="128KB">%1$s</xliff:g> used, as measured by your tablet. Your carrier\'s data usage accounting may differ.</string>
+    <!-- Label displaying total network data transferred during a specific time period, including a disclaimer that contrasts device versus carrier reporting. [CHAR LIMIT=80] -->
+    <string name="data_usage_total_during_range_mobile" product="default"><xliff:g id="range" example="Jul 1 - Jul 31">%2$s</xliff:g>: about <xliff:g id="total" example="128KB">%1$s</xliff:g> used, as measured by your phone. Your carrier\'s data usage accounting may differ.</string>
 
     <!-- Dialog title for selecting paid networks. [CHAR LIMIT=25] -->
     <string name="data_usage_metered_title">Expensive networks</string>
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index 88f6491..9e99014 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -30,32 +30,27 @@
         <CheckBoxPreference
                 android:key="toggle_large_text_preference"
                 android:title="@string/accessibility_toggle_large_text_title"
-                android:persistent="false"
-                android:order="1"/>
+                android:persistent="false"/>
 
         <CheckBoxPreference
                 android:key="toggle_power_button_ends_call_preference"
                 android:title="@string/accessibility_power_button_ends_call_title"
-                android:persistent="false"
-                android:order="2"/>
+                android:persistent="false"/>
 
         <CheckBoxPreference
                 android:key="toggle_auto_rotate_screen_preference"
                 android:title="@string/accelerometer_title"
-                android:persistent="false"
-                android:order="3"/>
+                android:persistent="false"/>
 
         <CheckBoxPreference
                 android:key="toggle_speak_password_preference"
                 android:title="@string/accessibility_speak_password_title"
-                android:persistent="false"
-                android:order="4"/>
+                android:persistent="false"/>
 
         <PreferenceScreen
                 android:key="toggle_touch_exploration_preference"
                 android:title="@string/accessibility_touch_exploration_title"
-                android:fragment="com.android.settings.AccessibilitySettings$ToggleTouchExplorationFragment"
-                android:order="5" >
+                android:fragment="com.android.settings.AccessibilitySettings$ToggleTouchExplorationFragment" >
                 <extra android:name="title" android:value="@string/accessibility_touch_exploration_title" />
                 <extra android:name="summary" android:value="@string/accessibility_touch_exploration_summary" />
                 <extra android:name="enable_warning_title" android:value="@android:string/dialog_alert_title" />
@@ -64,12 +59,15 @@
                 <extra android:name="settings_component_name" android:value="com.android.settings/com.android.settings.AccessibilityTutorialActivity" />
         </PreferenceScreen>
 
+        <PreferenceScreen android:key="tts_settings"
+                android:fragment="com.android.settings.tts.TextToSpeechSettings"
+                android:title="@string/tts_settings_title" />
+
         <ListPreference android:key="select_long_press_timeout_preference"
                 android:title="@string/accessibility_long_press_timeout_title"
                 android:entries="@array/long_press_timeout_selector_titles"
                 android:entryValues="@array/long_press_timeout_selector_values"
-                android:persistent="false"
-                android:order="6"/>
+                android:persistent="false"/>
 
         <!-- We want a dialog with no title, so use an empty string to avoid a fall back to the preference title. -->
         <com.android.settings.AccessibilityEnableScriptInjectionPreference
@@ -80,8 +78,7 @@
                 android:dialogMessage="@string/accessibility_script_injection_security_warning_summary"
                 android:positiveButtonText="@string/accessibility_script_injection_button_allow"
                 android:negativeButtonText="@string/accessibility_script_injection_button_disallow"
-                android:persistent="false"
-                android:order="7"/>
+                android:persistent="false"/>
 
     </PreferenceCategory>
 
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index cfcc341..f001486 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -92,4 +92,14 @@
                 android:title="@string/pointer_speed"
                 android:dialogTitle="@string/pointer_speed" />
     </PreferenceCategory>
+
+    <PreferenceCategory android:key="game_controller_settings_category"
+            android:title="@string/game_controller_settings_category">
+        <CheckBoxPreference
+                android:key="vibrate_input_devices"
+                android:title="@string/vibrate_input_devices"
+                android:summaryOn="@string/vibrate_input_devices_summary"
+                android:summaryOff="@string/vibrate_input_devices_summary"
+                android:persistent="false"/>
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 70c0d9b..ae9c1cb 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1147,8 +1147,15 @@
         final String totalPhrase = Formatter.formatFileSize(context, totalBytes);
         final String rangePhrase = formatDateRange(context, start, end);
 
-        mUsageSummary.setText(
-                getString(R.string.data_usage_total_during_range, totalPhrase, rangePhrase));
+        final int summaryRes;
+        if (TAB_MOBILE.equals(mCurrentTab) || TAB_3G.equals(mCurrentApp)
+                || TAB_4G.equals(mCurrentApp)) {
+            summaryRes = R.string.data_usage_total_during_range_mobile;
+        } else {
+            summaryRes = R.string.data_usage_total_during_range;
+        }
+
+        mUsageSummary.setText(getString(summaryRes, totalPhrase, rangePhrase));
     }
 
     private final LoaderCallbacks<ChartData> mChartDataCallbacks = new LoaderCallbacks<
@@ -1191,13 +1198,15 @@
 
         @Override
         public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
-            mAdapter.bindStats(data);
+            final int[] restrictedAppIds = mPolicyManager.getAppsWithPolicy(
+                    POLICY_REJECT_METERED_BACKGROUND);
+            mAdapter.bindStats(data, restrictedAppIds);
             updateEmptyVisible();
         }
 
         @Override
         public void onLoaderReset(Loader<NetworkStats> loader) {
-            mAdapter.bindStats(null);
+            mAdapter.bindStats(null, new int[0]);
             updateEmptyVisible();
         }
 
@@ -1374,6 +1383,7 @@
 
     public static class AppItem implements Comparable<AppItem>, Parcelable {
         public final int appId;
+        public boolean restricted;
         public SparseBooleanArray uids = new SparseBooleanArray();
         public long total;
 
@@ -1439,7 +1449,7 @@
         /**
          * Bind the given {@link NetworkStats}, or {@code null} to clear list.
          */
-        public void bindStats(NetworkStats stats) {
+        public void bindStats(NetworkStats stats, int[] restrictedAppIds) {
             mItems.clear();
 
             final AppItem systemItem = new AppItem(android.os.Process.SYSTEM_UID);
@@ -1468,6 +1478,16 @@
                 }
             }
 
+            for (int appId : restrictedAppIds) {
+                AppItem item = knownUids.get(appId);
+                if (item == null) {
+                    item = new AppItem(appId);
+                    item.total = -1;
+                    mItems.add(item);
+                }
+                item.restricted = true;
+            }
+
             if (systemItem.total > 0) {
                 mItems.add(systemItem);
             }
@@ -1513,7 +1533,13 @@
             final AppItem item = mItems.get(position);
             UidDetailTask.bindView(mProvider, item, convertView);
 
-            text1.setText(Formatter.formatFileSize(context, item.total));
+            if (item.restricted && item.total <= 0) {
+                text1.setText(R.string.data_usage_app_restricted);
+                progress.setVisibility(View.GONE);
+            } else {
+                text1.setText(Formatter.formatFileSize(context, item.total));
+                progress.setVisibility(View.VISIBLE);
+            }
 
             final int percentTotal = mLargest != 0 ? (int) (item.total * 100 / mLargest) : 0;
             progress.setProgress(percentTotal);
@@ -1580,16 +1606,13 @@
             // TODO: customize default limits based on network template
             final String currentTab = parent.mCurrentTab;
             if (TAB_3G.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_3g);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else if (TAB_4G.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_4g);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else if (TAB_MOBILE.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_list_mobile);
-                limitBytes = 5 * GB_IN_BYTES;
-            } else if (TAB_WIFI.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_wifi);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else {
                 throw new IllegalArgumentException("unknown current tab: " + currentTab);
@@ -1605,10 +1628,6 @@
             dialog.show(parent.getFragmentManager(), TAG_CONFIRM_LIMIT);
         }
 
-        private static CharSequence buildDialogMessage(Resources res, int networkResId) {
-            return res.getString(R.string.data_usage_limit_dialog, res.getString(networkResId));
-        }
-
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             final Context context = getActivity();
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index 999449a..d0eef62 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -17,8 +17,6 @@
 package com.android.settings.deviceinfo;
 
 import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
-import static android.content.pm.PackageManager.ENFORCEMENT_DEFAULT;
-import static android.content.pm.PackageManager.ENFORCEMENT_YES;
 
 import android.app.ActivityThread;
 import android.app.AlertDialog;
@@ -180,15 +178,15 @@
         final MenuItem usb = menu.findItem(R.id.storage_usb);
         usb.setVisible(!isMassStorageEnabled());
 
-        final int enforcement;
+        final boolean enforced;
         try {
-            enforcement = mPackageService.getPermissionEnforcement(READ_EXTERNAL_STORAGE);
+            enforced = mPackageService.isPermissionEnforced(READ_EXTERNAL_STORAGE);
         } catch (RemoteException e) {
             throw new RuntimeException("Problem talking with PackageManager", e);
         }
 
         final MenuItem enforceReadExternal = menu.findItem(R.id.storage_enforce_read_external);
-        enforceReadExternal.setChecked(enforcement == ENFORCEMENT_YES);
+        enforceReadExternal.setChecked(enforced);
     }
 
     @Override
@@ -209,10 +207,9 @@
                 final boolean checked = !item.isChecked();
                 item.setChecked(checked);
 
-                final int enforcement = checked ? ENFORCEMENT_YES : ENFORCEMENT_DEFAULT;
                 try {
                     // TODO: offload to background thread
-                    mPackageService.setPermissionEnforcement(READ_EXTERNAL_STORAGE, enforcement);
+                    mPackageService.setPermissionEnforced(READ_EXTERNAL_STORAGE, checked);
                 } catch (RemoteException e) {
                     throw new RuntimeException("Problem talking with PackageManager", e);
                 }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index ac9a27b..e764a73 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -52,7 +52,7 @@
 import java.util.Set;
 
 public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
-        implements Preference.OnPreferenceChangeListener{
+        implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener {
 
     private static final String KEY_PHONE_LANGUAGE = "phone_language";
     private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
@@ -73,11 +73,13 @@
     private ListPreference mShowInputMethodSelectorPref;
     private PreferenceCategory mKeyboardSettingsCategory;
     private PreferenceCategory mHardKeyboardCategory;
+    private PreferenceCategory mGameControllerCategory;
     private Preference mLanguagePref;
     private final ArrayList<InputMethodPreference> mInputMethodPreferenceList =
             new ArrayList<InputMethodPreference>();
     private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList =
             new ArrayList<PreferenceScreen>();
+    private InputManager mIm;
     private InputMethodManager mImm;
     private List<InputMethodInfo> mImis;
     private boolean mIsOnlyImeSettings;
@@ -117,6 +119,8 @@
         mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard");
         mKeyboardSettingsCategory = (PreferenceCategory)findPreference(
                 "keyboard_settings_category");
+        mGameControllerCategory = (PreferenceCategory)findPreference(
+                "game_controller_settings_category");
 
         // Filter out irrelevant features if invoked from IME settings button.
         mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
@@ -158,8 +162,9 @@
             }
         }
 
-        // Build hard keyboard preference category.
-        updateHardKeyboards();
+        // Build hard keyboard and game controller preference categories.
+        mIm = (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
+        updateInputDevices();
 
         // Spell Checker
         final Intent intent = new Intent(Intent.ACTION_MAIN);
@@ -214,6 +219,9 @@
     @Override
     public void onResume() {
         super.onResume();
+
+        mIm.registerInputDeviceListener(this, null);
+
         if (!mIsOnlyImeSettings) {
             if (mLanguagePref != null) {
                 Configuration conf = getResources().getConfiguration();
@@ -240,7 +248,7 @@
             }
         }
 
-        updateHardKeyboards();
+        updateInputDevices();
 
         // IME
         InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
@@ -251,6 +259,9 @@
     @Override
     public void onPause() {
         super.onPause();
+
+        mIm.unregisterInputDeviceListener(this);
+
         if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
             mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
         }
@@ -259,6 +270,21 @@
     }
 
     @Override
+    public void onInputDeviceAdded(int deviceId) {
+        updateInputDevices();
+    }
+
+    @Override
+    public void onInputDeviceChanged(int deviceId) {
+        updateInputDevices();
+    }
+
+    @Override
+    public void onInputDeviceRemoved(int deviceId) {
+        updateInputDevices();
+    }
+
+    @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         // Input Method stuff
         if (Utils.isMonkeyRunning()) {
@@ -283,6 +309,11 @@
                     }
                 }
             }
+            if (chkPref == mGameControllerCategory.findPreference("vibrate_input_devices")) {
+                System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES,
+                        chkPref.isChecked() ? 1 : 0);
+                return true;
+            }
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -359,12 +390,14 @@
         return pref;
     }
 
+    private void updateInputDevices() {
+        updateHardKeyboards();
+        updateGameControllers();
+    }
+
     private void updateHardKeyboards() {
         mHardKeyboardPreferenceList.clear();
         if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) {
-            final InputManager im =
-                    (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
-
             final int[] devices = InputDevice.getDeviceIds();
             for (int i = 0; i < devices.length; i++) {
                 InputDevice device = InputDevice.getDevice(devices[i]);
@@ -374,9 +407,9 @@
                         && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
                     final String inputDeviceDescriptor = device.getDescriptor();
                     final String keyboardLayoutDescriptor =
-                            im.getKeyboardLayoutForInputDevice(inputDeviceDescriptor);
+                            mIm.getKeyboardLayoutForInputDevice(inputDeviceDescriptor);
                     final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
-                            im.getKeyboardLayout(keyboardLayoutDescriptor) : null;
+                            mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null;
 
                     final Intent intent = new Intent(Intent.ACTION_MAIN);
                     intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
@@ -409,11 +442,37 @@
                 pref.setOrder(i);
                 mHardKeyboardCategory.addPreference(pref);
             }
+
+            getPreferenceScreen().addPreference(mHardKeyboardCategory);
         } else {
             getPreferenceScreen().removePreference(mHardKeyboardCategory);
         }
     }
 
+    private void updateGameControllers() {
+        if (haveInputDeviceWithVibrator()) {
+            getPreferenceScreen().addPreference(mGameControllerCategory);
+
+            CheckBoxPreference chkPref = (CheckBoxPreference)
+                    mGameControllerCategory.findPreference("vibrate_input_devices");
+            chkPref.setChecked(System.getInt(getContentResolver(),
+                    Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0);
+        } else {
+            getPreferenceScreen().removePreference(mGameControllerCategory);
+        }
+    }
+
+    private boolean haveInputDeviceWithVibrator() {
+        final int[] devices = InputDevice.getDeviceIds();
+        for (int i = 0; i < devices.length; i++) {
+            InputDevice device = InputDevice.getDevice(devices[i]);
+            if (device != null && !device.isVirtual() && device.getVibrator().hasVibrator()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private class SettingsObserver extends ContentObserver {
         public SettingsObserver(Handler handler, Context context) {
             super(handler);
diff --git a/src/com/android/settings/net/ChartDataLoader.java b/src/com/android/settings/net/ChartDataLoader.java
index 830d006..e0336b7 100644
--- a/src/com/android/settings/net/ChartDataLoader.java
+++ b/src/com/android/settings/net/ChartDataLoader.java
@@ -21,6 +21,7 @@
 import static android.net.NetworkStats.TAG_NONE;
 import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
 import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
 
 import android.content.AsyncTaskLoader;
 import android.content.Context;
@@ -88,9 +89,6 @@
         data.network = mSession.getHistoryForNetwork(template, fields);
 
         if (app != null) {
-            data.detailDefault = null;
-            data.detailForeground = null;
-
             // load stats for current uid and template
             final int size = app.uids.size();
             for (int i = 0; i < size; i++) {
@@ -101,9 +99,15 @@
                         template, uid, SET_FOREGROUND, data.detailForeground);
             }
 
-            data.detail = new NetworkStatsHistory(data.detailForeground.getBucketDuration());
-            data.detail.recordEntireHistory(data.detailDefault);
-            data.detail.recordEntireHistory(data.detailForeground);
+            if (size > 0) {
+                data.detail = new NetworkStatsHistory(data.detailForeground.getBucketDuration());
+                data.detail.recordEntireHistory(data.detailDefault);
+                data.detail.recordEntireHistory(data.detailForeground);
+            } else {
+                data.detailDefault = new NetworkStatsHistory(HOUR_IN_MILLIS);
+                data.detailForeground = new NetworkStatsHistory(HOUR_IN_MILLIS);
+                data.detail = new NetworkStatsHistory(HOUR_IN_MILLIS);
+            }
         }
 
         return data;