diff options
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"><br><br></xliff:g>Възможно е приложението да не работи правилно без това ограничено разрешение. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Научете как да разрешите достъпа</a>"</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"><br><br></xliff:g>Възможно е приложението да не работи правилно без тези ограничени разрешения. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Научете как да разрешите достъпа</a>"</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"><br><br></xliff:g>Възможно е приложението да не работи правилно без това ограничено разрешение. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Научете как да разрешите достъпа</a>"</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"><br><br></xliff:g>És possible que l\'aplicació no funcioni correctament sense aquests permisos restringits. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Més informació sobre com pots permetre l\'accés</a>"</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"><br><br></xliff:g>És possible que l\'aplicació no funcioni correctament sense aquest permís. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Més informació sobre com pots permetre l\'accés</a>"</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"><br><br></xliff:g>És possible que l\'aplicació no funcioni correctament sense aquest permís restringit. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Més informació sobre com pots permetre l\'accés</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog ograničenog dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tih ograničenih dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog uskraćenog dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tih ograničenih dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog ograničenog dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog dopuštenja. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Saznajte kako omogućiti pristup</a>"</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"><br><br></xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Ketahui cara membenarkan akses</a>"</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"><br><br></xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Ketahui cara membenarkan akses</a>"</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"><br><br></xliff:g>Apl mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Ketahui cara membenarkan akses</a>"</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"><br><br></xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>Ketahui cara membenarkan akses</a>"</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"><br><br></xliff:g>Без такого разрешения приложение может работать неправильно. Узнайте, <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>как предоставить доступ к данным</a>."</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"><br><br></xliff:g>Без таких разрешений приложение может работать неправильно. Узнайте, <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>как предоставить доступ к данным</a>."</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"><br><br></xliff:g>Без них приложение может работать неправильно. Узнайте, <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>как предоставить доступ к данным</a>."</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"><br><br></xliff:g>Без него приложение может работать неправильно. Узнайте, <a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>как предоставить доступ к данным</a>."</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"><br><br></xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。<a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>進一步瞭解如何授予存取權</a>"</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"><br><br></xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。<a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>進一步瞭解如何授予存取權</a>"</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"><br><br></xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。<a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>>進一步瞭解如何授予存取權</a>"</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 c4ed99be1..02fa0d455 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 & 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( |