summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-01-07 10:29:58 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-01-07 10:29:58 +0000
commit63dac78706d90b76a13733195102cdf0c5ceb274 (patch)
tree94ede8109bdb9d930df864c65f4677e435ad0817
parent7ebc6a8122120bae583a287aca93a04c83ecc6dd (diff)
parentab62079aa17c6cfc79977c0a384a00c23d7b14c4 (diff)
downloadbase-63dac78706d90b76a13733195102cdf0c5ceb274.tar.gz
Snap for 11282710 from ab62079aa17c6cfc79977c0a384a00c23d7b14c4 to mainline-documentsui-releaseaml_doc_341510050
Change-Id: I4da69f1f6fe5b4014ea04fd7c75760947137b3db
-rw-r--r--Android.bp4
-rw-r--r--core/res/res/values-ar/strings.xml2
-rw-r--r--core/res/res/values-da/strings.xml2
-rw-r--r--core/res/res/values-de/strings.xml2
-rw-r--r--core/res/res/values-eu/strings.xml2
-rw-r--r--core/res/res/values-fr/strings.xml2
-rw-r--r--core/res/res/values-sw/strings.xml2
-rw-r--r--packages/InputDevices/res/values-uk/strings.xml68
-rw-r--r--packages/SettingsLib/res/values-sw/strings.xml18
-rw-r--r--packages/SystemUI/res/values-hi/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kn/strings.xml2
-rw-r--r--packages/SystemUI/res/values-kn/tiles_states_strings.xml58
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java29
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java30
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java66
-rw-r--r--services/tests/servicestests/res/xml/user_100_v9.xml20
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java90
-rw-r--r--services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java5
18 files changed, 303 insertions, 101 deletions
diff --git a/Android.bp b/Android.bp
index 773528c054e0..44c6f0b15d46 100644
--- a/Android.bp
+++ b/Android.bp
@@ -561,10 +561,6 @@ java_library {
// TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp
metalava_framework_docs_args = "" +
- "--api-lint-ignore-prefix android.icu. " +
- "--api-lint-ignore-prefix java. " +
- "--api-lint-ignore-prefix junit. " +
- "--api-lint-ignore-prefix org. " +
"--error NoSettingsProvider " +
"--error UnhiddenSystemApi " +
"--force-convert-to-warning-nullability-annotations +*:-android.*:+android.icu.*:-dalvik.* " +
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 702d2331feab..b15ff58bf2ab 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -2300,7 +2300,7 @@
<string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"إزالة الحظر"</string>
<string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"الخصوصية في جهاز الاستشعار"</string>
<string name="splash_screen_view_icon_description" msgid="180638751260598187">"رمز التطبيق"</string>
- <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"الصورة الذهنية للعلامة التجارية للتطبيق"</string>
+ <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"هوية العلامة التجارية للتطبيق"</string>
<string name="view_and_control_notification_title" msgid="4300765399209912240">"التحقّق من إعدادات الوصول"</string>
<string name="view_and_control_notification_content" msgid="8003766498562604034">"يمكن لخدمة <xliff:g id="SERVICE_NAME">%s</xliff:g> الاطّلاع على شاشتك والتحكّم فيها. انقر لمراجعة الإعدادات."</string>
<string name="ui_translation_accessibility_translated_text" msgid="3197547218178944544">"<xliff:g id="MESSAGE">%1$s</xliff:g> (مُترجَم)."</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index cdde32ca2bdf..19ba52e6b751 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -2034,7 +2034,7 @@
<string name="autofill_save_type_password" msgid="5624528786144539944">"adgangskode"</string>
<string name="autofill_save_type_address" msgid="3111006395818252885">"adresse"</string>
<string name="autofill_save_type_credit_card" msgid="3583795235862046693">"kreditkort"</string>
- <string name="autofill_save_type_debit_card" msgid="3169397504133097468">"betalingskort"</string>
+ <string name="autofill_save_type_debit_card" msgid="3169397504133097468">"debetkort"</string>
<string name="autofill_save_type_payment_card" msgid="6555012156728690856">"betalingskort"</string>
<string name="autofill_save_type_generic_card" msgid="1019367283921448608">"kort"</string>
<string name="autofill_save_type_username" msgid="1018816929884640882">"brugernavn"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index e20645ebb62b..1dea3b2a7a6d 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -354,7 +354,7 @@
<string name="permlab_fullScreenIntent" msgid="4310888199502509104">"Benachrichtigungen auf einem gesperrten Gerät als Vollbildaktivitäten anzeigen"</string>
<string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"Ermöglicht der App, Benachrichtigungen auf einem gesperrten Gerät als Vollbildaktivitäten anzuzeigen"</string>
<string name="permlab_install_shortcut" msgid="7451554307502256221">"Verknüpfungen installieren"</string>
- <string name="permdesc_install_shortcut" msgid="4476328467240212503">"ohne Zutun des Nutzers Verknüpfungen zum Startbildschirm hinzufügen."</string>
+ <string name="permdesc_install_shortcut" msgid="4476328467240212503">"Ermöglicht einer App, dem Startbildschirm ohne Zutun des Nutzers Verknüpfungen hinzuzufügen."</string>
<string name="permlab_uninstall_shortcut" msgid="295263654781900390">"Verknüpfungen deinstallieren"</string>
<string name="permdesc_uninstall_shortcut" msgid="1924735350988629188">"Ermöglicht einer App das Entfernen von Verknüpfungen vom Startbildschirm ohne Eingriff des Nutzers"</string>
<string name="permlab_processOutgoingCalls" msgid="4075056020714266558">"Ausgehende Anrufe umleiten"</string>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index efdc69c3c942..4317cd5d48cc 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -2315,7 +2315,7 @@
<string name="default_card_name" msgid="9198284935962911468">"<xliff:g id="CARDNUMBER">%d</xliff:g> TXARTELA"</string>
<string name="permlab_companionProfileWatch" msgid="2457738382085872542">"Aplikazio osagarrien erloju-profilaren baimena erlojuak kudeatzeko"</string>
<string name="permdesc_companionProfileWatch" msgid="5655698581110449397">"Erlojuak kudeatzeko baimena ematen die aplikazio osagarriei."</string>
- <string name="permlab_observeCompanionDevicePresence" msgid="9008994909653990465">"Begiratu gailu osagarrien presentzia"</string>
+ <string name="permlab_observeCompanionDevicePresence" msgid="9008994909653990465">"Begiratu gailu osagarrien presentziari"</string>
<string name="permdesc_observeCompanionDevicePresence" msgid="3011699826788697852">"Gailu osagarrien presentzia begiratzeko baimena ematen die aplikazio osagarriei gailuak inguruan edo urrun daudenean."</string>
<string name="permlab_deliverCompanionMessages" msgid="3931552294842980887">"Entregatu aplikazio osagarrien mezuak"</string>
<string name="permdesc_deliverCompanionMessages" msgid="2170847384281412850">"Beste gailuetan mezuak entregatzeko baimena ematen die aplikazio osagarriei."</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 4c283ac0377c..d0e0e37a2389 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1715,7 +1715,7 @@
<string name="color_inversion_feature_name" msgid="2672824491933264951">"Inversion des couleurs"</string>
<string name="color_correction_feature_name" msgid="7975133554160979214">"Correction des couleurs"</string>
<string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Mode une main"</string>
- <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Encore moins lumineux"</string>
+ <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Luminosité ultra-réduite"</string>
<string name="hearing_aids_feature_name" msgid="1125892105105852542">"Appareils auditifs"</string>
<string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Touches de volume appuyées de manière prolongée. Service <xliff:g id="SERVICE_NAME">%1$s</xliff:g> activé."</string>
<string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Touches de volume appuyées de manière prolongée. Service <xliff:g id="SERVICE_NAME">%1$s</xliff:g> désactivé."</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 09c295331330..122a3c821490 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -572,7 +572,7 @@
<string name="permdesc_changeWimaxState" product="tablet" msgid="4011097664859480108">"Inaruhusu programu kuunganisha kompyuta kibao, na kukata kompyuta kibao kutoka mitandao ya WiMAX."</string>
<string name="permdesc_changeWimaxState" product="tv" msgid="5373274458799425276">"Huruhusu programu iunganishe na kutenganisha kifaa chako cha Android TV na mitandao ya WiMAX."</string>
<string name="permdesc_changeWimaxState" product="default" msgid="1551666203780202101">"Inaruhusu programu kuunganisha simu kwenye, na kukata simu kutoka mitandao ya WiMAX."</string>
- <string name="permlab_bluetooth" msgid="586333280736937209">"oanisha na vifaa vya Bluetooth"</string>
+ <string name="permlab_bluetooth" msgid="586333280736937209">"unganisha na vifaa vya Bluetooth"</string>
<string name="permdesc_bluetooth" product="tablet" msgid="3053222571491402635">"Huruhusu programu kuona usanidi wa Bluetooth kwenye kompyuta kibao, na kutuma na kukubali miunganisho kwa vifaa vilivyooanishwa."</string>
<string name="permdesc_bluetooth" product="tv" msgid="8851534496561034998">"Huruhusu programu iangalie mipangilio iliyowekwa ya Bluetooth kwenye kifaa chako cha Android TV na kufanya na kukubali miunganisho na vifaa vilivyooanishwa."</string>
<string name="permdesc_bluetooth" product="default" msgid="2779606714091276746">"Huruhusu programu kuona usanidi wa Bluetooth kwenye simu, na kutuma na kukubali miunganisho kwa vifaa vilivyooanishwa."</string>
diff --git a/packages/InputDevices/res/values-uk/strings.xml b/packages/InputDevices/res/values-uk/strings.xml
index 5368f2c64828..71b3496c929f 100644
--- a/packages/InputDevices/res/values-uk/strings.xml
+++ b/packages/InputDevices/res/values-uk/strings.xml
@@ -3,49 +3,49 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="8016145283189546017">"Пристрої вводу"</string>
<string name="keyboard_layouts_label" msgid="6688773268302087545">"Клавіатура Android"</string>
- <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"англійська (Велика Британія)"</string>
- <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"англійська (США)"</string>
- <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"англійська (США), міжнародна"</string>
- <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"англійська (США), розкладка Colemak"</string>
- <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"англійська (США), розкладка Дворака"</string>
- <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"англійська (США), розкладка Workman"</string>
- <string name="keyboard_layout_german_label" msgid="8451565865467909999">"німецька"</string>
- <string name="keyboard_layout_french_label" msgid="813450119589383723">"французька"</string>
- <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"французька (Канада)"</string>
- <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"російська"</string>
- <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"російська, розкладка Mac"</string>
- <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"іспанська"</string>
- <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"французька (Швейцарія)"</string>
- <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"німецька (Швейцарія)"</string>
- <string name="keyboard_layout_belgian" msgid="2011984572838651558">"бельгійська"</string>
- <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"болгарська"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"Англійська (Велика Британія)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"Англійська (США)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"Англійська (США), міжнародна"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"Англійська (США), розкладка Colemak"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"Англійська (США), розкладка Дворака"</string>
+ <string name="keyboard_layout_english_us_workman_label" msgid="2944541595262173111">"Англійська (США), розкладка Workman"</string>
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Німецька"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"Французька"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Французька (Канада)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Російська"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Російська, розкладка Mac"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Іспанська"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Французька (Швейцарія)"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Німецька (Швейцарія)"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Бельгійська"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Болгарська"</string>
<string name="keyboard_layout_bulgarian_phonetic" msgid="7568914730360106653">"Болгарська (фонетична)"</string>
- <string name="keyboard_layout_italian" msgid="6497079660449781213">"італійська"</string>
- <string name="keyboard_layout_danish" msgid="8036432066627127851">"данська"</string>
- <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"норвезька"</string>
- <string name="keyboard_layout_swedish" msgid="732959109088479351">"шведська"</string>
- <string name="keyboard_layout_finnish" msgid="5585659438924315466">"фінська"</string>
- <string name="keyboard_layout_croatian" msgid="4172229471079281138">"хорватська"</string>
- <string name="keyboard_layout_czech" msgid="1349256901452975343">"чеська"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"Італійська"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"Данська"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"Норвезька"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"Шведська"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"Фінська"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"Хорватська"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"Чеська"</string>
<string name="keyboard_layout_czech_qwerty" msgid="3331402534128515501">"Чеська (QWERTY)"</string>
- <string name="keyboard_layout_estonian" msgid="8775830985185665274">"естонська"</string>
- <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"угорська"</string>
- <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ісландська"</string>
- <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"бразильська"</string>
- <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"португальська"</string>
- <string name="keyboard_layout_slovak" msgid="2469379934672837296">"словацька"</string>
- <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"словенська"</string>
- <string name="keyboard_layout_turkish" msgid="7736163250907964898">"турецька"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"Естонська"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"Угорська"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"Ісландська"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"Бразильська"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"Португальська"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"Словацька"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"Словенська"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Турецька"</string>
<string name="keyboard_layout_turkish_f" msgid="9130320856010776018">"Турецька-F"</string>
- <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"українська"</string>
- <string name="keyboard_layout_arabic" msgid="5671970465174968712">"арабська"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Українська"</string>
+ <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Арабська"</string>
<string name="keyboard_layout_greek" msgid="7289253560162386040">"Грецька"</string>
<string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Іврит"</string>
<string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Литовська"</string>
<string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Іспанська (латиниця)"</string>
<string name="keyboard_layout_latvian" msgid="4405417142306250595">"Латвійська"</string>
<string name="keyboard_layout_persian" msgid="3920643161015888527">"Перська"</string>
- <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербайджанська"</string>
+ <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайджанська"</string>
<string name="keyboard_layout_polish" msgid="1121588624094925325">"Польська"</string>
<string name="keyboard_layout_belarusian" msgid="7619281752698687588">"Білоруська"</string>
<string name="keyboard_layout_mongolian" msgid="7678483495823936626">"Монгольська"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 51ed204ff82d..011fb32f50b5 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -136,8 +136,8 @@
<string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Tumia kwa kuingiza"</string>
<string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Tumia kwenye Vifaa vya Kusaidia Kusikia"</string>
<string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Tumia kwa ajili ya LE_AUDIO"</string>
- <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Oanisha"</string>
- <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"OANISHA"</string>
+ <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Unganisha"</string>
+ <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"UNGANISHA"</string>
<string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Ghairi"</string>
<string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Kuoanisha hutoa ruhusa ya kufikiwa kwa unaowasiliana nao na rekodi ya simu zilizopigwa unapounganishwa."</string>
<string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Haikuwezakulinganisha na <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string>
@@ -231,10 +231,10 @@
<string name="adb_wireless_error" msgid="721958772149779856">"Hitilafu"</string>
<string name="adb_wireless_settings" msgid="2295017847215680229">"Utatuzi usiotumia waya"</string>
<string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Ili kuangalia na kutumia vifaa vinavyopatikana, washa utatuzi usiotumia waya"</string>
- <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Oanisha kifaa ukitumia msimbo wa QR"</string>
- <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Oanisha vifaa vipya ukitumia kichanganuzi cha Msimbo wa QR"</string>
- <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Oanisha kifaa ukitumia msimbo wa kuoanisha"</string>
- <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Oanisha vifaa vipya ukitumia msimbo wa tarakimu sita"</string>
+ <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"Unganisha kifaa ukitumia msimbo wa QR"</string>
+ <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"Unganisha vifaa vipya ukitumia kichanganuzi cha Msimbo wa QR"</string>
+ <string name="adb_pair_method_code_title" msgid="1122590300445142904">"Unganisha kifaa ukitumia msimbo wa kuunganisha"</string>
+ <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"Unganisha vifaa vipya ukitumia msimbo wa tarakimu sita"</string>
<string name="adb_paired_devices_title" msgid="5268997341526217362">"Vifaa vilivyooanishwa"</string>
<string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"Vilivyounganishwa kwa sasa"</string>
<string name="adb_wireless_device_details_title" msgid="7129369670526565786">"Maelezo ya kifaa"</string>
@@ -242,16 +242,16 @@
<string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"Alama bainifu ya kifaa: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string>
<string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Imeshindwa kuunganisha"</string>
<string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"Hakikisha kuwa <xliff:g id="DEVICE_NAME">%1$s</xliff:g> kimeunganishwa kwenye mtandao sahihi"</string>
- <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Oanisha na kifaa"</string>
+ <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Unganisha na kifaa"</string>
<string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Msimbo wa kuoanisha wa Wi-Fi"</string>
<string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Imeshindwa kuoanisha"</string>
<string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Hakikisha kuwa kifaa kimeunganishwa kwenye mtandao mmoja."</string>
- <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Oanisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Unganisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string>
<string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Inaoanisha kifaa…"</string>
<string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Imeshindwa kuoanisha kifaa. Huenda msimbo wa QR haukuwa sahihi au kifaa hakijaunganishwa kwenye mtandao mmoja."</string>
<string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Anwani ya IP na Mlango"</string>
<string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Changanua msimbo wa QR"</string>
- <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Oanisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Unganisha kifaa kupitia Wi-Fi kwa kuchanganua msimbo wa QR"</string>
<string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Tafadhali unganisha kwenye mtandao wa Wi-Fi"</string>
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, tatua, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Njia ya mkato ya kuripoti hitilafu"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 67414d8e6b17..fee9685b8e2b 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -612,7 +612,7 @@
<string name="keyboard_key_dpad_up" msgid="2164184320424941416">"ऊपर तीर"</string>
<string name="keyboard_key_dpad_down" msgid="2110172278574325796">"नीचे तीर"</string>
<string name="keyboard_key_dpad_left" msgid="8329738048908755640">"बायां तीर"</string>
- <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"दायां तीर"</string>
+ <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"राइट ऐरो"</string>
<string name="keyboard_key_dpad_center" msgid="4079412840715672825">"मध्य तीर"</string>
<string name="keyboard_key_tab" msgid="4592772350906496730">"Tab"</string>
<string name="keyboard_key_space" msgid="6980847564173394012">"Space"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 38ce03e5228e..8fcb56ccd4e2 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -91,7 +91,7 @@
<string name="screenshot_bottom_boundary_pct" msgid="3880821519814946478">"ಕೆಳಗಿನ ಬೌಂಡರಿ ಶೇಕಡಾ <xliff:g id="PERCENT">%1$d</xliff:g>"</string>
<string name="screenshot_left_boundary_pct" msgid="8502323556112287469">"ಎಡಭಾಗದ ಬೌಂಡರಿ ಶೇಕಡಾ <xliff:g id="PERCENT">%1$d</xliff:g>"</string>
<string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"ಬಲಭಾಗದ ಬೌಂಡರಿ ಶೇಕಡಾ <xliff:g id="PERCENT">%1$d</xliff:g>"</string>
- <string name="screenshot_work_profile_notification" msgid="203041724052970693">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿನ <xliff:g id="APP">%1$s</xliff:g> ನಲ್ಲಿ ಉಳಿಸಲಾಗಿದೆ"</string>
+ <string name="screenshot_work_profile_notification" msgid="203041724052970693">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿನ <xliff:g id="APP">%1$s</xliff:g> ನಲ್ಲಿ ಸೇವ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="screenshot_default_files_app_name" msgid="8721579578575161912">"ಫೈಲ್‌ಗಳು"</string>
<string name="screenshot_detected_template" msgid="7940376642921719915">"ಈ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು <xliff:g id="APPNAME">%1$s</xliff:g> ಪತ್ತೆಹಚ್ಚಿದೆ."</string>
<string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> ಹಾಗೂ ತೆರೆದಿರುವ ಇತರ ಆ್ಯಪ್‌ಗಳು ಈ ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿವೆ."</string>
diff --git a/packages/SystemUI/res/values-kn/tiles_states_strings.xml b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
index 16e82eacdd63..876562dd8584 100644
--- a/packages/SystemUI/res/values-kn/tiles_states_strings.xml
+++ b/packages/SystemUI/res/values-kn/tiles_states_strings.xml
@@ -33,147 +33,147 @@
<!-- no translation found for tile_states_default:2 (9192445505551219506) -->
<string-array name="tile_states_internet">
<item msgid="5499482407653291407">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="3048856902433862868">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="3048856902433862868">"ಆಫ್"</item>
<item msgid="6877982264300789870">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_wifi">
<item msgid="8054147400538405410">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4293012229142257455">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4293012229142257455">"ಆಫ್"</item>
<item msgid="6221288736127914861">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_cell">
<item msgid="1235899788959500719">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="2074416252859094119">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="2074416252859094119">"ಆಫ್"</item>
<item msgid="287997784730044767">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_battery">
<item msgid="6311253873330062961">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="7838121007534579872">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="7838121007534579872">"ಆಫ್"</item>
<item msgid="1578872232501319194">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_dnd">
<item msgid="467587075903158357">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5376619709702103243">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="5376619709702103243">"ಆಫ್"</item>
<item msgid="4875147066469902392">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_flashlight">
<item msgid="3465257127433353857">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5044688398303285224">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="5044688398303285224">"ಆಫ್"</item>
<item msgid="8527389108867454098">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_rotation">
<item msgid="4578491772376121579">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5776427577477729185">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="5776427577477729185">"ಆಫ್"</item>
<item msgid="7105052717007227415">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_bt">
<item msgid="5330252067413512277">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5315121904534729843">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="5315121904534729843">"ಆಫ್"</item>
<item msgid="503679232285959074">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_airplane">
<item msgid="1985366811411407764">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4801037224991420996">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4801037224991420996">"ಆಫ್"</item>
<item msgid="1982293347302546665">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_location">
<item msgid="3316542218706374405">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4813655083852587017">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4813655083852587017">"ಆಫ್"</item>
<item msgid="6744077414775180687">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_hotspot">
<item msgid="3145597331197351214">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="5715725170633593906">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="5715725170633593906">"ಆಫ್"</item>
<item msgid="2075645297847971154">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_color_correction">
<item msgid="2840507878437297682">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="1909756493418256167">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="1909756493418256167">"ಆಫ್"</item>
<item msgid="4531508423703413340">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_inversion">
<item msgid="3638187931191394628">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="9103697205127645916">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="9103697205127645916">"ಆಫ್"</item>
<item msgid="8067744885820618230">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_saver">
<item msgid="39714521631367660">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="6983679487661600728">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="6983679487661600728">"ಆಫ್"</item>
<item msgid="7520663805910678476">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_dark">
<item msgid="2762596907080603047">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="400477985171353">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="400477985171353">"ಆಫ್"</item>
<item msgid="630890598801118771">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_work">
<item msgid="389523503690414094">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="8045580926543311193">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="8045580926543311193">"ಆಫ್"</item>
<item msgid="4913460972266982499">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_cast">
<item msgid="6032026038702435350">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="1488620600954313499">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="1488620600954313499">"ಆಫ್"</item>
<item msgid="588467578853244035">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_night">
<item msgid="7857498964264855466">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="2744885441164350155">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="2744885441164350155">"ಆಫ್"</item>
<item msgid="151121227514952197">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_screenrecord">
<item msgid="1085836626613341403">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="8259411607272330225">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="8259411607272330225">"ಆಫ್"</item>
<item msgid="578444932039713369">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_reverse">
<item msgid="3574611556622963971">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="8707481475312432575">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="8707481475312432575">"ಆಫ್"</item>
<item msgid="8031106212477483874">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_reduce_brightness">
<item msgid="1839836132729571766">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4572245614982283078">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4572245614982283078">"ಆಫ್"</item>
<item msgid="6536448410252185664">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_cameratoggle">
<item msgid="6680671247180519913">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4765607635752003190">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4765607635752003190">"ಆಫ್"</item>
<item msgid="1697460731949649844">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_mictoggle">
<item msgid="6895831614067195493">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="3296179158646568218">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="3296179158646568218">"ಆಫ್"</item>
<item msgid="8998632451221157987">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_controls">
<item msgid="8199009425335668294">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="4544919905196727508">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="4544919905196727508">"ಆಫ್"</item>
<item msgid="3422023746567004609">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_wallet">
<item msgid="4177615438710836341">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="7571394439974244289">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="7571394439974244289">"ಆಫ್"</item>
<item msgid="6866424167599381915">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_qr_code_scanner">
<item msgid="7435143266149257618">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="3301403109049256043">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="3301403109049256043">"ಆಫ್"</item>
<item msgid="8878684975184010135">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_alarm">
<item msgid="4936533380177298776">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="2710157085538036590">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="2710157085538036590">"ಆಫ್"</item>
<item msgid="7809470840976856149">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_onehanded">
<item msgid="8189342855739930015">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="146088982397753810">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="146088982397753810">"ಆಫ್"</item>
<item msgid="460891964396502657">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_dream">
<item msgid="6184819793571079513">"ಲಭ್ಯವಿಲ್ಲ"</item>
- <item msgid="8014986104355098744">"ಆಫ್ ಮಾಡಿ"</item>
+ <item msgid="8014986104355098744">"ಆಫ್"</item>
<item msgid="5966994759929723339">"ಆನ್ ಮಾಡಿ"</item>
</string-array>
<string-array name="tile_states_font_scaling">
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index a9115371413c..b99e66f68038 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -55,6 +55,7 @@ import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.VersionedPackage;
+import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Binder;
@@ -665,17 +666,22 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
// App package name and label length is restricted so that really long strings aren't
// written to disk.
- if (params.appPackageName != null
- && params.appPackageName.length() > SessionParams.MAX_PACKAGE_NAME_LENGTH) {
+ if (params.appPackageName != null && !isValidPackageName(params.appPackageName)) {
params.appPackageName = null;
}
params.appLabel = TextUtils.trimToSize(params.appLabel,
PackageItemInfo.MAX_SAFE_LABEL_LENGTH);
- String requestedInstallerPackageName = (params.installerPackageName != null
- && params.installerPackageName.length() < SessionParams.MAX_PACKAGE_NAME_LENGTH)
- ? params.installerPackageName : installerPackageName;
+ // Validate installer package name.
+ if (params.installerPackageName != null && !isValidPackageName(
+ params.installerPackageName)) {
+ params.installerPackageName = null;
+ }
+
+ var requestedInstallerPackageName =
+ params.installerPackageName != null ? params.installerPackageName
+ : installerPackageName;
if (PackageManagerServiceUtils.isRootOrShell(callingUid)
|| PackageInstallerSession.isSystemDataLoaderInstallation(params)
@@ -1085,6 +1091,19 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
return Integer.parseInt(sessionId);
}
+ private static boolean isValidPackageName(@NonNull String packageName) {
+ if (packageName.length() > SessionParams.MAX_PACKAGE_NAME_LENGTH) {
+ return false;
+ }
+ // "android" is a valid package name
+ var errorMessage = FrameworkParsingPackageUtils.validateName(
+ packageName, /* requireSeparator= */ false, /* requireFilename */ true);
+ if (errorMessage != null) {
+ return false;
+ }
+ return true;
+ }
+
private File getTmpSessionDir(String volumeUuid) {
return Environment.getDataAppDirectory(volumeUuid);
}
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index bea6a2f5c22c..ffb4cb3aa127 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -2680,7 +2680,8 @@ public class UserManagerService extends IUserManager.Stub {
}
}
- private void setUserRestrictionInner(int userId, @NonNull String key, boolean value) {
+ @VisibleForTesting
+ void setUserRestrictionInner(int userId, @NonNull String key, boolean value) {
if (!UserRestrictionsUtils.isValidRestriction(key)) {
Slog.e(LOG_TAG, "Setting invalid restriction " + key);
return;
@@ -3717,7 +3718,8 @@ public class UserManagerService extends IUserManager.Stub {
if (type == XmlPullParser.START_TAG) {
final String name = parser.getName();
if (name.equals(TAG_USER)) {
- UserData userData = readUserLP(parser.getAttributeInt(null, ATTR_ID));
+ UserData userData = readUserLP(parser.getAttributeInt(null, ATTR_ID),
+ mUserVersion);
if (userData != null) {
synchronized (mUsersLock) {
@@ -4290,11 +4292,11 @@ public class UserManagerService extends IUserManager.Stub {
UserRestrictionsUtils.writeRestrictions(serializer,
mDevicePolicyUserRestrictions.getRestrictions(UserHandle.USER_ALL),
- TAG_DEVICE_POLICY_RESTRICTIONS);
+ TAG_DEVICE_POLICY_GLOBAL_RESTRICTIONS);
UserRestrictionsUtils.writeRestrictions(serializer,
mDevicePolicyUserRestrictions.getRestrictions(userInfo.id),
- TAG_DEVICE_POLICY_RESTRICTIONS);
+ TAG_DEVICE_POLICY_LOCAL_RESTRICTIONS);
}
if (userData.account != null) {
@@ -4398,7 +4400,7 @@ public class UserManagerService extends IUserManager.Stub {
}
@GuardedBy({"mPackagesLock"})
- private UserData readUserLP(int id) {
+ private UserData readUserLP(int id, int userVersion) {
try (ResilientAtomicFile file = getUserFile(id)) {
FileInputStream fis = null;
try {
@@ -4407,19 +4409,19 @@ public class UserManagerService extends IUserManager.Stub {
Slog.e(LOG_TAG, "User info not found, returning null, user id: " + id);
return null;
}
- return readUserLP(id, fis);
+ return readUserLP(id, fis, userVersion);
} catch (Exception e) {
// Remove corrupted file and retry.
Slog.e(LOG_TAG, "Error reading user info, user id: " + id);
file.failRead(fis, e);
- return readUserLP(id);
+ return readUserLP(id, userVersion);
}
}
}
@GuardedBy({"mPackagesLock"})
@VisibleForTesting
- UserData readUserLP(int id, InputStream is) throws IOException,
+ UserData readUserLP(int id, InputStream is, int userVersion) throws IOException,
XmlPullParserException {
int flags = 0;
String userType = null;
@@ -4512,7 +4514,17 @@ public class UserManagerService extends IUserManager.Stub {
} else if (TAG_DEVICE_POLICY_RESTRICTIONS.equals(tag)) {
legacyLocalRestrictions = UserRestrictionsUtils.readRestrictions(parser);
} else if (TAG_DEVICE_POLICY_LOCAL_RESTRICTIONS.equals(tag)) {
- localRestrictions = UserRestrictionsUtils.readRestrictions(parser);
+ if (userVersion < 10) {
+ // Prior to version 10, the local user restrictions were stored as sub tags
+ // grouped by the user id of the source user. The source is no longer stored
+ // on versions 10+ as this is now stored in the DevicePolicyEngine.
+ RestrictionsSet oldLocalRestrictions =
+ RestrictionsSet.readRestrictions(
+ parser, TAG_DEVICE_POLICY_LOCAL_RESTRICTIONS);
+ localRestrictions = oldLocalRestrictions.mergeAll();
+ } else {
+ localRestrictions = UserRestrictionsUtils.readRestrictions(parser);
+ }
} else if (TAG_DEVICE_POLICY_GLOBAL_RESTRICTIONS.equals(tag)) {
globalRestrictions = UserRestrictionsUtils.readRestrictions(parser);
} else if (TAG_ACCOUNT.equals(tag)) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 9c1d765fe0f9..9f65a33185b5 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -30,6 +30,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppGlobals;
import android.app.BroadcastOptions;
+import android.app.admin.BooleanPolicyValue;
import android.app.admin.DevicePolicyIdentifiers;
import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyState;
@@ -133,6 +134,67 @@ final class DevicePolicyEngine {
mEnforcingAdmins = new SparseArray<>();
}
+ private void maybeForceEnforcementRefreshLocked(@NonNull PolicyDefinition<?> policyDefinition) {
+ try {
+ if (shouldForceEnforcementRefresh(policyDefinition)) {
+ // This is okay because it's only true for user restrictions which are all <Boolean>
+ forceEnforcementRefreshLocked((PolicyDefinition<Boolean>) policyDefinition);
+ }
+ } catch (Throwable e) {
+ // Catch any possible exceptions just to be on the safe side
+ Log.e(TAG, "Exception throw during maybeForceEnforcementRefreshLocked", e);
+ }
+ }
+
+ private boolean shouldForceEnforcementRefresh(@NonNull PolicyDefinition<?> policyDefinition) {
+ // These are all "not nullable" but for the purposes of maximum safety for a lightly tested
+ // change we check here
+ if (policyDefinition == null) {
+ return false;
+ }
+ PolicyKey policyKey = policyDefinition.getPolicyKey();
+ if (policyKey == null) {
+ return false;
+ }
+
+ if (policyKey instanceof UserRestrictionPolicyKey) {
+ // b/307481299 We must force all user restrictions to re-sync local
+ // + global on each set/clear
+ return true;
+ }
+
+ return false;
+ }
+
+ private void forceEnforcementRefreshLocked(PolicyDefinition<Boolean> policyDefinition) {
+ Binder.withCleanCallingIdentity(() -> {
+ // Sync global state
+ PolicyValue<Boolean> globalValue = new BooleanPolicyValue(false);
+ try {
+ PolicyState<Boolean> policyState = getGlobalPolicyStateLocked(policyDefinition);
+ globalValue = policyState.getCurrentResolvedPolicy();
+ } catch (IllegalArgumentException e) {
+ // Expected for local-only policies
+ }
+
+ enforcePolicy(policyDefinition, globalValue, UserHandle.USER_ALL);
+
+ // Loop through each user and sync that user's state
+ for (UserInfo user : mUserManager.getUsers()) {
+ PolicyValue<Boolean> localValue = new BooleanPolicyValue(false);
+ try {
+ PolicyState<Boolean> localPolicyState = getLocalPolicyStateLocked(
+ policyDefinition, user.id);
+ localValue = localPolicyState.getCurrentResolvedPolicy();
+ } catch (IllegalArgumentException e) {
+ // Expected for global-only policies
+ }
+
+ enforcePolicy(policyDefinition, localValue, user.id);
+ }
+ });
+ }
+
/**
* Set the policy for the provided {@code policyDefinition} (see {@link PolicyDefinition}) and
* {@code enforcingAdmin} to the provided {@code value}.
@@ -174,6 +236,7 @@ final class DevicePolicyEngine {
// No need to notify admins as no new policy is actually enforced, we're just filling in
// the data structures.
if (!skipEnforcePolicy) {
+ maybeForceEnforcementRefreshLocked(policyDefinition);
if (policyChanged) {
onLocalPolicyChangedLocked(policyDefinition, enforcingAdmin, userId);
}
@@ -262,6 +325,7 @@ final class DevicePolicyEngine {
Objects.requireNonNull(enforcingAdmin);
synchronized (mLock) {
+ maybeForceEnforcementRefreshLocked(policyDefinition);
if (!hasLocalPolicyLocked(policyDefinition, userId)) {
return;
}
@@ -425,6 +489,7 @@ final class DevicePolicyEngine {
// No need to notify admins as no new policy is actually enforced, we're just filling in
// the data structures.
if (!skipEnforcePolicy) {
+ maybeForceEnforcementRefreshLocked(policyDefinition);
if (policyChanged) {
onGlobalPolicyChangedLocked(policyDefinition, enforcingAdmin);
}
@@ -474,6 +539,7 @@ final class DevicePolicyEngine {
PolicyState<V> policyState = getGlobalPolicyStateLocked(policyDefinition);
boolean policyChanged = policyState.removePolicy(enforcingAdmin);
+ maybeForceEnforcementRefreshLocked(policyDefinition);
if (policyChanged) {
onGlobalPolicyChangedLocked(policyDefinition, enforcingAdmin);
}
diff --git a/services/tests/servicestests/res/xml/user_100_v9.xml b/services/tests/servicestests/res/xml/user_100_v9.xml
new file mode 100644
index 000000000000..03c08ed40828
--- /dev/null
+++ b/services/tests/servicestests/res/xml/user_100_v9.xml
@@ -0,0 +1,20 @@
+<user id="100"
+ serialNumber="0"
+ flags="3091"
+ type="android.os.usertype.full.SYSTEM"
+ created="0"
+ lastLoggedIn="0"
+ lastLoggedInFingerprint="0"
+ profileBadge="0">
+ <restrictions no_oem_unlock="true" />
+ <device_policy_local_restrictions>
+ <restrictions_user user_id="0">
+ <restrictions no_camera="true" />
+ </restrictions_user>
+ <restrictions_user user_id="100">
+ <restrictions no_camera="true" />
+ <restrictions no_install_unknown_sources="true" />
+ </restrictions_user>
+ </device_policy_local_restrictions>
+ <ignorePrepareStorageErrors>false</ignorePrepareStorageErrors>
+</user> \ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
index 2273fcd22b38..429c58e768bf 100644
--- a/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/UserManagerServiceUserInfoTest.java
@@ -43,27 +43,33 @@ import android.annotation.UserIdInt;
import android.app.PropertyInvalidatedCache;
import android.content.pm.UserInfo;
import android.content.pm.UserInfo.UserInfoFlag;
+import android.content.res.Resources;
import android.os.Looper;
import android.os.Parcel;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.text.TextUtils;
+import android.util.Xml;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
import androidx.test.runner.AndroidJUnit4;
+import com.android.frameworks.servicestests.R;
import com.android.server.LocalServices;
import com.android.server.pm.UserManagerService.UserData;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
+import java.nio.charset.StandardCharsets;
import java.util.List;
/**
@@ -76,6 +82,7 @@ import java.util.List;
@MediumTest
public class UserManagerServiceUserInfoTest {
private UserManagerService mUserManagerService;
+ private Resources mResources;
@Before
public void setup() {
@@ -95,6 +102,8 @@ public class UserManagerServiceUserInfoTest {
assertEquals("Multiple users so this test can't run.", 1, users.size());
assertEquals("Only user present isn't the system user.",
UserHandle.USER_SYSTEM, users.get(0).id);
+
+ mResources = InstrumentationRegistry.getTargetContext().getResources();
}
@Test
@@ -108,11 +117,51 @@ public class UserManagerServiceUserInfoTest {
byte[] bytes = baos.toByteArray();
UserData read = mUserManagerService.readUserLP(
- data.info.id, new ByteArrayInputStream(bytes));
+ data.info.id, new ByteArrayInputStream(bytes), 0);
assertUserInfoEquals(data.info, read.info, /* parcelCopy= */ false);
}
+ /** Tests that device policy restrictions are written/read properly. */
+ @Test
+ public void testWriteReadDevicePolicyUserRestrictions() throws Exception {
+ final String globalRestriction = UserManager.DISALLOW_FACTORY_RESET;
+ final String localRestriction = UserManager.DISALLOW_CONFIG_DATE_TIME;
+
+ UserData data = new UserData();
+ data.info = createUser(100, FLAG_FULL, "A type");
+
+ mUserManagerService.putUserInfo(data.info);
+
+ // Set a global and user restriction so they get written out to the user file.
+ setUserRestrictions(data.info.id, globalRestriction, localRestriction, true);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DataOutputStream out = new DataOutputStream(baos);
+ mUserManagerService.writeUserLP(data, out);
+ byte[] bytes = baos.toByteArray();
+
+ // Clear the restrictions to see if they are properly read in from the user file.
+ setUserRestrictions(data.info.id, globalRestriction, localRestriction, false);
+
+ final int userVersion = 10;
+ //read the secondary and SYSTEM user file to fetch local/global device policy restrictions.
+ mUserManagerService.readUserLP(data.info.id, new ByteArrayInputStream(bytes),
+ userVersion);
+
+ assertTrue(mUserManagerService.hasUserRestrictionOnAnyUser(globalRestriction));
+ assertTrue(mUserManagerService.hasUserRestrictionOnAnyUser(localRestriction));
+ }
+
+ /** Sets a global and local restriction and verifies they were set properly **/
+ private void setUserRestrictions(int id, String global, String local, boolean enabled) {
+ mUserManagerService.setUserRestrictionInner(UserHandle.USER_ALL, global, enabled);
+ assertEquals(mUserManagerService.hasUserRestrictionOnAnyUser(global), enabled);
+
+ mUserManagerService.setUserRestrictionInner(id, local, enabled);
+ assertEquals(mUserManagerService.hasUserRestrictionOnAnyUser(local), enabled);
+ }
+
@Test
public void testParcelUnparcelUserInfo() throws Exception {
UserInfo info = createUser();
@@ -250,6 +299,45 @@ public class UserManagerServiceUserInfoTest {
assertTrue(mUserManagerService.isUserOfType(106, USER_TYPE_FULL_DEMO));
}
+ /** Tests readUserLP upgrading from version 9 to 10+. */
+ @Test
+ public void testUserRestrictionsUpgradeFromV9() throws Exception {
+ final String[] localRestrictions = new String[] {
+ UserManager.DISALLOW_CAMERA,
+ UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES,
+ };
+
+ final int userId = 100;
+ UserData data = new UserData();
+ data.info = createUser(userId, FLAG_FULL, "A type");
+
+ mUserManagerService.putUserInfo(data.info);
+
+ for (String restriction : localRestrictions) {
+ assertFalse(mUserManagerService.hasBaseUserRestriction(restriction, userId));
+ assertFalse(mUserManagerService.hasUserRestriction(restriction, userId));
+ }
+
+ // Convert the xml resource to the system storage xml format.
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DataOutputStream os = new DataOutputStream(baos);
+ XmlPullParser in = mResources.getXml(R.xml.user_100_v9);
+ XmlSerializer out = Xml.newBinarySerializer();
+ out.setOutput(os, StandardCharsets.UTF_8.name());
+ Xml.copy(in, out);
+ byte[] userBytes = baos.toByteArray();
+ baos.reset();
+
+ final int userVersion = 9;
+ mUserManagerService.readUserLP(data.info.id, new ByteArrayInputStream(userBytes),
+ userVersion);
+
+ for (String restriction : localRestrictions) {
+ assertFalse(mUserManagerService.hasBaseUserRestriction(restriction, userId));
+ assertTrue(mUserManagerService.hasUserRestriction(restriction, userId));
+ }
+ }
+
/** Creates a UserInfo with the given flags and userType. */
private UserInfo createUser(@UserIdInt int userId, @UserInfoFlag int flags, String userType) {
return new UserInfo(userId, "A Name", "A path", flags, userType);
diff --git a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
index 3102639ff148..29e3d58696e6 100644
--- a/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
+++ b/services/tests/servicestests/src/com/android/server/power/batterysaver/BatterySaverPolicyTest.java
@@ -116,7 +116,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
testServiceDefaultValue_On(ServiceType.NULL);
}
- @Suppress
+ @Suppress // TODO: b/317823111 - Remove once test fixed.
@SmallTest
public void testGetBatterySaverPolicy_PolicyVibration_DefaultValueCorrect() {
testServiceDefaultValue_On(ServiceType.VIBRATION);
@@ -202,7 +202,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
testServiceDefaultValue_On(ServiceType.QUICK_DOZE);
}
- @Suppress
+ @Suppress // TODO: b/317823111 - Remove once test fixed.
@SmallTest
public void testUpdateConstants_getCorrectData() {
mBatterySaverPolicy.updateConstantsLocked(BATTERY_SAVER_CONSTANTS, "");
@@ -302,6 +302,7 @@ public class BatterySaverPolicyTest extends AndroidTestCase {
}
}
+ @Suppress // TODO: b/317823111 - Remove once test fixed.
public void testSetPolicyLevel_Adaptive() {
mBatterySaverPolicy.setPolicyLevel(POLICY_LEVEL_ADAPTIVE);