diff options
67 files changed, 839 insertions, 146 deletions
diff --git a/PermissionController/Android.bp b/PermissionController/Android.bp index 86e883c0d..0115dece3 100644 --- a/PermissionController/Android.bp +++ b/PermissionController/Android.bp @@ -164,6 +164,9 @@ android_library { "//apex_available:platform", "com.android.permission", ], + + // TODO(b/313706381): Remove jarjar once flagging lib is fixed + jarjar_rules: "jarjar-rules.txt", } android_app { diff --git a/PermissionController/OWNERS b/PermissionController/OWNERS index 66cd836f2..3ed65e519 100644 --- a/PermissionController/OWNERS +++ b/PermissionController/OWNERS @@ -18,3 +18,4 @@ per-file WEAR_OWNERS = file:/PermissionController/WEAR_OWNERS per-file src/com/android/permissioncontroller/permission/ui/wear/** = file:/PermissionController/WEAR_OWNERS per-file src/com/android/permissioncontroller/role/ui/wear/** = file:/PermissionController/WEAR_OWNERS per-file res/*-watch/* = file:/PermissionController/WEAR_OWNERS +per-file tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/** = file:/PermissionController/WEAR_OWNERS diff --git a/PermissionController/jarjar-rules.txt b/PermissionController/jarjar-rules.txt new file mode 100644 index 000000000..f4d8a0be2 --- /dev/null +++ b/PermissionController/jarjar-rules.txt @@ -0,0 +1 @@ +rule android.permission.flags.** com.android.permissioncontroller.jarjar.@0 diff --git a/PermissionController/res/values-am/strings.xml b/PermissionController/res/values-am/strings.xml index fb568283a..de2e0c8d8 100644 --- a/PermissionController/res/values-am/strings.xml +++ b/PermissionController/res/values-am/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"ተጨማሪ መረጃ"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"ሁሉንም ፍቀድ"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"ሁልጊዜ ሁሉንም ፍቀድ"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"የተገደበ መዳረሻ ፍቀድ"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ፎቶዎችን እና ቪድዮዎችን ምረጥ"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"ተጨማሪ ምረጥ"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"ተጨማሪ አትምረጥ"</string> diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml index f334a09e0..47731ef8b 100644 --- a/PermissionController/res/values-ar/strings.xml +++ b/PermissionController/res/values-ar/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"معلومات أكثر"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"السماح بالكل"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"السماح بالكل دومًا"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"السماح بالوصول المحدود إلى الصور والفيديوهات"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"اختيار صور وفيديوهات"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"اختيار المزيد"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"عدم اختيار المزيد"</string> diff --git a/PermissionController/res/values-bg/strings.xml b/PermissionController/res/values-bg/strings.xml index ae16f8e57..fb5d670c7 100644 --- a/PermissionController/res/values-bg/strings.xml +++ b/PermissionController/res/values-bg/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Още информация"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Разрешаване на пълен достъп"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Винаги да се разрешава пълен достъп"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Разрешаване на ограничения достъп"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Избиране на снимки и видеоклипове"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Избиране на още"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Без избиране на още"</string> diff --git a/PermissionController/res/values-bn/strings.xml b/PermissionController/res/values-bn/strings.xml index a4cb8858f..ae5f1c3cf 100644 --- a/PermissionController/res/values-bn/strings.xml +++ b/PermissionController/res/values-bn/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"আরও তথ্য"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"সব অনুমোদন করুন"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"সবসময় সব অনুমতি দিন"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"সীমিত অ্যাক্সেসের অনুমতি দিন"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ফটো এবং ভিডিও বেছে নিন"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"আরও বেছে নিন"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"আর বেছে নেবেন না"</string> diff --git a/PermissionController/res/values-bs/strings.xml b/PermissionController/res/values-bs/strings.xml index 88151f0ed..061ed86a1 100644 --- a/PermissionController/res/values-bs/strings.xml +++ b/PermissionController/res/values-bs/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Više informacija"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Dozvoli sve"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Uvijek dozvoli sve"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Dozvoli ograničeni pristup"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Odabir fotografija i videozapisa"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Odaberi više"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Nemoj odabrati više"</string> diff --git a/PermissionController/res/values-cs/strings.xml b/PermissionController/res/values-cs/strings.xml index 64df5f1b9..20c594403 100644 --- a/PermissionController/res/values-cs/strings.xml +++ b/PermissionController/res/values-cs/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Další informace"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Povolit vše"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Vždy zobrazit vše"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Povolit omezený přístup"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Vybrat fotky a videa"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Vybrat další"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Nevybírat další"</string> diff --git a/PermissionController/res/values-el/strings.xml b/PermissionController/res/values-el/strings.xml index f144bc3a9..a8039d2d9 100644 --- a/PermissionController/res/values-el/strings.xml +++ b/PermissionController/res/values-el/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Περισσότερα"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Να επιτρέπεται"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Να επιτρέπονται πάντα όλα"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Να επιτρέπεται περιορισμένη πρόσβαση"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Επιλογή φωτογραφιών και βίντεο"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Επιλέξτε περισσότερα"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Να μην γίνει επιλογή περισσότερων"</string> diff --git a/PermissionController/res/values-en-rAU/strings.xml b/PermissionController/res/values-en-rAU/strings.xml index 9c8a2e6df..6fb7994a8 100644 --- a/PermissionController/res/values-en-rAU/strings.xml +++ b/PermissionController/res/values-en-rAU/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"More info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Allow all"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Always allow all"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Allow limited access"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Select photos and videos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Select more"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Don\'t select more"</string> diff --git a/PermissionController/res/values-en-rCA/strings.xml b/PermissionController/res/values-en-rCA/strings.xml index 6f7182552..a01a0cef2 100644 --- a/PermissionController/res/values-en-rCA/strings.xml +++ b/PermissionController/res/values-en-rCA/strings.xml @@ -421,7 +421,7 @@ <string name="ongoing_usage_dialog_separator" msgid="1715181526581520068">", "</string> <string name="ongoing_usage_dialog_last_separator" msgid="4170995004748832163">" and "</string> <string name="default_app_search_keyword" msgid="8330125736889689743">"default apps"</string> - <string name="permgroup_list_microphone_and_camera" msgid="962768198001487969">"Microphone & Camera"</string> + <string name="permgroup_list_microphone_and_camera" msgid="962768198001487969">"Microphone and camera"</string> <string name="settings_button" msgid="4414988414732479636">"Settings"</string> <string name="default_apps" msgid="5119201969348748639">"Default apps"</string> <string name="no_default_apps" msgid="2593466527182950231">"No default apps"</string> diff --git a/PermissionController/res/values-en-rGB/strings.xml b/PermissionController/res/values-en-rGB/strings.xml index 51b5c5da1..bfaca7355 100644 --- a/PermissionController/res/values-en-rGB/strings.xml +++ b/PermissionController/res/values-en-rGB/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"More info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Allow all"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Always allow all"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Allow limited access"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Select photos and videos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Select more"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Don\'t select more"</string> diff --git a/PermissionController/res/values-en-rIN/strings.xml b/PermissionController/res/values-en-rIN/strings.xml index 51b5c5da1..bfaca7355 100644 --- a/PermissionController/res/values-en-rIN/strings.xml +++ b/PermissionController/res/values-en-rIN/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"More info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Allow all"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Always allow all"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Allow limited access"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Select photos and videos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Select more"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Don\'t select more"</string> diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml index bb77fd8b0..ba8386062 100644 --- a/PermissionController/res/values-es-rUS/strings.xml +++ b/PermissionController/res/values-es-rUS/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Más información"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Permitir todo"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Permitir todo siempre"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Permite el acceso limitado"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Seleccionar fotos y videos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Seleccionar más"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"No seleccionar más"</string> diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml index 1ccbdd803..f17cbd1f8 100644 --- a/PermissionController/res/values-et/strings.xml +++ b/PermissionController/res/values-et/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Lisateave"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Anna juurdepääs kõigile"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Luba alati kõik"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Luba piiratud juurdepääs"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Valige fotod ja videod"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Valige rohkem"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Ära vali rohkem"</string> diff --git a/PermissionController/res/values-fr/strings.xml b/PermissionController/res/values-fr/strings.xml index 8f81cbbbd..97c3461e5 100644 --- a/PermissionController/res/values-fr/strings.xml +++ b/PermissionController/res/values-fr/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Plus d\'infos"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Tout autoriser"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Toujours autoriser"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Autoriser un accès limité"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Certaines photos et vidéos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Sélectionner plus"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Ne rien sélectionner de plus"</string> diff --git a/PermissionController/res/values-gl/strings.xml b/PermissionController/res/values-gl/strings.xml index 40f40660f..5c5a61baf 100644 --- a/PermissionController/res/values-gl/strings.xml +++ b/PermissionController/res/values-gl/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Máis datos"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Permitir todos"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Permitir todos sempre"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Permitir acceso limitado"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Seleccionar fotos e vídeos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Seleccionar máis"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Non seleccionar máis"</string> diff --git a/PermissionController/res/values-hi/strings.xml b/PermissionController/res/values-hi/strings.xml index ae77d3ca1..04b9167aa 100644 --- a/PermissionController/res/values-hi/strings.xml +++ b/PermissionController/res/values-hi/strings.xml @@ -34,7 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"ज़्यादा जानकारी"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"सभी के लिए अनुमति दें"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"हमेशा के लिए सभी को अनुमति दें"</string> - <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"सीमित ऐक्सेस की अनुमति दें"</string> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"सीमित ऐक्सेस देने की अनुमति दें"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"चुनिंदा फ़ोटो और वीडियो को अनुमति दें"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"ज़्यादा फ़ोटो चुनें"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"ज़्यादा फ़ोटो और वीडियो न चुनें"</string> diff --git a/PermissionController/res/values-hr/strings.xml b/PermissionController/res/values-hr/strings.xml index da0248c4b..d45180846 100644 --- a/PermissionController/res/values-hr/strings.xml +++ b/PermissionController/res/values-hr/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Više podataka"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Dopusti sve"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Uvijek dopusti sve"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Omogućivanje ograničenog pristupa"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Odaberite slike i videozapise"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Odaberite više"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Nemoj dopustiti"</string> diff --git a/PermissionController/res/values-hy/strings.xml b/PermissionController/res/values-hy/strings.xml index e8afc0303..8d92099d2 100644 --- a/PermissionController/res/values-hy/strings.xml +++ b/PermissionController/res/values-hy/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Մանրամասն"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Թույլատրել բոլորը"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Միշտ թույլատրել բոլորը"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Տրամադրել սահմանափակ հասանելիություն"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Կոնկրետ լուսանկարներ և տեսանյութեր"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Ընտրել այլ տարրեր"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Չընտրել այլ լուսանկարներ"</string> diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml index a6101699e..37df6c326 100644 --- a/PermissionController/res/values-in/strings.xml +++ b/PermissionController/res/values-in/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Info lengkap"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Izinkan semua"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Selalu izinkan semua"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Izinkan akses terbatas"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Pilih foto dan video"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Pilih lainnya"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Jangan pilih lainnya"</string> diff --git a/PermissionController/res/values-is/strings.xml b/PermissionController/res/values-is/strings.xml index ab7f6b264..4a472afa0 100644 --- a/PermissionController/res/values-is/strings.xml +++ b/PermissionController/res/values-is/strings.xml @@ -34,7 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Upplýsingar"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Leyfa allt"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Alltaf leyfa allt"</string> - <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Heimila takmarkaðan aðgang"</string> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Leyfa takmarkaðan aðgang"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Velja myndir og myndskeið"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Velja meira"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Ekki velja fleiri"</string> diff --git a/PermissionController/res/values-it/strings.xml b/PermissionController/res/values-it/strings.xml index ea7d9f617..27a1ec703 100644 --- a/PermissionController/res/values-it/strings.xml +++ b/PermissionController/res/values-it/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Altre info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Consenti tutto"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Consenti sempre tutto"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Consenti accesso limitato"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Seleziona foto e video"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Seleziona più messaggi"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Non selezionare altro"</string> diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml index 1b5c39820..b861cbf0d 100644 --- a/PermissionController/res/values-ja/strings.xml +++ b/PermissionController/res/values-ja/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"詳細"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"すべて許可"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"常にすべて許可"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"アクセス制限を許可する"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"写真と動画を選択"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"さらに選択"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"他を選択しない"</string> diff --git a/PermissionController/res/values-ka/strings.xml b/PermissionController/res/values-ka/strings.xml index ebc912c62..b8bc6fd95 100644 --- a/PermissionController/res/values-ka/strings.xml +++ b/PermissionController/res/values-ka/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"მეტი ინფორმაცია"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"ყველას დაშვება"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"ყოველთვის ყველას დაშვება"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"შეზღუდული წვდომის დაშვება"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ფოტოებისა და ვიდეოების არჩევა"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"მეტის არჩევა"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"მეტის აღარ არჩევა"</string> diff --git a/PermissionController/res/values-kk/strings.xml b/PermissionController/res/values-kk/strings.xml index 5c501080c..b39b229c3 100644 --- a/PermissionController/res/values-kk/strings.xml +++ b/PermissionController/res/values-kk/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Толығырақ"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Бәріне рұқсат беру"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Әрдайым бәріне рұқсат беру"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Шектеулі рұқсат беру"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Фотосуреттер мен бейнелерді таңдау"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Тағы таңдау"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Тағы басқасын таңдамау"</string> diff --git a/PermissionController/res/values-km/strings.xml b/PermissionController/res/values-km/strings.xml index 7b853c357..d1b60ad11 100644 --- a/PermissionController/res/values-km/strings.xml +++ b/PermissionController/res/values-km/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"ព័ត៌មានបន្ថែម"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"អនុញ្ញាតទាំងអស់"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"អនុញ្ញាតទាំងអស់ជានិច្ច"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"អនុញ្ញាតឱ្យចូលប្រើដោយមានកម្រិត"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ជ្រើសរើសរូបថត និងវីដេអូ"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"ជ្រើសរើសច្រើនទៀត"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"កុំជ្រើសរើសទៀត"</string> diff --git a/PermissionController/res/values-ko/strings.xml b/PermissionController/res/values-ko/strings.xml index 9149c57d3..cc06d56d7 100644 --- a/PermissionController/res/values-ko/strings.xml +++ b/PermissionController/res/values-ko/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"추가 정보"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"모두 허용"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"항상 모두 허용"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"제한된 액세스 허용"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"사진 및 동영상 선택"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"더보기 선택"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"추가 선택 안함"</string> diff --git a/PermissionController/res/values-ky/strings.xml b/PermissionController/res/values-ky/strings.xml index 769d10c62..1f1ee13a1 100644 --- a/PermissionController/res/values-ky/strings.xml +++ b/PermissionController/res/values-ky/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Дагы маалымат"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Баарына уруксат берүү"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Ар дайым баарына уруксат берүү"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Чектелген мүмкүнчүлүк берүү"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Сүрөттөрдү жана видеолорду тандаңыз"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Дагы тандоо"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Башка тандалбасын"</string> diff --git a/PermissionController/res/values-lo/strings.xml b/PermissionController/res/values-lo/strings.xml index 678c8338b..b78db29c8 100644 --- a/PermissionController/res/values-lo/strings.xml +++ b/PermissionController/res/values-lo/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"ຂໍ້ມູນເພີ່ມເຕີມ"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"ອະນຸຍາດທັງໝົດ"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"ອະນຸຍາດທັງໝົດຕະຫຼອດ"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"ອະນຸຍາດສິດເຂົ້າເຖິງແບບຈຳກັດ"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ເລືອກຮູບພາບ ແລະ ວິດີໂອ"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"ເລືອກເພີ່ມເຕີມ"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"ຢ່າເລືອກເພີ່ມເຕີມ"</string> diff --git a/PermissionController/res/values-lv/strings.xml b/PermissionController/res/values-lv/strings.xml index 8d0e6e390..10b79f45d 100644 --- a/PermissionController/res/values-lv/strings.xml +++ b/PermissionController/res/values-lv/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Informācija"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Atļaut visu"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Vienmēr atļaut visu"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Atļaut ierobežotu piekļuvi"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Atlasīt fotoattēlus un video"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Atlasīt citus"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Neatlasīt vairāk"</string> diff --git a/PermissionController/res/values-ml/strings.xml b/PermissionController/res/values-ml/strings.xml index b1637f79a..2403dc6d3 100644 --- a/PermissionController/res/values-ml/strings.xml +++ b/PermissionController/res/values-ml/strings.xml @@ -34,7 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"കൂടുതൽ വിവരങ്ങൾ"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"എല്ലാം അനുവദിക്കുക"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"എപ്പോഴും എല്ലാം അനുവദിക്കുക"</string> - <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"പരിമിത ആക്സസ് അനുവദിക്കുക"</string> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"പരിമിതമായ ആക്സസ് അനുവദിക്കുക"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ഫോട്ടോകളും വീഡിയോകളും തിരഞ്ഞെടുക്കുക"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"കൂടുതൽ തിരഞ്ഞെടുക്കുക"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"കൂടുതൽ തിരഞ്ഞെടുക്കരുത്"</string> diff --git a/PermissionController/res/values-ms/strings.xml b/PermissionController/res/values-ms/strings.xml index 923a6b4ee..a2e48b2bd 100644 --- a/PermissionController/res/values-ms/strings.xml +++ b/PermissionController/res/values-ms/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Lagi maklumat"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Benarkan semua"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Sentiasa benarkan semua"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Benarkan akses terhad"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Pilih foto dan video"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Pilih lagi"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Jangan pilih lagi"</string> diff --git a/PermissionController/res/values-nb/strings.xml b/PermissionController/res/values-nb/strings.xml index 656a6b4f1..fc86eb79d 100644 --- a/PermissionController/res/values-nb/strings.xml +++ b/PermissionController/res/values-nb/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Mer info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Tillat alle"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Tillat alltid alle"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Gi begrenset tilgang"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Velg bilder og videoer"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Velg flere"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Ikke velg flere"</string> diff --git a/PermissionController/res/values-ne/strings.xml b/PermissionController/res/values-ne/strings.xml index d131b1599..c934729fd 100644 --- a/PermissionController/res/values-ne/strings.xml +++ b/PermissionController/res/values-ne/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"थप जानकारी"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"सबै डेटा प्रयोग गर्ने अनुमति दिनुहोस्"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"सधैँ सबै अनुमति दिइयोस्"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"सीमित एक्सेस दिनुहोस्"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"फोटो र भिडियोहरू चयन गर्नुहोस्"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"अझ धेरै फोटो चयन गर्नुहोस्"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"थप डेटा चयन नगर्नुहोस्"</string> diff --git a/PermissionController/res/values-or/strings.xml b/PermissionController/res/values-or/strings.xml index b77972455..beb7572ba 100644 --- a/PermissionController/res/values-or/strings.xml +++ b/PermissionController/res/values-or/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"ଅଧିକ ସୂଚନା"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"ସବୁକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"ସର୍ବଦା ସବୁକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"ସୀମିତ ଆକ୍ସେସକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"ଫଟୋ ଏବଂ ଭିଡିଓଗୁଡ଼ିକୁ ଚୟନ କରନ୍ତୁ"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"ଅଧିକ ଚୟନ କରନ୍ତୁ"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"ଅଧିକ ଚୟନ କରନ୍ତୁ ନାହିଁ"</string> diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml index 23736443c..437805f95 100644 --- a/PermissionController/res/values-pt-rPT/strings.xml +++ b/PermissionController/res/values-pt-rPT/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Mais informação"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Permitir todos"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Permitir sempre todos"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Permitir acesso limitado"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Selecionar fotos e vídeos"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Selecionar mais"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Não selecionar mais"</string> diff --git a/PermissionController/res/values-ro/strings.xml b/PermissionController/res/values-ro/strings.xml index 1c8a79e4d..b4abb4142 100644 --- a/PermissionController/res/values-ro/strings.xml +++ b/PermissionController/res/values-ro/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Mai multe info."</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Permite-le pe toate"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Permite-le întotdeauna pe toate"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Permite cu acces limitat"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Alege fotografii și videoclipuri"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Selectează mai multe"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Nu selecta mai multe"</string> diff --git a/PermissionController/res/values-sk/strings.xml b/PermissionController/res/values-sk/strings.xml index 1c63d2d62..6680ddad9 100644 --- a/PermissionController/res/values-sk/strings.xml +++ b/PermissionController/res/values-sk/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Ďalšie info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Povoliť všetko"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Vždy povoliť všetko"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Povoliť obmedzený prístup"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Vybrať fotky a videá"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Vybrať ďalšie"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Nevybrať ďalšie"</string> diff --git a/PermissionController/res/values-sv/strings.xml b/PermissionController/res/values-sv/strings.xml index 59505861a..350d6528c 100644 --- a/PermissionController/res/values-sv/strings.xml +++ b/PermissionController/res/values-sv/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Mer info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Tillåt alla"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Tillåt alltid alla"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Tillåt begränsad åtkomst"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Välj foton och videor"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Välj fler"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Välj inte fler"</string> diff --git a/PermissionController/res/values-ta/strings.xml b/PermissionController/res/values-ta/strings.xml index 1af565aa3..70d71f31b 100644 --- a/PermissionController/res/values-ta/strings.xml +++ b/PermissionController/res/values-ta/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"மேலும் தகவல்"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"அனைத்தையும் அனுமதி"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"எப்போதும் அனைத்தையும் அனுமதி"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"வரம்பிற்குட்பட்ட அணுகலை அனுமதி"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"படங்களையும் வீடியோக்களையும் தேர்ந்தெடுங்கள்"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"இன்னும் தேர்ந்தெடுங்கள்"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"கூடுதலாகத் தேர்ந்தெடுக்க வேண்டாம்"</string> diff --git a/PermissionController/res/values-tl/strings.xml b/PermissionController/res/values-tl/strings.xml index 8bf4b99ce..c17871ae5 100644 --- a/PermissionController/res/values-tl/strings.xml +++ b/PermissionController/res/values-tl/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Higit pang info"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Pahintulutan lahat"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Palaging pahintulutan lahat"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Payagan ang limitadong access"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Pumili ng mga larawan at video"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Pumili pa"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Huwag nang pumili pa"</string> diff --git a/PermissionController/res/values-tr/strings.xml b/PermissionController/res/values-tr/strings.xml index fe3459cd7..878e9155c 100644 --- a/PermissionController/res/values-tr/strings.xml +++ b/PermissionController/res/values-tr/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Daha fazla bilgi"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Tümüne izin ver"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Tümüne her zaman izin ver"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Sınırlı erişime izin ver"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Fotoğraf ve video seçin"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Daha fazla seçin"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Başka seçilmesin"</string> diff --git a/PermissionController/res/values-uk/strings.xml b/PermissionController/res/values-uk/strings.xml index 999c9bff0..9a39e12ee 100644 --- a/PermissionController/res/values-uk/strings.xml +++ b/PermissionController/res/values-uk/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Докладніше"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Дозволити всі"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Завжди дозволяти всі"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Дозволити обмежений доступ"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Вибрати фото й відео"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Вибрати ще"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Не вибирати більше"</string> diff --git a/PermissionController/res/values-ur/strings.xml b/PermissionController/res/values-ur/strings.xml index d16c06510..e6f6ac167 100644 --- a/PermissionController/res/values-ur/strings.xml +++ b/PermissionController/res/values-ur/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"مزید معلومات"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"سبھی کو اجازت دیں"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"ہمیشہ سبھی کو اجازت دیں"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"محدود رسائی کی اجازت دیں"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"تصاویر اور ویڈیوز منتخب کریں"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"مزید منتخب کریں"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"مزید منتخب نہ کریں"</string> diff --git a/PermissionController/res/values-zh-rCN/strings.xml b/PermissionController/res/values-zh-rCN/strings.xml index 31f108ad4..985bd4fc7 100644 --- a/PermissionController/res/values-zh-rCN/strings.xml +++ b/PermissionController/res/values-zh-rCN/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"更多信息"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"全部允许"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"始终全部允许"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"允许有限访问"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"选择照片和视频"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"选择更多"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"不选择其他数据"</string> diff --git a/PermissionController/res/values-zu/strings.xml b/PermissionController/res/values-zu/strings.xml index 0ece51662..6fb918556 100644 --- a/PermissionController/res/values-zu/strings.xml +++ b/PermissionController/res/values-zu/strings.xml @@ -34,8 +34,7 @@ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Olunye ulwazi"</string> <string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Vumela konke"</string> <string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Njalo vumela konke"</string> - <!-- no translation found for grant_dialog_button_allow_limited_access (5713551784422137594) --> - <skip /> + <string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Vumela ukufinyelela okulinganiselwe"</string> <string name="grant_dialog_button_allow_selected_photos" msgid="5497042471576153842">"Khetha izithombe namavidiyo"</string> <string name="grant_dialog_button_allow_more_selected_photos" msgid="5145657877588697709">"Khetha okuningi"</string> <string name="grant_dialog_button_dont_select_more" msgid="6643552729129461268">"Ungakhethi okuningi"</string> diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java index 53b024076..4cd595b55 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java @@ -78,6 +78,8 @@ import com.android.permissioncontroller.permission.ui.handheld.v34.AppDataSharin import com.android.permissioncontroller.permission.ui.legacy.AppPermissionActivity; import com.android.permissioncontroller.permission.ui.television.TvUnusedAppsFragment; import com.android.permissioncontroller.permission.ui.wear.WearAppPermissionFragment; +import com.android.permissioncontroller.permission.ui.wear.WearPermissionUsageDetailsFragment; +import com.android.permissioncontroller.permission.ui.wear.WearPermissionUsageFragment; import com.android.permissioncontroller.permission.ui.wear.WearUnusedAppsFragment; import com.android.permissioncontroller.permission.utils.KotlinUtils; import com.android.permissioncontroller.permission.utils.PermissionMapping; @@ -229,6 +231,8 @@ public final class ManagePermissionsActivity extends SettingsActivity { PERMISSION_USAGE_FRAGMENT_INTERACTION__ACTION__OPEN); if (DeviceUtils.isAuto(this)) { androidXFragment = new AutoPermissionUsageFragment(); + } else if (DeviceUtils.isWear(this)) { + androidXFragment = WearPermissionUsageFragment.newInstance(sessionId); } else { androidXFragment = PermissionUsageWrapperFragment.newInstance( Long.MAX_VALUE, sessionId); @@ -250,6 +254,9 @@ public final class ManagePermissionsActivity extends SettingsActivity { if (DeviceUtils.isAuto(this)) { androidXFragment = AutoPermissionUsageDetailsFragment.Companion.newInstance( groupName, showSystem, sessionId); + } else if (DeviceUtils.isWear(this)) { + androidXFragment = WearPermissionUsageDetailsFragment + .newInstance(groupName, showSystem, show7Days); } else { androidXFragment = PermissionDetailsWrapperFragment .newInstance(groupName, Long.MAX_VALUE, showSystem, sessionId, diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt index 65a715738..971542e2b 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt @@ -254,7 +254,6 @@ class AppPermissionViewModel( mutableMapOf<String, LightAppPermGroupLiveData>() init { - addSource(appPermGroupLiveData) { appPermGroup -> lightAppPermGroup = appPermGroup if (permGroupName in PermissionMapping.STORAGE_SUPERGROUP_PERMISSIONS) { @@ -397,6 +396,17 @@ class AppPermissionViewModel( deniedState.isChecked = !group.isGranted selectState.isChecked = isPartialStorageGrant(group) allowedState.isChecked = group.isGranted && !isPartialStorageGrant(group) + if (group.foreground.isPolicyFixed || group.foreground.isSystemFixed) { + allowedState.isEnabled = false + selectState.isEnabled = false + deniedState.isEnabled = false + showAdminSupportLiveData.value = admin + val detailId = + getDetailResIdForFixedByPolicyPermissionGroup(group, admin != null) + if (detailId != 0) { + detailResIdLiveData.value = detailId to null + } + } } else { // Allow / Deny case allowedState.isShown = true @@ -657,8 +667,12 @@ class AppPermissionViewModel( fun openPhotoPicker(fragment: Fragment) { val appPermGroup = lightAppPermGroup ?: return - openPhotoPickerForApp(fragment.requireActivity(), appPermGroup.packageInfo.uid, - appPermGroup.foregroundPermNames, 0) + openPhotoPickerForApp( + fragment.requireActivity(), + appPermGroup.packageInfo.uid, + appPermGroup.foregroundPermNames, + 0 + ) } /** diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt index e30fc7bfd..fa5b1b685 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt @@ -315,11 +315,26 @@ class PermissionUsageViewModel( if (mAllLightPackageOpsLiveData.isStale) { return } + if ( + appPermGroupUiInfoLiveDataList.any { + !it.value.isInitialized || it.value.isStale + } + ) { + return + } + if ( + lightPackageInfoLiveDataMap.any { !it.value.isInitialized || it.value.isStale } + ) { + return + } + val packageOps: Map<Pair<String, UserHandle>, LightPackageOps> = + mAllLightPackageOpsLiveData.value ?: emptyMap() val appPermissionIds = mutableListOf<AppPermissionId>() - val allPackages = mAllLightPackageOpsLiveData.value?.keys ?: setOf() - for (packageWithUserHandle: Pair<String, UserHandle> in allPackages) { - for (permissionGroup in getAllEligiblePermissionGroups()) { + val allPackages = packageOps.keys + + packageOps.forEach { (packageWithUserHandle, pkgOps) -> + pkgOps.lastPermissionGroupAccessTimesMs.keys.forEach { permissionGroup -> appPermissionIds.add( AppPermissionId( packageWithUserHandle.first, diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java index f11096a8b..fdeb2ed2a 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java @@ -20,11 +20,14 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED; import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.IntentSender; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import android.os.Build; import android.os.Bundle; import android.os.RemoteCallback; import android.os.UserHandle; @@ -96,11 +99,6 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat mAppPermissions = new AppPermissions(activity, packageInfo, false, () -> getActivity().finish()); - if (mAppPermissions.getPermissionGroups().isEmpty()) { - activity.finish(); - return; - } - boolean reviewRequired = false; for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { if (group.isReviewRequired()) { @@ -110,6 +108,7 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat } if (!reviewRequired) { + confirmPermissionsReview(); activity.finish(); } } @@ -142,19 +141,22 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat final boolean isPackageUpdated = isPackageUpdated(); int permOrder = ORDER_PERM_OFFSET_START; + PackageInfo pkg = mAppPermissions.getPackageInfo(); + ApplicationInfo appInfo = pkg.applicationInfo; + for (AppPermissionGroup group : mAppPermissions.getPermissionGroups()) { if (!Utils.shouldShowPermission(getContext(), group) || !Utils.OS_PKG.equals(group.getDeclaringPackage())) { continue; } - final SwitchPreference preference; + final PermissionSwitchPreference preference; Preference cachedPreference = oldNewPermissionsCategory != null ? oldNewPermissionsCategory.findPreference(group.getName()) : null; - if (cachedPreference instanceof SwitchPreference) { - preference = (SwitchPreference) cachedPreference; + if (cachedPreference instanceof PermissionSwitchPreference) { + preference = (PermissionSwitchPreference) cachedPreference; } else { - preference = new SwitchPreference(getActivity()); + preference = new PermissionSwitchPreference(getActivity()); preference.setKey(group.getName()); preference.setTitle(group.getLabel()); @@ -164,7 +166,8 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat preference.setOnPreferenceChangeListener(this); } - if (group.isReviewRequired() ) { + if (appInfo.targetSdkVersion < Build.VERSION_CODES.M && + group.isReviewRequired() ) { preference.setChecked(true); } else { preference.setChecked(group.areRuntimePermissionsGranted()); @@ -218,14 +221,16 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - Log.d(TAG, "onPreferenceChange " + preference.getTitle()); + Log.d(TAG, "onPreferenceChange " + preference.getTitle()); if (mHasConfirmedRevoke) { return true; } - if (preference instanceof SwitchPreference) { - SwitchPreference switchPreference = (SwitchPreference) preference; - if (switchPreference.isChecked()) { - showWarnRevokeDialog(switchPreference); + if (preference instanceof PermissionSwitchPreference) { + PermissionSwitchPreference permPreference = (PermissionSwitchPreference) + preference; + permPreference.setChanged(); + if (permPreference.isChecked()) { + showWarnRevokeDialog(permPreference); } else { return true; } @@ -266,16 +271,29 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat final int preferenceCount = preferenceGroup.getPreferenceCount(); for (int i = 0; i < preferenceCount; i++) { Preference preference = preferenceGroup.getPreference(i); - if (preference instanceof TwoStatePreference) { - TwoStatePreference twoStatePreference = (TwoStatePreference) preference; + if (preference instanceof PermissionSwitchPreference) { + PermissionSwitchPreference permPreference = (PermissionSwitchPreference) + preference; String groupName = preference.getKey(); AppPermissionGroup group = mAppPermissions.getPermissionGroup(groupName); - if (twoStatePreference.isChecked()) { - group.grantRuntimePermissions(true, false); - } else { - group.revokeRuntimePermissions(false); + if (group.isReviewRequired() || permPreference.wasChanged()) { + if (permPreference.isChecked()) { + Log.i(TAG, groupName + " permPreference.isChecked()"); + group.grantRuntimePermissions(true, false); + } else { + Log.i(TAG, groupName + " !permPreference.isChecked()"); + group.revokeRuntimePermissions(false); + } + } + + AppPermissionGroup backgroundGroup = group.getBackgroundPermissions(); + if (backgroundGroup != null) { + // If the preference wasn't toggled we show it as "fully granted" + if (backgroundGroup.isReviewRequired() && !permPreference.wasChanged()) { + backgroundGroup.grantRuntimePermissions(true, false); + } + backgroundGroup.unsetReviewRequired(); } - group.unsetReviewRequired(); } } } @@ -403,4 +421,32 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat callback.sendResult(result); } } + + /** + * Extend the {@link SwitchPreference}: + * <ul> + * <li>Monitor the changed state</li> + * </ul> + */ + private static class PermissionSwitchPreference extends SwitchPreference { + private boolean mWasChanged = false; + + PermissionSwitchPreference(Context context) { + super(context); + } + + /** + * Mark the permission as changed by the user + */ + void setChanged() { + mWasChanged = true; + } + + /** + * @return {@code true} iff the permission was changed by the user + */ + boolean wasChanged() { + return mWasChanged; + } + } } diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt new file mode 100644 index 000000000..ead7f9503 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permission.ui.wear + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.android.permissioncontroller.PermissionControllerApplication +import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsViewModelFactory +import com.android.permissioncontroller.permission.utils.KotlinUtils.is7DayToggleEnabled + +/** + * This is a condensed version of + * [com.android.permissioncontroller.permission.ui.handheld.v31.PermissionUsageDetailsFragment], + * tailored for Wear. + */ +@RequiresApi(Build.VERSION_CODES.S) +class WearPermissionUsageDetailsFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val permissionGroup = + arguments?.getString(Intent.EXTRA_PERMISSION_GROUP_NAME) + ?: let { + Log.e(TAG, "No permission group was provided for PermissionDetailsFragment") + return null + } + val showSystem = + arguments?.getBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, false) ?: false + val show7Days = + arguments?.getBoolean(ManagePermissionsActivity.EXTRA_SHOW_7_DAYS, false) ?: false + + val factory = + PermissionUsageDetailsViewModelFactory( + PermissionControllerApplication.get(), + this, + permissionGroup + ) + val viewModel = + ViewModelProvider(this, factory).get(PermissionUsageDetailsViewModel::class.java) + viewModel.updateShowSystemAppsToggle(showSystem) + viewModel.updateShow7DaysToggle(is7DayToggleEnabled() && show7Days) + + return ComposeView(requireContext()).apply { + setContent { WearPermissionUsageDetailsScreen(permissionGroup, viewModel) } + } + } + + companion object { + private const val TAG = "WearPermissionUsageDetails" + + @JvmStatic + fun newInstance( + groupName: String?, + showSystem: Boolean, + show7Days: Boolean + ): WearPermissionUsageDetailsFragment { + return WearPermissionUsageDetailsFragment().apply { + val arguments = + Bundle().apply { + if (groupName != null) { + putString(Intent.EXTRA_PERMISSION_GROUP_NAME, groupName) + } + putBoolean(ManagePermissionsActivity.EXTRA_SHOW_SYSTEM, showSystem) + putBoolean(ManagePermissionsActivity.EXTRA_SHOW_7_DAYS, show7Days) + } + setArguments(arguments) + } + } + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt new file mode 100644 index 000000000..3c62e5343 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permission.ui.wear + +import android.content.Intent +import android.os.Build +import android.text.format.DateFormat +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.wear.compose.material.ChipDefaults +import androidx.wear.compose.material.MaterialTheme +import com.android.permissioncontroller.R +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo +import com.android.permissioncontroller.permission.ui.wear.elements.Chip +import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen +import com.android.permissioncontroller.permission.utils.KotlinUtils + +@RequiresApi(Build.VERSION_CODES.S) +@Composable +fun WearPermissionUsageDetailsScreen( + permissionGroup: String, + viewModel: PermissionUsageDetailsViewModel +) { + val context = LocalContext.current + val uiData = viewModel.permissionUsagesDetailsInfoUiLiveData.observeAsState(null) + val showSystem = viewModel.showSystemLiveData.observeAsState(false) + var isLoading by remember { mutableStateOf(true) } + + val title = stringResource(R.string.permission_history_title) + val subtitle = + stringResource( + R.string.permission_group_usage_title, + KotlinUtils.getPermGroupLabel(context, permissionGroup) + ) + val hasSystemApps: Boolean = uiData.value?.containsSystemAppAccesses ?: false + val onShowSystemClick: (Boolean) -> Unit = { show -> + run { viewModel.updateShowSystemAppsToggle(show) } + } + val onChipClick: (AppPermissionAccessUiInfo) -> Unit = { uiInfo -> + run { + val intent = + PermissionUsageDetailsViewModel.createHistoryPreferenceClickIntent( + context, + uiInfo.userHandle, + uiInfo.packageName, + uiInfo.permissionGroup, + uiInfo.accessStartTime, + uiInfo.accessEndTime, + uiInfo.showingAttribution, + uiInfo.attributionTags + ) + context.startActivityAsUser(intent, uiInfo.userHandle) + } + } + val onManagePermissionClick: () -> Unit = { + val intent: Intent = + Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) + .putExtra(Intent.EXTRA_PERMISSION_NAME, permissionGroup) + context.startActivity(intent) + } + + val appPermissionAccessUiInfoList: List<AppPermissionAccessUiInfo> = + uiData.value?.appPermissionAccessUiInfoList ?: emptyList() + + WearPermissionUsageDetailsContent( + title, + subtitle, + isLoading, + hasSystemApps, + showSystem.value, + onShowSystemClick, + appPermissionAccessUiInfoList, + onChipClick, + onManagePermissionClick + ) + + if (isLoading && uiData.value != null) { + isLoading = false + } +} + +@Composable +internal fun WearPermissionUsageDetailsContent( + title: String, + subtitle: String, + isLoading: Boolean, + hasSystemApps: Boolean, + showSystem: Boolean, + onShowSystemClick: (Boolean) -> Unit, + appPermissionAccessUiInfoList: List<AppPermissionAccessUiInfo>, + onChipClick: (AppPermissionAccessUiInfo) -> Unit, + onManagePermissionClick: () -> Unit +) { + ScrollableScreen(title = title, subtitle = subtitle, isLoading = isLoading) { + if (appPermissionAccessUiInfoList.isEmpty()) { + item { Chip(label = stringResource(R.string.no_apps), onClick = {}) } + } else { + for (uiInfo in appPermissionAccessUiInfoList) { + item { + Chip( + label = uiInfo.packageLabel, + labelMaxLines = Int.MAX_VALUE, + secondaryLabel = + DateFormat.getTimeFormat(LocalContext.current) + .format(uiInfo.accessEndTime), + secondaryLabelMaxLines = Int.MAX_VALUE, + icon = uiInfo.badgedPackageIcon, + onClick = { onChipClick(uiInfo) } + ) + } + } + if (hasSystemApps) { + item { + Chip( + label = + if (showSystem) { + stringResource(R.string.menu_hide_system) + } else { + stringResource(R.string.menu_show_system) + }, + labelMaxLines = Int.MAX_VALUE, + onClick = { onShowSystemClick(!showSystem) }, + modifier = Modifier.fillMaxWidth(), + ) + } + } + item { + Chip( + label = stringResource(R.string.manage_permission), + textColor = MaterialTheme.colors.background, + colors = ChipDefaults.primaryChipColors(), + onClick = { onManagePermissionClick() }, + ) + } + } + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt new file mode 100644 index 000000000..f8c305e0f --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permission.ui.wear + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.compose.ui.platform.ComposeView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.android.permissioncontroller.Constants +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel.PermissionUsageViewModelFactory + +/** + * This is a condensed version of + * [com.android.permissioncontroller.permission.ui.handheld.v31.PermissionUsageFragment], tailored + * for Wear. + */ +@RequiresApi(Build.VERSION_CODES.S) +class WearPermissionUsageFragment : Fragment() { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val sessionId: Long = + arguments?.getLong(Constants.EXTRA_SESSION_ID) ?: Constants.INVALID_SESSION_ID + val factory = + PermissionUsageViewModelFactory(requireActivity().getApplication(), this, Bundle()) + val viewModel: PermissionUsageViewModel = + ViewModelProvider(this, factory).get(PermissionUsageViewModel::class.java) + + return ComposeView(requireContext()).apply { + setContent { WearPermissionUsageScreen(sessionId, viewModel) } + } + } + + companion object { + @JvmStatic + fun newInstance(sessionId: Long): WearPermissionUsageFragment { + return WearPermissionUsageFragment().apply { + val arguments = Bundle().apply { putLong(Constants.EXTRA_SESSION_ID, sessionId) } + setArguments(arguments) + } + } + } +} diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt new file mode 100644 index 000000000..f155365d0 --- /dev/null +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permission.ui.wear + +import android.os.Build +import androidx.annotation.RequiresApi +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.livedata.observeAsState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import com.android.permissioncontroller.R +import com.android.permissioncontroller.permission.ui.handheld.v31.PermissionUsageControlPreference +import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageViewModel +import com.android.permissioncontroller.permission.ui.wear.elements.Chip +import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen +import java.text.Collator + +@RequiresApi(Build.VERSION_CODES.S) +@Composable +fun WearPermissionUsageScreen(sessionId: Long, viewModel: PermissionUsageViewModel) { + val context = LocalContext.current + val permissionUsagesUiData = viewModel.permissionUsagesUiLiveData.observeAsState(null) + val showSystem = viewModel.showSystemAppsLiveData.observeAsState(false) + val show7Days = viewModel.show7DaysLiveData.observeAsState(false) + var isLoading by remember { mutableStateOf(true) } + + val hasSystemApps: Boolean = permissionUsagesUiData.value?.containsSystemAppUsages ?: false + val onShowSystemClick: (Boolean) -> Unit = { show -> run { viewModel.updateShowSystem(show) } } + + val permissionGroupWithUsageCounts: Map<String, Int> = + permissionUsagesUiData.value?.permissionGroupsWithUsageCount ?: emptyMap() + val permissionGroupWithUsageCountsEntries: List<Map.Entry<String, Int>> = + ArrayList<Map.Entry<String, Int>>(permissionGroupWithUsageCounts.entries) + + val collator = Collator.getInstance(context.resources.configuration.locales.get(0)) + val permissionGroupPreferences = + permissionGroupWithUsageCountsEntries + .map { + PermissionUsageControlPreference( + context, + it.key, + it.value, + showSystem.value, + sessionId, + show7Days.value + ) + } + .sortedWith { o1, o2 -> + var result = collator.compare(o1.title.toString(), o2.title.toString()) + if (result == 0) { + result = o1.title.toString().compareTo(o2.title.toString()) + } + result + } + .toList() + + WearPermissionUsageContent( + isLoading, + hasSystemApps, + showSystem.value, + onShowSystemClick, + permissionGroupPreferences + ) + + if (isLoading && permissionUsagesUiData.value != null) { + isLoading = false + } +} + +@Composable +internal fun WearPermissionUsageContent( + isLoading: Boolean, + hasSystemApps: Boolean, + showSystem: Boolean, + onShowSystemClick: (Boolean) -> Unit, + permissionGroupPreferences: List<PermissionUsageControlPreference> +) { + ScrollableScreen( + title = stringResource(R.string.permission_usage_title), + isLoading = isLoading + ) { + if (permissionGroupPreferences.isEmpty()) { + item { Chip(label = stringResource(R.string.no_permissions), onClick = {}) } + } else { + for (preference in permissionGroupPreferences) { + item { + Chip( + label = preference.title.toString(), + labelMaxLines = Int.MAX_VALUE, + secondaryLabel = preference.summary.toString(), + secondaryLabelMaxLines = Int.MAX_VALUE, + icon = preference.icon, + enabled = preference.isEnabled, + onClick = { preference.performClick() } + ) + } + } + if (hasSystemApps) { + item { + Chip( + label = + if (showSystem) { + stringResource(R.string.menu_hide_system) + } else { + stringResource(R.string.menu_show_system) + }, + labelMaxLines = Int.MAX_VALUE, + onClick = { onShowSystemClick(!showSystem) }, + modifier = Modifier.fillMaxWidth(), + ) + } + } + } + } +} diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearPermissionUsageFragmentTest.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearPermissionUsageFragmentTest.kt new file mode 100644 index 000000000..21c080862 --- /dev/null +++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearPermissionUsageFragmentTest.kt @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permissionui.ui.wear + +import android.content.Intent +import android.os.Build +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SdkSuppress +import androidx.test.uiautomator.By +import com.android.compatibility.common.util.SystemUtil.eventually +import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity +import com.android.compatibility.common.util.UiAutomatorUtils2.waitFindObject +import com.android.permissioncontroller.permissionui.PermissionHub2Test +import com.android.permissioncontroller.permissionui.pressHome +import com.android.permissioncontroller.permissionui.wakeUpScreen +import org.junit.After +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +/** Tests for [WearPermissionUsageFragment] */ +@RunWith(AndroidJUnit4::class) +@SdkSuppress(minSdkVersion = Build.VERSION_CODES.S) +class WearPermissionUsageFragmentTest : PermissionHub2Test() { + private val SHOW_SYSTEM_LABEL = "Show system" + private val HIDE_SYSTEM_LABEL = "Hide system" + private val TIMEOUT = 30_000L + + @Before + fun setup() { + assumeTrue(isWear()) + wakeUpScreen() + } + + @Test + fun testShowSystem() { + runWithShellPermissionIdentity { + context.startActivity( + Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE).apply { + addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + ) + } + + eventually { + try { + waitFindObject(By.textContains(SHOW_SYSTEM_LABEL), TIMEOUT).click() + } catch (e: Exception) { + throw e + } + } + + eventually { + try { + waitFindObject(By.textContains(HIDE_SYSTEM_LABEL), TIMEOUT).click() + } catch (e: Exception) { + throw e + } + } + + waitFindObject(By.textContains(SHOW_SYSTEM_LABEL), TIMEOUT) + } + + @After + fun tearDown() { + pressHome() + } +} diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearUtils.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearUtils.kt new file mode 100644 index 000000000..00811a267 --- /dev/null +++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearUtils.kt @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.permissioncontroller.permissionui.ui.wear + +import android.content.pm.PackageManager +import androidx.test.platform.app.InstrumentationRegistry + +fun isWear() = + InstrumentationRegistry.getInstrumentation() + .targetContext + .packageManager + .hasSystemFeature(PackageManager.FEATURE_WATCH) diff --git a/framework-s/java/android/app/role/RoleManager.java b/framework-s/java/android/app/role/RoleManager.java index 7d1323b4e..3cf1e94ba 100644 --- a/framework-s/java/android/app/role/RoleManager.java +++ b/framework-s/java/android/app/role/RoleManager.java @@ -1023,11 +1023,20 @@ public final class RoleManager { @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { if (SdkLevel.isAtLeastV() && Flags.systemServerRoleControllerEnabled()) { int userId = getContextUserIfAppropriate().getIdentifier(); + boolean visible; try { - mService.isApplicationVisibleForRoleAsUser(roleName, packageName, userId); + visible = mService.isApplicationVisibleForRoleAsUser(roleName, packageName, userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } + executor.execute(() -> { + final long token = Binder.clearCallingIdentity(); + try { + callback.accept(visible); + } finally { + Binder.restoreCallingIdentity(token); + } + }); } else { getRoleControllerManager().isApplicationVisibleForRole(roleName, packageName, executor, callback); diff --git a/service/Android.bp b/service/Android.bp index c37cbe3f0..2e4442c15 100644 --- a/service/Android.bp +++ b/service/Android.bp @@ -139,6 +139,10 @@ java_sdk_library { "com.android.role", "com.android.safetycenter", ], + optimize: { + proguard_compatibility: false, // TODO(b/215530220): remove when this is default behavior + proguard_flags_files: ["proguard.flags"], + }, } genrule { diff --git a/service/proguard.flags b/service/proguard.flags new file mode 100644 index 000000000..a504239a1 --- /dev/null +++ b/service/proguard.flags @@ -0,0 +1,4 @@ +# Keep classes that implements RoleBehavior, which are used by reflection. +-keep class * implements com.android.role.controller.model.RoleBehavior { + *; +}
\ No newline at end of file diff --git a/tests/cts/permission/src/android/permission/cts/NearbyDevicesRenouncePermissionTest.java b/tests/cts/permission/src/android/permission/cts/NearbyDevicesRenouncePermissionTest.java index a196cedfd..aeb4d1d28 100644 --- a/tests/cts/permission/src/android/permission/cts/NearbyDevicesRenouncePermissionTest.java +++ b/tests/cts/permission/src/android/permission/cts/NearbyDevicesRenouncePermissionTest.java @@ -40,15 +40,19 @@ import android.content.pm.PackageManager; import android.os.Process; import android.os.SystemClock; import android.platform.test.annotations.AppModeFull; +import android.provider.DeviceConfig; import android.util.ArraySet; import android.util.Base64; import android.util.Log; import androidx.test.InstrumentationRegistry; +import com.android.compatibility.common.util.DeviceConfigStateChangerRule; import com.android.compatibility.common.util.EnableLocationRule; import com.android.compatibility.common.util.SystemUtil; +import com.google.common.util.concurrent.Uninterruptibles; + import org.junit.After; import org.junit.Before; import org.junit.ClassRule; @@ -58,6 +62,8 @@ import org.junit.Test; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; /** * Tests behaviour when performing bluetooth scans with renounced location permission. @@ -73,11 +79,22 @@ public class NearbyDevicesRenouncePermissionTest { public static final EnableBluetoothRule sEnableBluetoothRule = new EnableBluetoothRule(true); @Rule + public DeviceConfigStateChangerRule safetyLabelChangeNotificationsEnabledConfig = + new DeviceConfigStateChangerRule( + mContext, + DeviceConfig.NAMESPACE_BLUETOOTH, + "scan_quota_count", + Integer.toString(1000) + ); + + @Rule public final EnableLocationRule enableLocationRule = new EnableLocationRule(); private AppOpsManager mAppOpsManager; - private int mLocationNoteCount; - private int mScanNoteCount; + + private volatile long mTestStartTimestamp; + private final AtomicInteger mLocationNoteCount = new AtomicInteger(0); + private final AtomicInteger mScanNoteCount = new AtomicInteger(0); private enum Result { UNKNOWN, EXCEPTION, EMPTY, FILTERED, FULL @@ -89,6 +106,13 @@ public class NearbyDevicesRenouncePermissionTest { @Before public void setUp() throws Exception { + // Sleep to guarantee that past noteOp timestamps are less than mTestStartTimestamp + Uninterruptibles.sleepUninterruptibly(2, TimeUnit.MILLISECONDS); + mTestStartTimestamp = System.currentTimeMillis(); + + mLocationNoteCount.set(0); + mScanNoteCount.set(0); + mAppOpsManager = getApplicationContext().getSystemService(AppOpsManager.class); mAppOpsManager.setOnOpNotedCallback(getApplicationContext().getMainExecutor(), new AppOpsManager.OnOpNotedCallback() { @@ -96,10 +120,12 @@ public class NearbyDevicesRenouncePermissionTest { public void onNoted(SyncNotedAppOp op) { switch (op.getOp()) { case OPSTR_FINE_LOCATION: - mLocationNoteCount++; + logNoteOp(op); + mLocationNoteCount.incrementAndGet(); break; case OPSTR_BLUETOOTH_SCAN: - mScanNoteCount++; + logNoteOp(op); + mScanNoteCount.incrementAndGet(); break; default: } @@ -113,10 +139,22 @@ public class NearbyDevicesRenouncePermissionTest { public void onAsyncNoted(AsyncNotedAppOp asyncOp) { switch (asyncOp.getOp()) { case OPSTR_FINE_LOCATION: - mLocationNoteCount++; + logNoteOp(asyncOp); + if (asyncOp.getTime() < mTestStartTimestamp) { + Log.i(TAG, "ignoring asyncOp that originated before test " + + "start"); + return; + } + mLocationNoteCount.incrementAndGet(); break; case OPSTR_BLUETOOTH_SCAN: - mScanNoteCount++; + logNoteOp(asyncOp); + if (asyncOp.getTime() < mTestStartTimestamp) { + Log.i(TAG, "ignoring asyncOp that originated before test " + + "start"); + return; + } + mScanNoteCount.incrementAndGet(); break; default: } @@ -124,26 +162,31 @@ public class NearbyDevicesRenouncePermissionTest { }); } + private void logNoteOp(SyncNotedAppOp op) { + Log.i(TAG, "OnOpNotedCallback::onNoted(op=" + op.getOp() + ")"); + } + + private void logNoteOp(AsyncNotedAppOp asyncOp) { + Log.i(TAG, "OnOpNotedCallback::" + + "onAsyncNoted(op=" + asyncOp.getOp() + + ", testStartTimestamp=" + mTestStartTimestamp + + ", noteOpTimestamp=" + asyncOp.getTime() + ")"); + } + @After public void tearDown() throws Exception { mAppOpsManager.setOnOpNotedCallback(null, null); } - private void clearNoteCounts() { - mLocationNoteCount = 0; - mScanNoteCount = 0; - } - @AppModeFull @Test public void scanWithoutRenouncingNotesBluetoothAndLocation() throws Exception { assumeTrue(supportsBluetoothLe()); - clearNoteCounts(); assertThat(performScan(Scenario.DEFAULT)).isEqualTo(Result.FULL); SystemUtil.eventually(() -> { - assertThat(mLocationNoteCount).isGreaterThan(0); - assertThat(mScanNoteCount).isGreaterThan(0); + assertThat(mLocationNoteCount.get()).isGreaterThan(0); + assertThat(mScanNoteCount.get()).isGreaterThan(0); }); } @@ -152,11 +195,10 @@ public class NearbyDevicesRenouncePermissionTest { public void scanRenouncingLocationNotesBluetoothButNotLocation() throws Exception { assumeTrue(supportsBluetoothLe()); - clearNoteCounts(); assertThat(performScan(Scenario.RENOUNCE)).isEqualTo(Result.FILTERED); SystemUtil.eventually(() -> { - assertThat(mLocationNoteCount).isEqualTo(0); - assertThat(mScanNoteCount).isGreaterThan(0); + assertThat(mLocationNoteCount.get()).isEqualTo(0); + assertThat(mScanNoteCount.get()).isGreaterThan(0); }); } @@ -165,22 +207,20 @@ public class NearbyDevicesRenouncePermissionTest { public void scanRenouncingInMiddleOfChainNotesBluetoothButNotLocation() throws Exception { assumeTrue(supportsBluetoothLe()); - clearNoteCounts(); assertThat(performScan(Scenario.RENOUNCE_MIDDLE)).isEqualTo(Result.FILTERED); SystemUtil.eventually(() -> { - assertThat(mLocationNoteCount).isEqualTo(0); - assertThat(mScanNoteCount).isGreaterThan(0); + assertThat(mLocationNoteCount.get()).isEqualTo(0); + assertThat(mScanNoteCount.get()).isGreaterThan(0); }); } @AppModeFull @Test public void scanRenouncingAtEndOfChainNotesBluetoothButNotLocation() throws Exception { - clearNoteCounts(); assertThat(performScan(Scenario.RENOUNCE_END)).isEqualTo(Result.FILTERED); SystemUtil.eventually(() -> { - assertThat(mLocationNoteCount).isEqualTo(0); - assertThat(mScanNoteCount).isGreaterThan(0); + assertThat(mLocationNoteCount.get()).isEqualTo(0); + assertThat(mScanNoteCount.get()).isGreaterThan(0); }); } diff --git a/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java b/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java index e87dde97b..05aa41d69 100644 --- a/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java +++ b/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java @@ -31,6 +31,8 @@ import android.platform.test.annotations.AppModeFull; import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.compatibility.common.util.SystemUtil; + import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -44,13 +46,14 @@ import java.util.concurrent.TimeUnit; @AppModeFull(reason = "Instant apps cannot access properties of other apps") @RunWith(AndroidJUnit4ClassRunner.class) public class PermissionUpdateListenerTest { + private static final String LOG_TAG = PermissionUpdateListenerTest.class.getSimpleName(); private static final String APK = "/data/local/tmp/cts-permission/" + "CtsAppThatRequestsCalendarContactsBodySensorCustomPermission.apk"; private static final String PACKAGE_NAME = "android.permission.cts.appthatrequestcustompermission"; private static final String PERMISSION_NAME = "android.permission.READ_CONTACTS"; - private static final int TIMEOUT = 30000; + private static final int TIMEOUT = 10000; private final Context mContext = InstrumentationRegistry.getInstrumentation().getContext(); @@ -59,8 +62,12 @@ public class PermissionUpdateListenerTest { private int mTestAppUid; @Before - public void setup() throws PackageManager.NameNotFoundException { - runShellCommandOrThrow("pm install -r " + APK); + public void setup() throws PackageManager.NameNotFoundException, InterruptedException { + runShellCommandOrThrow("pm install " + APK); + // permission change events are generated for a package install, the wait helps prevent + // those permission change events interfere with the test. + SystemUtil.waitForBroadcasts(); + Thread.sleep(1000); mTestAppUid = mPackageManager.getPackageUid(PACKAGE_NAME, 0); } @@ -116,6 +123,8 @@ public class PermissionUpdateListenerTest { TestOnPermissionsChangedListener permissionsChangedListener = new TestOnPermissionsChangedListener(1); runWithShellPermissionIdentity(() -> { + mPackageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME, + mContext.getUser()); mPackageManager.addOnPermissionsChangeListener(permissionsChangedListener); mPackageManager.revokeRuntimePermission(PACKAGE_NAME, PERMISSION_NAME, mContext.getUser()); diff --git a/tests/cts/permissionmultidevice/Android.bp b/tests/cts/permissionmultidevice/Android.bp index 2d2956ff6..61ac6541d 100644 --- a/tests/cts/permissionmultidevice/Android.bp +++ b/tests/cts/permissionmultidevice/Android.bp @@ -34,7 +34,6 @@ android_test { "modules-utils-build_system", "cts-wm-util", "flag-junit", - "CtsVirtualDeviceCommonLib", "android.companion.virtual.flags-aconfig-java", "permission-test-util-lib", "permission-multidevice-test-util-lib", diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index c6e27120a..c37b71cd4 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -17,6 +17,7 @@ package android.permissionmultidevice.cts import android.Manifest +import android.app.ActivityOptions import android.app.Instrumentation import android.content.ComponentName import android.content.Intent @@ -33,7 +34,6 @@ import android.permissionmultidevice.cts.UiAutomatorUtils.waitFindObject import android.platform.test.annotations.RequiresFlagsEnabled import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.view.Display -import android.virtualdevice.cts.common.util.VirtualDeviceTestUtils import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SdkSuppress import androidx.test.platform.app.InstrumentationRegistry @@ -176,7 +176,7 @@ class DeviceAwarePermissionGrantTest { } private fun requestPermissionOnDevice(displayId: Int, targetDeviceId: Int) { - val options = VirtualDeviceTestUtils.createActivityOptions(displayId) + val options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle() val intent = Intent() diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml index d6f24b9ba..5d3096f9f 100644 --- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml +++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml @@ -2285,7 +2285,7 @@ @hide --> <permission android:name="android.permission.SUSPEND_APPS" - android:protectionLevel="signature|role" /> + android:protectionLevel="signature|role|verifier" /> <!-- @SystemApi @hide @@ -7302,6 +7302,13 @@ <permission android:name="android.permission.MODIFY_TOUCH_MODE_STATE" android:protectionLevel="signature" /> + <!-- @SystemApi Allows the holder to launch an Intent Resolver flow with custom presentation + and/or targets. + @FlaggedApi("android.service.chooser.support_nfc_resolver") + @hide --> + <permission android:name="android.permission.SHOW_CUSTOMIZED_RESOLVER" + android:protectionLevel="signature|privileged" /> + <!-- @hide Allows an application to get a People Tile preview for a given shortcut. --> <permission android:name="android.permission.GET_PEOPLE_TILE_PREVIEW" android:protectionLevel="signature|recents" /> @@ -7645,6 +7652,13 @@ <permission android:name="android.permission.RESET_HOTWORD_TRAINING_DATA_EGRESS_COUNT" android:protectionLevel="signature" /> + <!-- @SystemApi Allows an app to track all preparations for a complete factory reset. + <p>Protection level: signature|privileged + @FlaggedApi("android.permission.flags.factory_reset_prep_permission_apis") + @hide --> + <permission android:name="android.permission.PREPARE_FACTORY_RESET" + android:protectionLevel="signature|privileged" /> + <!-- Attribution for Geofencing service. --> <attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/> <!-- Attribution for Country Detector. --> diff --git a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt index fea9b45cc..60c3b4d6a 100644 --- a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt +++ b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt @@ -49,7 +49,7 @@ class SafetyCenterTestConfigs(private val context: Context) { context.packageName, PackageInfoFlags.of(GET_SIGNING_CERTIFICATES.toLong()) ) - .signingInfo + .signingInfo!! .apkContentsSigners[0] .toByteArray() ) |