summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/res/values-bg/strings.xml2
-rw-r--r--PermissionController/res/values-ca/strings.xml2
-rw-r--r--PermissionController/res/values-hr/strings.xml8
-rw-r--r--PermissionController/res/values-ja/strings.xml2
-rw-r--r--PermissionController/res/values-ms/strings.xml4
-rw-r--r--PermissionController/res/values-ru/strings.xml4
-rw-r--r--PermissionController/res/values-zh-rHK/strings.xml2
-rw-r--r--PermissionController/res/xml/roles.xml43
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/Role.java2
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java6
-rw-r--r--SafetyCenter/Resources/res/values-de-v34/strings.xml2
-rw-r--r--framework-s/api/system-current.txt1
-rw-r--r--framework-s/java/android/app/ecm/EnhancedConfirmationManager.java9
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml25
-rw-r--r--tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml10
-rw-r--r--tests/cts/permissionui/AndroidTest.xml1
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt44
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt165
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/NotificationPermissionTest.kt11
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt36
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTapjackingTest.kt10
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTest.kt20
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt38
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionTest29.kt9
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionTest30.kt3
25 files changed, 317 insertions, 142 deletions
diff --git a/PermissionController/res/values-bg/strings.xml b/PermissionController/res/values-bg/strings.xml
index 9bd171db2..aad55e46f 100644
--- a/PermissionController/res/values-bg/strings.xml
+++ b/PermissionController/res/values-bg/strings.xml
@@ -676,7 +676,7 @@
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"От съображения за сигурност понастоящем тази настройка не е налице."</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"На приложението бе отказан достъп до <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Приложението поиска разрешение за достъп до поверителни данни, което може да изложи на риск личната или финансовата ви информация.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Възможно е приложението да не работи правилно без това ограничено разрешение. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Научете как да разрешите достъпа&lt;/a&gt;"</string>
- <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"На приложението бе забранено да изпълнява функциите на основно <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
+ <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Приложението не получи разрешение да бъде по подразбиране: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Приложението поиска разрешения за достъп до поверителни данни, които може да изложат на риск личната или финансовата ви информация.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Възможно е приложението да не работи правилно без тези ограничени разрешения. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Научете как да разрешите достъпа&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"На приложението бе отказан достъп"</string>
<string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"Достъпът до това разрешение може да изложи на риск личната и финансовата ви информация.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Възможно е приложението да не работи правилно без това ограничено разрешение. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Научете как да разрешите достъпа&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-ca/strings.xml b/PermissionController/res/values-ca/strings.xml
index 1de8e07e6..c0bd6cb8a 100644
--- a/PermissionController/res/values-ca/strings.xml
+++ b/PermissionController/res/values-ca/strings.xml
@@ -679,7 +679,7 @@
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"A l\'aplicació se li ha denegat l\'accés per ser <xliff:g id="ROLE_NAME">%1$s</xliff:g> de manera predeterminada"</string>
<string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"L\'aplicació ha demanat accés a permisos sensibles, els quals poden posar en risc la teva informació personal o financera.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>És possible que l\'aplicació no funcioni correctament sense aquests permisos restringits. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Més informació sobre com pots permetre l\'accés&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"A l\'aplicació se li ha denegat l\'accés"</string>
- <string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"L\'accés a aquest permís pot posar en risc la teva informació personal i financera.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>És possible que l\'aplicació no funcioni correctament sense aquest permís. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Més informació sobre com pots permetre l\'accés&lt;/a&gt;"</string>
+ <string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"L\'accés a aquest permís pot posar en risc la teva informació personal i financera.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>És possible que l\'aplicació no funcioni correctament sense aquest permís restringit. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Més informació sobre com pots permetre l\'accés&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_learn_more" msgid="5226619861379095709">"Més informació"</string>
<string name="enhanced_confirmation_dialog_ok" msgid="8560373821598619924">"D\'acord"</string>
<string name="permission_grant_dialog_streaming_blocked_title" msgid="8905241017017043649">"S\'ha suprimit la sol·licitud de permís"</string>
diff --git a/PermissionController/res/values-hr/strings.xml b/PermissionController/res/values-hr/strings.xml
index 55cfcfa78..c0b9d935e 100644
--- a/PermissionController/res/values-hr/strings.xml
+++ b/PermissionController/res/values-hr/strings.xml
@@ -675,11 +675,11 @@
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ograničena postavka"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Radi vaše sigurnosti ova postavka trenutačno nije dostupna."</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaciji je odbijen pristup dopuštenju <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
- <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zatražila pristup dopuštenju za osjetljive podatke koje može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog ograničenog dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
- <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji je uskraćeno da prema zadanim postavkama bude <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
- <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Aplikacija je zatražila pristup dopuštenjima za osjetljive podatke koja mogu ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tih ograničenih dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
+ <string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zatražila pristup dopuštenju za osjetljive podatke koje može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog uskraćenog dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
+ <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji je uskraćeno da bude zadana <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
+ <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Aplikacija je zatražila pristup dopuštenjima za osjetljive podatke čime može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tih ograničenih dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"Aplikaciji je odbijen pristup"</string>
- <string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"Pristup tom dopuštenju može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog ograničenog dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
+ <string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"Pristup tom dopuštenju može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_learn_more" msgid="5226619861379095709">"Saznajte više"</string>
<string name="enhanced_confirmation_dialog_ok" msgid="8560373821598619924">"U redu"</string>
<string name="permission_grant_dialog_streaming_blocked_title" msgid="8905241017017043649">"Upit za dopuštenje je spriječen"</string>
diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml
index e7322b07b..d706f9174 100644
--- a/PermissionController/res/values-ja/strings.xml
+++ b/PermissionController/res/values-ja/strings.xml
@@ -185,7 +185,7 @@
<string name="app_permission_usage_summary" msgid="390383661936709672">"アクセス: <xliff:g id="NUM">%1$s</xliff:g> 回。合計時間: <xliff:g id="DURATION">%2$s</xliff:g>。最終使用: <xliff:g id="TIME">%3$s</xliff:g>前。"</string>
<string name="app_permission_usage_summary_no_duration" msgid="3698475875179457400">"アクセス: <xliff:g id="NUM">%1$s</xliff:g> 回。最終使用: <xliff:g id="TIME">%2$s</xliff:g>前。"</string>
<string name="app_permission_button_allow" msgid="5808039516494774647">"許可する"</string>
- <string name="app_permission_button_allow_all_files" msgid="1792232272599018825">"すべてのファイルの管理を許可"</string>
+ <string name="app_permission_button_allow_all_files" msgid="1792232272599018825">"すべての管理を許可"</string>
<string name="app_permission_button_allow_media_only" msgid="2834282724426046154">"アクセスのみ許可"</string>
<string name="app_permission_button_allow_always" msgid="4573292371734011171">"常に許可"</string>
<string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"アプリの使用中のみ許可"</string>
diff --git a/PermissionController/res/values-ms/strings.xml b/PermissionController/res/values-ms/strings.xml
index 6b65594b4..39bf0b7b3 100644
--- a/PermissionController/res/values-ms/strings.xml
+++ b/PermissionController/res/values-ms/strings.xml
@@ -676,8 +676,8 @@
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Untuk keselamatan anda, tetapan ini tidak tersedia pada masa ini."</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Akses apl kepada <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> telah ditolak"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Apl meminta akses kepada kebenaran sensitif yang boleh mengakibatkan risiko terhadap maklumat peribadi dan kewangan anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ketahui cara membenarkan akses&lt;/a&gt;"</string>
- <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Akses apl untuk menjadi <xliff:g id="ROLE_NAME">%1$s</xliff:g> secara lalai telah ditolak"</string>
- <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Apl meminta akses kepada kebenaran sensitif yang boleh mengakibatkan risiko terhadap maklumat peribadi dan kewangan anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ketahui cara membenarkan akses&lt;/a&gt;"</string>
+ <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Akses apl untuk menjadi <xliff:g id="ROLE_NAME">%1$s</xliff:g> lalai telah ditolak"</string>
+ <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Apl meminta akses kepada kebenaran sensitif yang boleh mengakibatkan risiko terhadap maklumat peribadi dan kewangan anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Apl mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ketahui cara membenarkan akses&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"Akses apl telah ditolak"</string>
<string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"Akses kepada kebenaran ini boleh mengakibatkan risiko terhadap maklumat peribadi dan kewangan anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ketahui cara membenarkan akses&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_learn_more" msgid="5226619861379095709">"Ketahui lebih lanjut"</string>
diff --git a/PermissionController/res/values-ru/strings.xml b/PermissionController/res/values-ru/strings.xml
index a96a76df3..07ad9f710 100644
--- a/PermissionController/res/values-ru/strings.xml
+++ b/PermissionController/res/values-ru/strings.xml
@@ -676,8 +676,8 @@
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"В целях безопасности эти настройки пока недоступны."</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Для приложения заблокировано разрешение \"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>\""</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Приложение запрашивает разрешение на доступ к конфиденциальной информации. Если вы предоставите его, ваши личные и финансовые данные могут оказаться под угрозой.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без такого разрешения приложение может работать неправильно. Узнайте, &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;как предоставить доступ к данным&lt;/a&gt;."</string>
- <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Запрещено использовать приложение в качестве стандартного в категории \"<xliff:g id="ROLE_NAME">%1$s</xliff:g>\""</string>
- <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Приложение запрашивает разрешения на доступ к конфиденциальной информации. Если вы предоставите их, ваши личные и финансовые данные могут оказаться под угрозой.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без таких разрешений приложение может работать неправильно. Узнайте, &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;как предоставить доступ к данным&lt;/a&gt;."</string>
+ <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Запрос на использование в качестве приложения по умолчанию (<xliff:g id="ROLE_NAME">%1$s</xliff:g>) отклонен"</string>
+ <string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"Приложение запросило разрешения на доступ к конфиденциальной информации. Такие разрешения могут поставить ваши личные и финансовые данные под угрозу.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без них приложение может работать неправильно. Узнайте, &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;как предоставить доступ к данным&lt;/a&gt;."</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"Доступ запрещен"</string>
<string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"Если вы предоставите это разрешение, ваши личные и финансовые данные могут оказаться под угрозой.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без него приложение может работать неправильно. Узнайте, &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;как предоставить доступ к данным&lt;/a&gt;."</string>
<string name="enhanced_confirmation_dialog_learn_more" msgid="5226619861379095709">"Подробнее"</string>
diff --git a/PermissionController/res/values-zh-rHK/strings.xml b/PermissionController/res/values-zh-rHK/strings.xml
index 07a401ab3..c195fd722 100644
--- a/PermissionController/res/values-zh-rHK/strings.xml
+++ b/PermissionController/res/values-zh-rHK/strings.xml
@@ -676,7 +676,7 @@
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"為安全起見,系統目前不提供此設定。"</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"系統已拒絕授予應用程式「<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>」存取權"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"應用程式要求存取敏感資料權限,授予此權限可能會危害你的個人和財務資料。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;進一步瞭解如何授予存取權&lt;/a&gt;"</string>
- <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"系統已拒絕授予應用程式預設<xliff:g id="ROLE_NAME">%1$s</xliff:g>存取權"</string>
+ <string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"系統已拒絕授予應用程式作為預設<xliff:g id="ROLE_NAME">%1$s</xliff:g>的存取權"</string>
<string name="enhanced_confirmation_dialog_desc_role" msgid="6369601947905234551">"應用程式要求存取敏感資料權限,授予此權限可能會危害你的個人和財務資料。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;進一步瞭解如何授予存取權&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_settings_default" msgid="1858092969721041576">"系統已拒絕授予應用程式存取權"</string>
<string name="enhanced_confirmation_dialog_desc_settings_default" msgid="6911632348359332981">"授予此權限可能會危害你的個人和財務資料。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;進一步瞭解如何授予存取權&lt;/a&gt;"</string>
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml
index 0f1d8fdd0..3d858a9c5 100644
--- a/PermissionController/res/xml/roles.xml
+++ b/PermissionController/res/xml/roles.xml
@@ -855,7 +855,8 @@
~ In addition, packages MUST NOT:
~ - Request INTERNET permission. Instead packages MUST access the internet through
~ well-defined APIs in an open source project.
- ~ - Perform direct binds to other applications, except the following system packages:
+ ~ - Perform direct binds to other applications, except the following system packages or
+ ~ other preloaded packages conforming with the requirements here:
~ - Bluetooth
~ - Contacts
~ - Media
@@ -1488,6 +1489,8 @@
<permission name="android.permission.MANAGE_DEVICE_POLICY_DISPLAY" minSdkVersion="35" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_LOCALE" minSdkVersion="35" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_SMS" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_APP_FUNCTIONS"
+ featureFlag="android.app.appfunctions.flags.Flags.enableAppFunctionManager" />
<permission name="android.permission.COPY_ACCOUNTS"
featureFlag="android.app.admin.flags.Flags.splitCreateManagedProfileEnabled" />
<permission name="android.permission.REMOVE_ACCOUNTS"
@@ -1885,4 +1888,42 @@
showNone="true"
visible="true"/>
+ <!---
+ ~ A role for the vendor package that provides privacy-preserving intelligent processor for
+ ~ vendor specific features.
+ ~
+ ~ A package holding this role MUST comply with requirements outlined in the Android CDD
+ ~ section "9.8.6 Content Capture".
+ ~ Example link for Android 15:
+ ~ https://source.android.com/docs/compatibility/15/android-15-cdd#986_os-level_and_ambient_data
+ ~
+ ~ In addition, packages MUST NOT:
+ ~ - Request INTERNET permission. Instead packages MUST access the internet through
+ ~ well-defined APIs in an open source project.
+ ~ - Perform direct binds to other applications, except the following system packages or
+ ~ other preloaded packages conforming with the requirements here:
+ ~ - Bluetooth
+ ~ - Contacts
+ ~ - Media
+ ~ - Telephony
+ ~ - System UI
+ ~ - Component providing internet APIs (see above)
+ ~ To achieve this packages MUST set up explicit <allow-association> configuration in the
+ ~ system config.
+ -->
+ <role
+ name="android.app.role.SYSTEM_VENDOR_INTELLIGENCE"
+ defaultHolders="config_systemVendorIntelligence"
+ exclusive="true"
+ exclusivity="user"
+ featureFlag="android.permission.flags.Flags.systemVendorIntelligenceRoleEnabled"
+ static="true"
+ systemOnly="true"
+ visible="false">
+ <permissions>
+ <permission name="android.permission.READ_GLOBAL_APP_SEARCH_DATA" />
+ <permission name="android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED"
+ featureFlag="android.app.appfunctions.flags.Flags.enableAppFunctionManager" />
+ </permissions>
+ </role>
</roles>
diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/Role.java b/PermissionController/role-controller/java/com/android/role/controller/model/Role.java
index c551c37dc..e2af00982 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/model/Role.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/model/Role.java
@@ -115,7 +115,7 @@ public class Role {
sExclusivityValues.put(EXCLUSIVITY_NONE, true);
sExclusivityValues.put(EXCLUSIVITY_USER, true);
sExclusivityValues.put(EXCLUSIVITY_PROFILE_GROUP,
- RoleFlags.isProfileGroupExclusivityAvailable());
+ RoleFlags.isProfileGroupExclusivityAvailable());
}
/**
diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java b/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java
index 061f351de..4b05554e3 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java
@@ -580,6 +580,12 @@ public class RoleParser {
skipCurrentTag(parser);
continue;
}
+ if (exclusivity == Role.EXCLUSIVITY_PROFILE_GROUP) {
+ throwOrLogMessage("<preferred-activities> is not supported for a"
+ + " profile-group-exclusive role: " + name);
+ skipCurrentTag(parser);
+ continue;
+ }
preferredActivities = parsePreferredActivities(parser);
break;
default:
diff --git a/SafetyCenter/Resources/res/values-de-v34/strings.xml b/SafetyCenter/Resources/res/values-de-v34/strings.xml
index 4289c14a0..8f75bdfbb 100644
--- a/SafetyCenter/Resources/res/values-de-v34/strings.xml
+++ b/SafetyCenter/Resources/res/values-de-v34/strings.xml
@@ -25,7 +25,7 @@
<string name="app_data_sharing_updates_title" msgid="7428862330643262588">"Änderungen bei der Weitergabe von Standortdaten"</string>
<string name="app_data_sharing_updates_search_terms" msgid="8414777373734245398">"Daten, Datenweitergabe, Aktualisierungen der Datenweitergabe, Aktualisierungen der Weitergabe von Standortdaten, Weitergabe"</string>
<string name="advanced_title" msgid="6259362998269627310">"Weitere Einstellungen"</string>
- <string name="more_settings_title" msgid="9033454654010697185">"Mehr Sicherheit und Datenschutz"</string>
+ <string name="more_settings_title" msgid="9033454654010697185">"Mehr Sicherheit &amp; Datenschutz"</string>
<string name="more_settings_summary" msgid="7086620830002515710">"Autofill, Benachrichtigungen und mehr"</string>
<string name="more_settings_search_terms" msgid="1371913937610933955"></string>
<string name="work_policy_title" msgid="915692932391542104">"Informationen zu den Arbeitsrichtlinien"</string>
diff --git a/framework-s/api/system-current.txt b/framework-s/api/system-current.txt
index 71c4f917c..efab125bd 100644
--- a/framework-s/api/system-current.txt
+++ b/framework-s/api/system-current.txt
@@ -8,6 +8,7 @@ package android.app.ecm {
method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isRestricted(@NonNull String, @NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
method @FlaggedApi("android.permission.flags.enhanced_confirmation_in_call_apis_enabled") @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isUnknownCallOngoing();
method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public void setClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ field @FlaggedApi("android.permission.flags.enhanced_confirmation_in_call_apis_enabled") public static final String ACTION_SHOW_ECM_PHONE_STATE_BLOCKED_SETTING_DIALOG = "android.app.ecm.action.SHOW_ECM_PHONE_STATE_BLOCKED_SETTING_DIALOG";
field public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG";
}
diff --git a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java
index 8eaa9354d..e497ba5f4 100644
--- a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java
+++ b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java
@@ -199,6 +199,15 @@ public final class EnhancedConfirmationManager {
public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG =
"android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG";
+ /**
+ * Shows a dialog indicating a setting has been blocked due to the phone state (such as being
+ * on a call with an unknown number). Opened when a setting is blocked.
+ */
+ @SdkConstant(BROADCAST_INTENT_ACTION)
+ @FlaggedApi(Flags.FLAG_ENHANCED_CONFIRMATION_IN_CALL_APIS_ENABLED)
+ public static final String ACTION_SHOW_ECM_PHONE_STATE_BLOCKED_SETTING_DIALOG =
+ "android.app.ecm.action.SHOW_ECM_PHONE_STATE_BLOCKED_SETTING_DIALOG";
+
/** A map of ECM states to their corresponding app op states */
@Retention(java.lang.annotation.RetentionPolicy.SOURCE)
@IntDef(prefix = {"ECM_STATE_"}, value = {EcmState.ECM_STATE_NOT_GUARDED,
diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
index 1e92e51d5..e6f53a028 100644
--- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
@@ -3921,6 +3921,14 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_CONTENT_PROTECTION"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to manage policy related to executing app functions.
+ <p>Protection level: internal|role
+ @FlaggedApi(android.app.appfunctions.flags.Flags.FLAG_ENABLE_APP_FUNCTION_MANAGER)
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_APP_FUNCTIONS"
+ android:protectionLevel="internal|role"
+ android:featureFlag="android.app.appfunctions.flags.enable_app_function_manager" />
+
<!-- Allows an application to set policy related to subscriptions downloaded by an admin.
<p>{@link Manifest.permission#MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL} is required to call
APIs protected by this permission on users different to the calling user.
@@ -4212,6 +4220,16 @@
android:protectionLevel="signature|privileged|vendorPrivileged"
android:featureFlag="android.media.tv.flags.media_quality_fw"/>
+ <!--
+ @FlaggedApi(android.media.tv.flags.Flags.FLAG_MEDIA_QUALITY_FW)
+ Allows an application to read the aggregated color zones on the screen for use cases like
+ TV ambient backlight usages.
+ <p> Protection level: normal
+ -->
+ <permission android:name="android.permission.READ_COLOR_ZONES"
+ android:protectionLevel="normal"
+ android:featureFlag="android.media.tv.flags.media_quality_fw"/>
+
<!-- ================================== -->
<!-- Permissions affecting the display of other applications -->
<!-- ================================== -->
@@ -6837,6 +6855,13 @@
<permission android:name="android.permission.MANAGE_SUBSCRIPTION_PLANS"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi @hide Allows for reading subscription plan fields for status and end date.
+ @FlaggedApi(com.android.internal.telephony.flags.Flags.FLAG_SUBSCRIPTION_PLAN_ALLOW_STATUS_AND_END_DATE)
+ -->
+ <permission android:name="android.permission.READ_SUBSCRIPTION_PLANS"
+ android:protectionLevel="signature|privileged"
+ android:featureFlag="com.android.internal.telephony.flags.subscription_plan_allow_status_and_end_date" />
+
<!-- C2DM permission.
@hide Used internally.
-->
diff --git a/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml b/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
index e123f13ce..6fa33c123 100644
--- a/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
@@ -186,6 +186,12 @@
android:protectionLevel="signature|privileged"
android:label="@string/car_permission_label_control_car_exterior_lights"
android:description="@string/car_permission_desc_control_car_exterior_lights"/>
+ <permission android:name="android.car.permission.READ_CAR_EXTERIOR_LIGHTS"
+ android:permissionGroup="android.car.permission-group.CAR_MONITORING"
+ android:protectionLevel="dangerous"
+ android:label="@string/car_permission_label_read_car_exterior_lights"
+ android:description="@string/car_permission_desc_car_read_exterior_lights"
+ android:featureFlag="android.car.feature.android_b_vehicle_properties" />
<permission android:name="android.car.permission.READ_CAR_INTERIOR_LIGHTS"
android:protectionLevel="signature|privileged"
android:label="@string/car_permission_label_car_interior_lights"
@@ -625,11 +631,11 @@
android:protectionLevel="signature"
android:label="@string/car_permission_label_record_vehicle_properties"
android:description="@string/car_permission_desc_record_vehicle_properties"
- android:featureFlag="android.car.feature.car_power_cancel_shell_command" />
+ android:featureFlag="android.car.feature.car_property_simulation" />
<permission
android:name="android.car.permission.INJECT_VEHICLE_PROPERTIES"
android:protectionLevel="signature"
android:label="@string/car_permission_label_inject_vehicle_properties"
android:description="@string/car_permission_desc_inject_vehicle_properties"
- android:featureFlag="android.car.feature.car_power_cancel_shell_command" />
+ android:featureFlag="android.car.feature.car_property_simulation" />
</manifest>
diff --git a/tests/cts/permissionui/AndroidTest.xml b/tests/cts/permissionui/AndroidTest.xml
index b73606f67..d5d8a27cf 100644
--- a/tests/cts/permissionui/AndroidTest.xml
+++ b/tests/cts/permissionui/AndroidTest.xml
@@ -25,6 +25,7 @@
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="secondary_user" />
+ <option name="config-descriptor:metadata" key="parameter" value="secondary_user_on_secondary_display" />
<option name="config-descriptor:metadata" key="parameter" value="run_on_sdk_sandbox" />
<option name="config-descriptor:metadata" key="mainline-param" value="com.google.android.permission.apex" />
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
index 4af5d56c6..d8eb153bf 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
@@ -42,10 +42,12 @@ import android.provider.DeviceConfig
import android.provider.Settings
import android.text.Html
import android.util.Log
+import android.view.KeyEvent
import androidx.test.core.app.ActivityScenario
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.BySelector
+import androidx.test.uiautomator.Direction
import androidx.test.uiautomator.StaleObjectException
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiObject2
@@ -58,6 +60,7 @@ import com.android.compatibility.common.util.SystemUtil.runShellCommand
import com.android.compatibility.common.util.SystemUtil.runShellCommandOrThrow
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.compatibility.common.util.UiAutomatorUtils2
+import com.android.compatibility.common.util.UserHelper
import com.android.modules.utils.build.SdkLevel
import com.google.common.truth.Truth.assertThat
import java.io.File
@@ -117,6 +120,13 @@ abstract class BasePermissionTest {
packageManager.hasSystemFeature(
/* PackageManager.FEATURE_CAR_SPLITSCREEN_MULTITASKING */
"android.software.car.splitscreen_multitasking")
+ @JvmStatic
+ private val isAutomotiveVisibleBackgroundUser = isAutomotive &&
+ UserHelper(context).isVisibleBackgroundUser()
+
+ // TODO(b/382327037):find a way to avoid specifying the display ID for each UiSelector.
+ @JvmStatic
+ protected val displayId = UserHelper().mainDisplayId
}
@get:Rule val screenRecordRule = ScreenRecordRule(false, false)
@@ -160,7 +170,7 @@ abstract class BasePermissionTest {
uiDevice.wakeUp()
runShellCommand(instrumentation, "wm dismiss-keyguard")
- uiDevice.findObject(By.text("Close"))?.click()
+ uiDevice.findObject(By.text("Close").displayId(displayId))?.click()
}
@Before
@@ -256,6 +266,7 @@ abstract class BasePermissionTest {
regex = regex.dropLast(1)
}
return By.text(Pattern.compile(regex, Pattern.CASE_INSENSITIVE or Pattern.UNICODE_CASE))
+ .displayId(displayId)
}
protected open fun installPackage(
@@ -400,32 +411,35 @@ abstract class BasePermissionTest {
}
private fun scrollToText(text: String, maxSearchSwipes: Int = MAX_SWIPES): UiObject2 {
- val scrollable =
- UiScrollable(UiSelector().scrollable(true)).apply {
- this.maxSearchSwipes = maxSearchSwipes
- }
-
- scrollable.scrollTextIntoView(text)
-
- val foundObject =
- uiDevice.findObject(
- By.text(text).pkg(context.packageManager.permissionControllerPackageName)
+ var foundObject: UiObject2?
+ if (isAutomotiveVisibleBackgroundUser) {
+ val scrollableObject = uiDevice.findObject(By.scrollable(true).displayId(displayId))
+ foundObject =
+ scrollableObject.scrollUntil(Direction.DOWN, Until.findObject(By.text(text)))
+ } else {
+ val scrollable =
+ UiScrollable(UiSelector().scrollable(true)).apply {
+ this.maxSearchSwipes = maxSearchSwipes
+ }
+ scrollable.scrollTextIntoView(text)
+ foundObject = uiDevice.findObject(
+ By.text(text).pkg(context.packageManager.permissionControllerPackageName)
)
+ }
Assert.assertNotNull("View not found after scrolling", foundObject)
-
return foundObject
}
protected fun pressBack() {
- uiDevice.pressBack()
+ runShellCommandOrThrow("input -d $displayId keyevent ${KeyEvent.KEYCODE_BACK}")
}
protected fun pressHome() {
- uiDevice.pressHome()
+ runShellCommandOrThrow("input -d $displayId keyevent ${KeyEvent.KEYCODE_HOME}")
}
protected fun pressDPadDown() {
- uiDevice.pressDPadDown()
+ runShellCommandOrThrow("input -d $displayId keyevent ${KeyEvent.KEYCODE_DPAD_DOWN}")
waitForIdle()
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
index 2332ff0c7..92599b617 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
@@ -387,12 +387,13 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
uiDevice.wait(
Until.hasObject(
By.textStartsWith("This app was built for an older version of Android")
+ .displayId(displayId)
),
timeoutMillis
)
if (targetSdkWarningVisible) {
try {
- uiDevice.findObject(By.res("android:id/button1")).click()
+ uiDevice.findObject(By.res("android:id/button1").displayId(displayId)).click()
} catch (e: StaleObjectException) {
// Click sometimes fails with StaleObjectException (b/280430717).
e.printStackTrace()
@@ -413,12 +414,13 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun clickPermissionReviewContinue() {
if (isAutomotive || isWatch) {
clickAndWaitForWindowTransition(
- By.text(getPermissionControllerString("review_button_continue")),
+ By.text(getPermissionControllerString("review_button_continue"))
+ .displayId(displayId),
TIMEOUT_MILLIS * 2
)
} else {
clickAndWaitForWindowTransition(
- By.res("com.android.permissioncontroller:id/continue_button")
+ By.res("com.android.permissioncontroller:id/continue_button").displayId(displayId)
)
}
}
@@ -545,30 +547,32 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun assertPermissionRationaleActivityTitleIsVisible(expected: Boolean) {
- findView(By.res(PERMISSION_RATIONALE_ACTIVITY_TITLE_VIEW), expected = expected)
+ findView(By.res(PERMISSION_RATIONALE_ACTIVITY_TITLE_VIEW).displayId(displayId),
+ expected = expected)
}
protected fun assertPermissionRationaleActivityDataSharingSourceSectionVisible(
expected: Boolean
) {
- findView(By.res(DATA_SHARING_SOURCE_TITLE_ID), expected = expected)
- findView(By.res(DATA_SHARING_SOURCE_MESSAGE_ID), expected = expected)
+ findView(By.res(DATA_SHARING_SOURCE_TITLE_ID).displayId(displayId), expected = expected)
+ findView(By.res(DATA_SHARING_SOURCE_MESSAGE_ID).displayId(displayId), expected = expected)
}
protected fun assertPermissionRationaleActivityPurposeSectionVisible(expected: Boolean) {
- findView(By.res(PURPOSE_TITLE_ID), expected = expected)
- findView(By.res(PURPOSE_MESSAGE_ID), expected = expected)
+ findView(By.res(PURPOSE_TITLE_ID).displayId(displayId), expected = expected)
+ findView(By.res(PURPOSE_MESSAGE_ID).displayId(displayId), expected = expected)
}
protected fun assertPermissionRationaleActivityLearnMoreSectionVisible(expected: Boolean) {
- findView(By.res(LEARN_MORE_TITLE_ID), expected = expected)
- findView(By.res(LEARN_MORE_MESSAGE_ID), expected = expected)
+ findView(By.res(LEARN_MORE_TITLE_ID).displayId(displayId), expected = expected)
+ findView(By.res(LEARN_MORE_MESSAGE_ID).displayId(displayId), expected = expected)
}
protected fun assertPermissionRationaleActivitySettingsSectionVisible(expected: Boolean) {
- findView(By.res(PERMISSION_RATIONALE_SETTINGS_SECTION), expected = expected)
- findView(By.res(SETTINGS_TITLE_ID), expected = expected)
- findView(By.res(SETTINGS_MESSAGE_ID), expected = expected)
+ findView(By.res(PERMISSION_RATIONALE_SETTINGS_SECTION).displayId(displayId),
+ expected = expected)
+ findView(By.res(SETTINGS_TITLE_ID).displayId(displayId), expected = expected)
+ findView(By.res(SETTINGS_MESSAGE_ID).displayId(displayId), expected = expected)
}
protected fun assertPermissionRationaleDialogIsVisible(
@@ -585,17 +589,18 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun assertPermissionRationaleContainerOnGrantDialogIsVisible(expected: Boolean) {
- findView(By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW), expected = expected)
+ findView(By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId),
+ expected = expected)
}
protected fun clickPermissionReviewCancel() {
if (isAutomotive || isWatch) {
clickAndWaitForWindowTransition(
- By.text(getPermissionControllerString("review_button_cancel"))
+ By.text(getPermissionControllerString("review_button_cancel")).displayId(displayId)
)
} else {
clickAndWaitForWindowTransition(
- By.res("com.android.permissioncontroller:id/cancel_button")
+ By.res("com.android.permissioncontroller:id/cancel_button").displayId(displayId)
)
}
}
@@ -789,22 +794,24 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun findPermissionRequestAllowButton(timeoutMillis: Long = 20000) {
if (isAutomotive || isWatch) {
- waitFindObject(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)), timeoutMillis)
+ waitFindObject(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT))
+ .displayId(displayId), timeoutMillis)
} else {
- waitFindObject(By.res(ALLOW_BUTTON), timeoutMillis)
+ waitFindObject(By.res(ALLOW_BUTTON).displayId(displayId), timeoutMillis)
}
}
protected fun clickPermissionRequestAllowButton(timeoutMillis: Long = 20000) {
if (isAutomotive || isWatch) {
- click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)), timeoutMillis)
+ click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)).displayId(displayId),
+ timeoutMillis)
} else {
- click(By.res(ALLOW_BUTTON), timeoutMillis)
+ click(By.res(ALLOW_BUTTON).displayId(displayId), timeoutMillis)
}
}
protected fun clickPermissionRequestAllowAllButton(timeoutMillis: Long = 20000) {
- click(By.res(ALLOW_ALL_BUTTON), timeoutMillis)
+ click(By.res(ALLOW_ALL_BUTTON).displayId(displayId), timeoutMillis)
}
/**
@@ -816,14 +823,16 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
uiDevice.wait(
Until.hasObject(
By.text(getPermissionControllerString(NOTIF_TEXT, APP_PACKAGE_NAME))
+ .displayId(displayId)
),
1000
)
if (notificationPermissionRequestVisible) {
if (isAutomotive) {
- click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)))
+ click(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT))
+ .displayId(displayId))
} else {
- click(By.res(ALLOW_BUTTON))
+ click(By.res(ALLOW_BUTTON).displayId(displayId))
}
}
}
@@ -837,43 +846,49 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
protected fun clickAllowAlwaysInSettings() {
if (isAutomotive || isTv || isWatch) {
- click(By.text(getPermissionControllerString("app_permission_button_allow_always")))
+ click(By.text(getPermissionControllerString("app_permission_button_allow_always"))
+ .displayId(displayId))
} else {
- click(By.res("com.android.permissioncontroller:id/allow_always_radio_button"))
+ click(By.res("com.android.permissioncontroller:id/allow_always_radio_button")
+ .displayId(displayId))
}
}
protected fun clickAllowForegroundInSettings() {
- click(By.res(ALLOW_FOREGROUND_RADIO_BUTTON))
+ click(By.res(ALLOW_FOREGROUND_RADIO_BUTTON).displayId(displayId))
}
protected fun clicksDenyInSettings() {
if (isAutomotive || isWatch) {
- click(By.text(getPermissionControllerString("app_permission_button_deny")))
+ click(By.text(getPermissionControllerString("app_permission_button_deny"))
+ .displayId(displayId))
} else {
- click(By.res("com.android.permissioncontroller:id/deny_radio_button"))
+ click(By.res("com.android.permissioncontroller:id/deny_radio_button")
+ .displayId(displayId))
}
}
protected fun findPermissionRequestAllowForegroundButton(timeoutMillis: Long = 20000) {
if (isAutomotive || isWatch) {
waitFindObject(
- By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)),
+ By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
+ .displayId(displayId),
timeoutMillis
)
} else {
- waitFindObject(By.res(ALLOW_FOREGROUND_BUTTON), timeoutMillis)
+ waitFindObject(By.res(ALLOW_FOREGROUND_BUTTON).displayId(displayId), timeoutMillis)
}
}
protected fun clickPermissionRequestAllowForegroundButton(timeoutMillis: Long = 20_000) {
if (isAutomotive || isWatch) {
click(
- By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)),
+ By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
+ .displayId(displayId),
timeoutMillis
)
} else {
- click(By.res(ALLOW_FOREGROUND_BUTTON), timeoutMillis)
+ click(By.res(ALLOW_FOREGROUND_BUTTON).displayId(displayId), timeoutMillis)
}
}
@@ -881,12 +896,12 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isAutomotive) {
scrollToBottom()
clickAndWaitForWindowTransition(
- By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ By.text(getPermissionControllerString(DENY_BUTTON_TEXT)).displayId(displayId)
)
} else if (isWatch || isTv) {
- click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)))
+ click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)).displayId(displayId))
} else {
- click(By.res(DENY_BUTTON))
+ click(By.res(DENY_BUTTON).displayId(displayId))
}
}
@@ -927,7 +942,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
private fun clickPermissionRequestSettingsLinkForWear() {
// Find detail message.
- val text = waitFindObject(By.textContains(" settings."))
+ val text = waitFindObject(By.textContains(" settings.").displayId(displayId))
// Move the view to the top of the screen.
var visibleBounds = text.getVisibleBounds()
@@ -963,41 +978,46 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
scrollToBottom()
clickAndWaitForWindowTransition(
By.text(getPermissionControllerString(DENY_AND_DONT_ASK_AGAIN_BUTTON_TEXT))
+ .displayId(displayId)
)
} else if (isWatch) {
- click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)))
+ click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)).displayId(displayId))
} else {
- click(By.res(DENY_AND_DONT_ASK_AGAIN_BUTTON))
+ click(By.res(DENY_AND_DONT_ASK_AGAIN_BUTTON).displayId(displayId))
}
}
// Only used in TV and Watch form factors
protected fun clickPermissionRequestDontAskAgainButton() {
if (isWatch) {
- click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)))
+ click(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)).displayId(displayId))
} else {
click(
By.res("com.android.permissioncontroller:id/permission_deny_dont_ask_again_button")
+ .displayId(displayId)
)
}
}
protected fun clickPermissionRequestNoUpgradeAndDontAskAgainButton() {
if (isAutomotive || isWatch) {
- click(By.text(getPermissionControllerString(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON_TEXT)))
+ click(By.text(getPermissionControllerString(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON_TEXT))
+ .displayId(displayId))
} else {
- click(By.res(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON))
+ click(By.res(NO_UPGRADE_AND_DONT_ASK_AGAIN_BUTTON).displayId(displayId))
}
}
protected fun clickPermissionRationaleContentInAppPermission() {
clickAndWaitForWindowTransition(
By.text(getPermissionControllerString(APP_PERMISSION_RATIONALE_SUBTITLE_TEXT))
+ .displayId(displayId)
)
}
protected fun clickPermissionRationaleViewInGrantDialog() {
- clickAndWaitForWindowTransition(By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW))
+ clickAndWaitForWindowTransition(
+ By.res(GRANT_DIALOG_PERMISSION_RATIONALE_CONTAINER_VIEW).displayId(displayId))
}
protected fun grantAppPermissionsByUi(vararg permissions: String) {
@@ -1082,9 +1102,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
navigateToAppPermissionSettings()
val permissionLabel = getPermissionLabel(permission)
if (isWatch) {
- clickAndWaitForWindowTransition(By.text(permissionLabel), 40_000)
+ clickAndWaitForWindowTransition(By.text(permissionLabel).displayId(displayId),
+ 40_000)
} else {
- clickPermissionControllerUi(By.text(permissionLabel))
+ clickPermissionControllerUi(By.text(permissionLabel).displayId(displayId))
}
return
}
@@ -1152,11 +1173,11 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
navigatedGroupLabels.add(permissionLabel)
if (useLegacyNavigation) {
if (isWatch) {
- click(By.text(permissionLabel), 40_000)
+ click(By.text(permissionLabel).displayId(displayId), 40_000)
} else if (isAutomotive) {
clickPermissionControllerUi(permissionLabel)
} else {
- clickPermissionControllerUi(By.text(permissionLabel))
+ clickPermissionControllerUi(By.text(permissionLabel).displayId(displayId))
}
} else {
doAndWaitForWindowTransition {
@@ -1180,20 +1201,24 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
// won't show an "Ask every time" message
!waitFindObject(
By.text(getPermissionControllerString("app_permission_button_deny"))
+ .displayId(displayId)
)
.isChecked
} else if (isTv || isWatch) {
- !(waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)))
+ !(waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ .displayId(displayId))
.isChecked ||
(!isLegacyApp &&
hasAskButton(permission) &&
- waitFindObject(By.text(getPermissionControllerString(ASK_BUTTON_TEXT)))
+ waitFindObject(By.text(getPermissionControllerString(ASK_BUTTON_TEXT))
+ .displayId(displayId))
.isChecked))
} else {
- !(waitFindObject(By.res(DENY_RADIO_BUTTON)).isChecked ||
+ !(waitFindObject(By.res(DENY_RADIO_BUTTON).displayId(displayId)).isChecked ||
(!isLegacyApp &&
hasAskButton(permission) &&
- waitFindObject(By.res(ASK_RADIO_BUTTON)).isChecked))
+ waitFindObject(By.res(ASK_RADIO_BUTTON).displayId(displayId))
+ .isChecked))
}
var alreadyChecked = false
val button =
@@ -1208,16 +1233,18 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
getPermissionControllerString(
"app_permission_button_allow_foreground"
)
- )
+ ).displayId(displayId)
} else {
By.text(
getPermissionControllerString("app_permission_button_allow")
- )
+ ).displayId(displayId)
}
PermissionState.DENIED ->
By.text(getPermissionControllerString("app_permission_button_deny"))
+ .displayId(displayId)
PermissionState.DENIED_WITH_PREJUDICE ->
By.text(getPermissionControllerString("app_permission_button_deny"))
+ .displayId(displayId)
}
} else if (isTv || isWatch) {
when (state) {
@@ -1227,7 +1254,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
getPermissionControllerString(
ALLOW_FOREGROUND_PREFERENCE_TEXT
)
- )
+ ).displayId(displayId)
} else {
byAnyText(
getPermissionControllerResString(ALLOW_BUTTON_TEXT),
@@ -1239,29 +1266,33 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
PermissionState.DENIED ->
if (!isLegacyApp && hasAskButton(permission)) {
By.text(getPermissionControllerString(ASK_BUTTON_TEXT))
+ .displayId(displayId)
} else {
By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ .displayId(displayId)
}
PermissionState.DENIED_WITH_PREJUDICE ->
By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ .displayId(displayId)
}
} else {
when (state) {
PermissionState.ALLOWED ->
if (showsForegroundOnlyButton(permission)) {
- By.res(ALLOW_FOREGROUND_RADIO_BUTTON)
+ By.res(ALLOW_FOREGROUND_RADIO_BUTTON).displayId(displayId)
} else if (showsAlwaysButton(permission)) {
- By.res(ALLOW_ALWAYS_RADIO_BUTTON)
+ By.res(ALLOW_ALWAYS_RADIO_BUTTON).displayId(displayId)
} else {
- By.res(ALLOW_RADIO_BUTTON)
+ By.res(ALLOW_RADIO_BUTTON).displayId(displayId)
}
PermissionState.DENIED ->
if (!isLegacyApp && hasAskButton(permission)) {
- By.res(ASK_RADIO_BUTTON)
+ By.res(ASK_RADIO_BUTTON).displayId(displayId)
} else {
- By.res(DENY_RADIO_BUTTON)
+ By.res(DENY_RADIO_BUTTON).displayId(displayId)
}
PermissionState.DENIED_WITH_PREJUDICE -> By.res(DENY_RADIO_BUTTON)
+ .displayId(displayId)
}
}
)
@@ -1279,10 +1310,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
click(
By.desc(
getPermissionControllerString("media_confirm_dialog_positive_button")
- )
+ ).displayId(displayId)
)
} else {
- click(By.res(ALERT_DIALOG_OK_BUTTON))
+ click(By.res(ALERT_DIALOG_OK_BUTTON).displayId(displayId))
}
} else if (!alreadyChecked && isLegacyApp && wasGranted) {
if (!isTv) {
@@ -1290,9 +1321,10 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
if (isWatch) {
waitFindObject(
By.text(getPermissionControllerString("old_sdk_deny_warning"))
+ .displayId(displayId)
)
} else {
- waitFindObject(By.res(ALERT_DIALOG_MESSAGE))
+ waitFindObject(By.res(ALERT_DIALOG_MESSAGE).displayId(displayId))
}
scrollToBottom()
}
@@ -1300,7 +1332,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
// Due to the limited real estate, Wear uses buttons with icons instead of text
// for dialogs
if (isWatch) {
- click(By.desc(getPermissionControllerString("ok")))
+ click(By.desc(getPermissionControllerString("ok")).displayId(displayId))
} else {
val resources =
context
@@ -1400,10 +1432,11 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
return null
}
- private fun byTextRes(textRes: Int): BySelector = By.text(context.getString(textRes))
+ private fun byTextRes(textRes: Int): BySelector =
+ By.text(context.getString(textRes)).displayId(displayId)
private fun byTextStartsWithCaseInsensitive(prefix: String): BySelector =
- By.text(Pattern.compile("(?i)^${Pattern.quote(prefix)}.*$"))
+ By.text(Pattern.compile("(?i)^${Pattern.quote(prefix)}.*$")).displayId(displayId)
protected fun assertAppHasPermission(permissionName: String, expectPermission: Boolean) {
val checkPermissionResult = packageManager.checkPermission(permissionName, APP_PACKAGE_NAME)
@@ -1458,11 +1491,11 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
protected fun clickECMAlertDialogOKButton(waitForWindowTransition: Boolean = !isWatch) {
- var action = { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ var action = { click(By.res(ALERT_DIALOG_OK_BUTTON).displayId(displayId), TIMEOUT_MILLIS) }
if (isWatch) {
val okButtonText =
getPermissionControllerResString(ECM_ALERT_DIALOG_OK_BUTTON_TEXT) ?: "OK"
- action = { click(By.text(okButtonText), TIMEOUT_MILLIS) }
+ action = { click(By.text(okButtonText).displayId(displayId), TIMEOUT_MILLIS) }
}
if (waitForWindowTransition) {
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/NotificationPermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/NotificationPermissionTest.kt
index c8298b19a..75a8914bf 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/NotificationPermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/NotificationPermissionTest.kt
@@ -141,7 +141,7 @@ class NotificationPermissionTest : BaseUsePermissionTest() {
launchApp()
killTestApp()
launchApp()
- waitFindObject(By.textContains(ALLOW))
+ waitFindObject(By.textContains(ALLOW).displayId(displayId))
clickPermissionRequestAllowButton()
}
@@ -201,9 +201,10 @@ class NotificationPermissionTest : BaseUsePermissionTest() {
installPackage(APP_APK_PATH_CREATE_NOTIFICATION_CHANNELS_31, expectSuccess = true)
launchApp(startSecondActivity = true)
if (isAutomotive || isWatch) {
- waitFindObject(By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)))
+ waitFindObject(
+ By.text(getPermissionControllerString(ALLOW_BUTTON_TEXT)).displayId(displayId))
} else {
- waitFindObject(By.res(ALLOW_BUTTON))
+ waitFindObject(By.res(ALLOW_BUTTON).displayId(displayId))
}
pressBack()
clickPermissionRequestAllowButton()
@@ -239,7 +240,7 @@ class NotificationPermissionTest : BaseUsePermissionTest() {
try {
// Watch does not have app bar
if (!isWatch) {
- waitFindObject(By.textContains(SECOND_ACTIVITY_LABEL))
+ waitFindObject(By.textContains(SECOND_ACTIVITY_LABEL).displayId(displayId))
}
assertDialogNotShowing()
} finally {
@@ -400,7 +401,7 @@ class NotificationPermissionTest : BaseUsePermissionTest() {
// Watch does not have app bar
if (!isWatch) {
- waitFindObject(By.textContains(ACTIVITY_LABEL))
+ waitFindObject(By.textContains(ACTIVITY_LABEL).displayId(displayId))
}
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt
index 495648b55..ae6e33b2a 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionDecisionsTest.kt
@@ -52,8 +52,10 @@ class PermissionDecisionsTest : BaseUsePermissionTest() {
openPermissionDecisions()
waitFindObject(
- By.hasChild(By.text("You gave $APP_PACKAGE_NAME access to location"))
- .hasChild(By.text("Today"))
+ By.hasChild(
+ By.text("You gave $APP_PACKAGE_NAME access to location").displayId(displayId))
+ .hasChild(By.text("Today").displayId(displayId))
+ .displayId(displayId)
)
}
@@ -66,8 +68,10 @@ class PermissionDecisionsTest : BaseUsePermissionTest() {
openPermissionDecisions()
waitFindObject(
- By.hasChild(By.text("You denied $APP_PACKAGE_NAME access to location"))
- .hasChild(By.text("Today"))
+ By.hasChild(
+ By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId))
+ .hasChild(By.text("Today").displayId(displayId))
+ .displayId(displayId)
)
}
@@ -82,8 +86,10 @@ class PermissionDecisionsTest : BaseUsePermissionTest() {
openPermissionDecisions()
assertNull(
waitFindObjectOrNull(
- By.hasChild(By.text("You denied $APP_PACKAGE_NAME access to location"))
- .hasChild(By.text("Today")),
+ By.hasChild(By.text("You denied $APP_PACKAGE_NAME access to location")
+ .displayId(displayId))
+ .hasChild(By.text("Today").displayId(displayId))
+ .displayId(displayId),
ASSERT_ABSENT_SELECTOR_TIMEOUT_MS
)
)
@@ -99,21 +105,25 @@ class PermissionDecisionsTest : BaseUsePermissionTest() {
openPermissionDecisions()
waitFindObject(
- By.hasChild(By.text("You gave $APP_PACKAGE_NAME access to location"))
- .hasChild(By.text("Today"))
+ By.hasChild(By.text("You gave $APP_PACKAGE_NAME access to location")
+ .displayId(displayId))
+ .hasChild(By.text("Today").displayId(displayId))
+ .displayId(displayId)
)
.click()
- waitFindObject(By.text(APP_PACKAGE_NAME))
- waitFindObject(By.text("Location access for this app"))
+ waitFindObject(By.text(APP_PACKAGE_NAME).displayId(displayId))
+ waitFindObject(By.text("Location access for this app").displayId(displayId))
// change the permission on the app permission screen and verify that updates the decision
// page
- waitFindObject(By.text("Don’t allow")).click()
+ waitFindObject(By.text("Don’t allow").displayId(displayId)).click()
pressBack()
waitFindObject(
- By.hasChild(By.text("You denied $APP_PACKAGE_NAME access to location"))
- .hasChild(By.text("Today"))
+ By.hasChild(
+ By.text("You denied $APP_PACKAGE_NAME access to location").displayId(displayId))
+ .hasChild(By.text("Today").displayId(displayId))
+ .displayId(displayId)
)
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTapjackingTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTapjackingTest.kt
index 95050ab3e..b2021b26f 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTapjackingTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTapjackingTest.kt
@@ -46,8 +46,9 @@ class PermissionReviewTapjackingTest : BaseUsePermissionTest() {
SystemUtil.waitForBroadcasts()
+ val userId = context.getUserId()
SystemUtil.runShellCommandOrThrow(
- "appops set $HELPER_PACKAGE_NAME android:system_alert_window allow"
+ "appops set --user $userId $HELPER_PACKAGE_NAME android:system_alert_window allow"
)
}
@@ -78,11 +79,12 @@ class PermissionReviewTapjackingTest : BaseUsePermissionTest() {
if (isWatch) {
waitFindObject(
- By.text(getPermissionControllerString("review_button_cancel")),
+ By.text(getPermissionControllerString("review_button_cancel")).displayId(displayId),
TIMEOUT_MILLIS * 2
)
} else {
- waitFindObject(By.res("com.android.permissioncontroller:id/permissions_message"))
+ waitFindObject(By.res("com.android.permissioncontroller:id/permissions_message")
+ .displayId(displayId))
}
try {
@@ -96,5 +98,5 @@ class PermissionReviewTapjackingTest : BaseUsePermissionTest() {
findOverlay()
}
- private fun findOverlay() = waitFindObject(By.text("Find me!"))
+ private fun findOverlay() = waitFindObject(By.text("Find me!").displayId(displayId))
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTest.kt
index 5ca23fea2..8c77595f1 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionReviewTest.kt
@@ -60,9 +60,9 @@ class PermissionReviewTest : BaseUsePermissionTest() {
fun testDenyCalendarDuringReview() {
startAppActivityAndAssertResultCode(Activity.RESULT_OK) {
// Deny
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
// Confirm deny
- click(By.res("android:id/button1"))
+ click(By.res("android:id/button1").displayId(displayId))
clickPermissionReviewContinue()
}
@@ -75,12 +75,12 @@ class PermissionReviewTest : BaseUsePermissionTest() {
fun testDenyGrantCalendarDuringReview() {
startAppActivityAndAssertResultCode(Activity.RESULT_OK) {
// Deny
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
// Confirm deny
- click(By.res("android:id/button1"))
+ click(By.res("android:id/button1").displayId(displayId))
// Grant
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
clickPermissionReviewContinue()
}
@@ -93,16 +93,16 @@ class PermissionReviewTest : BaseUsePermissionTest() {
fun testDenyGrantDenyCalendarDuringReview() {
startAppActivityAndAssertResultCode(Activity.RESULT_OK) {
// Deny
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
// Confirm deny
- click(By.res("android:id/button1"))
+ click(By.res("android:id/button1").displayId(displayId))
// Grant
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
// Deny
- clickPermissionControllerUi(By.text("Calendar"))
+ clickPermissionControllerUi(By.text("Calendar").displayId(displayId))
clickPermissionReviewContinue()
}
@@ -126,7 +126,7 @@ class PermissionReviewTest : BaseUsePermissionTest() {
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.TIRAMISU, codeName = "TIRAMISU")
fun testNotificationPermissionAddedToReview() {
startAppActivityAndAssertResultCode(Activity.RESULT_CANCELED) {
- waitFindObject(By.text("Notifications"), 5000L)
+ waitFindObject(By.text("Notifications").displayId(displayId), 5000L)
clickPermissionReviewCancel()
}
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
index b81432369..baebfe06f 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
@@ -21,6 +21,8 @@ import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Point
import android.os.Build
+import android.os.SystemClock
+import android.view.MotionEvent
import androidx.test.filters.FlakyTest
import androidx.test.filters.SdkSuppress
import androidx.test.uiautomator.By
@@ -50,12 +52,14 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {}
val buttonCenter =
- waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)))
+ waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
+ .displayId(displayId))
.visibleCenter
// Wait for overlay to hide the dialog
context.sendBroadcast(Intent(ACTION_SHOW_OVERLAY).putExtra(EXTRA_FULL_OVERLAY, true))
- waitFindObject(By.res("android.permissionui.cts.usepermission:id/overlay"))
+ waitFindObject(
+ By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId))
tryClicking(buttonCenter)
}
@@ -73,14 +77,17 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {}
val foregroundButtonCenter =
- waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT)))
+ waitFindObject(By.text(getPermissionControllerString(ALLOW_FOREGROUND_BUTTON_TEXT))
+ .displayId(displayId))
.visibleCenter
val oneTimeButton =
- waitFindObjectOrNull(By.text(getPermissionControllerString(ALLOW_ONE_TIME_BUTTON_TEXT)))
+ waitFindObjectOrNull(By.text(getPermissionControllerString(ALLOW_ONE_TIME_BUTTON_TEXT))
+ .displayId(displayId))
// If one-time button is not available, fallback to deny button
val overlayButtonBounds =
oneTimeButton?.visibleBounds
- ?: waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT)))
+ ?: waitFindObject(By.text(getPermissionControllerString(DENY_BUTTON_TEXT))
+ .displayId(displayId))
.visibleBounds
// Wait for overlay to hide the dialog
@@ -92,7 +99,8 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
.putExtra(OVERLAY_RIGHT, overlayButtonBounds.right)
.putExtra(OVERLAY_BOTTOM, overlayButtonBounds.bottom)
)
- waitFindObject(By.res("android.permissionui.cts.usepermission:id/overlay"))
+ waitFindObject(
+ By.res("android.permissionui.cts.usepermission:id/overlay").displayId(displayId))
tryClicking(foregroundButtonCenter)
}
@@ -106,7 +114,7 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
packageManager.checkPermission(ACCESS_FINE_LOCATION, APP_PACKAGE_NAME) ==
PackageManager.PERMISSION_DENIED
) {
- uiDevice.click(buttonCenter.x, buttonCenter.y)
+ click(buttonCenter)
Thread.sleep(100)
}
assertAppHasPermission(ACCESS_FINE_LOCATION, true)
@@ -127,7 +135,7 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
packageManager.checkPermission(ACCESS_FINE_LOCATION, APP_PACKAGE_NAME) ==
PackageManager.PERMISSION_DENIED
) {
- uiDevice.click(buttonCenter.x, buttonCenter.y)
+ click(buttonCenter)
Thread.sleep(100)
}
assertAppHasPermission(ACCESS_FINE_LOCATION, true)
@@ -136,6 +144,20 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
)
}
+ private fun click(buttonCenter: Point) {
+ val downTime = SystemClock.uptimeMillis()
+ val x= buttonCenter.x.toFloat()
+ val y = buttonCenter.y.toFloat()
+ var event = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN,x , y, 0)
+ event.displayId = displayId
+ uiAutomation.injectInputEvent(event, true)
+
+ val upTime = SystemClock.uptimeMillis()
+ event = MotionEvent.obtain(upTime, upTime, MotionEvent.ACTION_UP, x, y, 0)
+ event.displayId = displayId
+ uiAutomation.injectInputEvent(event, true)
+ }
+
companion object {
const val ACTION_SHOW_OVERLAY = "android.permissionui.cts.usepermission.ACTION_SHOW_OVERLAY"
const val ACTION_HIDE_OVERLAY = "android.permissionui.cts.usepermission.ACTION_HIDE_OVERLAY"
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest29.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest29.kt
index 3278596d4..21e6863b3 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest29.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest29.kt
@@ -176,14 +176,15 @@ class PermissionTest29 : BaseUsePermissionTest() {
eventually {
pressBack()
if (isAutomotive) {
- waitFindObject(By.textContains("Allow in settings."), 100)
+ waitFindObject(By.textContains("Allow in settings.").displayId(displayId), 100)
} else if (isWatch) {
waitForIdleLong()
findAccessibilityNodeInfosByTextForSurfaceView(
uiAutomation.rootInActiveWindow,
"Allow in settings")
} else {
- waitFindObject(By.res("com.android.permissioncontroller:id/grant_dialog"), 100)
+ waitFindObject(By.res("com.android.permissioncontroller:id/grant_dialog")
+ .displayId(displayId), 100)
}
}
}
@@ -226,11 +227,13 @@ class PermissionTest29 : BaseUsePermissionTest() {
}
waitFindObject(
By.textContains("contacts").pkg(packageManager.permissionControllerPackageName)
+ .displayId(displayId)
)
var didNotFindPhone = false
try {
waitFindObject(
- By.textContains("phone calls").pkg(packageManager.permissionControllerPackageName),
+ By.textContains("phone calls").pkg(packageManager.permissionControllerPackageName)
+ .displayId(displayId),
3000L
)
} catch (expected: Exception) {
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest30.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest30.kt
index 25bdab298..9f0ffdfaa 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest30.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTest30.kt
@@ -77,7 +77,8 @@ class PermissionTest30 : BaseUsePermissionTest() {
// Verify there's no location accuracy options
val locationAccuracyOptions =
waitFindObjectOrNull(
- By.res("com.android.permissioncontroller:id/permission_location_accuracy"),
+ By.res("com.android.permissioncontroller:id/permission_location_accuracy")
+ .displayId(displayId),
1000L
)
assertNull(