diff options
61 files changed, 653 insertions, 325 deletions
diff --git a/PermissionController/jarjar-rules.txt b/PermissionController/jarjar-rules.txt index 5ecb0241f..ceac6c3a7 100644 --- a/PermissionController/jarjar-rules.txt +++ b/PermissionController/jarjar-rules.txt @@ -26,6 +26,10 @@ rule android.os.*FeatureFlags* com.android.permissioncontroller.jarjar.@0 rule android.os.FeatureFlags* com.android.permissioncontroller.jarjar.@0 rule android.os.FeatureFlags com.android.permissioncontroller.jarjar.@0 rule android.os.Flags com.android.permissioncontroller.jarjar.@0 +rule android.xr.*FeatureFlags* com.android.permissioncontroller.jarjar.@0 +rule android.xr.FeatureFlags* com.android.permissioncontroller.jarjar.@0 +rule android.xr.FeatureFlags com.android.permissioncontroller.jarjar.@0 +rule android.xr.Flags com.android.permissioncontroller.jarjar.@0 rule com.android.permission.flags.*FeatureFlags* com.android.permissioncontroller.jarjar.@0 rule com.android.permission.flags.FeatureFlags* com.android.permissioncontroller.jarjar.@0 rule com.android.permission.flags.FeatureFlags com.android.permissioncontroller.jarjar.@0 diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml index d6632c08c..5872dae21 100644 --- a/PermissionController/res/values-ar/strings.xml +++ b/PermissionController/res/values-ar/strings.xml @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"تم حظر هذا الإعداد لحماية الجهاز والبيانات.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>قد يحاول المخادِعون تثبيت تطبيقات ضارّة من خلال طلب تثبيت تطبيقات غير معروفة من مصدر جديد."</string> +</xliff:g>قد يطلب منك المخادِعون تثبيت تطبيقات غير معروفة من مصدر جديد في محاولة لتثبيت تطبيقات ضارّة."</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>قد يحاول المخادِعون التحكّم في جهازك من خلال طلب السماح بوصول أحد التطبيقات إلى ميزات تسهيل الاستخدام."</string> diff --git a/PermissionController/res/values-b+sr+Latn/strings.xml b/PermissionController/res/values-b+sr+Latn/strings.xml index 994075e38..f65a2ad0e 100644 --- a/PermissionController/res/values-b+sr+Latn/strings.xml +++ b/PermissionController/res/values-b+sr+Latn/strings.xml @@ -355,7 +355,7 @@ <string name="accessibility_service_dialog_title_multiple" msgid="5527879210683548175">"Aplikacije pristupačnosti (<xliff:g id="NUM_SERVICES">%s</xliff:g>) imaju potpun pristup uređaju"</string> <string name="accessibility_service_dialog_bottom_text_single" msgid="1128666197822205958">"<xliff:g id="SERVICE_NAME">%s</xliff:g> može da pregleda sadržaj ekrana, radnje i unose, obavlja radnje i upravlja ekranom."</string> <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Ove aplikacije mogu da pregledaju sadržaj ekrana, radnje i unose, kao i da obavljaju radnje i upravljaju ekranom."</string> - <string name="role_assistant_label" msgid="4727586018198208128">"Podrazumev. digitalni pomoćnik"</string> + <string name="role_assistant_label" msgid="4727586018198208128">"Podrazumevani digitalni pomoćnik"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Aplikacija digitalnog pomoćnika"</string> <string name="role_assistant_description" msgid="6622458130459922952">"Aplikacije za pomoć mogu da vam pomognu na osnovu informacija sa ekrana koji gledate. Neke aplikacije podržavaju usluge pokretača i glasovnog unosa da bi vam pružile integrisanu pomoć."</string> <string name="role_browser_label" msgid="2877796144554070207">"Podrazumevana apl. pregledača"</string> diff --git a/PermissionController/res/values-bn/strings.xml b/PermissionController/res/values-bn/strings.xml index ce33e6217..131a87878 100644 --- a/PermissionController/res/values-bn/strings.xml +++ b/PermissionController/res/values-bn/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"এই অ্যাপগুলি আপনার স্ক্রিন, অ্যাকশন ও ইনপুট দেখতে এবং অ্যাকশন নিতে ও ডিসপ্লে নিয়ন্ত্রণ করতে পারে।"</string> <string name="role_assistant_label" msgid="4727586018198208128">"ডিফল্ট ডিজিটাল অ্যাসিস্ট্যান্ট অ্যাপ"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"ডিজিটাল অ্যাসিস্ট্যান্ট অ্যাপ"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"আপনি যে স্ক্রিন দেখছেন সেটির তথ্যের উপর নির্ভর করে সহায়তা অ্যাপ আপনাকে সাহায্য করতে পারে৷ কিছু অ্যাপ আপনাকে ইন্টিগ্রেটেড সহায়তা দিতে, লঞ্চার ও ভয়েস ইনপুট দুটি পরিষেবাই ব্যবহার করতে পারে।"</string> + <string name="role_assistant_description" msgid="6622458130459922952">"আপনি যে স্ক্রিন দেখছেন সেটির তথ্যের উপর নির্ভর করে অ্যাসিস্ট অ্যাপ আপনাকে সাহায্য করতে পারে৷ কিছু অ্যাপ আপনাকে ইন্টিগ্রেটেড সহায়তা দিতে, লঞ্চার ও ভয়েস ইনপুট দুটি পরিষেবাই ব্যবহার করতে পারে।"</string> <string name="role_browser_label" msgid="2877796144554070207">"ডিফল্ট ব্রাউজার অ্যাপ"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"ব্রাউজার অ্যাপ"</string> <string name="role_browser_description" msgid="3465253637499842671">"এমন অ্যাপ যা ইন্টারনেট অ্যাক্সেস করতে সাহায্য করে ও ট্যাপ করা লিঙ্কগুলি দেখায়"</string> @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"আপনার ডিভাইস ও ডেটা সুরক্ষিত রাখতে এই সেটিং ব্লক করা হয়েছে।<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>স্ক্যামাররা নতুন সোর্স থেকে অজানা অ্যাপ ইনস্টল করতে বলার মাধ্যমে, ক্ষতিকর অ্যাপ ইনস্টল করার চেষ্টা করতে পারে।"</string> +</xliff:g>স্ক্যামাররা আপনাকে নতুন সোর্স থেকে অজানা অ্যাপ ইনস্টল করার কথা বলে, ক্ষতিকর অ্যাপ ইনস্টল করার চেষ্টা করতে পারে।"</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>স্ক্যামাররা কোনও অ্যাপের জন্য অ্যাক্সেসিবিলিটি অ্যাক্সেস করার অনুমতি দিতে বলার মাধ্যমে, আপনার ডিভাইসের কন্ট্রোল নেওয়ার চেষ্টা করতে পারে।"</string> diff --git a/PermissionController/res/values-bs/strings.xml b/PermissionController/res/values-bs/strings.xml index de01dcfa3..cda6d19d6 100644 --- a/PermissionController/res/values-bs/strings.xml +++ b/PermissionController/res/values-bs/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Ove aplikacije mogu pregledati vaš ekran, radnje i unose, izvršavati radnje i kontrolirati ekran."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Zadani digitalni asistent"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Aplikacija digitalnog asistenta"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Aplikacije za pomoć vam mogu pomoći na osnovu informacija s ekrana koji pregledate. Neke aplikacije podržavaju i usluge pokretača i glasovnog unosa kako bi vam pružile sveukupnu pomoć."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Aplikacije za pomoć vam mogu pomoći na osnovu informacija s ekrana koji pregledate. Neke aplikacije podržavaju i usluge pokretača i glasovnog unosa kako bi vam pružile integriranu pomoć."</string> <string name="role_browser_label" msgid="2877796144554070207">"Zadana aplikacija preglednika"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Aplikacija preglednika"</string> <string name="role_browser_description" msgid="3465253637499842671">"Aplikacije koje vam pružaju pristup internetu i prikazuju linkove koje možete dodirnuti"</string> diff --git a/PermissionController/res/values-en-rAU/strings.xml b/PermissionController/res/values-en-rAU/strings.xml index 369a13497..0ec4ed4f2 100644 --- a/PermissionController/res/values-en-rAU/strings.xml +++ b/PermissionController/res/values-en-rAU/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"These apps can view your screen, actions and inputs, perform actions, and control the display."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Default digital assistant app"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Digital assistant app"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you, based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> <string name="role_browser_label" msgid="2877796144554070207">"Default browser app"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Browser app"</string> <string name="role_browser_description" msgid="3465253637499842671">"Apps that give you access to the Internet and display links that you tap"</string> diff --git a/PermissionController/res/values-en-rGB/strings.xml b/PermissionController/res/values-en-rGB/strings.xml index c3311aaf4..44a195ef9 100644 --- a/PermissionController/res/values-en-rGB/strings.xml +++ b/PermissionController/res/values-en-rGB/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"These apps can view your screen, actions and inputs, perform actions, and control the display."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Default digital assistant app"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Digital assistant app"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you, based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> <string name="role_browser_label" msgid="2877796144554070207">"Default browser app"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Browser app"</string> <string name="role_browser_description" msgid="3465253637499842671">"Apps that give you access to the Internet and display links that you tap"</string> diff --git a/PermissionController/res/values-en-rIN/strings.xml b/PermissionController/res/values-en-rIN/strings.xml index c3311aaf4..44a195ef9 100644 --- a/PermissionController/res/values-en-rIN/strings.xml +++ b/PermissionController/res/values-en-rIN/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"These apps can view your screen, actions and inputs, perform actions, and control the display."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Default digital assistant app"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Digital assistant app"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you, based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Assist apps can help you based on information from the screen that you’re viewing. Some apps support both Launcher and voice input services to give you integrated assistance."</string> <string name="role_browser_label" msgid="2877796144554070207">"Default browser app"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Browser app"</string> <string name="role_browser_description" msgid="3465253637499842671">"Apps that give you access to the Internet and display links that you tap"</string> diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml index a48267fd9..0a8908fd7 100644 --- a/PermissionController/res/values-es-rUS/strings.xml +++ b/PermissionController/res/values-es-rUS/strings.xml @@ -678,7 +678,7 @@ <string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir configuración restringida"</string> <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Parámetro restringido"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Por seguridad, este parámetro de configuración no está disponible actualmente."</string> - <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"No se puede completar la acción durante la llamada"</string> + <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"No se puede completar la acción durante las llamadas"</string> <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Se bloqueó este parámetro de configuración para proteger tu dispositivo y tus datos.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> diff --git a/PermissionController/res/values-es/strings.xml b/PermissionController/res/values-es/strings.xml index 7fa05079e..6c2e76289 100644 --- a/PermissionController/res/values-es/strings.xml +++ b/PermissionController/res/values-es/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Estas aplicaciones pueden ver tu pantalla, lo que haces y lo que introduces; realizar acciones; y controlar la pantalla."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Aplicación de asistente digital predeterminada"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Aplicación de asistente digital"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Las aplicaciones de asistencia te ayudan según la información que aparezca en la pantalla. Algunas aplicaciones admiten tanto el menú de aplicaciones como los servicios de entrada de voz para ofrecerte asistencia integrada."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Las aplicaciones de asistencia te ayudan a partir de la información que aparezca en la pantalla. Algunas aplicaciones admiten tanto el menú de aplicaciones como los servicios de entrada de voz para ofrecerte asistencia integrada."</string> <string name="role_browser_label" msgid="2877796144554070207">"Aplicación de navegador predeterminada"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Aplicación de navegador"</string> <string name="role_browser_description" msgid="3465253637499842671">"Son las aplicaciones que te permiten acceder a Internet y abren los enlaces que tocas"</string> @@ -678,7 +678,7 @@ <string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir ajustes restringidos"</string> <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ajuste restringido"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Por seguridad, este ajuste no está disponible actualmente."</string> - <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"No se puede completar la acción durante la llamada"</string> + <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"No se puede completar la acción durante una llamada"</string> <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Este ajuste está bloqueado para proteger tu dispositivo y tus datos.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml index 4d1ee6e4e..a8f8fb6dd 100644 --- a/PermissionController/res/values-et/strings.xml +++ b/PermissionController/res/values-et/strings.xml @@ -679,7 +679,7 @@ <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Piiratud seade"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Teie turvalisuse huvides pole see seade praegu saadaval."</string> <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Seda toimingut ei saa kõne ajal teha"</string> - <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"See seade on teie seadme ja andmete kaitsmiseks blokeeritud.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"See säte on teie seadme ja andmete kaitsmiseks blokeeritud.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> </xliff:g>Petised võivad proovida installida kahjulikke rakendusi, paludes teil installida uuest allikast tundmatuid rakendusi."</string> diff --git a/PermissionController/res/values-eu/strings.xml b/PermissionController/res/values-eu/strings.xml index 6f64c70e8..5906b18dc 100644 --- a/PermissionController/res/values-eu/strings.xml +++ b/PermissionController/res/values-eu/strings.xml @@ -460,8 +460,7 @@ <string name="incident_report_notification_text" msgid="3376480583513587923">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak arazketa-informazioa kargatu nahi du."</string> <string name="incident_report_dialog_title" msgid="669104389325204095">"Arazketa-datuak partekatu nahi dituzu?"</string> <string name="incident_report_dialog_intro" msgid="5897733669850951832">"Arazo bat hauteman du sistemak."</string> - <!-- no translation found for incident_report_dialog_text (1819244417678973362) --> - <skip /> + <string name="incident_report_dialog_text" msgid="1819244417678973362">"<xliff:g id="DATE">%2$s</xliff:g> (<xliff:g id="TIME">%3$s</xliff:g>) datan sortutako akatsen txostena kargatzeko baimena eskatzen ari da <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Akatsen txostenek zure gailuari buruzkoa den edo aplikazioek erregistratu duten informazio pertsonala dute; adibidez, erabiltzaile-izenak, kokapenari buruzko datuak, gailu-identifikatzaileak eta sareari buruzko informazioa. Informazio hori izateko fidagarriak iruditzen zaizkizun pertsona eta aplikazioekin soilik partekatu beharko zenituzke akatsen txostenak.\n\nAkatsen txostena kargatzeko baimena eman nahi diozu <xliff:g id="APP_NAME_1">%4$s</xliff:g> aplikazioari?"</string> <string name="incident_report_error_dialog_text" msgid="4189647113387092272">"Errore bat gertatu da <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren akatsen txostena prozesatzean; beraz, ezin izan dira partekatu arazketa-datu xehatuak. Barkatu eragozpenak."</string> <string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Eman baimena"</string> <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Ukatu"</string> @@ -680,12 +679,13 @@ <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Murriztapenak ditu ezarpenak"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Zure segurtasuna bermatzeko, ezarpena ez dago erabilgarri une honetan."</string> <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Ezin da osatu ekintza deia abian den bitartean"</string> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (3803423079498712549) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc (6400007048943674066) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc (6567523001053288057) --> - <skip /> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Ezarpen hau blokeatuta dago zure gailua eta datuak babesteko.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Baliteke iruzurgileak aplikazio kaltegarriak instalatzen saiatzea, aplikazio ezezagunak iturburu berri batetik instalatzeko eskatuta."</string> + <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Baliteke iruzurgileak zure gailua kontrolatzen saiatzea, aplikazio batean erabilerraztasun-eginbideak erabiltzeko baimena eskatuta."</string> <string name="enhanced_confirmation_phone_state_dialog_generic_desc" msgid="158278816955957088"></string> <string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikazioari <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> erabiltzeko baimena ukatu zaio"</string> <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Kontuzko informazioa erabiltzeko baimen bat eskatu du aplikazioak, eta agian horrek arriskuan jarriko ditu zure informazio pertsonala eta finantzei buruzko informazioa.<xliff:g id="ID_1"><br><br></xliff:g>Baliteke aplikazioak behar bezala ez funtzionatzea baimen murriztu hori gabe. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Lortu baimena emateko argibideak</a>"</string> diff --git a/PermissionController/res/values-fr-rCA/strings.xml b/PermissionController/res/values-fr-rCA/strings.xml index 1180ab935..fc91de0e0 100644 --- a/PermissionController/res/values-fr-rCA/strings.xml +++ b/PermissionController/res/values-fr-rCA/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Ces applis peuvent voir votre écran, vos actions et ce que vous entrez; elles peuvent également effectuer des actions et contrôler l\'écran."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Assistant numérique par défaut"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Appli d\'assistant numérique"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Les applis d\'assistance peuvent vous aider en fonction de l\'information affichée à l\'écran. Certaines applis sont compatibles à la fois avec le lanceur d\'applis et les services d\'entrée vocale, vous permettant de bénéficier d\'une assistance intégrée."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Les applis d\'assistance peuvent se servir des informations à l\'écran pour vous aider. Certaines applis sont compatibles à la fois avec le lanceur d\'applis et les services d\'entrée vocale pour vous offrir une assistance intégrée."</string> <string name="role_browser_label" msgid="2877796144554070207">"Appli de navigation par défaut"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Appli de navigation"</string> <string name="role_browser_description" msgid="3465253637499842671">"Applis qui vous donnent accès à Internet et qui affichent des liens que vous pouvez toucher"</string> diff --git a/PermissionController/res/values-gl/strings.xml b/PermissionController/res/values-gl/strings.xml index 8bf1079e7..0a46020ff 100644 --- a/PermissionController/res/values-gl/strings.xml +++ b/PermissionController/res/values-gl/strings.xml @@ -460,8 +460,7 @@ <string name="incident_report_notification_text" msgid="3376480583513587923">"A aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> quere cargar información de depuración."</string> <string name="incident_report_dialog_title" msgid="669104389325204095">"Queres compartir os datos de depuración?"</string> <string name="incident_report_dialog_intro" msgid="5897733669850951832">"O sistema detectou un problema."</string> - <!-- no translation found for incident_report_dialog_text (1819244417678973362) --> - <skip /> + <string name="incident_report_dialog_text" msgid="1819244417678973362">"A aplicación <xliff:g id="APP_NAME_0">%1$s</xliff:g> quere cargar un informe de erros, xerado o <xliff:g id="DATE">%2$s</xliff:g> (<xliff:g id="TIME">%3$s</xliff:g>) deste dispositivo. Os informes de erros inclúen información persoal sobre o aparello ou datos rexistrados polas aplicacións, como os nomes de usuario, os datos de localización, os identificadores do dispositivo e a información da rede. Comparte estes informes unicamente con persoas e aplicacións de confianza.\n\nQueres permitir que a aplicación <xliff:g id="APP_NAME_1">%4$s</xliff:g> cargue un informe de erros?"</string> <string name="incident_report_error_dialog_text" msgid="4189647113387092272">"Houbo un erro ao procesar o informe de erros da aplicación <xliff:g id="APP_NAME">%1$s</xliff:g>, polo cal se denegou o uso compartido dos datos de depuración detallados. Lamentamos a interrupción."</string> <string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Permitir"</string> <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Denegar"</string> @@ -680,12 +679,13 @@ <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Opción de configuración restrinxida"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Pola túa seguranza, esta opción de configuración non está dispoñible nestes momentos."</string> <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Non se pode completar a acción durante as chamadas"</string> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (3803423079498712549) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc (6400007048943674066) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc (6567523001053288057) --> - <skip /> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Esta opción de configuración está bloqueada para protexer o teu dispositivo e os teus datos.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Os estafadores poden pedirche que instales aplicacións descoñecidas dunha orixe nova para instalar aplicacións daniñas."</string> + <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Os estafadores poden solicitarche permiso para entrar nas opcións de accesibilidade dunha aplicación co fin de tentar asumir o control do teu dispositivo."</string> <string name="enhanced_confirmation_phone_state_dialog_generic_desc" msgid="158278816955957088"></string> <string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Denegóuselle á aplicación o acceso ao permiso: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"A aplicación solicitou acceso a un permiso confidencial que pode poñer en perigo a túa información persoal e financeira.<xliff:g id="ID_1"><br><br></xliff:g>É posible que a aplicación non funcione correctamente sen este permiso restrinxido. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Máis información sobre como permitir o acceso</a>"</string> diff --git a/PermissionController/res/values-gu/strings.xml b/PermissionController/res/values-gu/strings.xml index 421b32714..eca8f049a 100644 --- a/PermissionController/res/values-gu/strings.xml +++ b/PermissionController/res/values-gu/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"આ ઍપ તમારી સ્ક્રીન, ક્રિયાઓ તેમજ ઇનપુટ જોઈ શકે છે, ક્રિયાઓ કરી શકે છે અને ડિસ્પ્લેનું નિયંત્રણ કરી શકે છે."</string> <string name="role_assistant_label" msgid="4727586018198208128">"ડિફૉલ્ટ ડિજિટલ આસિસ્ટંટ ઍપ"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"ડિજિટલ આસિસ્ટંટ ઍપ"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"તમે જોઈ રહ્યા હો તે સ્ક્રીન પરની માહિતીના આધારે સહાયક ઍપ તમને સહાય કરી શકે છે. કેટલીક ઍપ્લિકેશનો તમને એકીકૃત સહાયતા આપવા માટે લૉન્ચર અને વૉઇસ ઇનપુટ સેવાઓ એમ બંનેને સમર્થન આપે છે."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"તમે જોઈ રહ્યા હો તે સ્ક્રીન પરની માહિતીના આધારે સહાયક ઍપ તમને સહાય કરી શકે છે. કેટલીક ઍપ તમને એકીકૃત સહાયતા આપવા માટે લૉન્ચર અને વૉઇસ ઇનપુટ સેવાઓ બંનેને સમર્થન આપે છે."</string> <string name="role_browser_label" msgid="2877796144554070207">"ડિફૉલ્ટ બ્રાઉઝર ઍપ"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"બ્રાઉઝર ઍપ"</string> <string name="role_browser_description" msgid="3465253637499842671">"ઍપ કે જે તમને ઇન્ટરનેટનો ઍક્સેસ આપે અને તમે જેના પર ટૅપ કરો તે લિંક દર્શાવે"</string> @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"તમારા ડિવાઇસ અને ડેટાને સુરક્ષિત રાખવા માટે આ સેટિંગ બ્લૉક કરવામાં આવ્યું છે.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>સ્કૅમર તમને નવા સોર્સ પરથી અજાણી ઍપ ઇન્સ્ટૉલ કરવાનું કહીને હાનિકારક ઍપ ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરી શકે છે."</string> +</xliff:g>સ્કૅમર તમને નવા સૉર્સ પરથી અજાણી ઍપ ઇન્સ્ટૉલ કરવાનું કહીને હાનિકારક ઍપ ઇન્સ્ટૉલ કરવાનો પ્રયાસ કરી શકે છે."</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>સ્કૅમર તમને કોઈ ઍપના ઍક્સેસની મંજૂરી આપવાનું કહીને તમારા ડિવાઇસને નિયંત્રિત કરવાનો પ્રયાસ કરી શકે છે."</string> diff --git a/PermissionController/res/values-hi/strings.xml b/PermissionController/res/values-hi/strings.xml index ee311b8e4..1c543caff 100644 --- a/PermissionController/res/values-hi/strings.xml +++ b/PermissionController/res/values-hi/strings.xml @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"आपके डिवाइस और डेटा को सुरक्षित रखने के लिए, यह सेटिंग ब्लॉक की गई है. <xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>धोखाधड़ी करने वाले लोग, आपको नए सोर्स से अनजान ऐप्लिकेशन इंस्टॉल करने के लिए कहकर, नुकसान पहुंचाने वाले ऐप्लिकेशन इंस्टॉल करने की कोशिश कर सकते हैं."</string> +</xliff:g>धोखाधड़ी करने वाले लोग, आपको नए सोर्स से अनजान ऐप्लिकेशन इंस्टॉल करने के लिए कहकर, आपके डिवाइस पर नुकसान पहुंचाने वाले ऐप्लिकेशन इंस्टॉल कराने की कोशिश कर सकते हैं."</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>धोखाधड़ी करने वाले लोग, आपके डिवाइस में मौजूद किसी ऐप्लिकेशन को ऐक्सेस करने की अनुमति लेकर, आपके डिवाइस को कंट्रोल करने की कोशिश कर सकते हैं."</string> diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml index 1484ad426..078e1804b 100644 --- a/PermissionController/res/values-in/strings.xml +++ b/PermissionController/res/values-in/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Aplikasi ini dapat menampilkan layar, tindakan, dan masukan Anda, melakukan tindakan, dan mengontrol tampilan."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Aplikasi asisten digital default"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Aplikasi asisten digital"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Aplikasi bantuan dapat membantu Anda berdasarkan informasi dari layar yang sedang Anda lihat. Beberapa aplikasi mendukung peluncur dan layanan masukan suara untuk memberikan bantuan terintegrasi."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Aplikasi asisten dapat membantu Anda berdasarkan informasi dari layar yang sedang Anda lihat. Beberapa aplikasi mendukung layanan peluncur dan input suara untuk memberikan bantuan terintegrasi."</string> <string name="role_browser_label" msgid="2877796144554070207">"Aplikasi browser default"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Aplikasi browser"</string> <string name="role_browser_description" msgid="3465253637499842671">"Aplikasi yang memberi Anda akses ke internet dan menampilkan link yang Anda ketuk"</string> diff --git a/PermissionController/res/values-is/strings.xml b/PermissionController/res/values-is/strings.xml index af2c76832..a4872c6b7 100644 --- a/PermissionController/res/values-is/strings.xml +++ b/PermissionController/res/values-is/strings.xml @@ -678,7 +678,7 @@ <string name="allow_restricted_settings" msgid="8073000189478396881">"Leyfa takmarkaðar stillingar"</string> <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Takmörkuð stilling"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Til að tryggja öryggi þitt er þessi stilling ekki tiltæk eins og er."</string> - <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Ekki hægt að ljúka við aðgerð á meðan á símtali stendur"</string> + <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Ekki hægt að ljúka við aðgerð meðan á símtali stendur"</string> <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Lokað er á þessa stillingu til að gæta að öryggi tækisins þíns og gagna.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> diff --git a/PermissionController/res/values-iw/strings.xml b/PermissionController/res/values-iw/strings.xml index 0ad1739b2..e8fa30442 100644 --- a/PermissionController/res/values-iw/strings.xml +++ b/PermissionController/res/values-iw/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"האפליקציות האלה יכולות להציג את המסך, הפעולות והקלט שלך, וכן לבצע פעולות ולשלוט בתצוגה."</string> <string name="role_assistant_label" msgid="4727586018198208128">"עוזר דיגיטלי כברירת המחדל"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"אפליקציית עוזר דיגיטלי"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"אפליקציות עזרה יכולות לסייע על סמך המידע שמוצג לך במסך. אפליקציות מסוימות תומכות גם בשירותי מרכז אפליקציות וגם בקלט קולי כדי לספק סיוע משולב."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"אפליקציות של עוזרים אישיים יכולות לסייע לפי המידע שמופיע על במסך. יש אפליקציות שתומכות גם בשירותי מרכז אפליקציות וגם בקלט קולי כדי לספק סיוע משולב."</string> <string name="role_browser_label" msgid="2877796144554070207">"אפליקציית ברירת מחדל לדפדפן"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"אפליקציית דפדפן"</string> <string name="role_browser_description" msgid="3465253637499842671">"אפליקציות שמספקות לך גישה לאינטרנט ומציגות קישורים ללחיצה"</string> diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml index 1b4849f4f..4b3ad4ac1 100644 --- a/PermissionController/res/values-ja/strings.xml +++ b/PermissionController/res/values-ja/strings.xml @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"デバイスとデータを保護するため、この設定はブロックされています。<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>詐欺師が、新しいソースから不明なアプリをインストールするようユーザーに依頼して、有害なアプリをインストールしようとする可能性があります。"</string> +</xliff:g>詐欺師が新しいソースから不明なアプリをインストールするようユーザーに持ちかけ、有害なアプリをインストールしようとする可能性があります。"</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>詐欺師が、ユーザー補助機能へのアクセスをアプリに許可するようユーザーに依頼して、デバイスを操作しようとする可能性があります。"</string> diff --git a/PermissionController/res/values-ky/strings.xml b/PermissionController/res/values-ky/strings.xml index 661fecc52..aff6ed8d5 100644 --- a/PermissionController/res/values-ky/strings.xml +++ b/PermissionController/res/values-ky/strings.xml @@ -678,8 +678,8 @@ <string name="allow_restricted_settings" msgid="8073000189478396881">"Чектелген параметрлерге уруксат берүү"</string> <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Чектелген функция"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Коопсуздук максатында бул параметр азырынча иштебейт."</string> - <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Чалуу учурунда аракетти бүтүрүү мүмкүн эмес"</string> - <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Түзмөгүңүздү жана маалыматыңызды коргоо үчүн бул параметр бөгөттөлдү.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Чалуу учурунда эч нерсе кыла албайсыз"</string> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Түзмөгүңүздү жана андагы нерселерди коргоо үчүн бул параметр бөгөттөлдү.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> </xliff:g>Шылуундар жаңы булактан белгисиз колдонмолорду орнотууну суранып, зыяндуу колдонмолорду орнотууга аракет кылышы мүмкүн."</string> diff --git a/PermissionController/res/values-mn/strings.xml b/PermissionController/res/values-mn/strings.xml index 7ccda556a..07501a5f0 100644 --- a/PermissionController/res/values-mn/strings.xml +++ b/PermissionController/res/values-mn/strings.xml @@ -460,8 +460,7 @@ <string name="incident_report_notification_text" msgid="3376480583513587923">"<xliff:g id="APP_NAME">%1$s</xliff:g> алдаа засах мэдээллийг байршуулах хүсэлтэй байна."</string> <string name="incident_report_dialog_title" msgid="669104389325204095">"Дебаг хийх өгөгдлийг хуваалцах уу?"</string> <string name="incident_report_dialog_intro" msgid="5897733669850951832">"Систем асуудал илрүүллээ."</string> - <!-- no translation found for incident_report_dialog_text (1819244417678973362) --> - <skip /> + <string name="incident_report_dialog_text" msgid="1819244417678973362">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> энэ төхөөрөмжөөс <xliff:g id="DATE">%2$s</xliff:g>-ны <xliff:g id="TIME">%3$s</xliff:g>-нд авсан алдааны мэдээг байршуулахыг хүсэж байна. Алдааны мэдээнд таны төхөөрөмж болон хэрэглэгчийн нэр, байршлын өгөгдөл, төхөөрөмж танигч, сүлжээний мэдээлэл зэрэг аппын бүртгэсэн хувийн мэдээлэл багтдаг. Та алдааны мэдээг зөвхөн итгэдэг хүн, апптайгаа хуваалцаарай.\n\n<xliff:g id="APP_NAME_1">%4$s</xliff:g>-д алдааны мэдээ байршуулахыг зөвшөөрөх үү?"</string> <string name="incident_report_error_dialog_text" msgid="4189647113387092272">"<xliff:g id="APP_NAME">%1$s</xliff:g>-н алдааны мэдээг боловсруулахад алдаа гарсан тул алдаа засах дэлгэрэнгүй өгөгдлийг хуваалцахаас татгалзлаа. Төвөг удсанд хүлцэл өчье."</string> <string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Зөвшөөрөх"</string> <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Татгалзах"</string> @@ -680,12 +679,13 @@ <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Хязгаарлагдсан тохиргоо"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Таны аюулгүй байдлын үүднээс энэ тохиргоо одоогоор боломжгүй байна."</string> <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Дуудлагын үеэр үйлдэл гүйцэтгэх боломжгүй"</string> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (3803423079498712549) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc (6400007048943674066) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc (6567523001053288057) --> - <skip /> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Таны төхөөрөмж, өгөгдлийг хамгаалахын тулд энэ тохиргоог блоклосон.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Залилагч танаас шинэ эх сурвалжаас тодорхойгүй апп суулгахыг хүсэж хор хөнөөлтэй апп суулгахаар оролдож магадгүй."</string> + <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Залилагч танаас аппын хандалтын эрхийг зөвшөөрөхийг хүсэж таны төхөөрөмжийн хяналтыг гартаа авахаар оролдож магадгүй."</string> <string name="enhanced_confirmation_phone_state_dialog_generic_desc" msgid="158278816955957088"></string> <string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Аппад <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>-д хандах эрх олгохоос татгалзсан"</string> <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Апп нь таны хувийн болон санхүүгийн мэдээллийг эрсдэлд оруулж болох эмзэг зөвшөөрөлд хандах эрх хүссэн.<xliff:g id="ID_1"><br><br></xliff:g>Энэ хязгаарлагдмал зөвшөөрөлгүйгээр уг апп зохих ёсоор ажиллахгүй байх боломжтой. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Хандах эрхийг хэрхэн зөвшөөрөх талаар мэдэж авах</a>"</string> diff --git a/PermissionController/res/values-my/strings.xml b/PermissionController/res/values-my/strings.xml index 3b8cef0aa..f91150823 100644 --- a/PermissionController/res/values-my/strings.xml +++ b/PermissionController/res/values-my/strings.xml @@ -682,7 +682,7 @@ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"သင့်စက်နှင့် ဒေတာကို ကာကွယ်ရန်အတွက် ဤဆက်တင်ကို ပိတ်ထားသည်။ <xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> -</xliff:g>လူလိမ်များသည် သတင်းအရင်းအမြစ်မှ အမျိုးအမည်မသိအက်ပ်များကို သင့်အား ထည့်သွင်းခိုင်းခြင်းဖြင့် အန္တရာယ်အက်ပ်များ ထည့်သွင်းရန် ကြိုးပမ်းနိုင်သည်။"</string> +</xliff:g>လူလိမ်များသည် အရင်းအမြစ်အသစ်မှ အမျိုးအမည်မသိအက်ပ်များကို သင့်အား ထည့်သွင်းခိုင်းခြင်းဖြင့် အန္တရာယ်အက်ပ်များ ထည့်သွင်းရန် ကြိုးပမ်းနိုင်သည်။"</string> <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> </xliff:g>လူလိမ်များသည် အက်ပ်အတွက် အများသုံးနိုင်ခွင့်ပြုရန် တောင်းဆိုခြင်းဖြင့် သင့်စက်ကို ထိန်းချုပ်ရန် ကြိုးပမ်းနိုင်သည်။"</string> diff --git a/PermissionController/res/values-or/strings.xml b/PermissionController/res/values-or/strings.xml index 27240a7ed..cbaba44b0 100644 --- a/PermissionController/res/values-or/strings.xml +++ b/PermissionController/res/values-or/strings.xml @@ -355,9 +355,9 @@ <string name="accessibility_service_dialog_title_multiple" msgid="5527879210683548175">"<xliff:g id="NUM_SERVICES">%s</xliff:g>ଟି ଆକ୍ସେସିବିଲିଟୀ ଆପ୍ସର ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ସମ୍ପୂର୍ଣ୍ଣ ଆକ୍ସେସ୍ ଅଛି"</string> <string name="accessibility_service_dialog_bottom_text_single" msgid="1128666197822205958">"<xliff:g id="SERVICE_NAME">%s</xliff:g> ଆପଣଙ୍କର ସ୍କ୍ରିନ୍, କାର୍ଯ୍ୟ ଏବଂ ଇନ୍ପୁଟ୍ ଦେଖିପାରିବ ଏବଂ କାର୍ଯ୍ୟ ସମ୍ପାଦନ କରିପାରିବ ଏବଂ ଡିସ୍ପ୍ଲେ ନିୟନ୍ତ୍ରଣ କରିପାରିବ।"</string> <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"ଏହି ଆପ୍ସ ଆପଣଙ୍କର ସ୍କ୍ରିନ୍, କାର୍ଯ୍ୟକଳାପ ଏବଂ ଇନ୍ପୁଟ୍ ଦେଖିପାରିବ ଏବଂ କାର୍ଯ୍ୟ ସମ୍ପାଦନ କରିପାରିବ ଏବଂ ଡିସ୍ପ୍ଲେ ନିୟନ୍ତ୍ରଣ କରିପାରିବ।"</string> - <string name="role_assistant_label" msgid="4727586018198208128">"ଡିଫଲ୍ଟ ଡିଜିଟାଲ୍ Assistant ଆପ୍"</string> + <string name="role_assistant_label" msgid="4727586018198208128">"ଡିଫଲ୍ଟ ଡିଜିଟାଲ ସହାୟକ ଆପ"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"ଡିଜିଟାଲ୍ Assistant ଆପ୍"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"ଆପଣ ଦେଖୁଥିବା ସ୍କ୍ରିନ୍ ସୂଚନାକୁ ଆଧାର କରି ସହାୟକ ଆପ୍ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିପାରିବ। କେତେକ ଆପ୍, ଆପଣଙ୍କୁ ଉତ୍ତମ ସହାୟତା ଦେବା ପାଇଁ, ଉଭୟ ଲଞ୍ଚର୍ ଓ ଭଏସ୍ ଇନପୁଟ୍ ସେବାକୁ ସମର୍ଥନ କରେ।"</string> + <string name="role_assistant_description" msgid="6622458130459922952">"ଆପଣ ଭ୍ୟୁ କରୁଥିବା ସ୍କ୍ରିନ ସୂଚନାକୁ ଆଧାର କରି ସହାୟକ ଆପ ଆପଣଙ୍କୁ ସାହାଯ୍ୟ କରିପାରିବ। କେତେକ ଆପ ଆପଣଙ୍କୁ ସମ୍ପୂର୍ଣ୍ଣ ସହାୟତା ଦେବା ପାଇଁ ଉଭୟ ଲଞ୍ଚର ଓ ଭଏସ ଇନପୁଟ ସେବାକୁ ସମର୍ଥନ କରେ।"</string> <string name="role_browser_label" msgid="2877796144554070207">"ଡିଫଲ୍ଟ ବ୍ରାଉଜର୍ ଆପ୍"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"ବ୍ରାଉଜର୍ ଆପ୍"</string> <string name="role_browser_description" msgid="3465253637499842671">"ଆପ୍ସ ଯାହା ଆପଣଙ୍କୁ ଇଣ୍ଟର୍ନେଟ ପାଇଁ ଆକ୍ସେସ ଦିଏ ଏବଂ ଆପଣ ଟାପ କରୁଥିବା ଲିଙ୍କଗୁଡ଼ିକୁ ଡିସପ୍ଲେ କରେ"</string> diff --git a/PermissionController/res/values-pl/strings.xml b/PermissionController/res/values-pl/strings.xml index fdcbe7cb7..baacd52cc 100644 --- a/PermissionController/res/values-pl/strings.xml +++ b/PermissionController/res/values-pl/strings.xml @@ -678,7 +678,7 @@ <string name="allow_restricted_settings" msgid="8073000189478396881">"Zezwól na ustawienia z ograniczonym dostępem"</string> <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ustawienie z ograniczonym dostępem"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ze względów bezpieczeństwa to ustawienie jest obecnie niedostępne."</string> - <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Nie można wykonać działania podczas połączenia"</string> + <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Nie można wykonywać działania podczas połączenia"</string> <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"To ustawienie jest zablokowane, aby chronić Twoje urządzenie i dane.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> diff --git a/PermissionController/res/values-pt-rBR/strings.xml b/PermissionController/res/values-pt-rBR/strings.xml index 17d18a2b7..48cedd428 100644 --- a/PermissionController/res/values-pt-rBR/strings.xml +++ b/PermissionController/res/values-pt-rBR/strings.xml @@ -442,7 +442,7 @@ <string name="default_apps_for_private_profile" msgid="2022024112144880785">"Padrão para o espaço privado"</string> <string name="default_app_recommended" msgid="5669584821778942909">"Otimizados para o dispositivo"</string> <string name="default_app_others" msgid="7793029848126079876">"Outros"</string> - <string name="default_app_none" msgid="9084592086808194457">"Nenhuma"</string> + <string name="default_app_none" msgid="9084592086808194457">"Nenhum"</string> <string name="default_app_system_default" msgid="6218386768175513760">"(Padrão do sistema)"</string> <string name="default_app_no_apps" msgid="115720991680586885">"Nenhum app"</string> <string name="default_payment_app_other_nfc_services" msgid="5957633798695758917">"Outros serviços de NFC"</string> diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml index 85af45c1e..bdf9b2567 100644 --- a/PermissionController/res/values-pt-rPT/strings.xml +++ b/PermissionController/res/values-pt-rPT/strings.xml @@ -355,7 +355,7 @@ <string name="accessibility_service_dialog_title_multiple" msgid="5527879210683548175">"<xliff:g id="NUM_SERVICES">%s</xliff:g> aplicações de acessibilidade têm acesso total ao seu dispositivo"</string> <string name="accessibility_service_dialog_bottom_text_single" msgid="1128666197822205958">"O serviço <xliff:g id="SERVICE_NAME">%s</xliff:g> pode ver o seu ecrã, as ações e as entradas, efetuar ações e controlar o ecrã."</string> <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Estas aplicações podem ver o ecrã, as ações e as entradas, efetuar ações e controlar o ecrã."</string> - <string name="role_assistant_label" msgid="4727586018198208128">"App assistente digital predefinida"</string> + <string name="role_assistant_label" msgid="4727586018198208128">"App de assistente digital predefinida"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"App assistente digital"</string> <string name="role_assistant_description" msgid="6622458130459922952">"As apps de assistência podem ser-lhe úteis com base em informações do ecrã que está a ver. Algumas apps são compatíveis com serviços de iniciação e de entrada de texto por voz para oferecer assistência integrada."</string> <string name="role_browser_label" msgid="2877796144554070207">"App navegador predefinida"</string> diff --git a/PermissionController/res/values-pt/strings.xml b/PermissionController/res/values-pt/strings.xml index 17d18a2b7..48cedd428 100644 --- a/PermissionController/res/values-pt/strings.xml +++ b/PermissionController/res/values-pt/strings.xml @@ -442,7 +442,7 @@ <string name="default_apps_for_private_profile" msgid="2022024112144880785">"Padrão para o espaço privado"</string> <string name="default_app_recommended" msgid="5669584821778942909">"Otimizados para o dispositivo"</string> <string name="default_app_others" msgid="7793029848126079876">"Outros"</string> - <string name="default_app_none" msgid="9084592086808194457">"Nenhuma"</string> + <string name="default_app_none" msgid="9084592086808194457">"Nenhum"</string> <string name="default_app_system_default" msgid="6218386768175513760">"(Padrão do sistema)"</string> <string name="default_app_no_apps" msgid="115720991680586885">"Nenhum app"</string> <string name="default_payment_app_other_nfc_services" msgid="5957633798695758917">"Outros serviços de NFC"</string> diff --git a/PermissionController/res/values-sk/strings.xml b/PermissionController/res/values-sk/strings.xml index 19c2a019a..1335d64ef 100644 --- a/PermissionController/res/values-sk/strings.xml +++ b/PermissionController/res/values-sk/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Tieto aplikácie si môžu zobraziť vašu obrazovku, akcie a vstupy, vykonávať akcie a ovládať obrazovku."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Predvolený digitálny asistent"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Digitálny asistent"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Asistenčné aplikácie vám pomáhajú na základe informácií zo zobrazenej obrazovky. Niektoré aplikácie podporujú spúšťač aj služby hlasového vstupu, aby vám poskytli integrovanú pomoc."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Asistenčné aplikácie pomáhajú na základe informácií zo zobrazenej obrazovky. Niektoré aplikácie podporujú spúšťače aj hlasový vstup, a ponúkajú tak integrovanú asistenciu."</string> <string name="role_browser_label" msgid="2877796144554070207">"Predvolený prehliadač"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Prehliadač"</string> <string name="role_browser_description" msgid="3465253637499842671">"Aplikácie, ktoré umožňujú prehliadať internet a otvárať webové odkazy"</string> diff --git a/PermissionController/res/values-sq/strings.xml b/PermissionController/res/values-sq/strings.xml index c2bd76835..73d2f27fe 100644 --- a/PermissionController/res/values-sq/strings.xml +++ b/PermissionController/res/values-sq/strings.xml @@ -460,8 +460,7 @@ <string name="incident_report_notification_text" msgid="3376480583513587923">"<xliff:g id="APP_NAME">%1$s</xliff:g> dëshiron të ngarkojë informacionin e korrigjimit."</string> <string name="incident_report_dialog_title" msgid="669104389325204095">"Të ndahen të dhënat e korrigjimit?"</string> <string name="incident_report_dialog_intro" msgid="5897733669850951832">"Sistemi ka zbuluar një problem."</string> - <!-- no translation found for incident_report_dialog_text (1819244417678973362) --> - <skip /> + <string name="incident_report_dialog_text" msgid="1819244417678973362">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> kërkon të ngarkojë një raport të defekteve në kod nga kjo pajisje të regjistruar më <xliff:g id="DATE">%2$s</xliff:g> në <xliff:g id="TIME">%3$s</xliff:g>. Raportet e defekteve në kod përfshijnë informacione personale rreth pajisjes sate ose të regjistruara nga aplikacionet, për shembull emrat e përdoruesve, të dhënat e vendndodhjes, identifikuesit e pajisjeve dhe informacionet e rrjetit. Ndaji raportet e defekteve në kod vetëm me personat dhe aplikacionet të cilave u beson me këto informacione.\n\nTë lejohet që <xliff:g id="APP_NAME_1">%4$s</xliff:g> të ngarkojë një raport të defekteve në kod?"</string> <string name="incident_report_error_dialog_text" msgid="4189647113387092272">"Kishte një gabim me përpunimin e raportit të defekteve në kod për <xliff:g id="APP_NAME">%1$s</xliff:g>. Kështu që ndarja e të dhënave të detajuara të korrigjimit është refuzuar. Na vjen keq për ndërprerjen."</string> <string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Lejo"</string> <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Refuzo"</string> @@ -680,12 +679,13 @@ <string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Cilësim i kufizuar"</string> <string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Për sigurinë tënde, ky cilësim nuk ofrohet për momentin."</string> <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Veprimi nuk mund të përfundohet gjatë telefonatës"</string> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (3803423079498712549) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc (6400007048943674066) --> - <skip /> - <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc (6567523001053288057) --> - <skip /> + <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="3803423079498712549">"Ky cilësim është bllokuar për të mbrojtur pajisjen dhe të dhënat e tua.<xliff:g id="SCAM_USE_SETTING_DESCRIPTION">%1$s</xliff:g>"</string> + <string name="enhanced_confirmation_phone_state_dialog_install_desc" msgid="6400007048943674066">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Mashtruesit mund të përpiqen të instalojnë aplikacione të dëmshme duke të të kërkuar që të instalosh aplikacione të panjohura nga një burim i ri."</string> + <string name="enhanced_confirmation_phone_state_dialog_a11y_desc" msgid="6567523001053288057">"<xliff:g id="EMPTY_LINE"> + +</xliff:g>Mashtruesit mund të përpiqen të marrin kontrollin e pajisjes sate duke të të kërkuar që të lejosh qasjen për shërbimin e qasshmërisë për një aplikacion."</string> <string name="enhanced_confirmation_phone_state_dialog_generic_desc" msgid="158278816955957088"></string> <string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikacionit iu refuzua qasja te: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string> <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacioni kërkoi qasje në një leje delikate që mund t\'i vendosë në rrezik informacionet e tua personale dhe financiare.<xliff:g id="ID_1"><br><br></xliff:g>Ka mundësi që aplikacioni të mos funksionojë si duhet pa këtë leje të kufizuar. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Mëso se si të lejosh qasjen</a>"</string> diff --git a/PermissionController/res/values-sr/strings.xml b/PermissionController/res/values-sr/strings.xml index d0b5f60f5..aeb17d32a 100644 --- a/PermissionController/res/values-sr/strings.xml +++ b/PermissionController/res/values-sr/strings.xml @@ -355,7 +355,7 @@ <string name="accessibility_service_dialog_title_multiple" msgid="5527879210683548175">"Апликације приступачности (<xliff:g id="NUM_SERVICES">%s</xliff:g>) имају потпун приступ уређају"</string> <string name="accessibility_service_dialog_bottom_text_single" msgid="1128666197822205958">"<xliff:g id="SERVICE_NAME">%s</xliff:g> може да прегледа садржај екрана, радње и уносе, обавља радње и управља екраном."</string> <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Ове апликације могу да прегледају садржај екрана, радње и уносе, као и да обављају радње и управљају екраном."</string> - <string name="role_assistant_label" msgid="4727586018198208128">"Подразумев. дигитални помоћник"</string> + <string name="role_assistant_label" msgid="4727586018198208128">"Подразумевани дигитални помоћник"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Апликација дигиталног помоћника"</string> <string name="role_assistant_description" msgid="6622458130459922952">"Апликације за помоћ могу да вам помогну на основу информација са екрана који гледате. Неке апликације подржавају услуге покретача и гласовног уноса да би вам пружиле интегрисану помоћ."</string> <string name="role_browser_label" msgid="2877796144554070207">"Подразумевана апл. прегледача"</string> diff --git a/PermissionController/res/values-sw/strings.xml b/PermissionController/res/values-sw/strings.xml index c1020b2fe..e307454c9 100644 --- a/PermissionController/res/values-sw/strings.xml +++ b/PermissionController/res/values-sw/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Programu hizi zinaweza kuona skrini, vitendo na maudhui unayoweka, kutekeleza vitendo na kudhibiti onyesho."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Programu msingi ya usaidizi wa kidijitali"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Programu saidizi ya kidijitali"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Programu za usaidizi zinaweza kukusaidia kulingana na maelezo kutoka skrini unayotazama. Baadhi ya programu zinaweza kutumia huduma za kifungua programu na kuweka data kwa kutamka ili kukupa usaidizi wa pamoja."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Programu za usaidizi zinaweza kukusaidia kulingana na maelezo kutoka kwenye skrini unayoangalia. Baadhi ya programu zinaweza kutumia huduma za kifungua programu na kuweka data kwa kutamka ili kukupa usaidizi jumuifu."</string> <string name="role_browser_label" msgid="2877796144554070207">"Programu kuu ya kivinjari"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Programu ya kivinjari"</string> <string name="role_browser_description" msgid="3465253637499842671">"Programu zinazokupa uwezo wa kufikia intaneti na kuonyesha viungo unavyogusa"</string> diff --git a/PermissionController/res/values-te/strings.xml b/PermissionController/res/values-te/strings.xml index 16a0d63ae..0d07bf6c1 100644 --- a/PermissionController/res/values-te/strings.xml +++ b/PermissionController/res/values-te/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"ఈ యాప్లు మీ స్క్రీన్, చర్యలు, ఇన్పుట్లను చూడగలవు, చర్యలను అమలు చేయగలవు, అలాగే ప్రదర్శనను నియంత్రించగలవు."</string> <string name="role_assistant_label" msgid="4727586018198208128">"ఆటోమేటిక్ డిజిటల్ అసిస్టెంట్ యాప్"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"డిజిటల్ అసిస్టెంట్ యాప్"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"సహాయక యాప్లు మీరు వీక్షిస్తున్న స్క్రీన్పై ఉన్న సమాచారం ఆధారంగా మీకు సహాయపడగలవు. కొన్ని యాప్లు మీకు సమగ్రమైన సహాయాన్ని అందించడానికి లాంచర్కు, వాయిస్ ఇన్పుట్ సర్వీసులకు రెండింటికీ సపోర్ట్ చేస్తాయి."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"మీ ముందున్న స్క్రీన్లోని సమాచారం ఆధారంగా సహాయక (అసిస్ట్) యాప్లు, మీకు హెల్ప్ చేయగలవు. కొన్ని యాప్లు, మీకు ఈజీగా సాయం చేయడానికి లాంచర్కు, వాయిస్ ఇన్పుట్ సర్వీసులకు రెండింటికీ సపోర్ట్ ఇస్తాయి."</string> <string name="role_browser_label" msgid="2877796144554070207">"ఆటోమేటిక్ బ్రౌజర్ యాప్"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"బ్రౌజర్ యాప్"</string> <string name="role_browser_description" msgid="3465253637499842671">"మీకు ఇంటర్నెట్కు యాక్సెస్ ఇచ్చి, ట్యాప్ చేయడానికి లింక్లను డిస్ప్లే చేసే యాప్లు"</string> diff --git a/PermissionController/res/values-tr-v33/strings.xml b/PermissionController/res/values-tr-v33/strings.xml index ee3827f93..f3b0f08e5 100644 --- a/PermissionController/res/values-tr-v33/strings.xml +++ b/PermissionController/res/values-tr-v33/strings.xml @@ -33,7 +33,7 @@ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Daralt"</string> <string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Uyarı. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string> <string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"İşlem tamamlandı"</string> - <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Cihazınızın korumasını artırabilecek ayarlara göz atın"</string> + <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Cihazınızın korunma düzeyini artırabilecek ayarlara göz atın"</string> <string name="safety_center_qs_page_landing" msgid="1717368301679228128">"Güvenlik ve gizlilikle ilgili hızlı ayarlar"</string> <string name="safety_center_qs_close_button" msgid="1352313308176244599">"Kapat"</string> <string name="safety_center_qs_expand_action" msgid="2193190557696484169">"Seçenekleri genişletip göster"</string> diff --git a/PermissionController/res/values-uk/strings.xml b/PermissionController/res/values-uk/strings.xml index c27b67be9..65feb5d2f 100644 --- a/PermissionController/res/values-uk/strings.xml +++ b/PermissionController/res/values-uk/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Ці додатки можуть бачити ваші екран, дії та введені дані, а також виконувати дії й контролювати дисплей."</string> <string name="role_assistant_label" msgid="4727586018198208128">"Цифровий помічник за умовчанням"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"Цифровий помічник"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"Помічники надають допомогу на основі вмісту, який ви переглядаєте на екрані. Задля ефективності деякі додатки підтримують панель запуску й голосовий ввід."</string> + <string name="role_assistant_description" msgid="6622458130459922952">"Додатки-помічники можуть допомагати, використовуючи інформацію на екрані. Для зручності деякі з них підтримують панель запуску й голосовий ввід."</string> <string name="role_browser_label" msgid="2877796144554070207">"Вебпереглядач за умовчанням"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"Вебпереглядач"</string> <string name="role_browser_description" msgid="3465253637499842671">"Додатки, за допомогою яких можна переглядати сайти й переходити за посиланнями"</string> diff --git a/PermissionController/res/values-zh-rTW/strings.xml b/PermissionController/res/values-zh-rTW/strings.xml index 649b5b26a..d745840ad 100644 --- a/PermissionController/res/values-zh-rTW/strings.xml +++ b/PermissionController/res/values-zh-rTW/strings.xml @@ -357,7 +357,7 @@ <string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"這些應用程式不但可查看你的畫面、動作和輸入內容,還能執行動作及控制顯示畫面。"</string> <string name="role_assistant_label" msgid="4727586018198208128">"預設數位助理應用程式"</string> <string name="role_assistant_short_label" msgid="3369003713187703399">"數位助理應用程式"</string> - <string name="role_assistant_description" msgid="6622458130459922952">"小幫手應用程式可根據當下的螢幕內容提供協助。某些應用程式同時支援啟動器和語音輸入服務,提供更完善的服務。"</string> + <string name="role_assistant_description" msgid="6622458130459922952">"小幫手應用程式可根據當下的螢幕內容提供協助。某些應用程式同時支援啟動器和語音輸入服務,服務更完善。"</string> <string name="role_browser_label" msgid="2877796144554070207">"預設瀏覽器應用程式"</string> <string name="role_browser_short_label" msgid="6745009127123292296">"瀏覽器應用程式"</string> <string name="role_browser_description" msgid="3465253637499842671">"透過這類應用程式你可以連上網際網路和顯示你輕觸的連結"</string> diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java b/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java index 41233a23e..00ec67569 100644 --- a/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java +++ b/PermissionController/role-controller/java/com/android/role/controller/util/UserUtils.java @@ -18,7 +18,6 @@ package com.android.role.controller.util; import android.content.Context; import android.os.Build; -import android.os.Flags; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -91,7 +90,7 @@ public final class UserUtils { * allowed from Android V+ only, so this method will return false on Sdk levels below that. */ public static boolean isPrivateProfile(@NonNull UserHandle user, @NonNull Context context) { - if (!SdkLevel.isAtLeastV() || !Flags.allowPrivateProfile()) { + if (!SdkLevel.isAtLeastV()) { return false; } Context userContext = getUserContext(context, user); diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java index 7573b571d..0dd07ffd0 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java @@ -311,10 +311,8 @@ public class GrantPermissionsActivity extends SettingsActivity PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, ContextCompat.DEVICE_ID_DEFAULT); - if (mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT) { - mPackageManager = ContextCompat.createDeviceContext(this, mTargetDeviceId) - .getPackageManager(); - } + mPackageManager = ContextCompat.createDeviceContext(this, mTargetDeviceId) + .getPackageManager(); // When the permission grant dialog is streamed to a virtual device, and when requested // permissions include both device-aware permissions and non-device aware permissions, @@ -337,21 +335,6 @@ public class GrantPermissionsActivity extends SettingsActivity new Intent(this, PermissionDialogStreamingBlockedActivity.class)); return; } - } else if (mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT) { - // On the default device, when requested permissions are for a remote device, - // filter out non-device aware permissions. - for (int i = mRequestedPermissions.size() - 1; i >= 0; i--) { - if (!MultiDeviceUtils.isPermissionDeviceAware( - getApplicationContext(), - mTargetDeviceId, - mRequestedPermissions.get(i))) { - Log.e( - LOG_TAG, - "non-device aware permission is requested for a remote device: " - + mRequestedPermissions.get(i)); - mRequestedPermissions.remove(i); - } - } } } @@ -740,7 +723,7 @@ public class GrantPermissionsActivity extends SettingsActivity int dialogDisplayDeviceId = ContextCompat.getDeviceId(this); boolean isMessageDeviceAware = dialogDisplayDeviceId != ContextCompat.DEVICE_ID_DEFAULT - || dialogDisplayDeviceId != mTargetDeviceId; + || dialogDisplayDeviceId != info.getDeviceId(); int messageId = getMessageId(info.getGroupName(), info.getPrompt(), isMessageDeviceAware); CharSequence message = @@ -1132,17 +1115,9 @@ public class GrantPermissionsActivity extends SettingsActivity if ((mDelegated || (mViewModel != null && mViewModel.shouldReturnPermissionState())) && mTargetPackage != null) { - PackageManager defaultDevicePackageManager = SdkLevel.isAtLeastV() - && mTargetDeviceId != ContextCompat.DEVICE_ID_DEFAULT - ? createDeviceContext(ContextCompat.DEVICE_ID_DEFAULT).getPackageManager() - : mPackageManager; - PackageManager targetDevicePackageManager = mPackageManager; for (int i = 0; i < resultPermissions.length; i++) { String permission = resultPermissions[i]; - PackageManager pm = MultiDeviceUtils.isPermissionDeviceAware( - getApplicationContext(), mTargetDeviceId, permission) - ? targetDevicePackageManager : defaultDevicePackageManager; - grantResults[i] = pm.checkPermission(resultPermissions[i], mTargetPackage); + grantResults[i] = mPackageManager.checkPermission(permission, mTargetPackage); } } else { grantResults = new int[0]; diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java index 4d778befb..10e8dd0e1 100644 --- a/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java +++ b/PermissionController/src/com/android/permissioncontroller/role/utils/UserUtils.java @@ -139,7 +139,7 @@ public class UserUtils { */ private static boolean isPrivateProfile(@NonNull UserHandle userHandle, @NonNull Context context) { - if (!SdkLevel.isAtLeastV() || !android.os.Flags.allowPrivateProfile()) { + if (!SdkLevel.isAtLeastV()) { return false; } Context userContext = context.createContextAsUser(userHandle, /* flags= */ 0); diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt index 8d7d96f99..307ef9cf6 100644 --- a/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt +++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterSearchIndexablesProvider.kt @@ -331,9 +331,7 @@ class SafetyCenterSearchIndexablesProvider : BaseSearchIndexablesProvider() { get() = SafetyCenterIds.entryIdFromString(id) private fun isPrivateProfileSupported(): Boolean { - return SdkLevel.isAtLeastV() && - com.android.permission.flags.Flags.privateProfileSupported() && - android.os.Flags.allowPrivateProfile() + return SdkLevel.isAtLeastV() && com.android.permission.flags.Flags.privateProfileSupported() } companion object { diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java index 1297bc4c2..47f9fd591 100644 --- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterDashboardFragment.java @@ -81,6 +81,7 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment { new CollapsableGroupCardHelper(); private PreferenceGroup mIssuesGroup; private PreferenceGroup mEntriesGroup; + @Nullable private PreferenceGroup mPrivacyEntriesGroup; private PreferenceGroup mStaticEntriesGroup; private boolean mIsQuickSettingsFragment; @@ -263,12 +264,17 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment { if (SdkLevel.isAtLeastV() && group != null && Objects.equals(group.getId(), PRIVACY_SOURCES_GROUP_ID)) { - // Add an extra header before the privacy sources - PreferenceCategory category = new ComparablePreferenceCategory(context); - SafetyCenterResourcesApk safetyCenterResourcesApk = - new SafetyCenterResourcesApk(requireContext()); - category.setTitle(safetyCenterResourcesApk.getStringByName("privacy_title")); - mEntriesGroup.addPreference(category); + // Add a special group for the privacy sources + mPrivacyEntriesGroup = new ComparablePreferenceCategory(context); + mPrivacyEntriesGroup.setTitle( + new SafetyCenterResourcesApk(requireContext()) + .getStringByName("privacy_title")); + mEntriesGroup.addPreference(mPrivacyEntriesGroup); + + mPrivacyEntriesGroup.addPreference( + new SafetyHomepageEntryPreference( + context, group, getSafetyCenterSessionId())); + continue; } if (SafetyCenterUiFlags.getShowSubpages() && group != null) { @@ -327,10 +333,14 @@ public final class SafetyCenterDashboardFragment extends SafetyCenterFragment { private void updateStaticSafetyEntries(Context context, SafetyCenterData data) { mStaticEntriesGroup.removeAll(); - for (SafetyCenterStaticEntryGroup group : data.getStaticEntryGroups()) { - if (group.getTitle().toString().isEmpty()) { - // Interpret an empty title as signal to not create a titled category - addStaticEntriesTo(context, data, mStaticEntriesGroup, group.getStaticEntries()); + List<SafetyCenterStaticEntryGroup> staticEntryGroups = data.getStaticEntryGroups(); + for (int i = 0, size = staticEntryGroups.size(); i < size; i++) { + SafetyCenterStaticEntryGroup group = staticEntryGroups.get(i); + + if (i == 0 && group.getTitle().toString().isEmpty() && mPrivacyEntriesGroup != null) { + // Interpret an empty title for the first group as signal to extend the privacy + // category. + addStaticEntriesTo(context, data, mPrivacyEntriesGroup, group.getStaticEntries()); } else { PreferenceCategory category = new ComparablePreferenceCategory(context); category.setTitle(group.getTitle()); diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt index b89abde13..551f676f1 100644 --- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt +++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetySubpageEntryPreference.kt @@ -49,7 +49,7 @@ class SafetySubpageEntryPreference( context: Context, private val launchTaskId: Int?, private val entry: SafetyCenterEntry, - private val viewModel: SafetyCenterViewModel + private val viewModel: SafetyCenterViewModel, ) : TwoTargetPreference(context), ComparablePreference { init { @@ -108,9 +108,7 @@ class SafetySubpageEntryPreference( } private fun isPrivateProfileSupported(): Boolean { - return SdkLevel.isAtLeastV() && - com.android.permission.flags.Flags.privateProfileSupported() && - android.os.Flags.allowPrivateProfile() + return SdkLevel.isAtLeastV() && com.android.permission.flags.Flags.privateProfileSupported() } override fun onBindViewHolder(holder: PreferenceViewHolder) { @@ -125,7 +123,7 @@ class SafetySubpageEntryPreference( PendingIntentSender.send(iconAction.pendingIntent, launchTaskId) viewModel.interactionLogger.recordForEntry( Action.ENTRY_ICON_ACTION_CLICKED, - entry + entry, ) } catch (ex: Exception) { Log.e(TAG, "Failed to execute icon action intent for $entry", ex) diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java index 87d8744a8..0da8286f6 100644 --- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java +++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/StaticSafetyEntryPreference.java @@ -98,8 +98,7 @@ public class StaticSafetyEntryPreference extends Preference implements Comparabl private Boolean isPrivateProfileSupported() { return SdkLevel.isAtLeastV() - && com.android.permission.flags.Flags.privateProfileSupported() - && android.os.Flags.allowPrivateProfile(); + && com.android.permission.flags.Flags.privateProfileSupported(); } @Override diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt index 2ae4b0585..5612b7731 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PermissionStorageTimeChangeReceiverTest.kt @@ -49,7 +49,7 @@ import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -125,7 +125,7 @@ class PermissionStorageTimeChangeReceiverTest { receiver.onReceive(context, Intent(Intent.ACTION_TIME_CHANGED)) verify(receiver, never()).onTimeChanged(anyLong()) - verifyZeroInteractions(editor) + verifyNoMoreInteractions(editor) } @Test @@ -133,7 +133,7 @@ class PermissionStorageTimeChangeReceiverTest { receiver.onReceive(context, Intent(Intent.ACTION_MANAGE_PERMISSIONS)) verify(receiver, never()).onTimeChanged(anyLong()) - verifyZeroInteractions(editor) + verifyNoMoreInteractions(editor) } @Test diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt index baa848960..4b89d5141 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/service/PersistedStoragePackageUninstalledReceiverTest.kt @@ -40,7 +40,7 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.spy -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -102,7 +102,7 @@ class PersistedStoragePackageUninstalledReceiverTest { receiver.onReceive(context, intent) - verifyZeroInteractions(permissionEventStorage) + verifyNoMoreInteractions(permissionEventStorage) } @Test diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt index d09b5093f..731022cb5 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/AppDataSharingUpdatesPrivacySourceTest.kt @@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -102,14 +102,14 @@ class AppDataSharingUpdatesPrivacySourceTest { fun safetyCenterEnabledChanged_enabled_doesNothing() { appDataSharingUpdatesPrivacySource.safetyCenterEnabledChanged(context, true) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } @Test fun safetyCenterEnabledChanged_disabled_doesNothing() { appDataSharingUpdatesPrivacySource.safetyCenterEnabledChanged(context, false) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } @Test diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt index cc3b096a8..cac60e1a2 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt @@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -209,7 +209,7 @@ class NotificationListenerPrivacySourceTest { privacySource.safetyCenterEnabledChanged(context, false) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } @Test @@ -281,7 +281,7 @@ class NotificationListenerPrivacySourceTest { SafetyCenterReceiver.RefreshEvent.UNKNOWN ) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } private fun setNotificationListenerCheckEnabled(enabled: Boolean) { diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt index a0199979d..2c166f24b 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/SafetyCenterReceiverTest.kt @@ -55,7 +55,7 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -199,8 +199,8 @@ class SafetyCenterReceiverTest { safetyCenterReceiver.onReceive(application, intent) advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) + verifyNoMoreInteractions(mockPrivacySource) + verifyNoMoreInteractions(mockPrivacySource2) } @Test @@ -214,7 +214,7 @@ class SafetyCenterReceiverTest { verify(mockPrivacySource) .rescanAndPushSafetyCenterData(application, intent, EVENT_REFRESH_REQUESTED) - verifyZeroInteractions(mockPrivacySource2) + verifyNoMoreInteractions(mockPrivacySource2) } @Test @@ -225,8 +225,8 @@ class SafetyCenterReceiverTest { safetyCenterReceiver.onReceive(application, intent) advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) + verifyNoMoreInteractions(mockPrivacySource) + verifyNoMoreInteractions(mockPrivacySource2) } @Test @@ -238,7 +238,7 @@ class SafetyCenterReceiverTest { safetyCenterReceiver.onReceive(application, intent) advanceUntilIdle() - verifyZeroInteractions(mockPrivacySource) - verifyZeroInteractions(mockPrivacySource2) + verifyNoMoreInteractions(mockPrivacySource) + verifyNoMoreInteractions(mockPrivacySource2) } } diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt index 38baee3ed..e2f1443e3 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/WorkPolicyInfoTest.kt @@ -47,7 +47,7 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -169,7 +169,7 @@ class WorkPolicyInfoTest { fun safetyCenterEnabledChanged_safetyCenterDisabled() { workPolicyInfo.safetyCenterEnabledChanged(context, false) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } @Test @@ -196,7 +196,7 @@ class WorkPolicyInfoTest { workPolicyInfo.safetyCenterEnabledChanged(context, false) - verifyZeroInteractions(mockSafetyCenterManager) + verifyNoMoreInteractions(mockSafetyCenterManager) } @Test diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt index 4d206a2f4..396ad41df 100644 --- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt +++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/safetylabel/SafetyLabelChangesJobServiceTest.kt @@ -46,7 +46,7 @@ import org.mockito.Mockito.doNothing import org.mockito.Mockito.mock import org.mockito.Mockito.times import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions +import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.MockitoSession @@ -121,14 +121,14 @@ class SafetyLabelChangesJobServiceTest { receiver.onReceive(application, Intent(Intent.ACTION_BOOT_COMPLETED)) - verifyZeroInteractions(mockJobScheduler) + verifyNoMoreInteractions(mockJobScheduler) } @Test fun onReceiveInvalidIntentAction_jobNotScheduled() { receiver.onReceive(application, Intent(Intent.ACTION_DEFAULT)) - verifyZeroInteractions(mockJobScheduler) + verifyNoMoreInteractions(mockJobScheduler) } @Test diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt index 23074a06f..57fdbca03 100644 --- a/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt +++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt @@ -205,7 +205,7 @@ fun Chip( color = secondaryTextColor, overflow = TextOverflow.Ellipsis, maxLines = secondaryLabelMaxLines ?: 1, - style = MaterialTheme.typography.caption2, + style = MaterialTheme.typography.caption2.copy(hyphens = Hyphens.Auto), ) } } diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt index 5f1c8dd2c..320e58964 100644 --- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt +++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt @@ -123,6 +123,7 @@ internal fun WearPermissionButtonInternal( text = secondaryLabel, modifier = Modifier.fillMaxWidth(), maxLines = secondaryLabelMaxLines ?: LocalTextConfiguration.current.maxLines, + style = LocalTextStyle.current.copy(hyphens = Hyphens.Auto), ) } } diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt index 296e45e79..208d3d6ec 100644 --- a/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt +++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt @@ -27,6 +27,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeightIn import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter @@ -59,7 +60,6 @@ import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.ScrollIndicator import androidx.wear.compose.material3.Text import androidx.wear.compose.material3.TimeText -import androidx.wear.compose.material3.lazy.scrollTransform import com.android.permissioncontroller.wear.permission.components.AnnotatedText import com.android.permissioncontroller.wear.permission.components.ListScopeWrapper import com.android.permissioncontroller.wear.permission.components.material2.Wear2Scaffold @@ -73,7 +73,7 @@ private class TransformingScopeConverter(private val scope: TransformingLazyColu ListScopeWrapper { override fun item(key: Any?, contentType: Any?, content: @Composable () -> Unit) { // TODO:https://buganizer.corp.google.com/issues/389093588. - scope.item { Box(modifier = Modifier.scrollTransform(this)) { content() } } + scope.item { content() } } override fun items( @@ -194,6 +194,11 @@ private fun WearPermissionScaffoldInternal( val scalingListState = rememberScalingLazyListState() val transformingLazyColumnState = rememberTransformingLazyColumnState() + LaunchedEffect(title, subtitle) { + // When the title/subtitle changes go to the top. Ex: A chain of permission requests. + scalingListState.scrollToItem(index = 0) + transformingLazyColumnState.scrollToItem(index = 0) + } val listState = if (asScalingList) scalingListState else transformingLazyColumnState val scrollInfoProvider = if (asScalingList) ScrollInfoProvider(scalingListState) diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt index e44a24981..c85381c1b 100644 --- a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt +++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt @@ -24,6 +24,7 @@ import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontVariation import androidx.compose.ui.unit.sp +import androidx.wear.compose.foundation.CurvedTextStyle import androidx.wear.compose.material3.Typography import com.android.permissioncontroller.wear.permission.components.R @@ -50,6 +51,18 @@ internal object WearComposeMaterial3Typography { return FontFamily(font) } + private fun CurvedTextStyle.updatedTextStyle( + context: Context, + @StringRes fontRes: Int, + variationSettings: FontVariation.Settings? = null, + @DimenRes fontSizeRes: Int, + ): CurvedTextStyle { + val fontFamily = + fontFamily(context = context, id = fontRes, variationSettings = variationSettings) + val fontSize = ResourceHelper.getDimen(context = context, id = fontSizeRes)?.sp ?: fontSize + return copy(fontFamily = fontFamily, fontSize = fontSize) + } + private fun TextStyle.updatedTextStyle( context: Context, @StringRes fontRes: Int, diff --git a/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml b/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml index cb6323fff..4e1865697 100644 --- a/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml +++ b/SafetyCenter/Resources/res/raw-v36/safety_center_config.xml @@ -67,6 +67,7 @@ titleForWork="@com.android.safetycenter.resources:string/biometrics_title_for_work" titleForPrivateProfile="@com.android.safetycenter.resources:string/biometrics_title_for_private_profile" searchTerms="@com.android.safetycenter.resources:string/biometrics_search_terms" + refreshOnPageOpenAllowed="true" initialDisplayState="hidden"/> </safety-sources-group> <safety-sources-group diff --git a/service/java/com/android/role/RoleService.java b/service/java/com/android/role/RoleService.java index ac6703545..529b0cbdf 100644 --- a/service/java/com/android/role/RoleService.java +++ b/service/java/com/android/role/RoleService.java @@ -40,6 +40,7 @@ import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -726,6 +727,35 @@ public class RoleService extends SystemService implements RoleUserState.Callback Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); Objects.requireNonNull(callback, "callback cannot be null"); + // Work around VoiceInteractionManagerService resetting default assistant upon force + // stop on pre-V platforms (b/191743558). + if (!SdkLevel.isAtLeastV() && Objects.equals(roleName, RoleManager.ROLE_ASSISTANT) + && Binder.getCallingUid() == Process.myUid()) { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + boolean isCallFromForceStop = false; + for (StackTraceElement stackTraceElement : stackTraceElements) { + if (stackTraceElement.getClassName().contains( + "com.android.server.voiceinteraction.VoiceInteractionManagerService") + && stackTraceElement.getMethodName().equals("onHandleForceStop")) { + isCallFromForceStop = true; + break; + } + } + if (isCallFromForceStop) { + Log.i(LOG_TAG, "Ignoring clearRoleHoldersAsUser() call from" + + " VoiceInteractionManagerService due to force stopping the current" + + " assistant"); + ForegroundThread.getHandler().post(() -> { + // Notify the callback as if this call has failed for some reason. + callback.sendResult(null); + // Announce a role holder change to trigger the default assistant to be + // re-configured in VoiceInteractionManagerService. + onRoleHoldersChanged(roleName, userId); + }); + return; + } + } + getOrCreateController(userId).onClearRoleHolders(roleName, flags, callback); } diff --git a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml index 211e415bd..c31bfdaf3 100644 --- a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml +++ b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/AndroidManifest.xml @@ -21,6 +21,7 @@ package="android.permissionmultidevice.cts.accessremotedevicecamera"> <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.READ_CONTACTS" /> <application> <activity android:name=".RequestPermissionActivity" android:exported="true" /> diff --git a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt index fa1d1f83c..33daa1253 100644 --- a/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt +++ b/tests/cts/permissionmultidevice/AccessRemoteDeviceCameraApp/src/android/permissionmultidevice/cts/accessremotedevicecamera/RequestPermissionActivity.kt @@ -16,7 +16,6 @@ package android.permissionmultidevice.cts.accessremotedevicecamera -import android.Manifest import android.app.Activity import android.content.Context import android.content.Intent @@ -33,17 +32,24 @@ class RequestPermissionActivity : Activity() { val deviceId = intent.getIntExtra( PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, - Context.DEVICE_ID_DEFAULT + Context.DEVICE_ID_INVALID, ) - requestPermissions(DEVICE_AWARE_PERMISSIONS, 1001, deviceId) + val permissions = + intent.getStringArrayExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES)!! + + if (deviceId != Context.DEVICE_ID_INVALID) { + requestPermissions(permissions, 1001, deviceId) + } else { + requestPermissions(permissions, 1001) + } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray, - deviceId: Int + deviceId: Int, ) { val resultReceiver = intent.getParcelableExtra(Intent.EXTRA_RESULT_RECEIVER, RemoteCallback::class.java) @@ -57,8 +63,4 @@ class RequestPermissionActivity : Activity() { resultReceiver?.sendResult(result) finish() } - - companion object { - private val DEVICE_AWARE_PERMISSIONS = arrayOf(Manifest.permission.CAMERA) - } } diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt index 907917f6f..76c86df76 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/AppPermissionsTest.kt @@ -108,7 +108,7 @@ class AppPermissionsTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionGrantTest() { @@ -123,7 +123,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = true, askChecked = false, - denyChecked = false + denyChecked = false, ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -131,14 +131,14 @@ class AppPermissionsTest { mapOf( "Allowed" to listOf(externalDeviceCameraText), "Ask every time" to emptyList(), - "Not allowed" to listOf("Camera") + "Not allowed" to listOf("Camera", "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) } @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionChangeToAskTest() { @@ -153,7 +153,7 @@ class AppPermissionsTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionChangeToDenyTest() { @@ -168,7 +168,7 @@ class AppPermissionsTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionChangeToAllowTest() { @@ -180,7 +180,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = false, askChecked = true, - denyChecked = false + denyChecked = false, ) clickAllowForegroundButton() @@ -189,7 +189,7 @@ class AppPermissionsTest { @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionNotDisplayedInitiallyTest() { @@ -200,14 +200,14 @@ class AppPermissionsTest { mapOf( "Allowed" to emptyList(), "Ask every time" to emptyList(), - "Not allowed" to listOf("Camera") + "Not allowed" to listOf("Camera", "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) } @RequiresFlagsEnabled( Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, ) @Test fun externalDevicePermissionStickyOnGrantTest() { @@ -219,7 +219,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = true, askChecked = false, - denyChecked = false + denyChecked = false, ) clickDenyButton() @@ -232,7 +232,7 @@ class AppPermissionsTest { mapOf( "Allowed" to emptyList(), "Ask every time" to emptyList(), - "Not allowed" to listOf("Camera", externalDeviceCameraText) + "Not allowed" to listOf("Camera", externalDeviceCameraText, "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) } @@ -243,7 +243,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = false, askChecked = true, - denyChecked = false + denyChecked = false, ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -252,7 +252,7 @@ class AppPermissionsTest { mapOf( "Allowed" to emptyList(), "Ask every time" to listOf(externalDeviceCameraText), - "Not allowed" to listOf("Camera") + "Not allowed" to listOf("Camera", "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) @@ -270,7 +270,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = false, askChecked = false, - denyChecked = true + denyChecked = true, ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -279,7 +279,7 @@ class AppPermissionsTest { mapOf( "Allowed" to emptyList(), "Ask every time" to emptyList(), - "Not allowed" to listOf("Camera", externalDeviceCameraText) + "Not allowed" to listOf("Camera", externalDeviceCameraText, "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) @@ -297,7 +297,7 @@ class AppPermissionsTest { verifyRadioButtonStates( allowForegroundChecked = true, askChecked = false, - denyChecked = false + denyChecked = false, ) UiAutomatorUtils2.getUiDevice().pressBack() @@ -306,7 +306,7 @@ class AppPermissionsTest { mapOf( "Allowed" to listOf(externalDeviceCameraText), "Ask every time" to emptyList(), - "Not allowed" to listOf("Camera") + "Not allowed" to listOf("Camera", "Contacts"), ) assertEquals(expectedGrantInfoMap, getGrantInfoMap()) @@ -327,7 +327,7 @@ class AppPermissionsTest { mapOf( "Allowed" to mutableListOf<String>(), "Ask every time" to mutableListOf(), - "Not allowed" to mutableListOf() + "Not allowed" to mutableListOf(), ) val outOfScopeTitles = setOf("Unused app settings", "Manage app if unused") @@ -360,21 +360,21 @@ class AppPermissionsTest { private fun verifyRadioButtonStates( allowForegroundChecked: Boolean, askChecked: Boolean, - denyChecked: Boolean + denyChecked: Boolean, ) { eventually { assertEquals( allowForegroundChecked, UiAutomatorUtils2.waitFindObject(By.res(ALLOW_FOREGROUND_ONLY_RADIO_BUTTON)) - .isChecked + .isChecked, ) assertEquals( askChecked, - UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked + UiAutomatorUtils2.waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked, ) assertEquals( denyChecked, - UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked + UiAutomatorUtils2.waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked, ) } } @@ -392,7 +392,7 @@ class AppPermissionsTest { ) }, Until.newWindow(), - NEW_WINDOW_TIMEOUT_MILLIS + NEW_WINDOW_TIMEOUT_MILLIS, ) } @@ -418,7 +418,7 @@ class AppPermissionsTest { permissionManager.grantRuntimePermission( APP_PACKAGE_NAME, DEVICE_AWARE_PERMISSION, - persistentDeviceId + persistentDeviceId, ) private fun getPermState(): Map<String, PermissionManager.PermissionState> = diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index 5c7573a0b..e1068e19a 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -24,11 +24,11 @@ import android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM import android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT import android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CAMERA import android.content.ComponentName +import android.content.Context import android.content.Intent import android.content.Intent.EXTRA_RESULT_RECEIVER import android.content.pm.PackageManager import android.content.pm.PackageManager.ACTION_REQUEST_PERMISSIONS -import android.hardware.display.DisplayManager import android.hardware.display.VirtualDisplay import android.os.Build import android.os.Bundle @@ -41,7 +41,6 @@ import android.permissionmultidevice.cts.UiAutomatorUtils.click import android.permissionmultidevice.cts.UiAutomatorUtils.findTextForView import android.permissionmultidevice.cts.UiAutomatorUtils.waitFindObject import android.platform.test.annotations.AppModeFull -import android.platform.test.annotations.RequiresFlagsDisabled import android.platform.test.annotations.RequiresFlagsEnabled import android.provider.Settings import android.view.Display @@ -65,13 +64,19 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName = "VanillaIceCream") @AppModeFull(reason = "VirtualDeviceManager cannot be accessed by instant apps") -class DeviceAwarePermissionGrantTest { +@RequiresFlagsEnabled( + Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, + Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, + Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES, +) +open class DeviceAwarePermissionGrantTest { private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() private val defaultDeviceContext = instrumentation.targetContext + private lateinit var defaultDeviceName: String private lateinit var virtualDeviceManager: VirtualDeviceManager private lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice private lateinit var virtualDisplay: VirtualDisplay - private lateinit var deviceDisplayName: String + private lateinit var virtualDeviceName: String private val permissionManager = defaultDeviceContext.getSystemService(PermissionManager::class.java)!! @@ -88,194 +93,449 @@ class DeviceAwarePermissionGrantTest { installPackage(APP_APK_PATH_STREAMING) virtualDeviceManager = defaultDeviceContext.getSystemService(VirtualDeviceManager::class.java)!! + + defaultDeviceName = + Settings.Global.getString( + defaultDeviceContext.contentResolver, + Settings.Global.DEVICE_NAME, + ) + } + + @After + fun cleanup() { + uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false) + Thread.sleep(2000) + } + + private fun createVirtualDevice(cameraPolicy: Int = DEVICE_POLICY_DEFAULT) { virtualDevice = virtualDeviceRule.createManagedVirtualDevice( VirtualDeviceParams.Builder() - .setDevicePolicy(POLICY_TYPE_CAMERA, DEVICE_POLICY_CUSTOM) + .setDevicePolicy(POLICY_TYPE_CAMERA, cameraPolicy) .build() ) - - val displayConfigBuilder = - VirtualDeviceRule.createDefaultVirtualDisplayConfigBuilder( - DISPLAY_WIDTH, - DISPLAY_HEIGHT, - ) - .setFlags( - DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC or - DisplayManager.VIRTUAL_DISPLAY_FLAG_TRUSTED or - DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY - ) - virtualDisplay = - virtualDeviceRule.createManagedVirtualDisplay(virtualDevice, displayConfigBuilder)!! - deviceDisplayName = + virtualDeviceRule.createManagedVirtualDisplay( + virtualDevice, + VirtualDeviceRule.createTrustedVirtualDisplayConfigBuilder(), + )!! + virtualDeviceName = virtualDeviceManager.getVirtualDevice(virtualDevice.deviceId)!!.displayName.toString() } - @After - fun cleanup() { - uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false) - Thread.sleep(2000) + @Test + fun deviceAwarePermission_onHost_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = false, + ) } - @RequiresFlagsEnabled( - Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - ) @Test - fun onHostDevice_requestPermissionForHostDevice_shouldGrantPermission() { - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) + fun deviceAwarePermission_onHost_withRemotePermission_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = true, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - testGrantPermissionForDevice( - Display.DEFAULT_DISPLAY, - DEVICE_ID_DEFAULT, - false, - "", + @Test + fun deviceAwarePermission_onHost_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_INVALID, expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = false, + expectPermissionGrantedOnVirtualDevice = false, ) } - @RequiresFlagsEnabled( - Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - ) @Test - fun onHostDevice_requestPermissionForRemoteDevice_shouldGrantPermission() { - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) + fun deviceAwarePermission_onHost_withRemotePermission_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = true, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - testGrantPermissionForDevice( - Display.DEFAULT_DISPLAY, - virtualDevice.deviceId, - true, - deviceDisplayName, + @Test + fun deviceAwarePermission_onHost_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = virtualDevice.deviceId, expectPermissionGrantedOnDefaultDevice = false, - expectPermissionGrantedOnRemoteDevice = true, + expectPermissionGrantedOnVirtualDevice = true, ) } @Test - fun onHostDevice_requestPermissionForRemoteDeviceAfterPermissionGrantedToHostDevice() { - instrumentation.uiAutomation.grantRuntimePermission(APP_PACKAGE_NAME, PERMISSION) + fun deviceAwarePermission_onHost_withHostPermission_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = true, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = virtualDevice.deviceId, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, true) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) + @Test + fun deviceAwarePermission_onRemote_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = virtualDevice.deviceId, + expectPermissionGrantedOnDefaultDevice = false, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - testGrantPermissionForDevice( - Display.DEFAULT_DISPLAY, - virtualDevice.deviceId, - true, - deviceDisplayName, + @Test + fun deviceAwarePermission_onRemote_withHostPermission_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = true, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = virtualDevice.deviceId, expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = true, + expectPermissionGrantedOnVirtualDevice = true, ) } @Test - fun onHostDevice_requestPermissionForHostDeviceAfterPermissionGrantedToRemoteDevice() { - permissionManager.grantRuntimePermission( - APP_PACKAGE_NAME, - PERMISSION, - virtualDevice.persistentDeviceId!!, + fun deviceAwarePermission_onRemote_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = virtualDevice.deviceId, + expectPermissionGrantedOnDefaultDevice = false, + expectPermissionGrantedOnVirtualDevice = true, ) + } - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, true) + @Test + fun deviceAwarePermission_onRemote_withHostPermission_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = true, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = virtualDevice.deviceId, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - testGrantPermissionForDevice( - Display.DEFAULT_DISPLAY, - DEVICE_ID_DEFAULT, - false, - "", + // TODO: Receives PERMISSION_DENIED but it's fine if remote permission is held?? + @Test + fun deviceAwarePermission_onRemote_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_DEFAULT, expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = true, + expectPermissionGrantedOnVirtualDevice = false, ) } - @RequiresFlagsEnabled( - Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - ) - @RequiresFlagsDisabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES) @Test - fun onRemoteDevice_requestPermissionForHostDevice_shouldShowWarningDialog() { - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) + fun deviceAwarePermission_onRemote_withRemotePermission_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_CUSTOM) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = true, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - requestPermissionOnDevice(virtualDisplay.display.displayId, DEVICE_ID_DEFAULT) + @Test + fun deviceAwarePermissionWithoutCapability_onHost_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - val displayId = virtualDisplay.display.displayId - waitFindObject(By.displayId(displayId).textContains("Permission request suppressed")) + @Test + fun deviceAwarePermissionWithoutCapability_onHost_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) } - @RequiresFlagsEnabled( - Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES, - ) - @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava") @Test - fun onRemoteDevice_requestPermissionForHostDevice_shouldGrantPermission() { - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) - // Create a virtual device with default policy, so that camera permission request will - // correspond to default device camera access. - virtualDevice = - virtualDeviceRule.createManagedVirtualDevice( - VirtualDeviceParams.Builder() - .setDevicePolicy(POLICY_TYPE_CAMERA, DEVICE_POLICY_DEFAULT) - .build() - ) - testGrantPermissionForDevice( - virtualDisplay.display.displayId, - virtualDevice.deviceId, - true, - Settings.Global.getString( - defaultDeviceContext.contentResolver, - Settings.Global.DEVICE_NAME, - ), + fun deviceAwarePermissionWithoutCapability_onHost_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = DEVICE_ID_INVALID, expectPermissionGrantedOnDefaultDevice = true, - expectPermissionGrantedOnRemoteDevice = false, + expectPermissionGrantedOnVirtualDevice = true, ) } - @RequiresFlagsEnabled( - Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED, - Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED, - ) @Test - fun onRemoteDevice_requestPermissionForRemoteDevice_shouldGrantPermission() { - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false) - assertAppHasPermissionForDevice(virtualDevice.deviceId, false) + fun deviceAwarePermissionWithoutCapability_onRemote_requestRemotePermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } - testGrantPermissionForDevice( - virtualDisplay.display.displayId, - virtualDevice.deviceId, - true, - deviceDisplayName, - expectPermissionGrantedOnDefaultDevice = false, - expectPermissionGrantedOnRemoteDevice = true, + @Test + fun deviceAwarePermissionWithoutCapability_onRemote_requestPermissionWithoutDeviceId() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, ) } - private fun testGrantPermissionForDevice( - displayId: Int, - targetDeviceId: Int, - showDeviceName: Boolean, - expectedDeviceNameInDialog: String, + @Test + fun deviceAwarePermissionWithoutCapability_onRemote_requestHostPermission() { + createVirtualDevice(cameraPolicy = DEVICE_POLICY_DEFAULT) + testMultiDevicePermissionGrant( + permission = Manifest.permission.CAMERA, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onHost_requestHostPermission() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onHost_requestPermissionWithoutDeviceId() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onHost_requestRemotePermission() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = DEVICE_ID_DEFAULT, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = DEVICE_ID_INVALID, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onRemote_requestRemotePermission() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = virtualDevice.deviceId, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onRemote_requestPermissionWithoutDeviceId() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_INVALID, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + @Test + fun nonDeviceAwarePermission_onRemote_requestHostPermission() { + createVirtualDevice() + testMultiDevicePermissionGrant( + permission = Manifest.permission.READ_CONTACTS, + initialDefaultDevicePermission = false, + initialVirtualDevicePermission = false, + requestingFromDevice = virtualDevice.deviceId, + requestingForDevice = DEVICE_ID_DEFAULT, + dialogDeviceName = DEVICE_ID_DEFAULT, + expectPermissionGrantedOnDefaultDevice = true, + expectPermissionGrantedOnVirtualDevice = true, + ) + } + + private fun testMultiDevicePermissionGrant( + permission: String, + initialDefaultDevicePermission: Boolean, + initialVirtualDevicePermission: Boolean, + requestingFromDevice: Int, + requestingForDevice: Int, + dialogDeviceName: Int, expectPermissionGrantedOnDefaultDevice: Boolean, - expectPermissionGrantedOnRemoteDevice: Boolean, + expectPermissionGrantedOnVirtualDevice: Boolean, ) { - val future = requestPermissionOnDevice(displayId, targetDeviceId) + if (initialDefaultDevicePermission) { + instrumentation.uiAutomation.grantRuntimePermission(APP_PACKAGE_NAME, permission) + } + if (initialVirtualDevicePermission) { + grantRuntimePermissionOnVirtualDevice(permission) + } + assertAppHasPermissionForDevice( + DEVICE_ID_DEFAULT, + permission, + initialDefaultDevicePermission, + ) + assertAppHasPermissionForDevice( + virtualDevice.deviceId, + permission, + initialVirtualDevicePermission, + ) - if (showDeviceName) { + val displayId = + if (requestingFromDevice == DEVICE_ID_DEFAULT) { + Display.DEFAULT_DISPLAY + } else { + virtualDisplay.display.displayId + } + + val future = requestPermissionOnDevice(displayId, requestingForDevice, permission) + + if (dialogDeviceName != DEVICE_ID_INVALID) { + val expectedDeviceNameInDialog = + if (dialogDeviceName == DEVICE_ID_DEFAULT) { + defaultDeviceName + } else { + virtualDeviceName + } assertPermissionMessageContainsDeviceName(displayId, expectedDeviceNameInDialog) + } else { + assertPermissionMessageDoesNotContainDeviceName(displayId) } // Click the allow button in the dialog to grant permission - SystemUtil.eventually { click(By.displayId(displayId).res(ALLOW_BUTTON)) } + val allowButton = + if (permission == Manifest.permission.CAMERA) ALLOW_BUTTON_FOREGROUND else ALLOW_BUTTON + SystemUtil.eventually { click(By.displayId(displayId).res(allowButton)) } // Validate permission grant result returned from callback val grantPermissionResult = future.get(TIMEOUT, TimeUnit.MILLISECONDS) @@ -284,34 +544,49 @@ class DeviceAwarePermissionGrantTest { TestConstants.PERMISSION_RESULT_KEY_PERMISSIONS ) ) - .isEqualTo(arrayOf(PERMISSION)) + .isEqualTo(arrayOf(permission)) assertThat( grantPermissionResult.getIntArray(TestConstants.PERMISSION_RESULT_KEY_GRANT_RESULTS) ) .isEqualTo(arrayOf(PackageManager.PERMISSION_GRANTED).toIntArray()) + + val expectedPermissionResultDeviceId = + if (requestingForDevice == DEVICE_ID_INVALID) { + requestingFromDevice + } else { + requestingForDevice + } assertThat(grantPermissionResult.getInt(TestConstants.PERMISSION_RESULT_KEY_DEVICE_ID)) - .isEqualTo(targetDeviceId) + .isEqualTo(expectedPermissionResultDeviceId) // Validate whether permission is granted as expected - assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, expectPermissionGrantedOnDefaultDevice) + assertAppHasPermissionForDevice( + DEVICE_ID_DEFAULT, + permission, + expectPermissionGrantedOnDefaultDevice, + ) assertAppHasPermissionForDevice( virtualDevice.deviceId, - expectPermissionGrantedOnRemoteDevice, + permission, + expectPermissionGrantedOnVirtualDevice, ) } private fun requestPermissionOnDevice( displayId: Int, targetDeviceId: Int, + permission: String, ): CompletableFuture<Bundle> { val future = CompletableFuture<Bundle>() val callback = RemoteCallback { result: Bundle? -> future.complete(result) } + val permissions = mutableListOf(permission).toTypedArray() val intent = Intent() .setComponent( ComponentName(APP_PACKAGE_NAME, "$APP_PACKAGE_NAME.RequestPermissionActivity") ) .putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, targetDeviceId) + .putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES, permissions) .putExtra(EXTRA_RESULT_RECEIVER, callback) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) @@ -327,12 +602,23 @@ class DeviceAwarePermissionGrantTest { assertThat(text).contains(deviceName) } - private fun assertAppHasPermissionForDevice(deviceId: Int, expectPermissionGranted: Boolean) { + private fun assertPermissionMessageDoesNotContainDeviceName(displayId: Int) { + waitFindObject(By.displayId(displayId).res(PERMISSION_MESSAGE_ID)) + val text = findTextForView(By.displayId(displayId).res(PERMISSION_MESSAGE_ID)) + assertThat(text).doesNotContain(virtualDeviceName) + assertThat(text).doesNotContain(defaultDeviceName) + } + + private fun assertAppHasPermissionForDevice( + deviceId: Int, + permission: String, + expectPermissionGranted: Boolean, + ) { val checkPermissionResult = defaultDeviceContext .createDeviceContext(deviceId) .packageManager - .checkPermission(PERMISSION, APP_PACKAGE_NAME) + .checkPermission(permission, APP_PACKAGE_NAME) if (expectPermissionGranted) { Assert.assertEquals(PackageManager.PERMISSION_GRANTED, checkPermissionResult) @@ -347,18 +633,25 @@ class DeviceAwarePermissionGrantTest { return intent.resolveActivity(defaultDeviceContext.packageManager) } + private fun grantRuntimePermissionOnVirtualDevice(permission: String) { + permissionManager.grantRuntimePermission( + APP_PACKAGE_NAME, + permission, + virtualDevice.persistentDeviceId!!, + ) + } + companion object { const val APK_DIRECTORY = "/data/local/tmp/cts-permissionmultidevice" const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk" const val APP_PACKAGE_NAME = "android.permissionmultidevice.cts.accessremotedevicecamera" const val PERMISSION_MESSAGE_ID = "com.android.permissioncontroller:id/permission_message" - const val ALLOW_BUTTON = + const val ALLOW_BUTTON_FOREGROUND = "com.android.permissioncontroller:id/permission_allow_foreground_only_button" - const val DEVICE_ID_DEFAULT = 0 + const val ALLOW_BUTTON = "com.android.permissioncontroller:id/permission_allow_button" + const val DEVICE_ID_DEFAULT = Context.DEVICE_ID_DEFAULT + const val DEVICE_ID_INVALID = Context.DEVICE_ID_INVALID const val PERSISTENT_DEVICE_ID_DEFAULT = VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT - const val PERMISSION = Manifest.permission.CAMERA const val TIMEOUT = 5000L - private const val DISPLAY_HEIGHT = 1920 - private const val DISPLAY_WIDTH = 1080 } } diff --git a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java index 3bc3ff12b..e15614be2 100644 --- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java +++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java @@ -878,7 +878,6 @@ public class RoleManagerTest { } @Test - @RequiresFlagsEnabled(android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE) @EnsureHasPrivateProfile(installInstrumentedApp = OptionalBoolean.TRUE) @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName = "VanillaIceCream") |