Merge "Limit device name length" into jb-mr2-dev
diff --git a/Android.mk b/Android.mk
index 22c7143..c8b81dc 100644
--- a/Android.mk
+++ b/Android.mk
@@ -13,6 +13,8 @@
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+LOCAL_AAPT_FLAGS += -c zz_ZZ
+
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 020cfad..12540e2 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -418,18 +418,15 @@
<string name="device_admin_title" msgid="3562216873644263804">"Toesteladministrasie"</string>
<string name="manage_device_admin" msgid="5059296715271077278">"Toesteladministrateurs"</string>
<string name="manage_device_admin_summary" msgid="7672709110988761075">"Sien of deaktiveer toesteladministrateurs"</string>
- <!-- no translation found for manage_notification_access (5799781079264981979) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_zero (2409912785614953348) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_nonzero:one (8344183614159211585) -->
- <!-- no translation found for manage_notification_access_summary_nonzero:other (980049191810249052) -->
- <!-- no translation found for no_notification_listeners (2767405417723149879) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_title (6494221261778885893) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_summary (2780319203595885564) -->
- <skip />
+ <string name="manage_notification_access" msgid="5799781079264981979">"Kennisgewingtoegang"</string>
+ <string name="manage_notification_access_summary_zero" msgid="2409912785614953348">"Programme kan nie kennisgewings lees nie"</string>
+ <plurals name="manage_notification_access_summary_nonzero">
+ <item quantity="one" msgid="8344183614159211585">"%d program kan kennisgewings lees"</item>
+ <item quantity="other" msgid="980049191810249052">"%d programme kan kennisgewings lees"</item>
+ </plurals>
+ <string name="no_notification_listeners" msgid="2767405417723149879">"Geen kennisgewingluisteraars is geïnstalleer nie."</string>
+ <string name="notification_listener_security_warning_title" msgid="6494221261778885893">"Aktiveer <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
+ <string name="notification_listener_security_warning_summary" msgid="2780319203595885564">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> sal alle kennisgewings kan lees wat deur die stelsel of deur enige geïnstalleerde program geplaas is, wat dalk persoonlike inligting soos kontakname en die teks van boodskappe na jou gestuur, kan insluit. Dit sal ook hierdie kennisgewings kan verwerp of handelingknoppies daarbinne kan aanraak."</string>
<string name="bluetooth_quick_toggle_title" msgid="1037056952714061893">"Bluetooth"</string>
<string name="bluetooth_quick_toggle_summary" msgid="5293641680139873341">"Skakel Bluetooth aan"</string>
<string name="bluetooth_settings" msgid="1810521656168174329">"Bluetooth"</string>
@@ -1691,10 +1688,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Agtergrondproses-limiet"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Wys alle ANRe"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Wys Program reageer nie-dialoog vir agtergrond programme"</string>
- <!-- no translation found for experimental_webview (4492200819033780927) -->
- <skip />
- <!-- no translation found for experimental_webview_summary (3431620080869482446) -->
- <skip />
+ <string name="experimental_webview" msgid="4492200819033780927">"Gebruik eksperimentele WebView"</string>
+ <string name="experimental_webview_summary" msgid="3431620080869482446">"Programme sal die jongste (beta) WebView gebruik"</string>
<string name="data_usage_summary_title" msgid="3804110657238092929">"Datagebruik"</string>
<string name="data_usage_cycle" msgid="5652529796195787949">"Datagebruiksiklus"</string>
<string name="data_usage_menu_roaming" msgid="8042359966835203296">"Dataswerwing"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index aa2c98e..715e9b3 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -555,7 +555,7 @@
<string name="wifi_scan_always_available" msgid="3470564139944368030">"Scanning er altid tilgængelig"</string>
<string name="wifi_scan_always_available_summary" msgid="7768204638882691453">"Lad Googles placeringstjeneste og andre apps scanne efter netværk, selv når Wi-Fi er slået fra"</string>
<string name="wifi_install_credentials" msgid="3551143317298272860">"Installer certifikater"</string>
- <string name="wifi_scan_notify_text_location_on" msgid="8135076005488914200">"Google- og andre apps scanner muligvis efter netværk i nærheden, selv når Wi-Fi er slukket, for at forbedre placeringsnøjagtighed m.m.. Hvis du ikke ønsker dette, kan du gå til Avanceret > Scanning altid tilgængelig."</string>
+ <string name="wifi_scan_notify_text_location_on" msgid="8135076005488914200">"Google og andre apps scanner muligvis efter netværk i nærheden, selv når Wi-Fi er slukket, for at forbedre placeringsnøjagtighed m.m.. Hvis du ikke ønsker dette, kan du gå til Avanceret > Scanning altid tilgængelig."</string>
<string name="wifi_scan_notify_text_location_off" msgid="6323983741393280935">"Apps kan søge efter netværk i nærheden, selv når Wi-Fi er slukket. Hvis du ikke ønsker, at dette sker, skal du gå til Avanceret > Scanning altid tilgængelig."</string>
<string name="wifi_scan_notify_remember_choice" msgid="5340097010842405981">"Vis ikke igen"</string>
<string name="wifi_setting_sleep_policy_title" msgid="5149574280392680092">"Hold Wi-Fi aktiveret i dvale"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 1f2da46..2e29f5d 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -303,10 +303,10 @@
<string name="biometric_weak_liveliness_summary" msgid="4199587000948042325">"Augenzwinkern beim Entsperren erforderlich"</string>
<string name="lock_after_timeout" msgid="4590337686681194648">"Automatisch sperren"</string>
<string name="lock_after_timeout_summary" msgid="6128431871360905631">"Nach <xliff:g id="TIMEOUT_STRING">%1$s</xliff:g> im Ruhezustand"</string>
- <string name="show_owner_info_on_lockscreen_label" msgid="5074906168357568434">"Inhaberinformationen auf Sperrbildschirm anzeigen"</string>
+ <string name="show_owner_info_on_lockscreen_label" msgid="5074906168357568434">"Infos zum Eigentümer auf Sperrbildschirm anzeigen"</string>
<string name="owner_info_settings_title" msgid="2723190010708381889">"Info zum Eigentümer"</string>
<string name="owner_info_settings_summary" msgid="3800834657847339570"></string>
- <string name="owner_info_settings_edit_text_hint" msgid="4608681417960923911">"Text für Display-Sperre eingeben"</string>
+ <string name="owner_info_settings_edit_text_hint" msgid="4608681417960923911">"Text für Sperrbildschirm eingeben"</string>
<string name="show_user_info_on_lockscreen_label" msgid="8408914624925608365">"Nutzerinformationen bei Bildschirmsperre anzeigen"</string>
<string name="user_info_settings_title" msgid="1195015434996724736">"Nutzerinformationen"</string>
<string name="location_settings_title" msgid="4483843407328665068">"Standortzugriff"</string>
@@ -829,7 +829,7 @@
<string name="memory_media_usage" msgid="3738830697707880405">"Medien"</string>
<string name="memory_downloads_usage" msgid="3755173051677533027">"Downloads"</string>
<string name="memory_dcim_usage" msgid="558887013613822577">"Bilder, Videos"</string>
- <string name="memory_music_usage" msgid="1363785144783011606">"Audio (Musik, Töne, usw.)"</string>
+ <string name="memory_music_usage" msgid="1363785144783011606">"Audio (Musik, Töne usw.)"</string>
<string name="memory_media_misc_usage" msgid="235452944021647124">"Sonstiges"</string>
<string name="memory_media_cache_usage" msgid="6704293333141177910">"Daten im Cache"</string>
<string name="sd_eject" product="nosdcard" msgid="4988563376492400073">"Gemeinsamen Speicher trennen"</string>
@@ -1336,7 +1336,7 @@
<string name="accessibility_global_gesture_preference_title" msgid="6752037184140789970">"Bedienungshilfenverknüpfung"</string>
<string name="accessibility_global_gesture_preference_summary_on" msgid="6180927399052022181">"An"</string>
<string name="accessibility_global_gesture_preference_summary_off" msgid="8102103337813609849">"Aus"</string>
- <string name="accessibility_global_gesture_preference_description" msgid="750438015254396963">"Wenn diese Funktion aktiviert ist, können Sie Bedienungshilfen schnell in zwei Schritten aktivieren:"\n\n"1. Schritt: Drücken und halten Sie die Ein-/Austaste, bis Sie einen Ton hören oder eine Vibration spüren."\n\n"2. Schritt: Berühren und halten Sie mit zwei Fingern, bis Sie eine Audiobestätigung hören."\n\n"Falls das Gerät mehrere Nutzer hat, werden die Bedienungshilfen durch Verwendung dieser Verknüpfung in der Bildschirmsperre solange aktiviert, bis das Gerät entsperrt ist."</string>
+ <string name="accessibility_global_gesture_preference_description" msgid="750438015254396963">"Wenn diese Funktion aktiviert ist, können Sie Bedienungshilfen schnell in zwei Schritten aktivieren:"\n\n"Schritt 1: Drücken und halten Sie die Ein-/Austaste, bis Sie einen Ton hören oder eine Vibration spüren."\n\n"Schritt 2: Berühren und halten Sie mit zwei Fingern, bis Sie eine Audiobestätigung hören."\n\n"Falls das Gerät mehrere Nutzer hat, werden die Bedienungshilfen durch Verwendung dieser Verknüpfung in der Bildschirmsperre solange aktiviert, bis das Gerät entsperrt ist."</string>
<string name="accessibility_toggle_large_text_preference_title" msgid="6307247527580207161">"Großer Text"</string>
<string name="accessibility_toggle_screen_magnification_preference_title" msgid="2472285215737820469">"Bildschirmvergrößerung"</string>
<string name="accessibility_toggle_screen_magnification_auto_update_preference_title" msgid="7218498768415430963">"Vergrößerung autom. aktualisieren"</string>
@@ -1602,7 +1602,7 @@
<string name="sync_enabled" msgid="4551148952179416813">"Synchronisierung AN"</string>
<string name="sync_disabled" msgid="8511659877596511991">"Synchronisierung AUS"</string>
<string name="sync_error" msgid="5060969083117872149">"Synchronisierungsfehler"</string>
- <string name="last_synced" msgid="4242919465367022234">"Zuletzt synchronisiert am <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
+ <string name="last_synced" msgid="4242919465367022234">"Zuletzt synchronisiert: <xliff:g id="LAST_SYNC_TIME">%1$s</xliff:g>"</string>
<string name="sync_in_progress" msgid="5151314196536070569">"Synchronisieren…"</string>
<string name="settings_backup" msgid="2274732978260797031">"Einstellungen sichern"</string>
<string name="settings_backup_summary" msgid="7916877705938054035">"Meine Einstellungen sichern"</string>
@@ -1710,7 +1710,7 @@
<string name="data_usage_empty" msgid="8621855507876539282">"Kein Datenverbrauch in diesem Zeitraum"</string>
<string name="data_usage_label_foreground" msgid="4938034231928628164">"Vordergrund"</string>
<string name="data_usage_label_background" msgid="3225844085975764519">"Hintergrund"</string>
- <string name="data_usage_app_restricted" msgid="3568465218866589705">"eingeschränkt"</string>
+ <string name="data_usage_app_restricted" msgid="3568465218866589705">"Eingeschränkt"</string>
<string name="data_usage_disable_mobile" msgid="5211007048880167438">"Mobilfunk deaktivieren?"</string>
<string name="data_usage_disable_mobile_limit" msgid="4644364396844393848">"Limit festlegen"</string>
<string name="data_usage_disable_4g_limit" msgid="6233554774946681175">"4G-Datenlimit festlegen"</string>
@@ -1743,7 +1743,7 @@
<string name="data_usage_cycle_editor_positive" msgid="8821760330497941117">"Übernehmen"</string>
<string name="data_usage_warning_editor_title" msgid="3704136912240060339">"Warnung für Datenverbrauch festlegen"</string>
<string name="data_usage_limit_editor_title" msgid="9153595142385030015">"Limit festlegen"</string>
- <string name="data_usage_limit_dialog_title" msgid="3023111643632996097">"Begrenzung des Datenverbrauchs"</string>
+ <string name="data_usage_limit_dialog_title" msgid="3023111643632996097">"Datenverbrauch begrenzen"</string>
<string name="data_usage_limit_dialog_mobile" product="tablet" msgid="3893348029612821262">"Ihre mobile Datenverbindung wird deaktiviert, sobald das angegebene Limit erreicht ist."\n\n"Der Datenverbrauch wird von Ihrem Tablet berechnet und kann von der Abrechnung Ihres Mobilfunkanbieters abweichen. Ziehen Sie deshalb die Verwendung eines niedrigen Limits in Betracht."</string>
<string name="data_usage_limit_dialog_mobile" product="default" msgid="7962145861903746827">"Ihre mobile Datenverbindung wird deaktiviert, sobald das angegebene Limit erreicht ist."\n\n"Der Datenverbrauch wird von Ihrem Telefon berechnet und kann von der Abrechnung Ihres Mobilfunkanbieters abweichen. Ziehen Sie deshalb die Verwendung eines niedrigen Limits in Betracht."</string>
<string name="data_usage_restrict_background_title" msgid="2201315502223035062">"Hintergrunddaten beschränken?"</string>
@@ -1756,8 +1756,8 @@
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Entfernte Apps und Nutzer"</string>
<string name="data_usage_received_sent" msgid="5039699009276621757">"<xliff:g id="RECEIVED">%1$s</xliff:g> erhalten, <xliff:g id="SENT">%2$s</xliff:g> gesendet"</string>
<string name="data_usage_total_during_range" msgid="4091294280619255237">"<xliff:g id="RANGE">%2$s</xliff:g>: ca. <xliff:g id="TOTAL">%1$s</xliff:g> verwendet"</string>
- <string name="data_usage_total_during_range_mobile" product="tablet" msgid="5961720793603268572">"<xliff:g id="RANGE">%2$s</xliff:g>: ca. <xliff:g id="TOTAL">%1$s</xliff:g> verwendet. Abrechnung des Datenverbrauchs durch Tablet. Kann von Mobilfunkanbieter abweichen."</string>
- <string name="data_usage_total_during_range_mobile" product="default" msgid="1625833170144610767">"<xliff:g id="RANGE">%2$s</xliff:g>: ca. <xliff:g id="TOTAL">%1$s</xliff:g> verwendet. Abrechnung des Datenverbrauchs durch Telefon. Kann von Mobilfunkanbieter abweichen."</string>
+ <string name="data_usage_total_during_range_mobile" product="tablet" msgid="5961720793603268572">"<xliff:g id="RANGE">%2$s</xliff:g>: ca. <xliff:g id="TOTAL">%1$s</xliff:g> verbraucht. Abrechnung des Datenverbrauchs durch Tablet. Kann von Mobilfunkanbieter abweichen."</string>
+ <string name="data_usage_total_during_range_mobile" product="default" msgid="1625833170144610767">"<xliff:g id="RANGE">%2$s</xliff:g>: ca. <xliff:g id="TOTAL">%1$s</xliff:g> verbraucht. Abrechnung des Datenverbrauchs durch Telefon. Kann von Mobilfunkanbieter abweichen."</string>
<string name="data_usage_metered_title" msgid="6204750602856383278">"Mobile Hotspots"</string>
<string name="data_usage_metered_body" msgid="4959032833706695848">"Wählen Sie die WLAN-Netzwerke aus, die mobile Hotspots sind. Die Verwendung dieser Netzwerke kann für Apps im Hintergrund eingeschränkt werden. Eventuell senden Apps auch eine Warnung, bevor diese Netzwerke für umfangreiche Downloads verwendet werden."</string>
<string name="data_usage_metered_mobile" msgid="5423305619126978393">"Mobilfunknetze"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 234c813..1cdbe07 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -418,18 +418,15 @@
<string name="device_admin_title" msgid="3562216873644263804">"Διαχείριση συσκευής"</string>
<string name="manage_device_admin" msgid="5059296715271077278">"Διαχειριστές συσκευών"</string>
<string name="manage_device_admin_summary" msgid="7672709110988761075">"Προβολή ή απενεργοποίηση των διαχειριστών συσκευής"</string>
- <!-- no translation found for manage_notification_access (5799781079264981979) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_zero (2409912785614953348) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_nonzero:one (8344183614159211585) -->
- <!-- no translation found for manage_notification_access_summary_nonzero:other (980049191810249052) -->
- <!-- no translation found for no_notification_listeners (2767405417723149879) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_title (6494221261778885893) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_summary (2780319203595885564) -->
- <skip />
+ <string name="manage_notification_access" msgid="5799781079264981979">"Πρόσβαση σε ειδοποιήσεις"</string>
+ <string name="manage_notification_access_summary_zero" msgid="2409912785614953348">"Οι εφαρμογές δεν μπορούν να διαβάσουν ειδοποιήσεις"</string>
+ <plurals name="manage_notification_access_summary_nonzero">
+ <item quantity="one" msgid="8344183614159211585">"%d εφαρμογή μπορεί να διαβάσει ειδοποιήσεις"</item>
+ <item quantity="other" msgid="980049191810249052">"%d εφαρμογές μπορούν να διαβάσουν ειδοποιήσεις"</item>
+ </plurals>
+ <string name="no_notification_listeners" msgid="2767405417723149879">"Δεν έχουν εγκατασταθεί υπηρεσίες ακρόασης ειδοποιήσεων."</string>
+ <string name="notification_listener_security_warning_title" msgid="6494221261778885893">"Ενεργοποίηση <xliff:g id="SERVICE">%1$s</xliff:g>;"</string>
+ <string name="notification_listener_security_warning_summary" msgid="2780319203595885564">"Η εφαρμογή <xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> θα μπορεί να διαβάζει όλες τις ειδοποιήσεις που δημοσιεύει το σύστημα ή οποιαδήποτε εγκατεστημένη εφαρμογή, οι οποίες ενδέχεται να συμπεριλαμβάνουν προσωπικά στοιχεία, όπως ονόματα επαφών και κείμενα από μηνύματα που έχετε λάβει. Θα έχει επίσης τη δυνατότητα να απορρίπτει αυτές τις ειδοποιήσεις ή να αγγίζει τα κουμπιά ενεργειών που περιέχονται σε αυτές."</string>
<string name="bluetooth_quick_toggle_title" msgid="1037056952714061893">"Bluetooth"</string>
<string name="bluetooth_quick_toggle_summary" msgid="5293641680139873341">"Ενεργοποίηση Bluetooth"</string>
<string name="bluetooth_settings" msgid="1810521656168174329">"Bluetooth"</string>
@@ -1691,10 +1688,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Όριο διεργασ. παρασκηνίου"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Εμφάνιση όλων των ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Εμφ.του παραθ. \"Η εφαρμ.δεν αποκρ.\" για εφ.παρασκ."</string>
- <!-- no translation found for experimental_webview (4492200819033780927) -->
- <skip />
- <!-- no translation found for experimental_webview_summary (3431620080869482446) -->
- <skip />
+ <string name="experimental_webview" msgid="4492200819033780927">"Χρήση πειραμ. προβ. ιστού"</string>
+ <string name="experimental_webview_summary" msgid="3431620080869482446">"Οι εφαρμ. θα χρησιμ. τη νέα (beta) προβολή ιστου"</string>
<string name="data_usage_summary_title" msgid="3804110657238092929">"Χρήση δεδομένων"</string>
<string name="data_usage_cycle" msgid="5652529796195787949">"Κύκλος δεδομένων χρήσης"</string>
<string name="data_usage_menu_roaming" msgid="8042359966835203296">"Περιαγωγή δεδομένων"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index f7bb72d..7e346b6 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -418,18 +418,15 @@
<string name="device_admin_title" msgid="3562216873644263804">"Device administration"</string>
<string name="manage_device_admin" msgid="5059296715271077278">"Device administrators"</string>
<string name="manage_device_admin_summary" msgid="7672709110988761075">"View or deactivate device administrators"</string>
- <!-- no translation found for manage_notification_access (5799781079264981979) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_zero (2409912785614953348) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_nonzero:one (8344183614159211585) -->
- <!-- no translation found for manage_notification_access_summary_nonzero:other (980049191810249052) -->
- <!-- no translation found for no_notification_listeners (2767405417723149879) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_title (6494221261778885893) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_summary (2780319203595885564) -->
- <skip />
+ <string name="manage_notification_access" msgid="5799781079264981979">"Notification access"</string>
+ <string name="manage_notification_access_summary_zero" msgid="2409912785614953348">"Apps cannot read notifications"</string>
+ <plurals name="manage_notification_access_summary_nonzero">
+ <item quantity="one" msgid="8344183614159211585">"%d app can read notifications"</item>
+ <item quantity="other" msgid="980049191810249052">"%d apps can read notifications"</item>
+ </plurals>
+ <string name="no_notification_listeners" msgid="2767405417723149879">"No notification listeners are installed."</string>
+ <string name="notification_listener_security_warning_title" msgid="6494221261778885893">"Enable <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
+ <string name="notification_listener_security_warning_summary" msgid="2780319203595885564">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> will be able to read all notifications posted by the system or any installed app, which may include personal information such as contact names and the text of messages sent to you. It will also be able to dismiss these notifications or touch action buttons within them."</string>
<string name="bluetooth_quick_toggle_title" msgid="1037056952714061893">"Bluetooth"</string>
<string name="bluetooth_quick_toggle_summary" msgid="5293641680139873341">"Turn on Bluetooth"</string>
<string name="bluetooth_settings" msgid="1810521656168174329">"Bluetooth"</string>
@@ -1691,10 +1688,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
- <!-- no translation found for experimental_webview (4492200819033780927) -->
- <skip />
- <!-- no translation found for experimental_webview_summary (3431620080869482446) -->
- <skip />
+ <string name="experimental_webview" msgid="4492200819033780927">"Use Experimental WebView"</string>
+ <string name="experimental_webview_summary" msgid="3431620080869482446">"Apps will use the newest (beta) WebView"</string>
<string name="data_usage_summary_title" msgid="3804110657238092929">"Data usage"</string>
<string name="data_usage_cycle" msgid="5652529796195787949">"Data usage cycle"</string>
<string name="data_usage_menu_roaming" msgid="8042359966835203296">"Data roaming"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index a21c191..663729f 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -1041,7 +1041,7 @@
<string name="lockpattern_settings_enable_summary" msgid="1165707416664252167">"برای باز کردن قفل صفحه باید یک الگو بکشید"</string>
<string name="lockpattern_settings_enable_visible_pattern_title" msgid="2615606088906120711">"الگو را قابل مشاهده کنید"</string>
<string name="lockpattern_settings_enable_tactile_feedback_title" msgid="8898518337442601027">"لرزش هنگام لمس"</string>
- <string name="lockpattern_settings_enable_power_button_instantly_locks" msgid="5735444062633666327">"دکمه روشن/خاموش فوراً دستگاه را قفل کند"</string>
+ <string name="lockpattern_settings_enable_power_button_instantly_locks" msgid="5735444062633666327">"قفلشدن فوری با دکمه روشن/خاموش"</string>
<string name="lockpattern_settings_choose_lock_pattern" msgid="1652352830005653447">"تنظیم الگوی بازگشایی قفل"</string>
<string name="lockpattern_settings_change_lock_pattern" msgid="1123908306116495545">"تغییر الگوی بازگشایی قفل"</string>
<string name="lockpattern_settings_help_how_to_record" msgid="2614673439060830433">"نحوه ترسیم الگوی بازگشایی قفل"</string>
@@ -1340,7 +1340,7 @@
<string name="accessibility_toggle_screen_magnification_preference_title" msgid="2472285215737820469">"بزرگنمایی صفحه"</string>
<string name="accessibility_toggle_screen_magnification_auto_update_preference_title" msgid="7218498768415430963">"بهروزرسانی خودکار بزرگنمایی صفحه"</string>
<string name="accessibility_toggle_screen_magnification_auto_update_preference_summary" msgid="4392059334816220155">"بهروزرسانی بزرگنمایی صفحه در انتقالهای برنامه"</string>
- <string name="accessibility_power_button_ends_call_prerefence_title" msgid="6673851944175874235">"دکمه روشن/خاموش به تماس پایان میدهد"</string>
+ <string name="accessibility_power_button_ends_call_prerefence_title" msgid="6673851944175874235">"قطع تماس با دکمه روشن/خاموش"</string>
<string name="accessibility_toggle_speak_password_preference_title" msgid="5986628515113204844">"گفتن گذرواژهها"</string>
<string name="accessibility_long_press_timeout_preference_title" msgid="6708467774619266508">"تأخیر لمس کردن و نگه داشتن"</string>
<string name="accessibility_menu_item_settings" msgid="3344942964710773365">"تنظیمات"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index e4d5ac3..794de53 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -418,18 +418,15 @@
<string name="device_admin_title" msgid="3562216873644263804">"Amministrazione dispositivo"</string>
<string name="manage_device_admin" msgid="5059296715271077278">"Amministratori dispositivo"</string>
<string name="manage_device_admin_summary" msgid="7672709110988761075">"Visualizza o disattiva amministratori dispositivo"</string>
- <!-- no translation found for manage_notification_access (5799781079264981979) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_zero (2409912785614953348) -->
- <skip />
- <!-- no translation found for manage_notification_access_summary_nonzero:one (8344183614159211585) -->
- <!-- no translation found for manage_notification_access_summary_nonzero:other (980049191810249052) -->
- <!-- no translation found for no_notification_listeners (2767405417723149879) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_title (6494221261778885893) -->
- <skip />
- <!-- no translation found for notification_listener_security_warning_summary (2780319203595885564) -->
- <skip />
+ <string name="manage_notification_access" msgid="5799781079264981979">"Accesso alle notifiche"</string>
+ <string name="manage_notification_access_summary_zero" msgid="2409912785614953348">"Le app non possono leggere le notifiche"</string>
+ <plurals name="manage_notification_access_summary_nonzero">
+ <item quantity="one" msgid="8344183614159211585">"L\'app %d può leggere le notifiche"</item>
+ <item quantity="other" msgid="980049191810249052">"Le app %d possono leggere le notifiche"</item>
+ </plurals>
+ <string name="no_notification_listeners" msgid="2767405417723149879">"Nessun listener di notifica installato."</string>
+ <string name="notification_listener_security_warning_title" msgid="6494221261778885893">"Attivare <xliff:g id="SERVICE">%1$s</xliff:g>?"</string>
+ <string name="notification_listener_security_warning_summary" msgid="2780319203595885564">"<xliff:g id="NOTIFICATION_LISTENER_NAME">%1$s</xliff:g> sarà in grado di leggere tutte le notifiche pubblicate dal sistema o da qualsiasi app installata, le quali potrebbero includere informazioni personali come i nomi dei contatti e il testo dei messaggi ricevuti. Sarà inoltre in grado di ignorare tali notifiche o di attivare pulsanti di azione al loro interno."</string>
<string name="bluetooth_quick_toggle_title" msgid="1037056952714061893">"Bluetooth"</string>
<string name="bluetooth_quick_toggle_summary" msgid="5293641680139873341">"Attiva Bluetooth"</string>
<string name="bluetooth_settings" msgid="1810521656168174329">"Bluetooth"</string>
@@ -1691,10 +1688,8 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processi background"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostra tutti errori ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostra finestra ANR per applicazioni in background"</string>
- <!-- no translation found for experimental_webview (4492200819033780927) -->
- <skip />
- <!-- no translation found for experimental_webview_summary (3431620080869482446) -->
- <skip />
+ <string name="experimental_webview" msgid="4492200819033780927">"Usa WebView sperimentale"</string>
+ <string name="experimental_webview_summary" msgid="3431620080869482446">"Le app utilizzeranno la WebView più recente (Beta)"</string>
<string name="data_usage_summary_title" msgid="3804110657238092929">"Utilizzo dati"</string>
<string name="data_usage_cycle" msgid="5652529796195787949">"Ciclo utilizzo dati"</string>
<string name="data_usage_menu_roaming" msgid="8042359966835203296">"Roaming dei dati"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d026ef1..6eecff4 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -274,10 +274,10 @@
<string name="roaming_disable" msgid="1295279574370898378">"Koble til datatjenester ved roaming"</string>
<string name="roaming_reenable_message" msgid="9141007271031717369">"Du har mistet datatilkobling fordi du forlot hjemmenettet med dataroaming av."</string>
<string name="roaming_turn_it_on_button" msgid="4387601818162120589">"Slå på"</string>
- <string name="roaming_warning" msgid="7625933694709170887">"Hvis du du tillater datastreifing, kan det påløpe høye kostnader."</string>
- <string name="roaming_warning_multiuser" product="tablet" msgid="6458990250829214777">"Når du tillater datastreifing, kan dette føre til høye kostnader."\n\n"Denne innstillingen påvirker alle brukerne på dette nettbrettet."</string>
- <string name="roaming_warning_multiuser" product="default" msgid="6368421100292355440">"Når du tillater datastreifing, kan dette føre til høye kostnader."\n\n"Denne innstillingen påvirker alle brukerne på denne telefonen."</string>
- <string name="roaming_reenable_title" msgid="6068100976707316772">"Vil du tillate datastreifing?"</string>
+ <string name="roaming_warning" msgid="7625933694709170887">"Å tillate roaming kan medføre høye datakostnader."</string>
+ <string name="roaming_warning_multiuser" product="tablet" msgid="6458990250829214777">"Når du tillater roaming, kan dette føre til høye datakostnader."\n\n"Denne innstillingen påvirker alle brukerne på dette nettbrettet."</string>
+ <string name="roaming_warning_multiuser" product="default" msgid="6368421100292355440">"Når du tillater roaming, kan dette føre til høye datakostnader."\n\n"Denne innstillingen påvirker alle brukerne på denne telefonen."</string>
+ <string name="roaming_reenable_title" msgid="6068100976707316772">"Vil du tillate roaming?"</string>
<string name="networks" msgid="6333316876545927039">"Operatør"</string>
<string name="sum_carrier_select" msgid="3616956422251879163">"Velg en nettverksoperatør"</string>
<string name="date_and_time_settings_title" msgid="3350640463596716780">"Dato og tid"</string>
@@ -895,7 +895,7 @@
<string name="apn_auth_type_pap_chap" msgid="9102343063036134541">"CHAP"</string>
<string name="apn_type" msgid="469613123902220544">"APN-type"</string>
<string name="apn_protocol" msgid="3272222921649348640">"APN-protokoll"</string>
- <string name="apn_roaming_protocol" msgid="3386954381510788422">"APN-protokoll ved streifing"</string>
+ <string name="apn_roaming_protocol" msgid="3386954381510788422">"APN-protokoll ved roaming"</string>
<string name="carrier_enabled" msgid="407655861175280806">"Aktivering eller deaktivering av APN"</string>
<string name="carrier_enabled_summaryOn" msgid="6338915271908057531">"APN aktivert"</string>
<string name="carrier_enabled_summaryOff" msgid="4300790190221203756">"APN er deaktivert"</string>
@@ -1697,7 +1697,7 @@
<skip />
<string name="data_usage_summary_title" msgid="3804110657238092929">"Databruk"</string>
<string name="data_usage_cycle" msgid="5652529796195787949">"Databruksyklus"</string>
- <string name="data_usage_menu_roaming" msgid="8042359966835203296">"Datastreifing"</string>
+ <string name="data_usage_menu_roaming" msgid="8042359966835203296">"Roaming"</string>
<string name="data_usage_menu_restrict_background" msgid="1989394568592253331">"Begrensning av bakgrunnsdata"</string>
<string name="data_usage_menu_split_4g" msgid="5322857680792601899">"Separat 4G-bruk"</string>
<string name="data_usage_menu_show_wifi" msgid="5056401102877964564">"Vis Wi-Fi-bruk"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index bafc8be..255fed7 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -713,19 +713,19 @@
<string name="dock_settings" msgid="1820107306693002541">"Dock"</string>
<string name="dock_settings_title" msgid="9161438664257429372">"Configurações de dock"</string>
<string name="dock_audio_settings_title" msgid="3324750259959570305">"Áudio"</string>
- <string name="dock_audio_summary_desk" msgid="6487784412371139335">"Configurações para o dock do computador anexo"</string>
- <string name="dock_audio_summary_car" msgid="6740897586006248450">"Configurações para o dock do carro anexo"</string>
+ <string name="dock_audio_summary_desk" msgid="6487784412371139335">"Configurações para a dock conectada ao computador"</string>
+ <string name="dock_audio_summary_car" msgid="6740897586006248450">"Configurações para a dock p/ carro conectada"</string>
<string name="dock_audio_summary_none" product="tablet" msgid="8215337394914283607">"Tablet não encaixado"</string>
<string name="dock_audio_summary_none" product="default" msgid="289909253741048784">"Telefone não encaixado"</string>
<string name="dock_audio_summary_unknown" msgid="4465059868974255693">"Configurações para o dock anexo"</string>
<string name="dock_not_found_title" msgid="3290961741828952424">"Dock não encontrado"</string>
- <string name="dock_not_found_text" product="tablet" msgid="8405432495282299143">"É necessário que você encaixe seu tablet antes de configurar o áudio do dock."</string>
- <string name="dock_not_found_text" product="default" msgid="1460497923342627801">"É necessário que você encaixe o telefone antes de configurar o áudio do dock."</string>
- <string name="dock_sounds_enable_title" msgid="885839627097024110">"Som de inserção no dock"</string>
- <string name="dock_sounds_enable_summary_on" product="tablet" msgid="838102386448981339">"Reproduzir sons ao inserir ou remover o tablet do dock"</string>
- <string name="dock_sounds_enable_summary_on" product="default" msgid="8491180514199743771">"Reproduzir sons ao inserir ou remover o telefone do dock."</string>
- <string name="dock_sounds_enable_summary_off" product="tablet" msgid="5077843049805652363">"Não reproduzir sons ao inserir ou remover o tablet do dock"</string>
- <string name="dock_sounds_enable_summary_off" product="default" msgid="3151046599205265919">"Não reproduzir sons ao inserir ou remover o telefone do dock."</string>
+ <string name="dock_not_found_text" product="tablet" msgid="8405432495282299143">"É necessário que você encaixe seu tablet antes de configurar o áudio da dock."</string>
+ <string name="dock_not_found_text" product="default" msgid="1460497923342627801">"É necessário que você encaixe o telefone antes de configurar o áudio da dock."</string>
+ <string name="dock_sounds_enable_title" msgid="885839627097024110">"Som de inserção na dock"</string>
+ <string name="dock_sounds_enable_summary_on" product="tablet" msgid="838102386448981339">"Reproduzir sons ao inserir ou remover o tablet da dock"</string>
+ <string name="dock_sounds_enable_summary_on" product="default" msgid="8491180514199743771">"Reproduzir sons ao inserir ou remover o telefone da dock."</string>
+ <string name="dock_sounds_enable_summary_off" product="tablet" msgid="5077843049805652363">"Não reproduzir sons ao inserir ou remover o tablet da dock"</string>
+ <string name="dock_sounds_enable_summary_off" product="default" msgid="3151046599205265919">"Não reproduzir sons ao inserir ou remover o telefone da dock."</string>
<string name="account_settings" msgid="6403589284618783461">"Contas"</string>
<string name="search_settings" msgid="1910951467596035063">"Pesquisar"</string>
<string name="search_settings_summary" msgid="9205656546570654169">"Gerenciar configurações e histórico de pesquisa"</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4cb20c4..c266e0b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4460,6 +4460,8 @@
<string name="user_rename">RENAME</string>
<!-- Preference label for custom restrictions [CHAR LIMIT=35] -->
<string name="app_restrictions_custom_label">Set application limits</string>
+ <!-- Summary for app entries that are controlled by another entry [CHAR LIMIT=none] -->
+ <string name="user_restrictions_controlled_by">Controlled by <xliff:g id="app">%1$s</xliff:g></string>
<!-- Restrictions title for configuring wifi and mobile [CHAR LIMIT=35] -->
<string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 8b7a8c6..ec00892 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -726,25 +726,22 @@
// Determine enabled services and accessibility state.
ComponentName toggledService = ComponentName.unflattenFromString(preferenceKey);
- final boolean accessibilityEnabled;
+ boolean accessibilityEnabled = false;
if (enabled) {
+ enabledServices.add(toggledService);
// Enabling at least one service enables accessibility.
accessibilityEnabled = true;
- enabledServices.add(toggledService);
} else {
+ enabledServices.remove(toggledService);
// Check how many enabled and installed services are present.
- int enabledAndInstalledServiceCount = 0;
Set<ComponentName> installedServices = sInstalledServices;
for (ComponentName enabledService : enabledServices) {
if (installedServices.contains(enabledService)) {
- enabledAndInstalledServiceCount++;
+ // Disabling the last service disables accessibility.
+ accessibilityEnabled = true;
+ break;
}
}
- // Disabling the last service disables accessibility.
- accessibilityEnabled = enabledAndInstalledServiceCount > 1
- || (enabledAndInstalledServiceCount == 1
- && !installedServices.contains(toggledService));
- enabledServices.remove(toggledService);
}
// Update the enabled services setting.
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
index 8ea99a1..6600703 100644
--- a/src/com/android/settings/LocalePicker.java
+++ b/src/com/android/settings/LocalePicker.java
@@ -23,8 +23,10 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
+import android.content.Context;
import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
+import com.android.settings.DevelopmentSettings;
import java.util.Locale;
@@ -46,6 +48,15 @@
}
@Override
+ protected boolean isInDeveloperMode() {
+ final boolean showDev = getActivity().getSharedPreferences(DevelopmentSettings.PREF_FILE,
+ Context.MODE_PRIVATE).getBoolean(
+ DevelopmentSettings.PREF_SHOW,
+ android.os.Build.TYPE.equals("eng"));
+ return showDev;
+ }
+
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(SAVE_TARGET_LOCALE)) {
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index c659f70..80a3d1f 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -16,22 +16,22 @@
package com.android.settings.bluetooth;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
import android.app.AlertDialog;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.DialogInterface;
-import android.graphics.drawable.Drawable;
+import android.os.UserManager;
import android.preference.Preference;
import android.text.Html;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
-import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
-import android.view.ViewGroup;
import android.widget.ImageView;
import com.android.settings.R;
@@ -66,7 +66,10 @@
mCachedDevice = cachedDevice;
if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
- setWidgetLayoutResource(R.layout.preference_bluetooth);
+ UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
+ if (! um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) {
+ setWidgetLayoutResource(R.layout.preference_bluetooth);
+ }
}
mCachedDevice.registerCallback(this);
diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java
index c0bfd32..ab657e0 100755
--- a/src/com/android/settings/bluetooth/BluetoothSettings.java
+++ b/src/com/android/settings/bluetooth/BluetoothSettings.java
@@ -16,6 +16,8 @@
package com.android.settings.bluetooth;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
import android.app.ActionBar;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
@@ -25,6 +27,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
+import android.os.UserManager;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
@@ -32,16 +35,13 @@
import android.preference.PreferenceScreen;
import android.util.Log;
import android.view.Gravity;
-import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.Switch;
import android.widget.TextView;
-import com.android.settings.ProgressCategory;
import com.android.settings.R;
/**
@@ -74,6 +74,8 @@
private final IntentFilter mIntentFilter;
+ private UserManager mUserManager;
+
// accessed from inner class (not private to avoid thunks)
Preference mMyDevicePreference;
@@ -100,6 +102,7 @@
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
+ mUserManager = (UserManager) getSystemService(Context.USER_SERVICE);
mActivityStarted = (savedInstanceState == null); // don't auto start scan after rotation
mEmptyView = (TextView) getView().findViewById(android.R.id.empty);
@@ -167,6 +170,9 @@
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (mLocalAdapter == null) return;
+ // If the user is not allowed to configure bluetooth, do not show the menu.
+ if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return;
+
boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON;
boolean isDiscovering = mLocalAdapter.isDiscovering();
int textId = isDiscovering ? R.string.bluetooth_searching_for_devices :
@@ -213,6 +219,7 @@
}
private void startScanning() {
+ if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return;
if (!mAvailableDevicesCategoryIsPresent) {
getPreferenceScreen().addPreference(mAvailableDevicesCategory);
}
@@ -259,12 +266,14 @@
mMyDevicePreference.setEnabled(true);
preferenceScreen.addPreference(mMyDevicePreference);
- if (mDiscoverableEnabler == null) {
- mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
- mLocalAdapter, mMyDevicePreference);
- mDiscoverableEnabler.resume();
- LocalBluetoothManager.getInstance(getActivity()).setDiscoverableEnabler(
- mDiscoverableEnabler);
+ if (! mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) {
+ if (mDiscoverableEnabler == null) {
+ mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(),
+ mLocalAdapter, mMyDevicePreference);
+ mDiscoverableEnabler.resume();
+ LocalBluetoothManager.getInstance(getActivity()).setDiscoverableEnabler(
+ mDiscoverableEnabler);
+ }
}
// Paired devices category
@@ -278,7 +287,9 @@
BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
- mDiscoverableEnabler.setNumberOfPairedDevices(numberOfPairedDevices);
+ if (mDiscoverableEnabler != null) {
+ mDiscoverableEnabler.setNumberOfPairedDevices(numberOfPairedDevices);
+ }
// Available devices category
if (mAvailableDevicesCategory == null) {
@@ -286,9 +297,11 @@
} else {
mAvailableDevicesCategory.removeAll();
}
- addDeviceCategory(mAvailableDevicesCategory,
- R.string.bluetooth_preference_found_devices,
- BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER);
+ if (! mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) {
+ addDeviceCategory(mAvailableDevicesCategory,
+ R.string.bluetooth_preference_found_devices,
+ BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER);
+ }
int numberOfAvailableDevices = mAvailableDevicesCategory.getPreferenceCount();
mAvailableDevicesCategoryIsPresent = true;
@@ -353,6 +366,8 @@
public void onClick(View v) {
// User clicked on advanced options icon for a device in the list
if (v.getTag() instanceof CachedBluetoothDevice) {
+ if (mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) return;
+
CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
Bundle args = new Bundle(1);
diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java
index 87d31e7..027ceed 100644
--- a/src/com/android/settings/bluetooth/DevicePickerFragment.java
+++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java
@@ -16,11 +16,15 @@
package com.android.settings.bluetooth;
+import static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
+
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothDevicePicker;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.os.UserManager;
import com.android.settings.R;
@@ -51,7 +55,9 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(getString(R.string.device_picker));
- mStartScanOnResume = (savedInstanceState == null); // don't start scan after rotation
+ UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
+ mStartScanOnResume = !um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)
+ && (savedInstanceState == null); // don't start scan after rotation
}
@Override
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 1dcb02c..2a3d5f8 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -606,7 +606,7 @@
app.tcpBytesSent = tcpBytesSent;
if (u.getUid() == Process.WIFI_UID) {
mWifiSippers.add(app);
- } else if (u.getUid() == Process.BLUETOOTH_GID) {
+ } else if (u.getUid() == Process.BLUETOOTH_UID) {
mBluetoothSippers.add(app);
} else if (userId != UserHandle.myUserId()
&& UserHandle.getAppId(u.getUid()) >= Process.FIRST_APPLICATION_UID) {
@@ -627,7 +627,7 @@
if (power != 0) {
if (u.getUid() == Process.WIFI_UID) {
mWifiPower += power;
- } else if (u.getUid() == Process.BLUETOOTH_GID) {
+ } else if (u.getUid() == Process.BLUETOOTH_UID) {
mBluetoothPower += power;
} else if (isOtherUser) {
Double userPower = mUserPower.get(userId);
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index c2ff0d9..2a5adb1 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -238,7 +238,16 @@
// and want to pretend that the language is valid for all locales.
// We need a way to support languages that aren't tied to a particular
// locale instead of hiding the locale qualifier.
- if (hasOnlyOneLanguageInstance(language,
+ if (language.equals("zz")) {
+ String country = conf.locale.getCountry();
+ if (country.equals("ZZ")) {
+ localeString = "[Developer] Accented English (zz_ZZ)";
+ } else if (country.equals("ZY")) {
+ localeString = "[Developer] Fake Bi-Directional (zz_ZY)";
+ } else {
+ localeString = "";
+ }
+ } else if (hasOnlyOneLanguageInstance(language,
Resources.getSystem().getAssets().getLocales())) {
localeString = conf.locale.getDisplayLanguage(conf.locale);
} else {
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index 90ebdae..6ea583e 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -16,12 +16,14 @@
package com.android.settings.users;
+import android.app.AppGlobals;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.RestrictionEntry;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -34,6 +36,7 @@
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.CheckBoxPreference;
@@ -78,6 +81,8 @@
private static final String TAG = AppRestrictionsFragment.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
private static final String PKG_PREFIX = "pkg_";
private static final String KEY_USER_INFO = "user_info";
@@ -98,6 +103,20 @@
private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap =
new HashMap<Integer,AppRestrictionsPreference>();
+ static class SelectableAppInfo {
+ String packageName;
+ CharSequence appName;
+ CharSequence activityName;
+ Drawable icon;
+ SelectableAppInfo masterEntry;
+
+ @Override
+ public String toString() {
+ return packageName + ": appName=" + appName + "; activityName=" + activityName
+ + "; icon=" + icon + "; masterEntry=" + masterEntry;
+ }
+ }
+
public static class Activity extends PreferenceActivity {
@Override
public Intent getIntent() {
@@ -113,7 +132,7 @@
private OnClickListener listener;
private ArrayList<RestrictionEntry> restrictions;
boolean panelOpen;
- private boolean required;
+ private boolean immutable;
List<Preference> childPreferences = new ArrayList<Preference>();
AppRestrictionsPreference(Context context, OnClickListener listener) {
@@ -130,12 +149,12 @@
this.restrictions = restrictions;
}
- void setRequired(boolean required) {
- this.required = required;
+ void setImmutable(boolean immutable) {
+ this.immutable = immutable;
}
- boolean isRequired() {
- return required;
+ boolean isImmutable() {
+ return immutable;
}
RestrictionEntry getRestriction(String key) {
@@ -168,10 +187,10 @@
appRestrictionsPref.setTag(this);
ViewGroup widget = (ViewGroup) view.findViewById(android.R.id.widget_frame);
- widget.setEnabled(!isRequired());
+ widget.setEnabled(!isImmutable());
if (widget.getChildCount() > 0) {
final Switch switchView = (Switch) widget.getChildAt(0);
- switchView.setEnabled(!isRequired());
+ switchView.setEnabled(!isImmutable());
switchView.setTag(this);
switchView.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
@@ -219,7 +238,7 @@
mUserPreference.setText(info.name);
}
- private void addSystemApps(List<ApplicationInfo> visibleApps, Intent intent) {
+ private void addSystemApps(List<SelectableAppInfo> visibleApps, Intent intent) {
final PackageManager pm = getActivity().getPackageManager();
List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0);
for (ResolveInfo app : launchableApps) {
@@ -228,7 +247,13 @@
if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0
|| (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
// System app
- visibleApps.add(app.activityInfo.applicationInfo);
+ SelectableAppInfo info = new SelectableAppInfo();
+ info.packageName = app.activityInfo.packageName;
+ info.appName = app.activityInfo.applicationInfo.loadLabel(pm);
+ info.icon = app.activityInfo.loadIcon(pm);
+ info.activityName = app.activityInfo.loadLabel(pm);
+ if (info.activityName == null) info.activityName = info.appName;
+ visibleApps.add(info);
}
}
}
@@ -236,10 +261,11 @@
private void populateApps() {
mAppList.setOrderingAsAdded(false);
- List<ApplicationInfo> visibleApps = new ArrayList<ApplicationInfo>();
+ List<SelectableAppInfo> visibleApps = new ArrayList<SelectableAppInfo>();
// TODO: Do this asynchronously since it can be a long operation
final Context context = getActivity();
PackageManager pm = context.getPackageManager();
+ IPackageManager ipm = AppGlobals.getPackageManager();
// Add launchers
Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
@@ -255,51 +281,103 @@
if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0
&& (app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
// Downloaded app
- visibleApps.add(app);
+ SelectableAppInfo info = new SelectableAppInfo();
+ info.packageName = app.packageName;
+ info.appName = app.loadLabel(pm);
+ info.activityName = info.appName;
+ info.icon = app.loadIcon(pm);
+ visibleApps.add(info);
}
}
- Collections.sort(visibleApps, new AppLabelComparator(pm));
+ // Now check apps that are installed on target user
+ List<ApplicationInfo> userApps = null;
+ try {
+ userApps = ipm.getInstalledApplications(
+ 0, mUser.getIdentifier()).getList();
+ } catch (RemoteException re) {
+ }
+
+ if (userApps != null) {
+ for (ApplicationInfo app : userApps) {
+ if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0
+ && (app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
+ // Downloaded app
+ SelectableAppInfo info = new SelectableAppInfo();
+ info.packageName = app.packageName;
+ info.appName = app.loadLabel(pm);
+ info.activityName = info.appName;
+ info.icon = app.loadIcon(pm);
+ visibleApps.add(info);
+ }
+ }
+ }
+ Collections.sort(visibleApps, new AppLabelComparator());
+
+ // Remove dupes
for (int i = visibleApps.size() - 1; i > 1; i--) {
- ApplicationInfo appInfo = visibleApps.get(i);
- if (appInfo.packageName.equals(visibleApps.get(i-1).packageName)) {
+ SelectableAppInfo info = visibleApps.get(i);
+ if (DEBUG) Log.i(TAG, info.toString());
+ if (info.packageName.equals(visibleApps.get(i-1).packageName)
+ && info.activityName.equals(visibleApps.get(i-1).activityName)) {
visibleApps.remove(i);
}
}
+
+ // Establish master/slave relationship for entries that share a package name
+ HashMap<String,SelectableAppInfo> packageMap = new HashMap<String,SelectableAppInfo>();
+ for (SelectableAppInfo info : visibleApps) {
+ if (packageMap.containsKey(info.packageName)) {
+ info.masterEntry = packageMap.get(info.packageName);
+ } else {
+ packageMap.put(info.packageName, info);
+ }
+ }
+
Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
- final List<ResolveInfo> existingApps = pm.queryIntentActivitiesAsUser(launcherIntent,
- 0, mUser.getIdentifier());
int i = 0;
if (visibleApps.size() > 0) {
- for (ApplicationInfo app : visibleApps) {
- if (app.packageName == null) continue;
+ for (SelectableAppInfo app : visibleApps) {
String packageName = app.packageName;
- Drawable icon = app.loadIcon(pm);
- CharSequence label = app.loadLabel(pm);
+ if (packageName == null) continue;
+ final boolean isSettingsApp = packageName.equals(getActivity().getPackageName());
AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
- p.setIcon(icon);
- p.setTitle(label);
+ final boolean hasSettings = resolveInfoListHasPackage(receivers, packageName);
+ p.setIcon(app.icon);
+ p.setTitle(app.activityName);
+ if (app.masterEntry != null) {
+ p.setSummary(getActivity().getString(R.string.user_restrictions_controlled_by,
+ app.masterEntry.activityName));
+ }
p.setKey(PKG_PREFIX + packageName);
- p.setSettingsEnabled(hasPackage(receivers, packageName)
- || packageName.equals(getActivity().getPackageName()));
+ p.setSettingsEnabled(hasSettings || isSettingsApp);
p.setPersistent(false);
p.setOnPreferenceChangeListener(this);
p.setOnPreferenceClickListener(this);
+ PackageInfo pi = null;
try {
- PackageInfo pi = pm.getPackageInfo(packageName, 0);
- if (pi.requiredForAllUsers) {
- p.setChecked(true);
- p.setRequired(true);
- } else if (!mNewUser && hasPackage(existingApps, packageName)) {
- p.setChecked(true);
- }
+ pi = pm.getPackageInfo(packageName, 0);
} catch (NameNotFoundException re) {
- // This would be bad
+ try {
+ pi = ipm.getPackageInfo(packageName, 0, mUser.getIdentifier());
+ } catch (RemoteException e) {
+ }
}
-
+ if (pi != null && pi.requiredForAllUsers) {
+ p.setChecked(true);
+ p.setImmutable(true);
+ // If the app is required and has no restrictions, skip showing it
+ if (!hasSettings && !isSettingsApp) continue;
+ } else if (!mNewUser && appInfoListHasPackage(userApps, packageName)) {
+ p.setChecked(true);
+ }
+ if (app.masterEntry != null) {
+ p.setImmutable(true);
+ p.setChecked(mSelectedPackages.get(packageName));
+ }
mAppList.addPreference(p);
- if (packageName.equals(getActivity().getPackageName())) {
+ if (isSettingsApp) {
p.setOrder(MAX_APP_RESTRICTIONS * 1);
} else {
p.setOrder(MAX_APP_RESTRICTIONS * (i + 2));
@@ -310,28 +388,17 @@
}
}
- private class AppLabelComparator implements Comparator<ApplicationInfo> {
-
- PackageManager pm;
-
- private AppLabelComparator(PackageManager pm) {
- this.pm = pm;
- }
-
- private CharSequence getLabel(ApplicationInfo info) {
- // TODO: Optimize this with a cache
- return info.loadLabel(pm);
- }
+ private class AppLabelComparator implements Comparator<SelectableAppInfo> {
@Override
- public int compare(ApplicationInfo lhs, ApplicationInfo rhs) {
- String lhsLabel = getLabel(lhs).toString();
- String rhsLabel = getLabel(rhs).toString();
- return lhsLabel.compareTo(rhsLabel);
+ public int compare(SelectableAppInfo lhs, SelectableAppInfo rhs) {
+ String lhsLabel = lhs.activityName.toString();
+ String rhsLabel = rhs.activityName.toString();
+ return lhsLabel.toLowerCase().compareTo(rhsLabel.toLowerCase());
}
}
- private boolean hasPackage(List<ResolveInfo> receivers, String packageName) {
+ private boolean resolveInfoListHasPackage(List<ResolveInfo> receivers, String packageName) {
for (ResolveInfo info : receivers) {
if (info.activityInfo.packageName.equals(packageName)) {
return true;
@@ -340,16 +407,37 @@
return false;
}
+ private boolean appInfoListHasPackage(List<ApplicationInfo> apps, String packageName) {
+ for (ApplicationInfo info : apps) {
+ if (info.packageName.equals(packageName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void updateAllEntries(String prefKey, boolean checked) {
+ for (int i = 0; i < mAppList.getPreferenceCount(); i++) {
+ Preference pref = mAppList.getPreference(i);
+ if (pref instanceof AppRestrictionsPreference) {
+ if (prefKey.equals(pref.getKey())) {
+ ((AppRestrictionsPreference) pref).setChecked(checked);
+ }
+ }
+ }
+ }
+
@Override
public void onClick(View v) {
if (v.getTag() instanceof AppRestrictionsPreference) {
AppRestrictionsPreference pref = (AppRestrictionsPreference) v.getTag();
if (v.getId() == R.id.app_restrictions_settings) {
toggleAppPanel(pref);
- } else if (!pref.isRequired()) {
+ } else if (!pref.isImmutable()) {
pref.setChecked(!pref.isChecked());
mSelectedPackages.put(pref.getKey().substring(PKG_PREFIX.length()),
pref.isChecked());
+ updateAllEntries(pref.getKey(), pref.isChecked());
}
}
}
@@ -597,9 +685,10 @@
public boolean onPreferenceClick(Preference preference) {
if (preference.getKey().startsWith(PKG_PREFIX)) {
AppRestrictionsPreference arp = (AppRestrictionsPreference) preference;
- if (!arp.isRequired()) {
+ if (!arp.isImmutable()) {
arp.setChecked(!arp.isChecked());
mSelectedPackages.put(arp.getKey().substring(PKG_PREFIX.length()), arp.isChecked());
+ updateAllEntries(arp.getKey(), arp.isChecked());
}
return true;
}