summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/Android.bp3
-rw-r--r--PermissionController/OWNERS1
-rw-r--r--PermissionController/jarjar-rules.txt1
-rw-r--r--PermissionController/res/values-am/strings.xml3
-rw-r--r--PermissionController/res/values-ar/strings.xml3
-rw-r--r--PermissionController/res/values-bg/strings.xml3
-rw-r--r--PermissionController/res/values-bn/strings.xml3
-rw-r--r--PermissionController/res/values-bs/strings.xml3
-rw-r--r--PermissionController/res/values-cs/strings.xml3
-rw-r--r--PermissionController/res/values-el/strings.xml3
-rw-r--r--PermissionController/res/values-en-rAU/strings.xml3
-rw-r--r--PermissionController/res/values-en-rCA/strings.xml2
-rw-r--r--PermissionController/res/values-en-rGB/strings.xml3
-rw-r--r--PermissionController/res/values-en-rIN/strings.xml3
-rw-r--r--PermissionController/res/values-es-rUS/strings.xml3
-rw-r--r--PermissionController/res/values-et/strings.xml3
-rw-r--r--PermissionController/res/values-fr/strings.xml3
-rw-r--r--PermissionController/res/values-gl/strings.xml3
-rw-r--r--PermissionController/res/values-hi/strings.xml2
-rw-r--r--PermissionController/res/values-hr/strings.xml3
-rw-r--r--PermissionController/res/values-hy/strings.xml3
-rw-r--r--PermissionController/res/values-in/strings.xml3
-rw-r--r--PermissionController/res/values-is/strings.xml2
-rw-r--r--PermissionController/res/values-it/strings.xml3
-rw-r--r--PermissionController/res/values-ja/strings.xml3
-rw-r--r--PermissionController/res/values-ka/strings.xml3
-rw-r--r--PermissionController/res/values-kk/strings.xml3
-rw-r--r--PermissionController/res/values-km/strings.xml3
-rw-r--r--PermissionController/res/values-ko/strings.xml3
-rw-r--r--PermissionController/res/values-ky/strings.xml3
-rw-r--r--PermissionController/res/values-lo/strings.xml3
-rw-r--r--PermissionController/res/values-lv/strings.xml3
-rw-r--r--PermissionController/res/values-ml/strings.xml2
-rw-r--r--PermissionController/res/values-ms/strings.xml3
-rw-r--r--PermissionController/res/values-nb/strings.xml3
-rw-r--r--PermissionController/res/values-ne/strings.xml3
-rw-r--r--PermissionController/res/values-or/strings.xml3
-rw-r--r--PermissionController/res/values-pt-rPT/strings.xml3
-rw-r--r--PermissionController/res/values-ro/strings.xml3
-rw-r--r--PermissionController/res/values-sk/strings.xml3
-rw-r--r--PermissionController/res/values-sv/strings.xml3
-rw-r--r--PermissionController/res/values-ta/strings.xml3
-rw-r--r--PermissionController/res/values-tl/strings.xml3
-rw-r--r--PermissionController/res/values-tr/strings.xml3
-rw-r--r--PermissionController/res/values-uk/strings.xml3
-rw-r--r--PermissionController/res/values-ur/strings.xml3
-rw-r--r--PermissionController/res/values-zh-rCN/strings.xml3
-rw-r--r--PermissionController/res/values-zu/strings.xml3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/AppPermissionViewModel.kt20
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt21
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java90
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt97
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt161
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageFragment.kt65
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt135
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearPermissionUsageFragmentTest.kt84
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/wear/WearUtils.kt26
-rw-r--r--framework-s/java/android/app/role/RoleManager.java11
-rw-r--r--service/Android.bp4
-rw-r--r--service/proguard.flags4
-rw-r--r--tests/cts/permission/src/android/permission/cts/NearbyDevicesRenouncePermissionTest.java86
-rw-r--r--tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java15
-rw-r--r--tests/cts/permissionmultidevice/Android.bp1
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt4
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml16
-rw-r--r--tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt2
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 &amp; 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()
)