diff options
38 files changed, 376 insertions, 122 deletions
diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index 0d3dc4901d8d..6310d32515c5 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -1280,6 +1280,24 @@ public class Bmgr { return "START_PACKAGE_RESTORE"; case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE: return "AGENT_FAILURE"; + case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED: + return "RESTORE_AT_INSTALL_INVOKED"; + case BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL: + return "SKIP_RESTORE_AT_INSTALL"; + case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE: + return "PACKAGE_ACCEPTED_FOR_RESTORE"; + case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE: + return "RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE"; + case BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE: + return "UNABLE_TO_CREATE_AGENT_FOR_RESTORE"; + case BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT: + return "AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SEN"; + case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE: + return "FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE"; + case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE: + return "AGENT_FAILURE_DURING_RESTORE"; + case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT: + return "FAILED_TO_READ_DATA_FROM_TRANSPORT"; default: return "UNKNOWN_ID"; } diff --git a/core/java/android/app/backup/BackupManagerMonitor.java b/core/java/android/app/backup/BackupManagerMonitor.java index c66478f6cf84..e741bc2bf608 100644 --- a/core/java/android/app/backup/BackupManagerMonitor.java +++ b/core/java/android/app/backup/BackupManagerMonitor.java @@ -269,6 +269,33 @@ public class BackupManagerMonitor { /** V to U restore attempt, allowlist and denlist are set @hide */ public static final int LOG_EVENT_ID_V_TO_U_RESTORE_SET_LIST = 72; + /** As part of package install, {@link PackageManager} invoked restore. + @hide */ + public static final int LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED = 73; + /** Skipping restore at package install + @hide */ + public static final int LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL = 74; + /** Package is eligible and is accepted for restore + @hide */ + public static final int LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE = 75; + /** Restore data doesn't belong to the package for which restore is started + @hide */ + public static final int LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE = 76; + /** Unable to create BackupAgent for package for restore + @hide */ + public static final int LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE = 77; + /** BackupAgent crashed after creation but before accepting any data + @hide */ + public static final int LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT = 78; + /** Failure in streaming restore data to BackupAgent + @hide */ + public static final int LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE = 79; + /** BackupAgent related failure during restore + @hide */ + public static final int LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE = 80; + /** Failure in reading data from TransportPackage during restore + @hide */ + public static final int LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT = 81; /** * This method will be called each time something important happens on BackupManager. diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index f965f529a347..360ddc816cec 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -357,7 +357,7 @@ <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"Kan \'n skermkiekie neem."</string> <string name="dream_preview_title" msgid="5570751491996100804">"Voorskou, <xliff:g id="DREAM_NAME">%1$s</xliff:g>"</string> <string name="permlab_statusBar" msgid="8798267849526214017">"deaktiveer of verander statusbalk"</string> - <string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die program toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string> + <string name="permdesc_statusBar" msgid="5809162768651019642">"Laat die app toe om die statusbalk te deaktiveer en stelselikone by te voeg of te verwyder."</string> <string name="permlab_statusBarService" msgid="2523421018081437981">"wees die statusbalk"</string> <string name="permdesc_statusBarService" msgid="6652917399085712557">"Laat die program toe om die statusbalk te wees."</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"vou statusbalk in of uit"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index b9aba478939c..4eb3db448a39 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -319,7 +319,7 @@ <string name="permgroupdesc_contacts" msgid="9163927941244182567">"الوصول إلى جهات اتصالك"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"الموقع الجغرافي"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"الوصول إلى موقع هذا الجهاز"</string> - <string name="permgrouplab_calendar" msgid="6426860926123033230">"التقويم"</string> + <string name="permgrouplab_calendar" msgid="6426860926123033230">"تقويم Google"</string> <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول إلى تقويمك"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"إرسال رسائل قصيرة SMS وعرضها"</string> @@ -1992,7 +1992,7 @@ <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"الطوارئ"</string> <string name="set_up_screen_lock_title" msgid="8346083801616474030">"ضبط قفل شاشة"</string> <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"ضبط قفل الشاشة"</string> - <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"لاستخدام مساحتك الخاصة، يجب ضبط قفل شاشة على هذا الجهاز."</string> + <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"لاستخدام مساحتك الخاصة، يجب ضبط قفل شاشة على هذا الجهاز"</string> <string name="app_blocked_title" msgid="7353262160455028160">"التطبيق غير متاح"</string> <string name="app_blocked_message" msgid="542972921087873023">"تطبيق <xliff:g id="APP_NAME">%1$s</xliff:g> غير متاح الآن."</string> <string name="app_streaming_blocked_title" msgid="6090945835898766139">"تطبيق <xliff:g id="ACTIVITY">%1$s</xliff:g> غير متاح"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index f20d334f4a1f..f9e3364fbaf7 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1989,7 +1989,7 @@ <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Emergència"</string> <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Defineix un bloqueig de pantalla"</string> <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Defineix un bloqueig de pantalla"</string> - <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Per utilitzar l\'espai privat, defineix un bloq. de pantalla"</string> + <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Per utilitzar l\'espai privat, defineix un bloqueig de pantalla en aquest dispositiu"</string> <string name="app_blocked_title" msgid="7353262160455028160">"L\'aplicació no està disponible"</string> <string name="app_blocked_message" msgid="542972921087873023">"Ara mateix, <xliff:g id="APP_NAME">%1$s</xliff:g> no està disponible."</string> <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> no està disponible"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 79733f9672e5..e5416c227980 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -827,7 +827,7 @@ <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Giver appen tilladelse til at opdatere tilstandene for verificering E2EE-kontaktnøgler, som ejes af andre apps"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Angiv regler for adgangskoder"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Tjek længden samt tilladte tegn i adgangskoder og pinkoder til skærmlåsen."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåg forsøg på oplåsning af skærm"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"Overvåge forsøg på oplåsning af skærm"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Overvåg antallet af forkert indtastede adgangskoder, når du låser skærmen op, og lås din tablet, eller slet alle data i den, hvis der er indtastet for mange forkerte adgangskoder."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Registrer antallet af forkerte adgangskoder, der angives ved oplåsning af skærmen, og lås din Android TV-enhed, eller ryd alle dataene på din Android TV-enhed, hvis adgangskoden angives forkert for mange gange."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Registrer antallet af forkert indtastede adgangskoder, når du låser skærmen op, og lås infotainmentsystemet, eller slet alle data i infotainmentsystemet, hvis der er indtastet for mange forkerte adgangskoder."</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 8caacd3709c2..3e9b7fc1724e 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1628,7 +1628,7 @@ <string name="validity_period" msgid="1717724283033175968">"Վավերականություն`"</string> <string name="issued_on" msgid="5855489688152497307">"Թողարկվել է`"</string> <string name="expires_on" msgid="1623640879705103121">"Սպառվում է`"</string> - <string name="serial_number" msgid="3479576915806623429">"Հերթական համարը`"</string> + <string name="serial_number" msgid="3479576915806623429">"Հերթական համար`"</string> <string name="fingerprints" msgid="148690767172613723">"Մատնահետքերը`"</string> <string name="sha256_fingerprint" msgid="7103976380961964600">"SHA-256 մատնահետք`"</string> <string name="sha1_fingerprint" msgid="2339915142825390774">"SHA-1 մատնահետք`"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index f25a4b430ae7..90ca80a1aa19 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1969,7 +1969,7 @@ <string name="user_creation_account_exists" msgid="2239146360099708035">"Viltu leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> (notandi með þennan reikning er þegar fyrir hendi)?"</string> <string name="user_creation_adding" msgid="7305185499667958364">"Leyfa <xliff:g id="APP">%1$s</xliff:g> að stofna nýjan notanda með <xliff:g id="ACCOUNT">%2$s</xliff:g> ?"</string> <string name="supervised_user_creation_label" msgid="6884904353827427515">"Bæta við stýrðum notanda"</string> - <string name="language_selection_title" msgid="52674936078683285">"Bæta við tungumáli"</string> + <string name="language_selection_title" msgid="52674936078683285">"Bæta tungumáli við"</string> <string name="country_selection_title" msgid="5221495687299014379">"Svæðisval"</string> <string name="search_language_hint" msgid="7004225294308793583">"Sláðu inn heiti tungumáls"</string> <string name="language_picker_section_suggested" msgid="6556199184638990447">"Tillögur"</string> @@ -1987,7 +1987,7 @@ <string name="work_mode_turn_on" msgid="5316648862401307800">"Ljúka hléi"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Neyðartilvik"</string> <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Stilltu skjálás"</string> - <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Stilltu skjálás"</string> + <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Stilla skjálás"</string> <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"Stilltu skjálás í tækinu til að nota leynirými"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Forrit er ekki tiltækt"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> er ekki tiltækt núna."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 981937d4d86b..e65cb4d2ae10 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -2368,8 +2368,8 @@ <string name="concurrent_display_notification_name" msgid="1526911253558311131">"デュアル スクリーン"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"デュアル スクリーン: ON"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>は 2 画面でコンテンツを表示しています"</string> - <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"デバイスが熱くなりすぎています"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"スマートフォンが熱くなりすぎているため、デュアル スクリーンを使用できません"</string> + <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"デバイスが熱くなっています"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"スマートフォンが熱いため、デュアル スクリーンを使用できません"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"デュアル スクリーンを使用できません"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"バッテリー セーバーが ON のため、デュアル スクリーンを使用できません。この動作は設定で OFF にできます。"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"設定に移動"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 0bef068286e1..e5572b4f907c 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1281,7 +1281,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Қолданбалар іске қосылуда."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Қосуды аяқтауда."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін реттеу үшін, оны жайлап түртіп көріңіз."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Реттеуді аяқтау үшін экранды өшіріңіз"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Реттеуді аяқтау үшін экранды өшіріңіз."</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Өшіру"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Саусақ ізін растауды жалғастырасыз ба?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Қуат түймесін бастыңыз. Бұл әдетте экранды өшіреді.\n\nСаусақ ізін растау үшін, оны жайлап түртіп көріңіз."</string> @@ -1559,7 +1559,7 @@ <string name="sync_really_delete" msgid="5657871730315579051">"Бұл нәрселер жойылсын"</string> <string name="sync_undo_deletes" msgid="5786033331266418896">"Жойылғандарды кері орындау"</string> <string name="sync_do_nothing" msgid="4528734662446469646">"Қазір ешқандай әрекет жасамаңыз"</string> - <string name="choose_account_label" msgid="5557833752759831548">"Аккаунт таңдау"</string> + <string name="choose_account_label" msgid="5557833752759831548">"Аккаунт таңдаңыз"</string> <string name="add_account_label" msgid="4067610644298737417">"Аккаунт қосу"</string> <string name="add_account_button_label" msgid="322390749416414097">"Аккаунт қосу."</string> <string name="number_picker_increment_button" msgid="7621013714795186298">"Арттыру"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 7474234c14b2..3582d0f73a08 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1741,7 +1741,7 @@ <string name="color_inversion_feature_name" msgid="2672824491933264951">"ការបញ្ច្រាសពណ៌"</string> <string name="color_correction_feature_name" msgid="7975133554160979214">"ការកែតម្រូវពណ៌"</string> <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"មុខងារប្រើដៃម្ខាង"</string> - <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"ពន្លឺតិចខ្លាំង"</string> + <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"ងងឹតខ្លាំង"</string> <string name="hearing_aids_feature_name" msgid="1125892105105852542">"ឧបករណ៍ជំនួយការស្ដាប់"</string> <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"បានសង្កត់គ្រាប់ចុចកម្រិតសំឡេងជាប់។ បានបើក <xliff:g id="SERVICE_NAME">%1$s</xliff:g>។"</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"បានសង្កត់គ្រាប់ចុចកម្រិតសំឡេងជាប់។ បានបិទ <xliff:g id="SERVICE_NAME">%1$s</xliff:g>។"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 71c128d013ef..46407ab9b424 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1281,7 +1281,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Колдонмолорду иштетип баштоо"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Жүктөлүүдө"</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин жөндөп жатканда аны акырын басып көрүңүз."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Кошуп бүтүрүү үчүн экранды өчүрүңүз"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Бүтүрүү үчүн экранды өчүрүңүз"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Өчүрүү"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Манжаңыздын изин ырастоону улантасызбы?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Кубат баскычын бастыңыз — адатта, бул экранды өчүрөт.\n\nМанжаңыздын изин ырастоо үчүн аны акырын басып көрүңүз."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index a575e2a527bb..0bc5e1cb6d7c 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -828,7 +828,7 @@ <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Atļauj lietotnei atjaunināt citām lietotnēm piederošu E2EE sakaru atslēgu verifikācijas statusus."</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Paroles kārtulu iestatīšana"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolēt ekrāna bloķēšanas paroļu un PIN garumu un tajos atļautās rakstzīmes."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"Ekrāna atbloķēšanas mēģinājumu pārraudzīšana"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"Pārraudzīt ekrāna atbloķēšanas mēģinājumus"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Pārrauga nepareizi ievadīto paroļu skaitu, atbloķējot ekrānu, un bloķē planšetdatoru vai dzēš visus planšetdatora datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Pārraudzīt nepareizi ievadīto ekrāna atbloķēšanas paroļu skaitu un bloķēt Android TV vai dzēst visus Android TV ierīces datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Ekrāna atbloķēšanas laikā pārraudzīt nepareizi ievadīto paroļu skaitu un bloķēt informatīvi izklaidējošo sistēmu vai dzēst visus informatīvi izklaidējošās sistēmas datus, ja tiek ievadīts pārāk daudz nepareizu paroļu."</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 0ff49ed82943..4e47a9e02d77 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1303,7 +1303,7 @@ <string name="dump_heap_ready_text" msgid="5849618132123045516">"Слика од меморијата на <xliff:g id="PROC">%1$s</xliff:g> ви е достапна за споделување. Бидете внимателни: оваа слика од меморијата можеби ги содржи сите чувствителни лични информации до коишто процесот има пристап, што може да вклучуваат работи што сте ги напишале."</string> <string name="sendText" msgid="493003724401350724">"Избери дејство за текст"</string> <string name="volume_ringtone" msgid="134784084629229029">"Јачина на звук на ѕвонче"</string> - <string name="volume_music" msgid="7727274216734955095">"Јачина на аудио/видео звук"</string> + <string name="volume_music" msgid="7727274216734955095">"Јачина на звук за аудио/видео"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Се репродуцира преку Bluetooth"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Поставено ѕвонење на тивко"</string> <string name="volume_call" msgid="7625321655265747433">"Јачина на звук на дојдовен повик"</string> @@ -1314,7 +1314,7 @@ <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Јачина на звук на Bluetooth"</string> <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Јачина на звук на мелодија"</string> <string name="volume_icon_description_incall" msgid="4491255105381227919">"Јачина на звук на повик"</string> - <string name="volume_icon_description_media" msgid="4997633254078171233">"Јачина на аудио/видео звук"</string> + <string name="volume_icon_description_media" msgid="4997633254078171233">"Јачина на звук за аудио/видео"</string> <string name="volume_icon_description_notification" msgid="579091344110747279">"Јачина на звук за известување"</string> <string name="ringtone_default" msgid="9118299121288174597">"Стандардна мелодија"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Стандардна (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> @@ -1987,7 +1987,7 @@ <string name="work_mode_turn_on" msgid="5316648862401307800">"Прекини ја паузата"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Итен случај"</string> <string name="set_up_screen_lock_title" msgid="8346083801616474030">"Поставете заклучување екран"</string> - <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Поставување заклучување екран"</string> + <string name="set_up_screen_lock_action_label" msgid="2687634803649209367">"Поставете заклучување екран"</string> <string name="private_space_set_up_screen_lock_message" msgid="1109956797005149814">"За да користите „Приватен простор“, поставете заклучување екран на уредов"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Апликацијата не е достапна"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> не е достапна во моментов."</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index d3424e274d44..eea6d2af617a 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -827,7 +827,7 @@ <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"यसले एपलाई अन्य एपको स्वामित्वमा रहेका E2EE कन्ट्याक्ट कीहरूको प्रमाणीकरणको स्थिति अपडेट गर्न दिन्छ"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रिन अनलक गर्न गरिएको प्रयासको अनुगमन गर्ने"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"स्क्रिन अनलक गर्दा गलत पासवर्ड टाइप भएको संख्या निरीक्षण गर्नुहोस् र यदि निकै धेरै गलत पासवर्डहरू टाइप भएका छन भने ट्याब्लेट लक गर्नुहोस् वा ट्याब्लेटका सबै डेटा मेट्नुहोस्।"</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"स्क्रिन अनलक गर्दा गलत पासवर्ड टाइप गरेको सङ्ख्या निरीक्षण गर्नुहोस्, र धेरै पटक गलत पासवर्डहरू टाइप गरिएको खण्डमा आफ्नो Android टिभी यन्त्र लक गर्नुहोस् वा डिभाइसमा भएको सम्पूर्ण डेटा मेटाउनुहोस्।"</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"स्क्रिन अनलक गर्दा कति पटक गलत पासवर्ड टाइप गरिन्छ भन्ने कुरा निगरानी गरियोस् र अत्यन्तै धेरै पटक गलत पासवर्ड टाइप गरिएका खण्डमा यो इन्फोटेनमेन्ट प्रणाली लक गरियोस् वा यस इन्फोटेनमेन्ट प्रणालीका सबै डेटा मेटाइयोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 84e2076227c6..4e8740c53cbb 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1864,7 +1864,7 @@ <string name="print_service_installed_title" msgid="6134880817336942482">"<xliff:g id="NAME">%s</xliff:g>-service geïnstalleerd"</string> <string name="print_service_installed_message" msgid="7005672469916968131">"Tik om aan te zetten"</string> <string name="restr_pin_enter_admin_pin" msgid="1199419462726962697">"Beheerderspincode invoeren"</string> - <string name="restr_pin_enter_pin" msgid="373139384161304555">"Geef de pincode op"</string> + <string name="restr_pin_enter_pin" msgid="373139384161304555">"Voer pincode in"</string> <string name="restr_pin_incorrect" msgid="3861383632940852496">"Onjuist"</string> <string name="restr_pin_enter_old_pin" msgid="7537079094090650967">"Huidige pincode"</string> <string name="restr_pin_enter_new_pin" msgid="3267614461844565431">"Nieuwe pincode"</string> @@ -2198,7 +2198,7 @@ <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Deze content kan niet worden geopend met werk-apps"</string> <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Deze content kan niet worden gedeeld met persoonlijke apps"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Deze content kan niet worden geopend met persoonlijke apps"</string> - <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werk-apps zijn onderbroken"</string> + <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Werk-apps zijn gepauzeerd"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Hervatten"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Geen werk-apps"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Geen persoonlijke apps"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 049ef0ce0bd9..6bf199e5ca9d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -828,7 +828,7 @@ <string name="permdesc_writeVerificationStateE2eeContactKeys" msgid="8453156829747427041">"Permite aplicației să actualizeze starea verificării cheilor E2EE deținute de alte aplicații"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Să seteze reguli pentru parolă"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Stabilește lungimea și tipul de caractere permise pentru parolele și codurile PIN de blocare a ecranului."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"Să monitorizeze încercările de deblocare a ecranului"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"să monitorizeze încercările de deblocare a ecranului"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează tableta sau șterge datele acesteia dacă sunt introduse prea multe parole incorecte."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează dispozitivul Android TV sau șterge toate datele de pe acesta dacă se introduc prea multe parole incorecte."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Monitorizează numărul de parole incorecte introduse la deblocarea ecranului și blochează sistemul de infotainment sau șterge toate datele acestuia dacă sunt introduse prea multe parole incorecte."</string> @@ -841,7 +841,7 @@ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Modifică blocarea ecranului."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Să blocheze ecranul"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Stabilește cum și când se blochează ecranul."</string> - <string name="policylab_wipeData" msgid="1359485247727537311">"Să șteargă toate datele"</string> + <string name="policylab_wipeData" msgid="1359485247727537311">"să șteargă toate datele"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Șterge datele de pe tabletă fără avertisment, efectuând resetarea configurării din fabrică."</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Șterge datele de pe dispozitivul Android TV fără avertisment, efectuând o revenire la setările din fabrică."</string> <string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Șterge datele din sistemul de infotainment fără avertisment, prin revenirea la setările din fabrică."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 8abfb65ce224..bce0eb683e53 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1283,7 +1283,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск приложений."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Окончание загрузки..."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nПри добавлении отпечатка пальца слегка прикоснитесь к кнопке."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Для завершения нужно отключить экран"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Для завершения нужно отключить экран."</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Отключить"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Продолжить сканирование отпечатка?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Вы нажали кнопку питания. Обычно это приводит к отключению экрана.\n\nЧтобы отсканировать отпечаток пальца, слегка прикоснитесь к кнопке."</string> diff --git a/packages/SystemUI/res/layout/screenshot_shelf.xml b/packages/SystemUI/res/layout/screenshot_shelf.xml index ef1a21f2fdf6..c988b4afcf74 100644 --- a/packages/SystemUI/res/layout/screenshot_shelf.xml +++ b/packages/SystemUI/res/layout/screenshot_shelf.xml @@ -28,7 +28,7 @@ android:elevation="4dp" android:background="@drawable/action_chip_container_background" android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal" - android:layout_marginBottom="@dimen/overlay_action_container_margin_bottom" + android:layout_marginBottom="@dimen/screenshot_shelf_vertical_margin" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/actions_container" app:layout_constraintEnd_toEndOf="@+id/actions_container" @@ -38,14 +38,14 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/overlay_action_container_margin_horizontal" - android:paddingEnd="@dimen/overlay_action_container_padding_end" + android:paddingHorizontal="@dimen/overlay_action_container_padding_end" android:paddingVertical="@dimen/overlay_action_container_padding_vertical" android:elevation="4dp" android:scrollbars="none" app:layout_constraintHorizontal_bias="0" app:layout_constraintWidth_percent="1.0" app:layout_constraintWidth_max="wrap" - app:layout_constraintStart_toEndOf="@+id/screenshot_preview_border" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="@id/actions_container_background"> <LinearLayout @@ -65,16 +65,16 @@ android:id="@+id/screenshot_preview_border" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginStart="16dp" + android:layout_marginStart="@dimen/overlay_action_container_margin_horizontal" android:layout_marginTop="@dimen/overlay_border_width_neg" android:layout_marginEnd="@dimen/overlay_border_width_neg" - android:layout_marginBottom="14dp" + android:layout_marginBottom="@dimen/screenshot_shelf_vertical_margin" android:elevation="8dp" android:background="@drawable/overlay_border" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/screenshot_preview" app:layout_constraintEnd_toEndOf="@id/screenshot_preview" - app:layout_constraintBottom_toBottomOf="parent"/> + app:layout_constraintBottom_toTopOf="@id/actions_container"/> <ImageView android:id="@+id/screenshot_preview" android:layout_width="@dimen/overlay_x_scale" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b7eff38aa015..a0fca51ecaff 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -448,6 +448,7 @@ <dimen name="overlay_action_container_padding_end">8dp</dimen> <dimen name="overlay_dismiss_button_tappable_size">48dp</dimen> <dimen name="overlay_dismiss_button_margin">8dp</dimen> + <dimen name="screenshot_shelf_vertical_margin">8dp</dimen> <!-- must be kept aligned with overlay_border_width_neg, below; overlay_border_width = overlay_border_width_neg * -1 --> <dimen name="overlay_border_width">4dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt index abdbd6880b33..97acccde2524 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotActionsProvider.kt @@ -26,34 +26,45 @@ import com.android.systemui.res.R import javax.inject.Inject /** - * Provides static actions for screenshots. This class can be overridden by a vendor-specific SysUI + * Provides actions for screenshots. This class can be overridden by a vendor-specific SysUI * implementation. */ interface ScreenshotActionsProvider { data class ScreenshotAction( - val icon: Drawable?, - val text: String?, - val overrideTransition: Boolean, + val icon: Drawable? = null, + val text: String? = null, + val description: String, + val overrideTransition: Boolean = false, val retrieveIntent: (Uri) -> Intent ) - fun getPreviewAction(context: Context, uri: Uri, user: UserHandle): Intent - fun getActions(context: Context, user: UserHandle): List<ScreenshotAction> -} + interface ScreenshotActionsCallback { + fun setPreviewAction(overrideTransition: Boolean = false, retrieveIntent: (Uri) -> Intent) + fun addAction(action: ScreenshotAction) = addActions(listOf(action)) + fun addActions(actions: List<ScreenshotAction>) + } -class DefaultScreenshotActionsProvider @Inject constructor() : ScreenshotActionsProvider { - override fun getPreviewAction(context: Context, uri: Uri, user: UserHandle): Intent { - return ActionIntentCreator.createEdit(uri, context) + interface Factory { + fun create( + context: Context, + user: UserHandle?, + callback: ScreenshotActionsCallback + ): ScreenshotActionsProvider } +} - override fun getActions( - context: Context, - user: UserHandle - ): List<ScreenshotActionsProvider.ScreenshotAction> { +class DefaultScreenshotActionsProvider( + private val context: Context, + private val user: UserHandle?, + private val callback: ScreenshotActionsProvider.ScreenshotActionsCallback +) : ScreenshotActionsProvider { + init { + callback.setPreviewAction(true) { ActionIntentCreator.createEdit(it, context) } val editAction = ScreenshotActionsProvider.ScreenshotAction( AppCompatResources.getDrawable(context, R.drawable.ic_screenshot_edit), context.resources.getString(R.string.screenshot_edit_label), + context.resources.getString(R.string.screenshot_edit_description), true ) { uri -> ActionIntentCreator.createEdit(uri, context) @@ -62,10 +73,21 @@ class DefaultScreenshotActionsProvider @Inject constructor() : ScreenshotActions ScreenshotActionsProvider.ScreenshotAction( AppCompatResources.getDrawable(context, R.drawable.ic_screenshot_share), context.resources.getString(R.string.screenshot_share_label), + context.resources.getString(R.string.screenshot_share_description), false ) { uri -> ActionIntentCreator.createShare(uri) } - return listOf(editAction, shareAction) + callback.addActions(listOf(editAction, shareAction)) + } + + class Factory @Inject constructor() : ScreenshotActionsProvider.Factory { + override fun create( + context: Context, + user: UserHandle?, + callback: ScreenshotActionsProvider.ScreenshotActionsCallback + ): ScreenshotActionsProvider { + return DefaultScreenshotActionsProvider(context, user, callback) + } } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java index c8e13bb8c2fc..597e7730e975 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotController.java @@ -19,6 +19,7 @@ package com.android.systemui.screenshot; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.TYPE_SCREENSHOT; +import static com.android.systemui.Flags.screenshotShelfUi; import static com.android.systemui.screenshot.LogConfig.DEBUG_ANIM; import static com.android.systemui.screenshot.LogConfig.DEBUG_CALLBACK; import static com.android.systemui.screenshot.LogConfig.DEBUG_INPUT; @@ -40,7 +41,6 @@ import android.app.ActivityOptions; import android.app.ExitTransitionCoordinator; import android.app.ICompatCameraControlCallback; import android.app.Notification; -import android.app.assist.AssistContent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -84,7 +84,6 @@ import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.clipboardoverlay.ClipboardOverlayController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.res.R; import com.android.systemui.screenshot.TakeScreenshotService.RequestCallback; import com.android.systemui.screenshot.scroll.LongScreenshotActivity; @@ -237,6 +236,7 @@ public class ScreenshotController { private final WindowContext mContext; private final FeatureFlags mFlags; private final ScreenshotViewProxy mViewProxy; + private final ScreenshotActionsProvider.Factory mActionsProviderFactory; private final ScreenshotNotificationsController mNotificationsController; private final ScreenshotSmartActions mScreenshotSmartActions; private final UiEventLogger mUiEventLogger; @@ -271,6 +271,8 @@ public class ScreenshotController { private boolean mScreenshotTakenInPortrait; private boolean mBlockAttach; + private ScreenshotActionsProvider mActionsProvider; + private Animator mScreenshotAnimation; private RequestCallback mCurrentRequestCallback; private String mPackageName = ""; @@ -298,6 +300,7 @@ public class ScreenshotController { Context context, FeatureFlags flags, ScreenshotViewProxy.Factory viewProxyFactory, + ScreenshotActionsProvider.Factory actionsProviderFactory, ScreenshotSmartActions screenshotSmartActions, ScreenshotNotificationsController.Factory screenshotNotificationsControllerFactory, ScrollCaptureClient scrollCaptureClient, @@ -349,6 +352,7 @@ public class ScreenshotController { mAssistContentRequester = assistContentRequester; mViewProxy = viewProxyFactory.getProxy(mContext, mDisplayId); + mActionsProviderFactory = actionsProviderFactory; mScreenshotHandler.setOnTimeoutRunnable(() -> { if (DEBUG_UI) { @@ -393,6 +397,7 @@ public class ScreenshotController { void handleScreenshot(ScreenshotData screenshot, Consumer<Uri> finisher, RequestCallback requestCallback) { Assert.isMainThread(); + mCurrentRequestCallback = requestCallback; if (screenshot.getType() == WindowManager.TAKE_SCREENSHOT_FULLSCREEN) { Rect bounds = getFullScreenRect(); @@ -435,16 +440,6 @@ public class ScreenshotController { prepareViewForNewScreenshot(screenshot, oldPackageName); - if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && screenshot.getTaskId() >= 0) { - mAssistContentRequester.requestAssistContent(screenshot.getTaskId(), - new AssistContentRequester.Callback() { - @Override - public void onAssistContentAvailable(AssistContent assistContent) { - screenshot.setContextUrl(assistContent.getWebUri()); - } - }); - } - if (!shouldShowUi()) { saveScreenshotInWorkerThread( screenshot.getUserHandle(), finisher, this::logSuccessOnActionsReady, @@ -496,7 +491,7 @@ public class ScreenshotController { return mDisplayId == Display.DEFAULT_DISPLAY || mShowUIOnExternalDisplay; } - void prepareViewForNewScreenshot(ScreenshotData screenshot, String oldPackageName) { + void prepareViewForNewScreenshot(@NonNull ScreenshotData screenshot, String oldPackageName) { withWindowAttached(() -> { if (mUserManager.isManagedProfile(screenshot.getUserHandle().getIdentifier())) { mViewProxy.announceForAccessibility(mContext.getResources().getString( @@ -509,6 +504,11 @@ public class ScreenshotController { mViewProxy.reset(); + if (screenshotShelfUi()) { + mActionsProvider = mActionsProviderFactory.create(mContext, screenshot.getUserHandle(), + ((ScreenshotActionsProvider.ScreenshotActionsCallback) mViewProxy)); + } + if (mViewProxy.isAttachedToWindow()) { // if we didn't already dismiss for another reason if (!mViewProxy.isDismissing()) { @@ -983,20 +983,16 @@ public class ScreenshotController { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); - doPostAnimation(imageData); + mViewProxy.setChipIntents(imageData); } }); } else { - doPostAnimation(imageData); + mViewProxy.setChipIntents(imageData); } }); } } - private void doPostAnimation(ScreenshotController.SavedImageData imageData) { - mViewProxy.setChipIntents(imageData); - } - /** * Sets up the action shade and its entrance animation, once we get the Quick Share action data. */ diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt index 9354fd27ce5a..88bca951beb6 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotShelfViewProxy.kt @@ -20,8 +20,10 @@ import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.app.Notification import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.graphics.Rect +import android.net.Uri import android.view.KeyEvent import android.view.LayoutInflater import android.view.ScrollCaptureResponse @@ -37,6 +39,7 @@ import com.android.systemui.screenshot.LogConfig.DEBUG_ACTIONS import com.android.systemui.screenshot.LogConfig.DEBUG_DISMISS import com.android.systemui.screenshot.LogConfig.DEBUG_INPUT import com.android.systemui.screenshot.LogConfig.DEBUG_WINDOW +import com.android.systemui.screenshot.ScreenshotController.SavedImageData import com.android.systemui.screenshot.ScreenshotEvent.SCREENSHOT_DISMISSED_OTHER import com.android.systemui.screenshot.scroll.ScrollCaptureController import com.android.systemui.screenshot.ui.ScreenshotAnimationController @@ -54,10 +57,9 @@ class ScreenshotShelfViewProxy constructor( private val logger: UiEventLogger, private val viewModel: ScreenshotViewModel, - private val staticActionsProvider: ScreenshotActionsProvider, @Assisted private val context: Context, @Assisted private val displayId: Int -) : ScreenshotViewProxy { +) : ScreenshotViewProxy, ScreenshotActionsProvider.ScreenshotActionsCallback { override val view: ScreenshotShelfView = LayoutInflater.from(context).inflate(R.layout.screenshot_shelf, null) as ScreenshotShelfView override val screenshotPreview: View @@ -75,6 +77,8 @@ constructor( override var isPendingSharedTransition = false private val animationController = ScreenshotAnimationController(view) + private var imageData: SavedImageData? = null + private var runOnImageDataAcquired: ((SavedImageData) -> Unit)? = null init { ScreenshotShelfViewBinder.bind(view, viewModel, LayoutInflater.from(context)) @@ -87,8 +91,9 @@ constructor( override fun reset() { animationController.cancel() isPendingSharedTransition = false - viewModel.setScreenshotBitmap(null) - viewModel.setActions(listOf()) + imageData = null + viewModel.reset() + runOnImageDataAcquired = null } override fun updateInsets(insets: WindowInsets) {} override fun updateOrientation(insets: WindowInsets) {} @@ -99,18 +104,9 @@ constructor( override fun addQuickShareChip(quickShareAction: Notification.Action) {} - override fun setChipIntents(imageData: ScreenshotController.SavedImageData) { - val staticActions = - staticActionsProvider.getActions(context, imageData.owner).map { - ActionButtonViewModel(it.icon, it.text) { - val intent = it.retrieveIntent(imageData.uri) - debugLog(DEBUG_ACTIONS) { "Action tapped: $intent" } - isPendingSharedTransition = true - callbacks?.onAction(intent, imageData.owner, it.overrideTransition) - } - } - - viewModel.setActions(staticActions) + override fun setChipIntents(data: SavedImageData) { + imageData = data + runOnImageDataAcquired?.invoke(data) } override fun requestDismissal(event: ScreenshotEvent) { @@ -223,4 +219,41 @@ constructor( interface Factory : ScreenshotViewProxy.Factory { override fun getProxy(context: Context, displayId: Int): ScreenshotShelfViewProxy } + + override fun setPreviewAction(overrideTransition: Boolean, retrieveIntent: (Uri) -> Intent) { + viewModel.setPreviewAction { + imageData?.let { + val intent = retrieveIntent(it.uri) + debugLog(DEBUG_ACTIONS) { "Preview tapped: $intent" } + isPendingSharedTransition = true + callbacks?.onAction(intent, it.owner, overrideTransition) + } + } + } + + override fun addActions(actions: List<ScreenshotActionsProvider.ScreenshotAction>) { + viewModel.addActions( + actions.map { action -> + ActionButtonViewModel(action.icon, action.text, action.description) { + val actionRunnable = + getActionRunnable(action.retrieveIntent, action.overrideTransition) + imageData?.let { actionRunnable(it) } + ?: run { runOnImageDataAcquired = actionRunnable } + } + } + ) + } + + private fun getActionRunnable( + retrieveIntent: (Uri) -> Intent, + overrideTransition: Boolean + ): (SavedImageData) -> Unit { + val onClick: (SavedImageData) -> Unit = { + val intent = retrieveIntent(it.uri) + debugLog(DEBUG_ACTIONS) { "Action tapped: $intent" } + isPendingSharedTransition = true + callbacks!!.onAction(intent, it.owner, overrideTransition) + } + return onClick + } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java index cb2dba00890b..65e845749f9e 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotView.java @@ -90,7 +90,6 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.UiEventLogger; import com.android.systemui.flags.FeatureFlags; -import com.android.systemui.flags.Flags; import com.android.systemui.res.R; import com.android.systemui.screenshot.scroll.ScrollCaptureController; import com.android.systemui.shared.system.InputChannelCompat; @@ -789,15 +788,8 @@ public class ScreenshotView extends FrameLayout implements mUiEventLogger.log(ScreenshotEvent.SCREENSHOT_SHARE_TAPPED, 0, mPackageName); prepareSharedTransition(); - Intent shareIntent; - if (mFlags.isEnabled(Flags.SCREENSHOT_METADATA) && mScreenshotData != null - && mScreenshotData.getContextUrl() != null) { - shareIntent = ActionIntentCreator.INSTANCE.createShareWithText( - imageData.uri, mScreenshotData.getContextUrl().toString()); - } else { - shareIntent = ActionIntentCreator.INSTANCE.createShareWithSubject( - imageData.uri, imageData.subject); - } + Intent shareIntent = ActionIntentCreator.INSTANCE.createShareWithSubject( + imageData.uri, imageData.subject); mCallbacks.onAction(shareIntent, imageData.owner, false); }); diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java index 9118ee1dfc73..2ce6d8380e36 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java @@ -94,8 +94,8 @@ public abstract class ScreenshotModule { ScreenshotSoundControllerImpl screenshotSoundProviderImpl); @Binds - abstract ScreenshotActionsProvider bindScreenshotActionsProvider( - DefaultScreenshotActionsProvider defaultScreenshotActionsProvider); + abstract ScreenshotActionsProvider.Factory bindScreenshotActionsProviderFactory( + DefaultScreenshotActionsProvider.Factory defaultScreenshotActionsProviderFactory); @Provides @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt index a5825b5f7797..c7fe3f608a2f 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ActionButtonViewBinder.kt @@ -36,6 +36,7 @@ object ActionButtonViewBinder { } else { view.setOnClickListener(null) } + view.contentDescription = viewModel.description view.visibility = View.VISIBLE view.alpha = 1f } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt index 3bcd52cbc99e..d8782009e24b 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt @@ -59,6 +59,11 @@ object ScreenshotShelfViewBinder { } } launch { + viewModel.previewAction.collect { onClick -> + previewView.setOnClickListener { onClick?.run() } + } + } + launch { viewModel.actions.collect { actions -> if (actions.isNotEmpty()) { view diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt index 6ee970534352..05bfed159527 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ActionButtonViewModel.kt @@ -20,6 +20,7 @@ import android.graphics.drawable.Drawable data class ActionButtonViewModel( val icon: Drawable?, - val name: String?, + val name: CharSequence?, + val description: CharSequence, val onClicked: (() -> Unit)? ) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt index 3a652d90bb78..dc61d1e9c37b 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/viewmodel/ScreenshotViewModel.kt @@ -24,6 +24,8 @@ import kotlinx.coroutines.flow.StateFlow class ScreenshotViewModel(private val accessibilityManager: AccessibilityManager) { private val _preview = MutableStateFlow<Bitmap?>(null) val preview: StateFlow<Bitmap?> = _preview + private val _previewAction = MutableStateFlow<Runnable?>(null) + val previewAction: StateFlow<Runnable?> = _previewAction private val _actions = MutableStateFlow(emptyList<ActionButtonViewModel>()) val actions: StateFlow<List<ActionButtonViewModel>> = _actions val showDismissButton: Boolean @@ -33,7 +35,19 @@ class ScreenshotViewModel(private val accessibilityManager: AccessibilityManager _preview.value = bitmap } - fun setActions(actions: List<ActionButtonViewModel>) { - _actions.value = actions + fun setPreviewAction(runnable: Runnable) { + _previewAction.value = runnable + } + + fun addActions(actions: List<ActionButtonViewModel>) { + val actionList = _actions.value.toMutableList() + actionList.addAll(actions) + _actions.value = actionList + } + + fun reset() { + _preview.value = null + _previewAction.value = null + _actions.value = listOf() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt index a1241965de7a..cc72a1e3f842 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/FullMobileConnectionRepository.kt @@ -301,7 +301,7 @@ class FullMobileConnectionRepository( .flatMapLatest { it.networkName } .logDiffsForTable( tableLogBuffer, - columnPrefix = "", + columnPrefix = "intent", initialValue = activeRepo.value.networkName.value, ) .stateIn(scope, SharingStarted.WhileSubscribed(), activeRepo.value.networkName.value) @@ -311,7 +311,7 @@ class FullMobileConnectionRepository( .flatMapLatest { it.carrierName } .logDiffsForTable( tableLogBuffer, - columnPrefix = "", + columnPrefix = "sub", initialValue = activeRepo.value.carrierName.value, ) .stateIn(scope, SharingStarted.WhileSubscribed(), activeRepo.value.carrierName.value) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt index 77fd6bef8a33..e4a2a6820d5b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryImpl.kt @@ -358,7 +358,13 @@ class MobileConnectionRepositoryImpl( } .stateIn(scope, SharingStarted.WhileSubscribed(), telephonyManager.simCarrierId) - /** BroadcastDispatcher does not handle sticky broadcasts, so we can't use it here */ + /** + * BroadcastDispatcher does not handle sticky broadcasts, so we can't use it here. Note that we + * now use the [SharingStarted.Eagerly] strategy, because there have been cases where the sticky + * broadcast does not represent the correct state. + * + * See b/322432056 for context. + */ @SuppressLint("RegisterReceiverViaContext") override val networkName: StateFlow<NetworkNameModel> = conflatedCallbackFlow { @@ -388,7 +394,7 @@ class MobileConnectionRepositoryImpl( awaitClose { context.unregisterReceiver(receiver) } } .flowOn(bgDispatcher) - .stateIn(scope, SharingStarted.WhileSubscribed(), defaultNetworkName) + .stateIn(scope, SharingStarted.Eagerly, defaultNetworkName) override val dataEnabled = run { val initial = telephonyManager.isDataConnectionAllowed diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt index 98556514f8ec..f761bcfe63d6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt @@ -868,6 +868,24 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { } @Test + fun networkName_usingEagerStrategy_retainsNameBetweenSubscribers() = + testScope.runTest { + // Use the [StateFlow.value] getter so we can prove that the collection happens + // even when there is no [Job] + + // Starts out default + assertThat(underTest.networkName.value).isEqualTo(DEFAULT_NAME_MODEL) + + val intent = spnIntent() + val captor = argumentCaptor<BroadcastReceiver>() + verify(context).registerReceiver(captor.capture(), any()) + captor.value!!.onReceive(context, intent) + + // The value is still there despite no active subscribers + assertThat(underTest.networkName.value).isEqualTo(intent.toNetworkNameModel(SEP)) + } + + @Test fun operatorAlphaShort_tracked() = testScope.runTest { var latest: String? = null diff --git a/packages/VpnDialogs/res/values-de/strings.xml b/packages/VpnDialogs/res/values-de/strings.xml index 7397ddb2510c..062f61c9eb42 100644 --- a/packages/VpnDialogs/res/values-de/strings.xml +++ b/packages/VpnDialogs/res/values-de/strings.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="prompt" msgid="3183836924226407828">"Verbindungsanfrage"</string> - <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. <br /> <br /> Wenn das VPN aktiv ist, wird oben im Display <img src=vpn_icon /> angezeigt."</string> + <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. <br /> <br /> Wenn das VPN aktiv ist, wird oben auf dem Display das Symbol „<img src=vpn_icon />“ angezeigt."</string> <string name="warning" product="tv" msgid="5188957997628124947">"<xliff:g id="APP">%s</xliff:g> möchte eine VPN-Verbindung herstellen, über die der Netzwerkverkehr überwacht werden kann. Lass die Verbindung nur zu, wenn die App vertrauenswürdig ist. <br /> <br /> <img src=vpn_icon /> wird auf dem Display angezeigt, wenn VPN aktiv ist."</string> <string name="legacy_title" msgid="192936250066580964">"VPN ist verbunden"</string> <string name="session" msgid="6470628549473641030">"Sitzung:"</string> diff --git a/services/backup/flags.aconfig b/services/backup/flags.aconfig index e9f959f4b9eb..74adfe08dba7 100644 --- a/services/backup/flags.aconfig +++ b/services/backup/flags.aconfig @@ -50,4 +50,12 @@ flag { "logger." bug: "296844513" is_fixed_read_only: true +} + +flag { + name: "enable_increased_bmm_logging_for_restore_at_install" + namespace: "onboarding" + description: "Increase BMM logging coverage in restore at install flow." + bug: "331749778" + is_fixed_read_only: true }
\ No newline at end of file diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 976504a8d880..dc1cfb92c3b8 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -3903,11 +3903,33 @@ public class UserBackupManagerService { skip = true; } + BackupManagerMonitorEventSender mBMMEventSender = + getBMMEventSender(/*monitor=*/ null); + PackageInfo packageInfo = getPackageInfoForBMMLogging(packageName); TransportConnection transportConnection = mTransportManager.getCurrentTransportClient("BMS.restoreAtInstall()"); if (transportConnection == null) { if (DEBUG) Slog.w(TAG, addUserIdToLogMessage(mUserId, "No transport client")); skip = true; + } else if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) { + try { + BackupTransportClient transportClient = transportConnection.connectOrThrow( + "BMS.restoreAtInstall"); + mBMMEventSender.setMonitor(transportClient.getBackupManagerMonitor()); + } catch (TransportNotAvailableException | RemoteException e) { + mBMMEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_TRANSPORT_IS_NULL, packageInfo, + BackupManagerMonitor.LOG_EVENT_CATEGORY_TRANSPORT, null); + } + } + + if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) { + mBMMEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED, packageInfo, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + mBMMEventSender.putMonitoringExtra(/*extras=*/null, + BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, + BackupAnnotations.OperationType.RESTORE)); } if (!mAutoRestore) { @@ -3943,7 +3965,7 @@ public class UserBackupManagerService { RestoreParams.createForRestoreAtInstall( transportConnection, /* observer */ null, - /* monitor */ null, + mBMMEventSender.getMonitor(), restoreSet, packageName, token, @@ -3963,6 +3985,15 @@ public class UserBackupManagerService { if (skip) { // Auto-restore disabled or no way to attempt a restore + if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) { + mBMMEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL, packageInfo, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + mBMMEventSender.putMonitoringExtra(/*extras=*/null, + BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, + BackupAnnotations.OperationType.RESTORE)); + } + if (transportConnection != null) { mTransportManager.disposeOfTransportClient( transportConnection, "BMS.restoreAtInstall()"); @@ -3976,6 +4007,23 @@ public class UserBackupManagerService { } } + private PackageInfo getPackageInfoForBMMLogging(String packageName) { + try { + return mPackageManager.getPackageInfoAsUser(packageName, 0, mUserId); + } catch (NameNotFoundException e) { + Slog.w( + TAG, + addUserIdToLogMessage( + mUserId, "Asked to get PackageInfo for BMM logging of nonexistent pkg " + + packageName)); + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = packageName; + + return packageInfo; + } + } + /** Hand off a restore session. */ public IRestoreSession beginRestoreSession(String packageName, String transport) { if (DEBUG) { diff --git a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java index 2c9eb51972af..b414b252cc37 100644 --- a/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java +++ b/services/backup/java/com/android/server/backup/restore/FullRestoreEngine.java @@ -29,6 +29,7 @@ import android.app.ApplicationThreadConstants; import android.app.IBackupAgent; import android.app.backup.BackupAgent; import android.app.backup.BackupAnnotations; +import android.app.backup.BackupManagerMonitor; import android.app.backup.FullBackup; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IFullBackupRestoreObserver; @@ -57,6 +58,7 @@ import com.android.server.backup.OperationStorage.OpType; import com.android.server.backup.UserBackupManagerService; import com.android.server.backup.fullbackup.FullBackupObbConnection; import com.android.server.backup.utils.BackupEligibilityRules; +import com.android.server.backup.utils.BackupManagerMonitorEventSender; import com.android.server.backup.utils.BytesReadListener; import com.android.server.backup.utils.FullBackupRestoreObserverUtils; import com.android.server.backup.utils.RestoreUtils; @@ -143,6 +145,8 @@ public class FullRestoreEngine extends RestoreEngine { private FileMetadata mReadOnlyParent = null; + private BackupManagerMonitorEventSender mBackupManagerMonitorEventSender; + public FullRestoreEngine( UserBackupManagerService backupManagerService, OperationStorage operationStorage, BackupRestoreTask monitorTask, IFullBackupRestoreObserver observer, @@ -155,6 +159,7 @@ public class FullRestoreEngine extends RestoreEngine { mMonitorTask = monitorTask; mObserver = observer; mMonitor = monitor; + mBackupManagerMonitorEventSender = new BackupManagerMonitorEventSender(monitor); mOnlyPackage = onlyPackage; mAllowApks = allowApks; mAgentTimeoutParameters = Objects.requireNonNull( @@ -225,6 +230,9 @@ public class FullRestoreEngine extends RestoreEngine { // one app's data but see a different app's on the wire if (onlyPackage != null) { if (!pkg.equals(onlyPackage.packageName)) { + logBMMEvent( + BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE, + onlyPackage); Slog.w(TAG, "Expected data for " + onlyPackage + " but saw " + pkg); setResult(RestoreEngine.TRANSPORT_FAILURE); setRunning(false); @@ -412,6 +420,9 @@ public class FullRestoreEngine extends RestoreEngine { } if (mAgent == null) { + logBMMEvent( + BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE, + onlyPackage); Slog.e(TAG, "Unable to create agent for " + pkg); okay = false; tearDownPipes(); @@ -501,6 +512,9 @@ public class FullRestoreEngine extends RestoreEngine { } catch (RemoteException e) { // whoops, remote entity went away. We'll eat the content // ourselves, then, and not copy it over. + logBMMEvent( + BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT, + onlyPackage); Slog.e(TAG, "Agent crashed during full restore"); agentSuccess = false; okay = false; @@ -531,6 +545,9 @@ public class FullRestoreEngine extends RestoreEngine { } catch (IOException e) { Slog.e(TAG, "Failed to write to restore pipe: " + e.getMessage()); + logBMMEvent( + BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE, + onlyPackage); pipeOkay = false; } } @@ -548,6 +565,8 @@ public class FullRestoreEngine extends RestoreEngine { // okay, if the remote end failed at any point, deal with // it by ignoring the rest of the restore on it if (!agentSuccess) { + logBMMEvent(BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE, + onlyPackage); Slog.w(TAG, "Agent failure restoring " + pkg + "; ending restore"); mBackupManagerService.getBackupHandler().removeMessages( MSG_RESTORE_OPERATION_TIMEOUT); @@ -590,6 +609,8 @@ public class FullRestoreEngine extends RestoreEngine { if (DEBUG) { Slog.w(TAG, "io exception on restore socket read: " + e.getMessage()); } + logBMMEvent(BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT, + onlyPackage); setResult(RestoreEngine.TRANSPORT_FAILURE); info = null; } @@ -631,6 +652,16 @@ public class FullRestoreEngine extends RestoreEngine { return false; } + private void logBMMEvent(int eventId, PackageInfo pkgInfo) { + if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) { + mBackupManagerMonitorEventSender.monitorEvent(eventId, pkgInfo, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + mBackupManagerMonitorEventSender.putMonitoringExtra(/*extras=*/ + null, BackupManagerMonitor.EXTRA_LOG_OPERATION_TYPE, + BackupAnnotations.OperationType.RESTORE)); + } + } + private static boolean isValidParent(FileMetadata parentDir, @NonNull FileMetadata childDir) { return parentDir != null && childDir.packageName.equals(parentDir.packageName) diff --git a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java index 8fece8257b89..e536876f6cc3 100644 --- a/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java +++ b/services/backup/java/com/android/server/backup/restore/PerformUnifiedRestoreTask.java @@ -418,25 +418,6 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { private void startRestore() { sendStartRestore(mAcceptSet.size()); - // If we're starting a full-system restore, set up to begin widget ID remapping - if (mIsSystemRestore) { - AppWidgetBackupBridge.systemRestoreStarting(mUserId); - Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); - mBackupManagerMonitorEventSender.monitorEvent( - BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE, - null, - BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, - monitoringExtras); - } else { - // We are either performing RestoreAtInstall or Bmgr. - Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); - mBackupManagerMonitorEventSender.monitorEvent( - BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL, - null, - BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, - monitoringExtras); - } - try { String transportDirName = mTransportManager.getTransportDirName( @@ -459,6 +440,34 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { mBackupManagerMonitorEventSender.setMonitor(transport.getBackupManagerMonitor()); } + if (Flags.enableIncreasedBmmLoggingForRestoreAtInstall()) { + for (PackageInfo info : mAcceptSet) { + mBackupManagerMonitorEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE, info, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + addRestoreOperationTypeToEvent(/* extras= */ null)); + } + } + + // If we're starting a full-system restore, set up to begin widget ID remapping + if (mIsSystemRestore) { + AppWidgetBackupBridge.systemRestoreStarting(mUserId); + Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); + mBackupManagerMonitorEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_START_SYSTEM_RESTORE, + null, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + monitoringExtras); + } else { + // We are either performing RestoreAtInstall or Bmgr. + Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); + mBackupManagerMonitorEventSender.monitorEvent( + BackupManagerMonitor.LOG_EVENT_ID_START_RESTORE_AT_INSTALL, + null, + BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, + monitoringExtras); + } + mStatus = transport.startRestore(mToken, packages); if (mStatus != BackupTransport.TRANSPORT_OK) { Slog.e(TAG, "Transport error " + mStatus + "; no restore possible"); @@ -638,7 +647,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); mBackupManagerMonitorEventSender.monitorEvent( BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_NOT_PRESENT, - mCurrentPackage, + createPackageInfoForBMMLogging(pkgName), BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, monitoringExtras); EventLog.writeEvent( @@ -739,7 +748,7 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { Bundle monitoringExtras = addRestoreOperationTypeToEvent(/* extras= */ null); mBackupManagerMonitorEventSender.monitorEvent( BackupManagerMonitor.LOG_EVENT_ID_NO_NEXT_RESTORE_TARGET, - mCurrentPackage, + null, BackupManagerMonitor.LOG_EVENT_CATEGORY_BACKUP_MANAGER_POLICY, monitoringExtras); EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE); @@ -1804,4 +1813,10 @@ public class PerformUnifiedRestoreTask implements BackupRestoreTask { monitoringExtrasDenylist); } + private PackageInfo createPackageInfoForBMMLogging(String packageName) { + PackageInfo packageInfo = new PackageInfo(); + packageInfo.packageName = packageName; + + return packageInfo; + } } diff --git a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java index 6d315ba38b31..fad59d23a6dc 100644 --- a/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java +++ b/services/backup/java/com/android/server/backup/utils/BackupManagerMonitorDumpsysUtils.java @@ -371,6 +371,24 @@ public class BackupManagerMonitorDumpsysUtils { "V to U restore pkg not eligible"; case BackupManagerMonitor.LOG_EVENT_ID_V_TO_U_RESTORE_SET_LIST -> "V to U restore lists"; + case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_AT_INSTALL_INVOKED -> + "Invoked restore at install"; + case BackupManagerMonitor.LOG_EVENT_ID_SKIP_RESTORE_AT_INSTALL -> + "Skip restore at install"; + case BackupManagerMonitor.LOG_EVENT_ID_PACKAGE_ACCEPTED_FOR_RESTORE -> + "Pkg accepted for restore"; + case BackupManagerMonitor.LOG_EVENT_ID_RESTORE_DATA_DOES_NOT_BELONG_TO_PACKAGE -> + "Restore data does not belong to package"; + case BackupManagerMonitor.LOG_EVENT_ID_UNABLE_TO_CREATE_AGENT_FOR_RESTORE -> + "Unable to create Agent"; + case BackupManagerMonitor.LOG_EVENT_ID_AGENT_CRASHED_BEFORE_RESTORE_DATA_IS_SENT -> + "Agent crashed before restore data is streamed"; + case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_SEND_DATA_TO_AGENT_DURING_RESTORE -> + "Failed to send data to agent"; + case BackupManagerMonitor.LOG_EVENT_ID_AGENT_FAILURE_DURING_RESTORE -> + "Agent failure during restore"; + case BackupManagerMonitor.LOG_EVENT_ID_FAILED_TO_READ_DATA_FROM_TRANSPORT -> + "Failed to read data from Transport"; default -> "Unknown log event ID: " + code; }; return id; |