summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp3
-rw-r--r--PermissionController/Android.bp9
-rw-r--r--PermissionController/AndroidManifest.xml28
-rw-r--r--PermissionController/TEST_MAPPING21
-rw-r--r--PermissionController/jarjar-rules.txt3
-rw-r--r--PermissionController/lint-baseline.xml666
-rw-r--r--PermissionController/res/drawable-v34/ic_lock_closed.xml28
-rw-r--r--PermissionController/res/layout-v33/view_more_issues.xml59
-rw-r--r--PermissionController/res/layout-v34/enhanced_confirmation_dialog.xml69
-rw-r--r--PermissionController/res/layout/request_role_item.xml5
-rw-r--r--PermissionController/res/values-af-v34/strings.xml9
-rw-r--r--PermissionController/res/values-af-watch/strings.xml7
-rw-r--r--PermissionController/res/values-af/strings.xml13
-rw-r--r--PermissionController/res/values-am-v34/strings.xml9
-rw-r--r--PermissionController/res/values-am-watch/strings.xml7
-rw-r--r--PermissionController/res/values-am/strings.xml13
-rw-r--r--PermissionController/res/values-ar-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ar-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ar/strings.xml19
-rw-r--r--PermissionController/res/values-as-v34/strings.xml9
-rw-r--r--PermissionController/res/values-as-watch/strings.xml7
-rw-r--r--PermissionController/res/values-as/strings.xml13
-rw-r--r--PermissionController/res/values-az-v34/strings.xml9
-rw-r--r--PermissionController/res/values-az-watch/strings.xml7
-rw-r--r--PermissionController/res/values-az/strings.xml13
-rw-r--r--PermissionController/res/values-b+sr+Latn-v34/strings.xml9
-rw-r--r--PermissionController/res/values-b+sr+Latn-watch/strings.xml7
-rw-r--r--PermissionController/res/values-b+sr+Latn/strings.xml13
-rw-r--r--PermissionController/res/values-be-v34/strings.xml9
-rw-r--r--PermissionController/res/values-be-watch/strings.xml7
-rw-r--r--PermissionController/res/values-be/strings.xml13
-rw-r--r--PermissionController/res/values-bg-v34/strings.xml9
-rw-r--r--PermissionController/res/values-bg-watch/strings.xml7
-rw-r--r--PermissionController/res/values-bg/strings.xml13
-rw-r--r--PermissionController/res/values-bn-v34/strings.xml9
-rw-r--r--PermissionController/res/values-bn-watch/strings.xml7
-rw-r--r--PermissionController/res/values-bn/strings.xml13
-rw-r--r--PermissionController/res/values-bs-v34/strings.xml9
-rw-r--r--PermissionController/res/values-bs-watch/strings.xml7
-rw-r--r--PermissionController/res/values-bs/strings.xml13
-rw-r--r--PermissionController/res/values-ca-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ca-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ca/strings.xml13
-rw-r--r--PermissionController/res/values-cs-v34/strings.xml9
-rw-r--r--PermissionController/res/values-cs-watch/strings.xml7
-rw-r--r--PermissionController/res/values-cs/strings.xml13
-rw-r--r--PermissionController/res/values-da-v34/strings.xml9
-rw-r--r--PermissionController/res/values-da-watch/strings.xml7
-rw-r--r--PermissionController/res/values-da/strings.xml25
-rw-r--r--PermissionController/res/values-de-v34/strings.xml9
-rw-r--r--PermissionController/res/values-de-watch/strings.xml7
-rw-r--r--PermissionController/res/values-de/strings.xml17
-rw-r--r--PermissionController/res/values-el-car/strings.xml2
-rw-r--r--PermissionController/res/values-el-v34/strings.xml9
-rw-r--r--PermissionController/res/values-el-watch/strings.xml7
-rw-r--r--PermissionController/res/values-el/strings.xml19
-rw-r--r--PermissionController/res/values-en-rAU-v34/strings.xml9
-rw-r--r--PermissionController/res/values-en-rAU-watch/strings.xml7
-rw-r--r--PermissionController/res/values-en-rAU/strings.xml13
-rw-r--r--PermissionController/res/values-en-rCA-v34/strings.xml9
-rw-r--r--PermissionController/res/values-en-rCA-watch/strings.xml7
-rw-r--r--PermissionController/res/values-en-rCA/strings.xml13
-rw-r--r--PermissionController/res/values-en-rGB-v34/strings.xml9
-rw-r--r--PermissionController/res/values-en-rGB-watch/strings.xml7
-rw-r--r--PermissionController/res/values-en-rGB/strings.xml13
-rw-r--r--PermissionController/res/values-en-rIN-v34/strings.xml9
-rw-r--r--PermissionController/res/values-en-rIN-watch/strings.xml7
-rw-r--r--PermissionController/res/values-en-rIN/strings.xml13
-rw-r--r--PermissionController/res/values-en-rXC-v34/strings.xml9
-rw-r--r--PermissionController/res/values-en-rXC-watch/strings.xml7
-rw-r--r--PermissionController/res/values-en-rXC/strings.xml13
-rw-r--r--PermissionController/res/values-es-rUS-v34/strings.xml9
-rw-r--r--PermissionController/res/values-es-rUS-watch/strings.xml7
-rw-r--r--PermissionController/res/values-es-rUS/strings.xml19
-rw-r--r--PermissionController/res/values-es-v34/strings.xml9
-rw-r--r--PermissionController/res/values-es-watch/strings.xml7
-rw-r--r--PermissionController/res/values-es/strings.xml19
-rw-r--r--PermissionController/res/values-et-v34/strings.xml9
-rw-r--r--PermissionController/res/values-et-watch/strings.xml7
-rw-r--r--PermissionController/res/values-et/strings.xml13
-rw-r--r--PermissionController/res/values-eu-v34/strings.xml9
-rw-r--r--PermissionController/res/values-eu-watch/strings.xml7
-rw-r--r--PermissionController/res/values-eu/strings.xml19
-rw-r--r--PermissionController/res/values-fa-v34/strings.xml9
-rw-r--r--PermissionController/res/values-fa-watch/strings.xml7
-rw-r--r--PermissionController/res/values-fa/strings.xml35
-rw-r--r--PermissionController/res/values-fi-v34/strings.xml9
-rw-r--r--PermissionController/res/values-fi-watch/strings.xml7
-rw-r--r--PermissionController/res/values-fi/strings.xml13
-rw-r--r--PermissionController/res/values-fr-rCA-v34/strings.xml9
-rw-r--r--PermissionController/res/values-fr-rCA-watch/strings.xml7
-rw-r--r--PermissionController/res/values-fr-rCA/strings.xml17
-rw-r--r--PermissionController/res/values-fr-v34/strings.xml9
-rw-r--r--PermissionController/res/values-fr-watch/strings.xml7
-rw-r--r--PermissionController/res/values-fr/strings.xml25
-rw-r--r--PermissionController/res/values-gl-v34/strings.xml9
-rw-r--r--PermissionController/res/values-gl-watch/strings.xml7
-rw-r--r--PermissionController/res/values-gl/strings.xml13
-rw-r--r--PermissionController/res/values-gu-v34/strings.xml9
-rw-r--r--PermissionController/res/values-gu-watch/strings.xml7
-rw-r--r--PermissionController/res/values-gu/strings.xml13
-rw-r--r--PermissionController/res/values-hi-v34/strings.xml9
-rw-r--r--PermissionController/res/values-hi-watch/strings.xml7
-rw-r--r--PermissionController/res/values-hi/strings.xml13
-rw-r--r--PermissionController/res/values-hr-v34/strings.xml9
-rw-r--r--PermissionController/res/values-hr-watch/strings.xml7
-rw-r--r--PermissionController/res/values-hr/strings.xml13
-rw-r--r--PermissionController/res/values-hu-v34/strings.xml9
-rw-r--r--PermissionController/res/values-hu-watch/strings.xml7
-rw-r--r--PermissionController/res/values-hu/strings.xml13
-rw-r--r--PermissionController/res/values-hy-v34/strings.xml9
-rw-r--r--PermissionController/res/values-hy-watch/strings.xml7
-rw-r--r--PermissionController/res/values-hy/strings.xml13
-rw-r--r--PermissionController/res/values-in-v34/strings.xml9
-rw-r--r--PermissionController/res/values-in-watch/strings.xml7
-rw-r--r--PermissionController/res/values-in/strings.xml23
-rw-r--r--PermissionController/res/values-is-v34/strings.xml9
-rw-r--r--PermissionController/res/values-is-watch/strings.xml7
-rw-r--r--PermissionController/res/values-is/strings.xml13
-rw-r--r--PermissionController/res/values-it-v34/strings.xml9
-rw-r--r--PermissionController/res/values-it-watch/strings.xml7
-rw-r--r--PermissionController/res/values-it/strings.xml15
-rw-r--r--PermissionController/res/values-iw-v34/strings.xml9
-rw-r--r--PermissionController/res/values-iw-watch/strings.xml7
-rw-r--r--PermissionController/res/values-iw/strings.xml13
-rw-r--r--PermissionController/res/values-ja-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ja-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ja/strings.xml21
-rw-r--r--PermissionController/res/values-ka-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ka-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ka/strings.xml15
-rw-r--r--PermissionController/res/values-kk-v34/strings.xml9
-rw-r--r--PermissionController/res/values-kk-watch/strings.xml7
-rw-r--r--PermissionController/res/values-kk/strings.xml13
-rw-r--r--PermissionController/res/values-km-v34/strings.xml9
-rw-r--r--PermissionController/res/values-km-watch/strings.xml7
-rw-r--r--PermissionController/res/values-km/strings.xml13
-rw-r--r--PermissionController/res/values-kn-v34/strings.xml9
-rw-r--r--PermissionController/res/values-kn-watch/strings.xml7
-rw-r--r--PermissionController/res/values-kn/strings.xml13
-rw-r--r--PermissionController/res/values-ko-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ko-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ko/strings.xml15
-rw-r--r--PermissionController/res/values-ky-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ky-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ky/strings.xml15
-rw-r--r--PermissionController/res/values-lo-v34/strings.xml9
-rw-r--r--PermissionController/res/values-lo-watch/strings.xml7
-rw-r--r--PermissionController/res/values-lo/strings.xml13
-rw-r--r--PermissionController/res/values-lt-v34/strings.xml9
-rw-r--r--PermissionController/res/values-lt-watch/strings.xml7
-rw-r--r--PermissionController/res/values-lt/strings.xml13
-rw-r--r--PermissionController/res/values-lv-v34/strings.xml9
-rw-r--r--PermissionController/res/values-lv-watch/strings.xml7
-rw-r--r--PermissionController/res/values-lv/strings.xml14
-rw-r--r--PermissionController/res/values-mk-v34/strings.xml9
-rw-r--r--PermissionController/res/values-mk-watch/strings.xml7
-rw-r--r--PermissionController/res/values-mk/strings.xml13
-rw-r--r--PermissionController/res/values-ml-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ml-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ml/strings.xml13
-rw-r--r--PermissionController/res/values-mn-v34/strings.xml9
-rw-r--r--PermissionController/res/values-mn-watch/strings.xml7
-rw-r--r--PermissionController/res/values-mn/strings.xml17
-rw-r--r--PermissionController/res/values-mr-v34/strings.xml9
-rw-r--r--PermissionController/res/values-mr-watch/strings.xml7
-rw-r--r--PermissionController/res/values-mr/strings.xml15
-rw-r--r--PermissionController/res/values-ms-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ms-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ms/strings.xml13
-rw-r--r--PermissionController/res/values-my-v34/strings.xml9
-rw-r--r--PermissionController/res/values-my-watch/strings.xml7
-rw-r--r--PermissionController/res/values-my/strings.xml17
-rw-r--r--PermissionController/res/values-nb-v34/strings.xml9
-rw-r--r--PermissionController/res/values-nb-watch/strings.xml7
-rw-r--r--PermissionController/res/values-nb/strings.xml13
-rw-r--r--PermissionController/res/values-ne-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ne-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ne/strings.xml17
-rw-r--r--PermissionController/res/values-nl-v34/strings.xml9
-rw-r--r--PermissionController/res/values-nl-watch/strings.xml7
-rw-r--r--PermissionController/res/values-nl/strings.xml13
-rw-r--r--PermissionController/res/values-or-v34/strings.xml9
-rw-r--r--PermissionController/res/values-or-watch/strings.xml7
-rw-r--r--PermissionController/res/values-or/strings.xml13
-rw-r--r--PermissionController/res/values-pa-v33/strings.xml6
-rw-r--r--PermissionController/res/values-pa-v34/strings.xml9
-rw-r--r--PermissionController/res/values-pa-watch/strings.xml7
-rw-r--r--PermissionController/res/values-pa/strings.xml17
-rw-r--r--PermissionController/res/values-pl-v34/strings.xml9
-rw-r--r--PermissionController/res/values-pl-watch/strings.xml7
-rw-r--r--PermissionController/res/values-pl/strings.xml13
-rw-r--r--PermissionController/res/values-pt-rBR-v34/strings.xml9
-rw-r--r--PermissionController/res/values-pt-rBR-watch/strings.xml7
-rw-r--r--PermissionController/res/values-pt-rBR/strings.xml13
-rw-r--r--PermissionController/res/values-pt-rPT-v34/strings.xml9
-rw-r--r--PermissionController/res/values-pt-rPT-watch/strings.xml7
-rw-r--r--PermissionController/res/values-pt-rPT/strings.xml15
-rw-r--r--PermissionController/res/values-pt-v34/strings.xml9
-rw-r--r--PermissionController/res/values-pt-watch/strings.xml7
-rw-r--r--PermissionController/res/values-pt/strings.xml13
-rw-r--r--PermissionController/res/values-ro-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ro-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ro/strings.xml13
-rw-r--r--PermissionController/res/values-ru-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ru-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ru/strings.xml15
-rw-r--r--PermissionController/res/values-si-v34/strings.xml9
-rw-r--r--PermissionController/res/values-si-watch/strings.xml7
-rw-r--r--PermissionController/res/values-si/strings.xml13
-rw-r--r--PermissionController/res/values-sk-v34/strings.xml9
-rw-r--r--PermissionController/res/values-sk-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sk/strings.xml13
-rw-r--r--PermissionController/res/values-sl-v34/strings.xml9
-rw-r--r--PermissionController/res/values-sl-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sl/strings.xml13
-rw-r--r--PermissionController/res/values-sq-v34/strings.xml9
-rw-r--r--PermissionController/res/values-sq-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sq/strings.xml13
-rw-r--r--PermissionController/res/values-sr-v34/strings.xml9
-rw-r--r--PermissionController/res/values-sr-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sr/strings.xml13
-rw-r--r--PermissionController/res/values-sv-v34/strings.xml9
-rw-r--r--PermissionController/res/values-sv-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sv/strings.xml13
-rw-r--r--PermissionController/res/values-sw-v34/strings.xml11
-rw-r--r--PermissionController/res/values-sw-watch/strings.xml7
-rw-r--r--PermissionController/res/values-sw/strings.xml29
-rw-r--r--PermissionController/res/values-ta-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ta-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ta/strings.xml13
-rw-r--r--PermissionController/res/values-te-v34/strings.xml9
-rw-r--r--PermissionController/res/values-te-watch/strings.xml7
-rw-r--r--PermissionController/res/values-te/strings.xml15
-rw-r--r--PermissionController/res/values-th-v34/strings.xml9
-rw-r--r--PermissionController/res/values-th-watch/strings.xml7
-rw-r--r--PermissionController/res/values-th/strings.xml13
-rw-r--r--PermissionController/res/values-tl-v34/strings.xml9
-rw-r--r--PermissionController/res/values-tl-watch/strings.xml7
-rw-r--r--PermissionController/res/values-tl/strings.xml13
-rw-r--r--PermissionController/res/values-tr-v34/strings.xml9
-rw-r--r--PermissionController/res/values-tr-watch/strings.xml7
-rw-r--r--PermissionController/res/values-tr/strings.xml13
-rw-r--r--PermissionController/res/values-uk-v34/strings.xml11
-rw-r--r--PermissionController/res/values-uk-watch/strings.xml7
-rw-r--r--PermissionController/res/values-uk/strings.xml13
-rw-r--r--PermissionController/res/values-ur-v34/strings.xml9
-rw-r--r--PermissionController/res/values-ur-watch/strings.xml7
-rw-r--r--PermissionController/res/values-ur/strings.xml13
-rw-r--r--PermissionController/res/values-uz-v34/strings.xml9
-rw-r--r--PermissionController/res/values-uz-watch/strings.xml7
-rw-r--r--PermissionController/res/values-uz/strings.xml13
-rw-r--r--PermissionController/res/values-v33/styles.xml35
-rw-r--r--PermissionController/res/values-v34/dimens.xml7
-rw-r--r--PermissionController/res/values-v34/strings.xml1
-rw-r--r--PermissionController/res/values-v34/styles.xml11
-rw-r--r--PermissionController/res/values-vi-v34/strings.xml9
-rw-r--r--PermissionController/res/values-vi-watch/strings.xml7
-rw-r--r--PermissionController/res/values-vi/strings.xml17
-rw-r--r--PermissionController/res/values-watch/strings.xml21
-rw-r--r--PermissionController/res/values-zh-rCN-v34/strings.xml11
-rw-r--r--PermissionController/res/values-zh-rCN-watch/strings.xml7
-rw-r--r--PermissionController/res/values-zh-rCN/strings.xml13
-rw-r--r--PermissionController/res/values-zh-rHK-v34/strings.xml9
-rw-r--r--PermissionController/res/values-zh-rHK-watch/strings.xml7
-rw-r--r--PermissionController/res/values-zh-rHK/strings.xml15
-rw-r--r--PermissionController/res/values-zh-rTW-v34/strings.xml11
-rw-r--r--PermissionController/res/values-zh-rTW-watch/strings.xml7
-rw-r--r--PermissionController/res/values-zh-rTW/strings.xml13
-rw-r--r--PermissionController/res/values-zu-v34/strings.xml9
-rw-r--r--PermissionController/res/values-zu-watch/strings.xml7
-rw-r--r--PermissionController/res/values-zu/strings.xml15
-rw-r--r--PermissionController/res/values/dimens.xml1
-rw-r--r--PermissionController/res/values/overlayable.xml1
-rw-r--r--PermissionController/res/values/strings.xml48
-rw-r--r--PermissionController/res/values/styles.xml3
-rw-r--r--PermissionController/res/xml/roles.xml60
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java30
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/behavior/WalletRoleBehavior.java175
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/Permission.java64
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/Permissions.java7
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/Role.java139
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/RoleBehavior.java4
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/RoleParser.java37
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/service/RoleControllerServiceImpl.java10
-rw-r--r--PermissionController/role-controller/lint-baseline.xml10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialog.java82
-rw-r--r--PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialogHelper.java96
-rw-r--r--PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt13
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java138
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java11
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/GrantPermissionsWearViewHandler.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt28
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsHelper.kt22
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt7
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsHelper.kt14
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt37
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt80
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AlertDialog.kt38
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/Chip.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ListHeader.kt1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt40
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Haptics.kt292
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Rotary.kt1187
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/RotaryVelocityTracker.kt47
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/model/WearUnusedAppsViewModel.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt55
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt191
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java39
-rw-r--r--PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt21
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/Role.md4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/ChangeDefaultCardEmulationActivity.java76
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/CheckableLinearLayout.java10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java214
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleItemView.java46
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreference.java (renamed from PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreference.java)10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreferenceMixin.java (renamed from PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreferenceMixin.java)27
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java2
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/TwoTargetPreference.java1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java19
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java25
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/behavior/HomeRoleUiBehavior.java5
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java26
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/behavior/WalletRoleUiBehavior.java189
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java14
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessListChildFragment.java8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListHelper.kt1
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRoleApplicationPreference.kt24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRolePreference.kt24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java41
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/utils/UiUtils.java26
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterUiData.kt10
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/view/MoreIssuesHeaderView.kt10
-rw-r--r--PermissionController/tests/mocking/Android.bp2
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt4
-rw-r--r--SafetyCenter/Config/Android.bp1
-rw-r--r--SafetyCenter/Config/java/com/android/safetycenter/config/SafetyCenterConfigParser.java25
-rw-r--r--SafetyCenter/Config/tests/Android.bp1
-rw-r--r--SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigInvalidTest.kt57
-rw-r--r--SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigValidTest.kt17
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_disabled_no_private.xml18
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_hidden_with_search_no_private.xml17
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_no_private.xml17
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_hidden_with_private.xml15
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_with_private.xml17
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_issue_only_safety_source_with_private.xml12
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_static_safety_source_with_primary_and_private.xml16
-rw-r--r--SafetyCenter/Config/tests/res/raw-v35/config_valid.xml197
-rw-r--r--SafetyCenter/Config/tests/res/raw/config_static_safety_source_with_private_profile.xml17
-rw-r--r--SafetyCenter/ConfigLintChecker/Android.bp119
-rw-r--r--SafetyCenter/Resources/Android.bp7
-rw-r--r--SafetyCenter/Resources/res/raw-v35/safety_center_config.xml12
-rw-r--r--SafetyCenter/Resources/res/values-af-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-am-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ar-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-as-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-az-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-b+sr+Latn-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-be-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-bg-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-bn-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-bs-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ca-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-cs-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-da-v35/strings.xml7
-rw-r--r--SafetyCenter/Resources/res/values-de-v35/strings.xml7
-rw-r--r--SafetyCenter/Resources/res/values-el-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-en-rAU-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-en-rCA-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-en-rGB-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-en-rIN-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-en-rXC-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-es-rUS-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-es-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-et-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-eu-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-fa-v34/strings.xml2
-rw-r--r--SafetyCenter/Resources/res/values-fa-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-fa/strings.xml4
-rw-r--r--SafetyCenter/Resources/res/values-fi-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-fi/strings.xml2
-rw-r--r--SafetyCenter/Resources/res/values-fr-rCA-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-fr-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-gl-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-gu-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-hi-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-hr-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-hu-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-hy-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-in-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-is-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-it-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-iw-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ja-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ja/strings.xml4
-rw-r--r--SafetyCenter/Resources/res/values-ka-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-kk-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-km-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-kn-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ko-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ky-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-lo-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-lt-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-lv-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-mk-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ml-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-mn-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-mr-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ms-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-my-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-nb-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ne-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-nl-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-or-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-pa-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-pl-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-pt-rBR-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-pt-rPT-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-pt-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ro-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ru-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-si-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sk-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sl-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sq-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sr-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sv-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-sw-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ta-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-te-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-th-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-tl-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-tr-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-uk-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-ur-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-uz-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-v35/strings.xml7
-rw-r--r--SafetyCenter/Resources/res/values-vi-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-zh-rCN-v34/strings.xml4
-rw-r--r--SafetyCenter/Resources/res/values-zh-rCN-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-zh-rHK-v34/strings.xml2
-rw-r--r--SafetyCenter/Resources/res/values-zh-rHK-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-zh-rTW-v34/strings.xml4
-rw-r--r--SafetyCenter/Resources/res/values-zh-rTW-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/res/values-zu-v35/strings.xml3
-rw-r--r--SafetyCenter/Resources/shared_res/values-pa/strings.xml2
-rw-r--r--flags/Android.bp29
-rw-r--r--flags/flags.aconfig34
-rw-r--r--framework-s/Android.bp7
-rw-r--r--framework-s/api/current.txt1
-rw-r--r--framework-s/api/module-lib-current.txt9
-rw-r--r--framework-s/api/system-current.txt15
-rw-r--r--framework-s/jarjar-rules.txt5
-rw-r--r--framework-s/java/android/app/ecm/EnhancedConfirmationFrameworkInitializer.java51
-rw-r--r--framework-s/java/android/app/ecm/EnhancedConfirmationManager.java356
-rw-r--r--framework-s/java/android/app/ecm/IEnhancedConfirmationManager.aidl (renamed from flags/java/com/android/permission/flags/PermissionsFlags.java)21
-rw-r--r--framework-s/java/android/app/role/IRoleManager.aidl2
-rw-r--r--framework-s/java/android/app/role/RoleManager.java31
-rw-r--r--framework-s/java/android/safetycenter/config/SafetySource.java100
-rw-r--r--framework-s/java/android/safetycenter/config/safety_center_config-v35.xsd223
-rw-r--r--framework-s/lint-baseline.xml22
-rw-r--r--framework/java/android/permission/PermissionStateUnused.java (renamed from framework/java/android/permission/PermissionState.java)2
-rw-r--r--service/Android.bp12
-rw-r--r--service/jarjar-rules.txt5
-rw-r--r--service/java/com/android/ecm/EnhancedConfirmationService.java374
-rw-r--r--service/java/com/android/permission/util/UserUtils.java35
-rw-r--r--service/java/com/android/role/RoleService.java57
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java49
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterConfigReader.java91
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterDataFactory.java228
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterFlags.java22
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterListeners.java4
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterRefreshTracker.java5
-rw-r--r--service/java/com/android/safetycenter/SafetyCenterService.java134
-rw-r--r--service/java/com/android/safetycenter/SafetySources.java19
-rw-r--r--service/java/com/android/safetycenter/UserProfileGroup.java219
-rw-r--r--service/java/com/android/safetycenter/data/SafetyCenterDataManager.java5
-rw-r--r--service/java/com/android/safetycenter/data/SafetyCenterInFlightIssueActionRepository.java4
-rw-r--r--service/java/com/android/safetycenter/data/SafetyCenterIssueRepository.java25
-rw-r--r--service/java/com/android/safetycenter/data/SafetySourceDataValidator.java14
-rw-r--r--service/java/com/android/safetycenter/data/SafetySourceStateCollectedLogger.java13
-rw-r--r--service/java/com/android/safetycenter/logging/SafetyCenterPullAtomCallback.java31
-rw-r--r--service/java/com/android/safetycenter/logging/SafetyCenterStatsdLogger.java82
-rw-r--r--service/java/com/android/safetycenter/notifications/SafetyCenterNotificationReceiver.java5
-rw-r--r--service/java/com/android/safetycenter/notifications/SafetyCenterNotificationSender.java11
-rw-r--r--service/lint-baseline.xml44
-rw-r--r--tests/cts/permission/Android.bp3
-rw-r--r--tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp1
-rw-r--r--tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/AndroidManifest.xml1
-rw-r--r--tests/cts/permission/AppThatAccessesLocationOnCommand/Android.bp1
-rw-r--r--tests/cts/permission/AppThatAlsoDefinesPermissionA/Android.bp1
-rw-r--r--tests/cts/permission/AppThatAlsoDefinesPermissionADifferentCert/Android.bp1
-rw-r--r--tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert/Android.bp1
-rw-r--r--tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert30/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDefinesPermissionA/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup30/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDefinesPermissionWithPlatformGroup/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp1
-rw-r--r--tests/cts/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp1
-rw-r--r--tests/cts/permission/AppThatHasNotificationListener/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestBluetoothPermission30/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestBluetoothPermission31/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocation31/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocationNoProvider/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestContactsPermission15/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestContactsPermission16/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestDevicePermissions/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationAndBackgroundPermission28/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationPermission22/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationPermission28/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationPermission29/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestLocationPermission29v4/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestMultiplePermissionsWithMinMaxSdk/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestOneTimePermission/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestPermissionAandB/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestPermissionAandC/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestStoragePermission28/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestStoragePermission29/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestSystemAlertWindow22/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRequestSystemAlertWindow23/Android.bp1
-rw-r--r--tests/cts/permission/AppThatRunsRationaleTests/Android.bp1
-rw-r--r--tests/cts/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp1
-rw-r--r--tests/cts/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp1
-rw-r--r--tests/cts/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp1
-rw-r--r--tests/cts/permission/AppWithSharedUidThatRequestsPermissions/Android.bp1
-rw-r--r--tests/cts/permission/StorageEscalationApp28/Android.bp1
-rw-r--r--tests/cts/permission/StorageEscalationApp29Full/Android.bp1
-rw-r--r--tests/cts/permission/StorageEscalationApp29Scoped/Android.bp1
-rw-r--r--tests/cts/permission/sdk28/Android.bp1
-rw-r--r--tests/cts/permission/src/android/permission/cts/AccessibilityPrivacySourceTest.kt30
-rw-r--r--tests/cts/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/CameraPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/ContactsProviderTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt361
-rw-r--r--tests/cts/permission/src/android/permission/cts/MinMaxSdkVersionTest.kt2
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoAudioPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoBroadcastPackageRemovedPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoKeyPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoReadLogsPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoSystemFunctionPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoWakeLockPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/NoWallpaperPermissionsTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/PermissionControllerTest.java2
-rw-r--r--tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java129
-rw-r--r--tests/cts/permission/src/android/permission/cts/ProviderPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/RebootPermissionTest.java3
-rw-r--r--tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt31
-rw-r--r--tests/cts/permission/src/android/permission/cts/RevokeSawPermissionTest.kt2
-rw-r--r--tests/cts/permission/src/android/permission/cts/ServicesInstantAppsCannotAccessTests.java7
-rw-r--r--tests/cts/permission/telephony/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp1
-rw-r--r--tests/cts/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp1
-rw-r--r--tests/cts/permissionmultidevice/Android.bp1
-rw-r--r--tests/cts/permissionmultidevice/AndroidManifest.xml1
-rw-r--r--tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt5
-rw-r--r--tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/PermissionUtils.kt34
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt62
-rw-r--r--tests/cts/permissionmultiuser/Android.bp1
-rw-r--r--tests/cts/permissionpolicy/Android.bp3
-rw-r--r--tests/cts/permissionpolicy/OWNERS1
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml1421
-rw-r--r--tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml41
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/ContactsProviderTest.java3
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoCaptureAudioOutputPermissionTest.java3
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoReceiveSmsPermissionTest.java16
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionMaxSdkVersionTest.java3
-rw-r--r--tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionPolicyTest.java36
-rw-r--r--tests/cts/permissionui/Android.bp2
-rw-r--r--tests/cts/permissionui/UsePermissionAppLatest/AndroidManifest.xml3
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt20
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt13
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt265
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt6
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/SensorBlockedBannerTest.kt6
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt25
-rw-r--r--tests/cts/role/Android.bp4
-rw-r--r--tests/cts/role/src/android/app/role/cts/RoleManagerTest.java96
-rw-r--r--tests/cts/safetycenter/Android.bp1
-rw-r--r--tests/cts/safetycenter/src/android/safetycenter/cts/config/SafetySourceTest.kt106
-rw-r--r--tests/functional/safetycenter/multiusers/Android.bp1
-rw-r--r--tests/functional/safetycenter/multiusers/src/android/safetycenter/functional/multiusers/SafetyCenterMultiUsersTest.kt417
-rw-r--r--tests/functional/safetycenter/singleuser/src/android/safetycenter/functional/SafetyCenterManagerTest.kt11
-rw-r--r--tests/hostside/safetycenter/helper-app/Android.bp1
-rw-r--r--tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt46
-rw-r--r--tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterNotificationLoggingHelperTests.kt28
-rw-r--r--tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt101
-rw-r--r--tests/hostside/safetycenter/src/android/safetycenter/hostside/rules/RequireSafetyCenterRule.kt13
-rw-r--r--tests/utils/safetycenter/Android.bp1
-rw-r--r--tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt26
-rw-r--r--tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt38
628 files changed, 12247 insertions, 2188 deletions
diff --git a/Android.bp b/Android.bp
index ae681e403..7a2f39fc3 100644
--- a/Android.bp
+++ b/Android.bp
@@ -23,7 +23,7 @@ apex {
defaults: ["com.android.permission-defaults"],
manifest: "apex_manifest.json",
compat_configs: [
- "framework-permission-s-compat-config"
+ "framework-permission-s-compat-config",
],
}
@@ -108,6 +108,7 @@ bootclasspath_fragment {
// result in a build failure due to inconsistent flags.
package_prefixes: [
"android.app.role",
+ "android.app.ecm",
"android.permission.jarjar",
"android.safetycenter",
"android.safetylabel",
diff --git a/PermissionController/Android.bp b/PermissionController/Android.bp
index 442495df2..34351a309 100644
--- a/PermissionController/Android.bp
+++ b/PermissionController/Android.bp
@@ -53,9 +53,6 @@ java_library {
srcs: [
":statslog-permissioncontroller-java-gen",
],
- lint: {
- baseline_filename: "lint-baseline.xml",
- },
}
java_library {
@@ -150,7 +147,7 @@ android_library {
"lottie",
"safety-label",
"role-controller",
- "permissions-flags-lib",
+ "permissions-aconfig-flags-lib",
"android.permission.flags-aconfig-java",
"androidx.compose.foundation_foundation",
"androidx.compose.runtime_runtime",
@@ -160,8 +157,8 @@ android_library {
],
lint: {
- strict_updatability_linting: true,
error_checks: ["Recycle"],
+ baseline_filename: "lint-baseline.xml",
},
apex_available: [
@@ -190,9 +187,7 @@ android_app {
static_libs: ["PermissionController-lib"],
lint: {
- strict_updatability_linting: true,
error_checks: ["Recycle"],
- baseline_filename: "lint-baseline.xml",
},
optimize: {
diff --git a/PermissionController/AndroidManifest.xml b/PermissionController/AndroidManifest.xml
index 0d663bc05..4bd7720d0 100644
--- a/PermissionController/AndroidManifest.xml
+++ b/PermissionController/AndroidManifest.xml
@@ -66,6 +66,8 @@
<uses-permission android:name="android.permission.START_TASKS_FROM_RECENTS" />
<uses-permission android:name="android.permission.READ_APP_SPECIFIC_LOCALES" />
<uses-permission android:name="android.permission.GET_APP_METADATA" />
+ <uses-permission android:name="android.permission.NFC_PREFERRED_PAYMENT_INFO" />
+ <uses-permission android:name="android.permission.MANAGE_ENHANCED_CONFIRMATION_STATES" />
<application android:name="com.android.permissioncontroller.PermissionControllerApplication"
android:label="@string/app_name"
@@ -281,6 +283,19 @@
</intent-filter>
</activity>
+ <activity android:name="com.android.permissioncontroller.ecm.EnhancedConfirmationDialog"
+ android:theme="@style/GrantPermissions.FilterTouches"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:launchMode="singleTop"
+ android:permission="android.permission.MANAGE_ENHANCED_CONFIRMATION_STATES"
+ android:enabled="@bool/is_at_least_v">
+ <intent-filter android:priority="1">
+ <action android:name="android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
<activity android:name="com.android.permissioncontroller.permission.ui.v34.PermissionRationaleActivity"
android:configChanges="keyboardHidden|screenSize"
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
@@ -472,6 +487,18 @@
</intent-filter>
</activity>
+ <activity android:name="com.android.permissioncontroller.role.ui.ChangeDefaultCardEmulationActivity"
+ android:enabled="@bool/is_at_least_v"
+ android:excludeFromRecents="true"
+ android:noHistory="true"
+ android:exported="true"
+ android:theme="@android:style/Theme.NoDisplay">
+ <intent-filter android:priority="1001">
+ <action android:name="android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
<provider android:name="com.android.permissioncontroller.permission.service.PermissionSearchIndexablesProvider"
android:authorities="com.android.permissioncontroller"
android:multiprocess="false"
@@ -593,6 +620,7 @@
android:name="com.android.permissioncontroller.safetycenter.ui.SafetyCenterActivity"
android:enabled="@bool/is_at_least_t"
android:exported="true"
+ android:enableOnBackInvokedCallback="true"
android:theme="@style/Theme.SafetyCenter">
<intent-filter android:priority="1">
<action android:name="android.intent.action.SAFETY_CENTER"/>
diff --git a/PermissionController/TEST_MAPPING b/PermissionController/TEST_MAPPING
index a7f2aec54..084670e76 100644
--- a/PermissionController/TEST_MAPPING
+++ b/PermissionController/TEST_MAPPING
@@ -49,6 +49,18 @@
"file_patterns": ["res/xml/roles\\.xml"]
},
{
+ "name": "PermissionControllerMockingTests[com.google.android.permission.apex]",
+ "options": [
+ {
+ "include-filter": "com.android.permissioncontroller.tests.mocking.role.model.RoleParserTest"
+ },
+ {
+ "exclude-annotation": "androidx.test.filters.FlakyTest"
+ }
+ ],
+ "file_patterns": ["res/xml/roles\\.xml"]
+ },
+ {
"name": "PermissionUiTestCases[com.google.android.permission.apex]",
"options": [
{
@@ -108,6 +120,15 @@
"file_patterns": ["res/xml/roles\\.xml"]
},
{
+ "name": "PermissionControllerMockingTests[com.google.android.permission.apex]",
+ "options": [
+ {
+ "include-filter": "com.android.permissioncontroller.tests.mocking.role.model.RoleParserTest"
+ }
+ ],
+ "file_patterns": ["res/xml/roles\\.xml"]
+ },
+ {
"name": "PermissionUiTestCases[com.google.android.permission.apex]",
"options": [
// TODO(b/238773220): These tests currently fails on R base image
diff --git a/PermissionController/jarjar-rules.txt b/PermissionController/jarjar-rules.txt
index f4d8a0be2..4df97f4c0 100644
--- a/PermissionController/jarjar-rules.txt
+++ b/PermissionController/jarjar-rules.txt
@@ -1 +1,2 @@
-rule android.permission.flags.** com.android.permissioncontroller.jarjar.@0
+rule android.permission.flags.*Flags* com.android.permissioncontroller.jarjar.@0
+rule android.permission.flags.Flags com.android.permissioncontroller.jarjar.@0
diff --git a/PermissionController/lint-baseline.xml b/PermissionController/lint-baseline.xml
index 546ed596d..5d77d8c81 100644
--- a/PermissionController/lint-baseline.xml
+++ b/PermissionController/lint-baseline.xml
@@ -1,92 +1,224 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.apphibernation.AppHibernationManager#isHibernatingForUser`"
- errorLine1=" if (hibernationManager.isHibernatingForUser(pkg.packageName)) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ message="Class requires API level 34 (current min is 31): `android.app.AppOpsManager.OnOpNotedListener`"
+ errorLine1=" AppOpsManager.OnOpNotedListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
- line="56"
- column="44"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt"
+ line="46"
+ column="5"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.content.pm.Attribution#getLabel`"
- errorLine1=" attributions?.forEach { attributionTagToLabel[it.tag] = it.label }"
- errorLine2=" ~~~~~">
+ message="Class requires API level 34 (current min is 31): `android.app.AppOpsManager.OnOpNotedListener`"
+ errorLine1=" AppOpsManager.OnOpNotedListener,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
- line="125"
- column="72"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightPackageOpsLiveData.kt"
+ line="43"
+ column="5"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.content.pm.Attribution#getTag`"
- errorLine1=" attributions?.forEach { attributionTagToLabel[it.tag] = it.label }"
- errorLine2=" ~~~">
+ message="Call requires API level 33 (current min is 30): `getIconId`"
+ errorLine1=" .setIcon(args.getIconId())"
+ errorLine2=" ~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
- line="125"
- column="62"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="504"
+ column="31"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#canAdminGrantSensorsPermissions`"
- errorLine1=" params.getGrantState(), params.canAdminGrantSensorsPermissions())));"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getMessageId`"
+ errorLine1=" .setMessage(args.getMessageId())"
+ errorLine2=" ~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
- line="517"
- column="48"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="505"
+ column="34"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getGrantState`"
- errorLine1=" params.getGrantState(), params.canAdminGrantSensorsPermissions())));"
- errorLine2=" ~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getNegativeButtonTextId`"
+ errorLine1=" .setNegativeButton(args.getNegativeButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
- line="517"
- column="24"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="509"
+ column="41"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getGranteePackageName`"
- errorLine1=" callerPackageName, params.getGranteePackageName(), params.getPermission(),"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getPositiveButtonTextId`"
+ errorLine1=" .setPositiveButton(args.getPositiveButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
- line="516"
- column="43"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="513"
+ column="41"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getPermission`"
- errorLine1=" callerPackageName, params.getGranteePackageName(), params.getPermission(),"
- errorLine2=" ~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getSetOneTime`"
+ errorLine1=" mViewModel.requestChange(args.getSetOneTime(),"
+ errorLine2=" ~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
- line="516"
- column="75"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="515"
+ column="59"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.hardware.SensorPrivacyManager#addSensorPrivacyListener`"
- errorLine1=" mSensorPrivacyManager.addSensorPrivacyListener(mPrivacyChangedListener);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getChangeRequest`"
+ errorLine1=" args.getChangeRequest(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionsFragment.java"
- line="159"
- column="35"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="518"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getButtonClicked`"
+ errorLine1=" args.getButtonClicked());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="519"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" if (args.getTitleId() != 0) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="521"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" b.setTitle(args.getTitleId());"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
+ line="522"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getIconId`"
+ errorLine1=" .setIcon(args.getIconId())"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="709"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getMessageId`"
+ errorLine1=" .setMessage(args.getMessageId())"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="710"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getNegativeButtonTextId`"
+ errorLine1=" .setNegativeButton(args.getNegativeButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="714"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getPositiveButtonTextId`"
+ errorLine1=" .setPositiveButton(args.getPositiveButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="718"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getSetOneTime`"
+ errorLine1=" mViewModel.requestChange(args.getSetOneTime(),"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="720"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getButtonClicked`"
+ errorLine1=" args.getChangeRequest(), args.getButtonClicked());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="722"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getChangeRequest`"
+ errorLine1=" args.getChangeRequest(), args.getButtonClicked());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="722"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" if (args.getTitleId() != 0) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="724"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" b.setTitle(args.getTitleId());"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
+ line="725"
+ column="29"/>
</issue>
<issue
@@ -95,8 +227,8 @@
errorLine1=" mSensorPrivacyManager.addSensorPrivacyListener(mPrivacyChangedListener);"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
- line="114"
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionsFragment.java"
+ line="159"
column="35"/>
</issue>
@@ -113,101 +245,134 @@
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.hardware.SensorPrivacyManager#removeSensorPrivacyListener`"
- errorLine1=" mSensorPrivacyManager.removeSensorPrivacyListener(mPrivacyChangedListener);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getIconId`"
+ errorLine1=" .setIcon(args.getIconId())"
+ errorLine2=" ~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
- line="365"
- column="35"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="463"
+ column="31"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterData#getIssues`"
- errorLine1=" issues"
- errorLine2=" ~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getMessageId`"
+ errorLine1=" .setMessage(args.getMessageId())"
+ errorLine2=" ~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="309"
- column="5"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="464"
+ column="34"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterData#getIssues`"
- errorLine1="private fun SafetyCenterData.buildIssueIdSet(): Set&lt;IssueId&gt; = issues.map { it.id }.toSet()"
- errorLine2=" ~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getNegativeButtonTextId`"
+ errorLine1=" .setNegativeButton(args.getNegativeButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="323"
- column="64"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="468"
+ column="41"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterData#getStatus`"
- errorLine1=" status.refreshStatus == SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS"
- errorLine2=" ~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getPositiveButtonTextId`"
+ errorLine1=" .setPositiveButton(args.getPositiveButtonTextId(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="321"
- column="5"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="472"
+ column="41"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getActions`"
- errorLine1=" issue.actions"
- errorLine2=" ~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getSetOneTime`"
+ errorLine1=" mViewModel.requestChange(args.getSetOneTime(),"
+ errorLine2=" ~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="311"
- column="19"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="474"
+ column="59"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getId`"
- errorLine1=" .map { issue.id to it.id }"
- errorLine2=" ~~">
+ message="Call requires API level 33 (current min is 30): `getButtonClicked`"
+ errorLine1=" args.getChangeRequest(), args.getButtonClicked());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="315"
- column="30"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="476"
+ column="67"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getId`"
- errorLine1="private fun SafetyCenterData.buildIssueIdSet(): Set&lt;IssueId&gt; = issues.map { it.id }.toSet()"
- errorLine2=" ~~">
+ message="Call requires API level 33 (current min is 30): `getChangeRequest`"
+ errorLine1=" args.getChangeRequest(), args.getButtonClicked());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="323"
- column="80"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="476"
+ column="42"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#getId`"
- errorLine1=" .map { issue.id to it.id }"
- errorLine2=" ~~">
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" if (args.getTitleId() != 0) {"
+ errorLine2=" ~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="315"
- column="39"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="478"
+ column="18"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#getSuccessMessage`"
- errorLine1=" .filter { it.isInFlight &amp;&amp; !it.successMessage.isNullOrEmpty() }"
- errorLine2=" ~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `getTitleId`"
+ errorLine1=" b.setTitle(args.getTitleId());"
+ errorLine2=" ~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="314"
- column="48"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
+ line="479"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 34 (current min is 30): `android.health.connect.HealthConnectManager#isHealthPermission`"
+ errorLine1=" .filter { permission -&gt; isHealthPermission(activity, permission) }"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt"
+ line="1059"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 31 (current min is 30): `android.apphibernation.AppHibernationManager`"
+ errorLine1=" userContext.getSystemService(APP_HIBERNATION_SERVICE) as AppHibernationManager"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
+ line="48"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 31 (current min is 30): `android.apphibernation.AppHibernationManager#isHibernatingForUser`"
+ errorLine1=" if (hibernationManager.isHibernatingForUser(pkg.packageName)) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
+ line="51"
+ column="44"/>
</issue>
<issue
@@ -223,156 +388,167 @@
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#isInFlight`"
- errorLine1=" .filter { it.isInFlight &amp;&amp; !it.successMessage.isNullOrEmpty() }"
- errorLine2=" ~~~~~~~~~~">
+ message="Call requires API level 31 (current min is 30): `android.os.UserManager#isCloneProfile`"
+ errorLine1=" if (userManager.isCloneProfile) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="314"
- column="30"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
+ line="653"
+ column="29"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#isSafetyCenterEnabled`"
- errorLine1=" if (!safetyCenterManager.isSafetyCenterEnabled()) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.app.Activity#startActivityForResultAsUser`"
+ errorLine1=" activity.startActivityForResultAsUser(pickerIntent, requestCode, user)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
- line="96"
- column="34"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
+ line="662"
+ column="18"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#isSafetyCenterEnabled`"
- errorLine1=" if (!safetyCenterManager.isSafetyCenterEnabled()) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 34 (current min is 30): `android.health.connect.HealthConnectManager#getHealthPermissions`"
+ errorLine1=" val permissions = HealthConnectManager.getHealthPermissions(context)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
- line="149"
- column="34"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
+ line="1689"
+ column="48"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#isSafetyCenterEnabled`"
- errorLine1=" if (!scManager.isSafetyCenterEnabled) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 31 (current min is 30): `android.content.pm.Attribution#getLabel`"
+ errorLine1=" attributions?.forEach { attributionTagToLabel[it.tag] = it.label }"
+ errorLine2=" ~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt"
- line="48"
- column="24"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
+ line="140"
+ column="72"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#refreshSafetySources`"
- errorLine1=" safetyCenterManager.refreshSafetySources(getRefreshReason());"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 31 (current min is 30): `android.content.pm.Attribution#getTag`"
+ errorLine1=" attributions?.forEach { attributionTagToLabel[it.tag] = it.label }"
+ errorLine2=" ~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
- line="155"
- column="29"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
+ line="140"
+ column="62"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterStatus#getRefreshStatus`"
- errorLine1=" status.refreshStatus == SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS"
- errorLine2=" ~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getActions`"
+ errorLine1=" issue.actions"
+ errorLine2=" ~~~~~~~">
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
- line="321"
- column="12"/>
+ line="288"
+ column="19"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `recordPermissionDecision`"
- errorLine1=" PermissionDecisionStorageImpl.recordPermissionDecision(app.applicationContext,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#getSuccessMessage`"
+ errorLine1=" .filter { it.isInFlight &amp;&amp; !it.successMessage.isNullOrEmpty() }"
+ errorLine2=" ~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt"
- line="1147"
- column="39"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="291"
+ column="48"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 30): `android.content.pm.PackageManager#getAppMetadata`"
- errorLine1=" app.packageManager.getAppMetadata(packageName)"
- errorLine2=" ~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#isInFlight`"
+ errorLine1=" .filter { it.isInFlight &amp;&amp; !it.successMessage.isNullOrEmpty() }"
+ errorLine2=" ~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/SafetyLabelInfoLiveData.kt"
- line="116"
- column="32"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="291"
+ column="30"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 30): `android.health.connect.HealthConnectManager#getHealthPermissions`"
- errorLine1=" val permissions = HealthConnectManager.getHealthPermissions(context)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getId`"
+ errorLine1=" .map { issue.id to it.id }"
+ errorLine2=" ~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
- line="1465"
- column="48"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="292"
+ column="30"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 30): `android.health.connect.HealthConnectManager#isHealthPermission`"
- errorLine1=" isHealthPermission(activity, permission)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue.Action#getId`"
+ errorLine1=" .map { issue.id to it.id }"
+ errorLine2=" ~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt"
- line="1268"
- column="17"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="292"
+ column="39"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 31 (current min is 30): `android.apphibernation.AppHibernationManager`"
- errorLine1=" userContext.getSystemService(APP_HIBERNATION_SERVICE) as AppHibernationManager"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterData#getStatus`"
+ errorLine1=" status.refreshStatus == SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS"
+ errorLine2=" ~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
- line="53"
- column="74"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="298"
+ column="5"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager`"
- errorLine1=" context.getSystemService(SafetyCenterManager.class);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterStatus#getRefreshStatus`"
+ errorLine1=" status.refreshStatus == SafetyCenterStatus.REFRESH_STATUS_FULL_RESCAN_IN_PROGRESS"
+ errorLine2=" ~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
- line="84"
- column="42"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="298"
+ column="12"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager`"
- errorLine1=" SafetyCenterManager safetyCenterManager = this.getSystemService(SafetyCenterManager.class);"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterIssue#getId`"
+ errorLine1=" allResolvableIssues.map { it.id }.toSet()"
+ errorLine2=" ~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
- line="144"
- column="73"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="301"
+ column="34"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager`"
- errorLine1=" val scManager = getSystemService(SafetyCenterManager::class.java)!!"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterData#getIssues`"
+ errorLine1=" issues.asSequence()"
+ errorLine2=" ~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/v33/SafetyCenterQsTileService.kt"
- line="41"
- column="42"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
+ line="308"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Field requires API level 33 (current min is 30): `Companion`"
+ errorLine1=" MoreIssuesCardPreference.TAG,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/MoreIssuesCardAnimator.kt"
+ line="110"
+ column="21"/>
</issue>
<issue
@@ -382,88 +558,140 @@
errorLine2=" ~~~">
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/MoreIssuesCardAnimator.kt"
- line="107"
+ line="110"
column="46"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.app.AppOpsManager.HistoricalOp#getDiscreteAccessAt`">
+ message="Call requires API level 33 (current min is 30): `android.hardware.SensorPrivacyManager#addSensorPrivacyListener`"
+ errorLine1=" mSensorPrivacyManager.addSensorPrivacyListener(mPrivacyChangedListener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/v31/LightHistoricalPackageOps.kt"
- line="153"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
+ line="114"
+ column="35"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.app.AppOpsManager.HistoricalOp#getDiscreteAccessAt`">
+ message="Call requires API level 33 (current min is 30): `android.hardware.SensorPrivacyManager#removeSensorPrivacyListener`"
+ errorLine1=" mSensorPrivacyManager.removeSensorPrivacyListener(mPrivacyChangedListener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/v31/LightHistoricalPackageOps.kt"
- line="188"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
+ line="365"
+ column="35"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.app.AppOpsManager.HistoricalOp#getDiscreteAccessCount`">
+ message="Call requires API level 31 (current min is 30): `SensorStatusLiveData`"
+ errorLine1=" lazy(LazyThreadSafetyMode.NONE) { SensorStatusLiveData() }"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/v31/LightHistoricalPackageOps.kt"
- line="152"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt"
+ line="100"
+ column="43"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.app.AppOpsManager.HistoricalOp#getDiscreteAccessCount`">
+ message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getGranteePackageName`"
+ errorLine1=" callerPackageName, params.getGranteePackageName(), params.getPermission(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/v31/LightHistoricalPackageOps.kt"
- line="187"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
+ line="521"
+ column="43"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.app.AppOpsManager.HistoricalOpsRequest.Builder#setHistoryFlags`">
+ message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getPermission`"
+ errorLine1=" callerPackageName, params.getGranteePackageName(), params.getPermission(),"
+ errorLine2=" ~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt"
- line="104"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
+ line="521"
+ column="75"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `getParentGroupId`">
+ message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#canAdminGrantSensorsPermissions`"
+ errorLine1=" params.getGrantState(), params.canAdminGrantSensorsPermissions())));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java"
- line="91"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
+ line="522"
+ column="48"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `openRelevantSubpage`">
+ message="Call requires API level 31 (current min is 30): `android.permission.AdminPermissionControlParams#getGrantState`"
+ errorLine1=" params.getGrantState(), params.canAdminGrantSensorsPermissions())));"
+ errorLine2=" ~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java"
- line="88"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
+ line="522"
+ column="24"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `openRelevantSubpage`">
+ message="Class requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager`"
+ errorLine1=" context.getSystemService(SafetyCenterManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterActivity.java"
- line="92"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
+ line="85"
+ column="42"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 34 (current min is 30): `android.app.AppOpsManager.OnOpNotedListener`">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#isSafetyCenterEnabled`"
+ errorLine1=" if (!safetyCenterManager.isSafetyCenterEnabled()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt"
- line="46"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
+ line="97"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager`"
+ errorLine1=" SafetyCenterManager safetyCenterManager = this.getSystemService(SafetyCenterManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
+ line="141"
+ column="73"/>
</issue>
<issue
id="NewApi"
- message="Class requires API level 34 (current min is 30): `android.app.AppOpsManager.OnOpNotedListener`">
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#isSafetyCenterEnabled`"
+ errorLine1=" if (!safetyCenterManager.isSafetyCenterEnabled()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightPackageOpsLiveData.kt"
- line="43"/>
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
+ line="146"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 33 (current min is 30): `android.safetycenter.SafetyCenterManager#refreshSafetySources`"
+ errorLine1=" safetyCenterManager.refreshSafetySources(getRefreshReason());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
+ line="152"
+ column="29"/>
</issue>
</issues> \ No newline at end of file
diff --git a/PermissionController/res/drawable-v34/ic_lock_closed.xml b/PermissionController/res/drawable-v34/ic_lock_closed.xml
new file mode 100644
index 000000000..e61a2d4a5
--- /dev/null
+++ b/PermissionController/res/drawable-v34/ic_lock_closed.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M12,15m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M18,8h-1.5V5.5C16.5,3.01 14.49,1 12,1S7.5,3.01 7.5,5.5V8H6c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V10C20,8.9 19.1,8 18,8zM9.5,5.5C9.5,4.12 10.62,3 12,3c1.38,0 2.5,1.12 2.5,2.5V8h-5V5.5zM18,20H6V10h1.5h9H18V20z"/>
+</vector>
diff --git a/PermissionController/res/layout-v33/view_more_issues.xml b/PermissionController/res/layout-v33/view_more_issues.xml
index e1db725ad..7365e11c5 100644
--- a/PermissionController/res/layout-v33/view_more_issues.xml
+++ b/PermissionController/res/layout-v33/view_more_issues.xml
@@ -15,31 +15,58 @@
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView
android:id="@+id/status_icon"
android:importantForAccessibility="no"
android:src="@drawable/safety_status_info"
- style="@style/SafetyCenterMoreIssuesIcon"/>
+ style="@style/SafetyCenterMoreIssuesIcon"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/title"/>
<TextView
- android:id="@+id/title"
- style="@style/SafetyCenterMoreIssuesTitle"/>
+ android:id="@id/title"
+ style="@style/SafetyCenterMoreIssuesTitle"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/status_icon"
+ app:layout_constraintEnd_toStartOf="@+id/widget_title"/>
- <LinearLayout
- android:id="@android:id/widget_frame"
- style="@style/SafetyCenterMoreIssuesCounter">
+ <View
+ android:id="@+id/widget_background"
+ style="@style/SafetyCenterMoreIssuesCounter"
+ app:layout_constraintTop_toTopOf="@id/widget_title"
+ app:layout_constraintBottom_toBottomOf="@id/widget_title"
+ app:layout_constraintStart_toStartOf="@id/widget_title"
+ app:layout_constraintEnd_toEndOf="parent"/>
- <TextView
- android:id="@+id/widget_title"
- style="@style/SafetyCenterMoreIssuesWidgetTitle" />
+ <TextView
+ android:id="@id/widget_title"
+ style="@style/SafetyCenterMoreIssuesWidgetTitle"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/title"
+ app:layout_constraintEnd_toStartOf="@+id/widget_icon"/>
+
+ <ImageView
+ android:id="@id/widget_icon"
+ android:importantForAccessibility="no"
+ style="@style/SafetyCenterMoreIssuesWidgetIcon"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintStart_toEndOf="@id/widget_title"
+ app:layout_constraintEnd_toEndOf="parent"/>
- <ImageView
- android:id="@+id/widget_icon"
- android:importantForAccessibility="no"
- style="@style/SafetyCenterMoreIssuesWidgetIcon" />
+ <androidx.constraintlayout.widget.Group
+ android:id="@+id/widget_frame"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="visible"
+ app:constraint_referenced_ids="widget_background,widget_title,widget_icon"/>
- </LinearLayout>
-</merge> \ No newline at end of file
+</merge>
diff --git a/PermissionController/res/layout-v34/enhanced_confirmation_dialog.xml b/PermissionController/res/layout-v34/enhanced_confirmation_dialog.xml
new file mode 100644
index 000000000..4f8d4cb08
--- /dev/null
+++ b/PermissionController/res/layout-v34/enhanced_confirmation_dialog.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/enhanced_confirmation_dialog_padding"
+ android:paddingStart="@dimen/enhanced_confirmation_dialog_padding"
+ android:paddingEnd="@dimen/enhanced_confirmation_dialog_padding"
+ android:paddingBottom="@dimen/enhanced_confirmation_dialog_padding_bottom"
+ android:orientation="vertical">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center_horizontal"
+ android:paddingBottom="@dimen/enhanced_confirmation_dialog_title_bottom_padding">
+ <ImageView
+ android:id="@+id/enhanced_confirmation_icon"
+ android:layout_width="@dimen/enhanced_confirmation_dialog_icon_size"
+ android:layout_height="@dimen/enhanced_confirmation_dialog_icon_size"
+ android:scaleType="fitCenter"
+ android:src="@drawable/ic_safety_center_shield"
+ android:tint="?android:attr/colorAccent"
+ android:contentDescription="@null"/>
+ <TextView
+ android:id="@+id/enhanced_confirmation_dialog_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:gravity="center_horizontal"
+ android:text="@string/enhanced_confirmation_dialog_title"
+ android:textAppearance="@style/TextAppearance.EnhancedConfirmationDialogHeadline"/>
+ </LinearLayout>
+
+ <ScrollView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:fadeScrollbars="false">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+ <TextView
+ android:id="@+id/enhanced_confirmation_dialog_desc"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textAppearance="@style/TextAppearance.EnhancedConfirmationDialogMessage"
+ android:maxLength="200"
+ android:gravity="start"
+ android:autoLink="email|phone|web"
+ android:text="@string/enhanced_confirmation_dialog_desc"
+ android:textColor="?android:attr/textColorSecondary"/>
+ </LinearLayout>
+ </ScrollView>
+</LinearLayout>
diff --git a/PermissionController/res/layout/request_role_item.xml b/PermissionController/res/layout/request_role_item.xml
index d7d142289..39e458aa2 100644
--- a/PermissionController/res/layout/request_role_item.xml
+++ b/PermissionController/res/layout/request_role_item.xml
@@ -24,28 +24,23 @@
<ImageView
android:id="@+id/icon"
- android:duplicateParentState="true"
style="@style/RequestRoleItemIcon" />
<LinearLayout
android:id="@+id/title_and_subtitle"
- android:duplicateParentState="true"
style="@style/RequestRoleItemTitleLayout">
<TextView
android:id="@+id/title"
- android:duplicateParentState="true"
style="@style/RequestRoleItemTitleText" />
<TextView
android:id="@+id/subtitle"
- android:duplicateParentState="true"
style="@style/RequestRoleItemSubtitleText" />
</LinearLayout>
<RadioButton
android:clickable="false"
- android:duplicateParentState="true"
android:focusable="false"
style="@style/RequestRoleItemRadioButton" />
</com.android.permissioncontroller.role.ui.CheckableLinearLayout>
diff --git a/PermissionController/res/values-af-v34/strings.xml b/PermissionController/res/values-af-v34/strings.xml
index db69a7032..a052addb6 100644
--- a/PermissionController/res/values-af-v34/strings.xml
+++ b/PermissionController/res/values-af-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Liggingtoegang"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Vir apps en dienste. As hierdie instelling af is, kan mikrofoondata steeds gedeel word wanneer jy ’n noodnommer bel"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Vir apps en dienste"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Beperkte instelling"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Hierdie instelling is vir jou veiligheid tans onbeskikbaar."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Meer inligting"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-af-watch/strings.xml b/PermissionController/res/values-af-watch/strings.xml
index 3386aa514..c6cfd6038 100644
--- a/PermissionController/res/values-af-watch/strings.xml
+++ b/PermissionController/res/values-af-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Onveranderbaar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Kanselleer"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Altyd"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Terwyl app gebruik word"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Altyd"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Terwyl app gebruik word"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Altyd"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Terwyl app gebruik word"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Altyd"</string>
</resources>
diff --git a/PermissionController/res/values-af/strings.xml b/PermissionController/res/values-af/strings.xml
index 0f9558fb4..6015ec3ce 100644
--- a/PermissionController/res/values-af/strings.xml
+++ b/PermissionController/res/values-af/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alle toestemmings"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ander programvermoëns"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Toestemmingsversoek"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Installeer- en deïnstalleerhandelinge word nie in Wear gesteun nie."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Kies waartoe &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang mag kry"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; is opgedateer. Kies waartoe hierdie program toegang mag kry."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Kanselleer"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Verwyder toestemmings as program nie gebruik word nie"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Verwyder toestemmings en maak spasie beskikbaar"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Onderbreek programaktiwiteit as ongebruik"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Bestuur app indien ongebruik"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Verwyder toestemmings, vee tydelike lêers uit, en stop kennisgewings"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Verwyder toestemmings, vee tydelike lêers uit, stop kennisgewings en argiveer die app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Om jou data te beskerm, sal toestemmings vir hierdie program verwyder word as die program \'n paar maande nie gebruik word nie."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Om jou data te beskerm, sal die volgende toestemmings verwyder word as dit vir \'n paar maande nie gebruik word nie: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Om jou data te beskerm, is toestemmings verwyder van programme wat jy \'n paar maande gelede laas gebruik het."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notasapp"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps wat jou toelaat om notas op jou toestel te maak"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Verstekbeursie-app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Beursie-app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Beursie-apps kan jou krediet- en lojaliteitskaarte, motorsleutels en ander goed stoor om met verskeie vorme van transaksies te help."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Stel <xliff:g id="APP_NAME">%1$s</xliff:g> as jou verstekbeursie-app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Geen toestemmings is nodig nie"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Huidige verstek"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Moenie weer vra nie"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Stel as verstek"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Datadelingopdaterings"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Sommige apps het die manier waarop hulle jou liggingdata kan deel, verander"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Instellings"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Ingegaan <xliff:g id="TIME_DATE">%1$s</xliff:g>."</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Gister ingegaan <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Ingegaan <xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Jou eenmalige wagwoord is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-am-v34/strings.xml b/PermissionController/res/values-am-v34/strings.xml
index 52f5188ba..7ce8735fe 100644
--- a/PermissionController/res/values-am-v34/strings.xml
+++ b/PermissionController/res/values-am-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"የአካባቢ መዳረሻ"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ለመተግበሪያዎች እና አገልግሎቶች። ይህ ቅንብር ከጠፋ እርስዎ ወደ አንድ የአደጋ ጊዜ ቁጥር ሲደውሉ የማይክሮፎን ውሂብ አሁንም ሊጋራ ይችላል"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ለመተግበሪያዎች እና አገልግሎቶች"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"የተገደበ ቅንብር"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ለእርስዎ ደህንነት ሲባል ይህ ቅንብር በአሁኑ ጊዜ አይገኝም።"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"የበለጠ ለመረዳት"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-am-watch/strings.xml b/PermissionController/res/values-am-watch/strings.xml
index 69a852865..463161920 100644
--- a/PermissionController/res/values-am-watch/strings.xml
+++ b/PermissionController/res/values-am-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ሊለወጥ አይችልም"</string>
<string name="generic_yes" msgid="2489207724988649846">"አዎ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ይቅር"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ሁልጊዜ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"መተግበሪያ እየተጠቀሙ ሳለ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ሁልጊዜ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"መተግበሪያ እየተጠቀሙ ሳለ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ሁልጊዜ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"መተግበሪያ እየተጠቀሙ ሳለ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ሁልጊዜ"</string>
</resources>
diff --git a/PermissionController/res/values-am/strings.xml b/PermissionController/res/values-am/strings.xml
index de2e0c8d8..1671a2c5f 100644
--- a/PermissionController/res/values-am/strings.xml
+++ b/PermissionController/res/values-am/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ሁሉም ፍቃዶች"</string>
<string name="other_permissions" msgid="2901186127193849594">"ሌሎች የመተግበሪያ ችሎታዎች"</string>
<string name="permission_request_title" msgid="8790310151025020126">"የፍቃድ ጥያቄ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"በWear ላይ የመጫን/ማራገፍ እርምጃዎች አይደገፉም።"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ምን መድረስ እንደሚችል ይምረጡ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ተዘምኗል። ይህ መተግበሪያ ምን መድረስ እንደሚችል ይምረጡ።"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ይቅር"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"መተግበሪያ ጥቅም ላይ ካልዋለ ፈቃዶችን አስወግድ"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ፈቃዶችን ያስወግዱ እና ቦታ ያስለቅቁ"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"የመተግበሪያ እንቅስቃሴ ሥራ ላይ ካልዋለ ባለበት አቁም"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ጥቅም ላይ ካልዋለ መተግበሪያን ያስተዳድሩ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ፈቃዶችን አስወግድ፣ ጊዜያዊ ፋይሎችን ሰርዝ እና ማሳወቂያዎችን አቁም"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ፈቃዶችን ያስወግዱ፣ ጊዜያዊ ፋይሎችን ይሰርዙ፣ ማሳወቂያዎችን ያቁሙ እና መተግበሪያውን በማህደር ያስቀምጡ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ለእርስዎ ውሂብ ጥበቃ ለማድረግ፣ ለዚህ መተግበሪያ የተሰጡ ፈቃዶች መተግበሪያው ለጥቂት ወራት ጥቅም ላይ ካልዋለ ይህ መተግበሪያ ይወገዳል።"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"የእርስዎን ውሂብ ለመጠበቅ፣ መተግበሪያው ለጥቂት ወራት ጥቅም ላይ ካልዋለ፣ የሚከተሉት ፈቃዶች ይወገዳሉ፦ <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"የእርስዎን ውሂብ ለመጠበቅ ሲባል ለጥቂት ወራት ካልተጠቀሙባቸው መተግበሪያዎች ላይ ፈቃዶች ተወግደዋል።"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"የማስታወሻዎች መተግበሪያ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"በመሣሪያዎ ላይ ማስታወሻ እንዲይዙ የሚያስችሉዎት መተግበሪያዎች"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ማስታወሻዎች"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ነባሪ የwallet መተግበሪያ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"የwallet መተግበሪያ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"የWallet መተግበሪያዎች የተለያዩ የግብይት ዓይነቶችን ለማገዝ የክሬዲትና የታማኝነት ካርዶችዎን፣ የመኪና ቁልፎችዎን እና ሌሎች ነገሮችን ማከማቸት ይችላሉ።"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> እንደ ነባሪ የWallet መተግበሪያዎ ይቀናበር?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ምንም ፈቃዶች አያስፈልጉም"</string>
<string name="request_role_current_default" msgid="738722892438247184">"አሁን ያለ ነባሪ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ዳግም አትጠይቅ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"እንደ ነባሪ አዘጋጅ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"የውሂብ ማጋራት ዝማኔዎች"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"አንዳንድ መተግበሪያዎች የእርስዎን የአካባቢ ውሂብ ሊያጋሩ የሚችሉበትን መንገድ ለውጠዋል"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ቅንብሮች"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"በ<xliff:g id="TIME_DATE">%1$s</xliff:g> ላይ ተደርስበታል"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ትላንት በ<xliff:g id="TIME_DATE">%1$s</xliff:g> ላይ ተደርስበታል"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"በ<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ላይ ተደርስበታል"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"የአንድ ጊዜ የይለፍ ቃልዎ 132435 ነው"</string>
</resources>
diff --git a/PermissionController/res/values-ar-v34/strings.xml b/PermissionController/res/values-ar-v34/strings.xml
index 5a0d25e63..ea3c41540 100644
--- a/PermissionController/res/values-ar-v34/strings.xml
+++ b/PermissionController/res/values-ar-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"الوصول إلى الموقع الجغرافي"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"للتطبيقات والخدمات: إذا كان هذا الخيار غير مفعّل، ستستمر إمكانية مشاركة بيانات الميكروفون عند الاتصال برقم طوارئ."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"للتطبيقات والخدمات"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"الإعداد محظور"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"للحفاظ على أمانك، هذا الإعداد غير متوفِّر حاليًا."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"مزيد من المعلومات"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ar-watch/strings.xml b/PermissionController/res/values-ar-watch/strings.xml
index c49e30aa6..fe1bb345b 100644
--- a/PermissionController/res/values-ar-watch/strings.xml
+++ b/PermissionController/res/values-ar-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"لا يمكن التغيير"</string>
<string name="generic_yes" msgid="2489207724988649846">"نعم"</string>
<string name="generic_cancel" msgid="2631708607129269698">"إلغاء"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"طوال الوقت"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"أثناء استخدام التطبيق"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"طوال الوقت"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"أثناء استخدام التطبيق"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"طوال الوقت"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"أثناء استخدام التطبيق"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"طوال الوقت"</string>
</resources>
diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml
index 47731ef8b..a933cd90a 100644
--- a/PermissionController/res/values-ar/strings.xml
+++ b/PermissionController/res/values-ar/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"كل الأذونات"</string>
<string name="other_permissions" msgid="2901186127193849594">"إمكانات التطبيق الأخرى"</string>
<string name="permission_request_title" msgid="8790310151025020126">"طلب الإذن"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"‏لا تتوافق إجراءات التثبيت/إلغاء التثبيت مع نظام Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"‏اختيار ما تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إليه"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"‏تمّ تحديث &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. وعليك اختيار ما تريد السماح لهذا التطبيق بالوصول إليه."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"إلغاء"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"إزالة الأذونات في حال عدم استخدام التطبيق"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"إزالة الأذونات وإخلاء مساحة"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"إيقاف نشاط التطبيق مؤقتًا عند عدم استخدامه"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"إدارة التطبيق في حال عدم استخدامه"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"إزالة الأذونات وحذف الملفات المؤقتة وإيقاف الإشعارات"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"إزالة الأذونات وحذف الملفات المؤقتة وإيقاف الإشعارات وأرشفة التطبيق"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"لحماية بياناتك، ستتم إزالة أذونات هذا التطبيق إذا لم يتم استخدامه لبضعة أشهر."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"لحماية بياناتك، إذا لم يتم استخدام التطبيق لبضعة أشهر، ستتم إزالة الأذونات التالية: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"لحماية بياناتك، تمت إزالة الأذونات من هذه التطبيقات التي لم تستخدمها منذ بضعة أشهر."</string>
@@ -337,7 +337,7 @@
<string name="app_perms_7d_access_all_files" msgid="8246193786397635824">"تم الوصول آخر مرة بتاريخ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> في <xliff:g id="TIME_DATE_1">%2$s</xliff:g> • جميع الملفات"</string>
<string name="app_perms_content_provider_24h_all_files" msgid="573104317727770850">"تم الوصول في آخر 24 ساعة • كل الملفات"</string>
<string name="app_perms_content_provider_7d_all_files" msgid="7962416229708835558">"تم الوصول في آخر 7 أيام • جميع الملفات"</string>
- <string name="no_permissions_allowed" msgid="6081976856354669209">"لم يتم منح أي أذونات."</string>
+ <string name="no_permissions_allowed" msgid="6081976856354669209">"لم يتم منح أي أذونات"</string>
<string name="no_permissions_denied" msgid="8159923922804043282">"لم يتم رفض أي أذونات."</string>
<string name="no_apps_allowed" msgid="7718822655254468631">"لم يتم السماح لأي تطبيقات."</string>
<string name="no_apps_allowed_full" msgid="8011716991498934104">"ما من تطبيقات تم منحها إذن الوصول إلى جميع الملفات."</string>
@@ -351,7 +351,7 @@
<string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"يمكن لهذه التطبيقات عرض شاشتك وإجراءاتك ومدخلاتك وتنفيذ الإجراءات والتحكم في العرض."</string>
<string name="role_assistant_label" msgid="4727586018198208128">"تطبيق المساعد الرقمي التلقائي"</string>
<string name="role_assistant_short_label" msgid="3369003713187703399">"تطبيق المساعد الرقمي"</string>
- <string name="role_assistant_description" msgid="6622458130459922952">"بإمكان التطبيقات المساعِدة مساعدتك استنادًا إلى المعلومات على الشاشة التي تشاهدها. وتتوافق بعض التطبيقات مع كل من خدمة المشغّل وخدمة الإدخال الصوتي لتوفير مساعدة متكاملة لك."</string>
+ <string name="role_assistant_description" msgid="6622458130459922952">"بإمكان التطبيقات المساعِدة مساعدك استنادًا إلى المعلومات التي تظهر على شاشتك. وتعمل بعض التطبيقات مع كل من خدمة المشغّل وخدمة الإدخال الصوتي لتوفير مساعدة متكاملة لك."</string>
<string name="role_browser_label" msgid="2877796144554070207">"تطبيق المتصفّح التلقائي"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"تطبيق المتصفح"</string>
<string name="role_browser_description" msgid="3465253637499842671">"التطبيقات التي تتيح إمكانية الوصول إلى الإنترنت وتعرض روابط تنقر عليها"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"تطبيق تدوين الملاحظات"</string>
<string name="role_notes_description" msgid="8496852798616883551">"التطبيقات التي تتيح لك تدوين ملاحظات على جهازك"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ملاحظات"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"تطبيق المحفظة التلقائي"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"تطبيق المحفظة"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"يمكن أن تخزِّن تطبيقات المحافِظ معلومات بطاقات الائتمان وبطاقات الولاء والمفاتيح الرقمية للسيارات وغيرها من المعلومات للمساعدة في إدارة أنواع المعاملات المختلفة."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"هل تريد ضبط \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" على أنّه تطبيق المحفظة التلقائي؟"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ما مِن أذونات مطلوبة."</string>
<string name="request_role_current_default" msgid="738722892438247184">"التطبيق التلقائي الحالي"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"لا تسألني مرة أخرى."</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ضبط كتطبيق تلقائي"</string>
@@ -503,7 +508,7 @@
<string name="permgroupupgraderequestdetail_microphone" msgid="2870497719571464239">"يحتاج هذا التطبيق إلى تسجيل الصوت طوال الوقت، حتى عند عدم استخدامك للتطبيق. يمكنك "<annotation id="link">"السماح بذلك في الإعدادات"</annotation></string>
<string name="permgrouprequest_activityRecognition" msgid="5415121592794230330">"‏هل تريد السماح للتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى بيانات نشاطك البدني؟"</string>
<string name="permgrouprequest_device_aware_activityRecognition" msgid="3408326850847755759">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالوصول إلى بيانات نشاطك البدني على جهاز &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt;؟"</string>
- <string name="permgrouprequest_camera" msgid="5123097035410002594">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالتقاط صور وتسجيل فيديوهات؟"</string>
+ <string name="permgrouprequest_camera" msgid="5123097035410002594">"‏هل يمكنك السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالتقاط صور وتسجيل فيديوهات؟"</string>
<string name="permgrouprequest_device_aware_camera" msgid="3525106924487608868">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالتقاط الصور وتسجيل الفيديوهات على جهاز &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt;؟"</string>
<string name="permgrouprequestdetail_camera" msgid="9085323239764667883">"لن يتمكن هذا التطبيق من التقاط صور وتسجيل فيديوهات إلا عندما يكون قيد الاستخدام"</string>
<string name="permgroupbackgroundrequest_camera" msgid="1274286575704213875">"‏هل تريد السماح لتطبيق &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; بالتقاط صور وتسجيل فيديوهات؟"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"تعديلات مشاركة البيانات"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"غيّرت بعض التطبيقات الطريقة التي قد تشارك بها بيانات موقعك الجغرافي."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"الإعدادات"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"‏آخر استخدام للإذن: ‎<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"‏آخر استخدام للإذن أمس: ‎<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"‏آخر استخدام للإذن في ‎<xliff:g id="TIME_DATE_0">%1$s</xliff:g>: ‏<xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"كلمة المرور الصالحة لمرة واحدة هي 132435"</string>
</resources>
diff --git a/PermissionController/res/values-as-v34/strings.xml b/PermissionController/res/values-as-v34/strings.xml
index 219f79370..3b957dc9b 100644
--- a/PermissionController/res/values-as-v34/strings.xml
+++ b/PermissionController/res/values-as-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"অৱস্থানৰ এক্সেছ"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"এপ্‌ আৰু সেৱাৰ বাবে। এই ছেটিংটো অফ হৈ থাকিলে, আপুনি কোনো জৰুৰীকালীন নম্বৰলৈ কল কৰিলে মাইক্ৰ’ফ’নৰ ডেটা তথাপি শ্বেয়াৰ কৰা হ’ব পাৰে"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"এপ্‌ আৰু সেৱাৰ বাবে"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"প্ৰতিবন্ধিত ছেটিং"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"আপোনাৰ সুৰক্ষাৰ বাবে, এই ছেটিংটো বৰ্তমান উপলব্ধ নহয়।"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"অধিক জানক"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-as-watch/strings.xml b/PermissionController/res/values-as-watch/strings.xml
index 314a08e71..ee41e21d6 100644
--- a/PermissionController/res/values-as-watch/strings.xml
+++ b/PermissionController/res/values-as-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"সলনি কৰিব নোৱাৰি"</string>
<string name="generic_yes" msgid="2489207724988649846">"হয়"</string>
<string name="generic_cancel" msgid="2631708607129269698">"বাতিল কৰক"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"সকলো সময়তে"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"এপ্‌টো ব্যৱহাৰ কৰা সময়ত"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"সকলো সময়তে"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"এপ্‌টো ব্যৱহাৰ কৰা সময়ত"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"সকলো সময়তে"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"এপ্‌টো ব্যৱহাৰ কৰা সময়ত"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"সকলো সময়তে"</string>
</resources>
diff --git a/PermissionController/res/values-as/strings.xml b/PermissionController/res/values-as/strings.xml
index 162b4a8ff..6af3b8a94 100644
--- a/PermissionController/res/values-as/strings.xml
+++ b/PermissionController/res/values-as/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"সকলো অনুমতি"</string>
<string name="other_permissions" msgid="2901186127193849594">"অন্য এপৰ কার্যক্ষমতা"</string>
<string name="permission_request_title" msgid="8790310151025020126">"অনুমতি বিচাৰি কৰা অনুৰোধ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ইনষ্টল/আনইনষ্টল কাৰ্য Wearত কৰিব নোৱাৰি।"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ক ক’ত এক্সেছ দিব লাগে বাছনি কৰক"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; আপডে’ট কৰা হৈছে। এই এপক ক’ত এক্সেছ দিব লাগে বাছনি কৰক।"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"বাতিল কৰক"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"যদি এপ্‌টো ব্যৱহাৰ কৰা নাই অনুমতিসমূহ আঁতৰাওক"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"অনুমতি আঁতৰাওক আৰু ঠাই খালী কৰক"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"অব্যৱহৃত হৈ থাকিলে এপৰ কাৰ্যকলাপ পজ কৰক"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"যদি ব্যৱহাৰ হোৱা নাই এপ্‌টো পৰিচালনা কৰক"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"অনুমতি আঁতৰাওক, অস্থায়ী ফাইল মচক আৰু জাননী বন্ধ কৰক"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"অনুমতি আঁতৰাওক, অস্থায়ী ফাইল মচক, জাননী বন্ধ কৰক আৰু এপ্‌টো আৰ্কাইভ কৰক"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"আপোনাৰ ডেটা সুৰক্ষিত কৰিবলৈ এই এপ্‌টো কেইমাহমান ব্যৱহাৰ নকৰিলে এইটোৰ বাবে থকা অনুমতিসমূহ আঁতৰোৱা হ\'ব।"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"আপোনাৰ ডেটা সুৰক্ষিত কৰিবলৈ এই এপ্‌টো কেইমাহমান ব্যৱহাৰ নকৰিলে তলত উল্লেখ কৰা অনুমতিসমূহ আঁতৰোৱা হ\'ব: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"আপোনাৰ ডেটা সুৰক্ষিত কৰিবলৈ আপুনি কেইমাহমান ব্যৱহাৰ নকৰা এপ্‌সমূহৰ পৰা অনুমতিসমূহ আঁতৰোৱা হ\'ব।"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"টোকা লোৱা এপ্‌"</string>
<string name="role_notes_description" msgid="8496852798616883551">"আপোনাক আপোনাৰ ডিভাইচত টোকা ল’বলৈ দিয়া এপ্‌সমূহ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"টোকা"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ডিফ’ল্ট Wallet এপ্‌"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet এপ্‌"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet এপে বিভিন্ন ধৰণৰ লেনদেনত সহায় কৰিবলৈ আপোনাৰ ক্ৰেডিট আৰু লয়েল্টী কাৰ্ড, গাড়ীৰ চাবি আৰু আন বস্তু ষ্ট’ৰ কৰিব পাৰে।"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>ক আপোনাৰ ডিফ’ল্ট Wallet এপ্‌ হিচাপে ছেট কৰিবনে?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"কোনো অনুমতিৰ প্ৰয়োজন নাই"</string>
<string name="request_role_current_default" msgid="738722892438247184">"বৰ্তমানৰ ডিফ’ল্ট"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"পুনৰায় নুসুধিব"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ডিফ’ল্ট ৰূপে ছেট কৰক"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ডেটা শ্বেয়াৰ কৰা সম্পৰ্কীয় আপডে’ট"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"কিছুমান এপে আপোনাৰ অৱস্থানৰ ডেটা শ্বেয়াৰ কৰিব পৰাৰ ধৰণসমূহ সলনি কৰিছে"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ছেটিং"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"কালি <xliff:g id="TIME_DATE">%1$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>ত এক্সেছ কৰিছিল"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"আপোনাৰ এবাৰ ব্যৱহাৰযোগ্য পাছৱর্ড হৈছে ১৩২৪৩৫"</string>
</resources>
diff --git a/PermissionController/res/values-az-v34/strings.xml b/PermissionController/res/values-az-v34/strings.xml
index 7e403dadc..0a7728eba 100644
--- a/PermissionController/res/values-az-v34/strings.xml
+++ b/PermissionController/res/values-az-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Məkana giriş"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Tətbiq və xidmətlər üçün. Bu ayar deaktivdirsə, təcili nömrəyə zəng etdikdə mikrofon datası yenə də paylaşıla bilər"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Tətbiq və xidmətlər üçün"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Məhdudlaşdırılmış ayar"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Təhlükəsizlik üçün bu ayar hazırda əlçatan deyil."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Ətraflı məlumat"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-az-watch/strings.xml b/PermissionController/res/values-az-watch/strings.xml
index 1b4273903..92d8c0e5f 100644
--- a/PermissionController/res/values-az-watch/strings.xml
+++ b/PermissionController/res/values-az-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Dəyişdirilmədi"</string>
<string name="generic_yes" msgid="2489207724988649846">"Bəli"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Ləğv edin"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Hər zaman"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Tətbiq istifadə edərkən"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Hər zaman"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Tətbiq istifadə edərkən"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Hər zaman"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Tətbiq istifadə edərkən"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Hər zaman"</string>
</resources>
diff --git a/PermissionController/res/values-az/strings.xml b/PermissionController/res/values-az/strings.xml
index 3d854cb29..1f68ef3ef 100644
--- a/PermissionController/res/values-az/strings.xml
+++ b/PermissionController/res/values-az/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Bütün icazələr"</string>
<string name="other_permissions" msgid="2901186127193849594">"Digər tətbiq imkanları"</string>
<string name="permission_request_title" msgid="8790310151025020126">"İcazə sorğusu"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Yükləmə/Sistemdən silmə fəaliyyətləri Wear\'də dəstəklənmir."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tətbiqinin daxil olacağı elementləri seçin"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; güncəlləndi. Bu tətbiqin daxil olacağı elementləri seçin."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Ləğv edin"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Tətbiq işlənməyəndə icazə ləğv edilsin"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"İcazələri silin və yer boşaldın"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"İstifadə edilmədikdə tətbiq fəaliyyətini durdurun"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"İstifadə edilmədikdə tətbiqi idarə edin"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"İcazələri silin, müvəqqəti faylları silin və bildirişləri dayandırın"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"İcazələri, müvəqqəti faylları silin, bildirişləri dayandırın və tətbiqi arxivə atın"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Bir neçə ay istifadə etmədiyiniz tətbiqlərdən icazələr datanızın qorunması məqsədilə silinib."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Bir neçə ay istifadə etmədiyiniz tətbiqlərdən icazələr datanızın qorunması məqsədilə silinib: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Bir neçə ay istifadə etmədiyiniz tətbiqlərdən icazələr datanızın qorunması məqsədilə silinib."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Qeyd tətbiqi"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Cihazınızda qeydlər aparmağa imkan verən tətbiqlər"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"qeydlər"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Defolt pulqabı tətbiqi"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Pulqabı tətbiqi"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Pulqabı tətbiqləri müxtəlif əməliyyat formaları ilə bağlı kömək etmək üçün kredit və sadiqlik kartlarını, avtomobil açarlarını və digər əşyaları saxlaya bilər."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> defolt pulqabı tətbiqi kimi ayarlansın?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"İcazəyə ehtiyac yoxdur"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Cari defolt"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Bir daha soruşmayın"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Defolt olaraq seçin"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Data paylaşma yenilikləri"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Bəzi tətbiqlər məkan datasını paylaşma üsulunu dəyişib"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ayarlar"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Daxil olunub: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Daxil olunub: dünən <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Daxil olunub: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Birdəfəlik parol: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-b+sr+Latn-v34/strings.xml b/PermissionController/res/values-b+sr+Latn-v34/strings.xml
index d5bf45128..366b059c2 100644
--- a/PermissionController/res/values-b+sr+Latn-v34/strings.xml
+++ b/PermissionController/res/values-b+sr+Latn-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Pristup lokaciji"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Za aplikacije i usluge. Ako je ovo podešavanje isključeno, podaci mikrofona mogu i dalje da se dele kada pozovete broj za hitne slučajeve"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Za aplikacije i usluge"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ograničeno podešavanje"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ovo podešavanje je trenutno nedostupno radi vaše bezbednosti."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saznajte više"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-b+sr+Latn-watch/strings.xml b/PermissionController/res/values-b+sr+Latn-watch/strings.xml
index 673a26286..f4b6e53bb 100644
--- a/PermissionController/res/values-b+sr+Latn-watch/strings.xml
+++ b/PermissionController/res/values-b+sr+Latn-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ne može da se promeni"</string>
<string name="generic_yes" msgid="2489207724988649846">"Da"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Otkaži"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Sve vreme"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Pri korišćenju aplikacije"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Sve vreme"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Pri korišćenju aplikacije"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Sve vreme"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Pri korišćenju aplikacije"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Sve vreme"</string>
</resources>
diff --git a/PermissionController/res/values-b+sr+Latn/strings.xml b/PermissionController/res/values-b+sr+Latn/strings.xml
index 3f109b756..9e86088d1 100644
--- a/PermissionController/res/values-b+sr+Latn/strings.xml
+++ b/PermissionController/res/values-b+sr+Latn/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Sve dozvole"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ostale mogućnosti aplikacije"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Zahtev za dozvolu"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Radnje Instaliraj/Deinstaliraj nisu podržane u Wear-u."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Izaberite čemu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; može da pristupa"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikacija &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; je ažurirana. Izaberite čemu ova aplikacija može da pristupa."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Otkaži"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni dozvole ako se aplikacija ne koristi"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ukloni dozvole i oslobodi prostor"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pauziraj aktivnosti ako se ne koristi"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Upravljajte aplikacijom ako se ne koristi"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Uklonite dozvole, izbrišite privremene fajlove i zaustavite obaveštenja"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Uklonite dozvole, izbrišite privremene fajlove, zaustavite obaveštenja i arhivirajte aplikaciju"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Radi zaštite podataka, dozvole za ovu aplikaciju se uklanjaju ako se aplikacija ne koristi par meseci."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Radi zaštite podataka, sledeće dozvole se uklanjaju ako se aplikacija ne koristi par meseci: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Radi zaštite podataka, dozvole su uklonjene iz aplikacija koje niste koristili par meseci."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacija za beleške"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacije koje vam omogućavaju da pravite beleške na uređaju"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"beleške"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Podrazumevana aplikacija Novčanik"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacija Novčanik"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikacije Novčanik mogu da čuvaju vaše kreditne kartice i kartice lojalnosti, ključeve od automobila i druge stvari kako bi vam pomogli pri različitim transakcijama."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Želite da podesite <xliff:g id="APP_NAME">%1$s</xliff:g> kao podrazumevanu aplikaciju Novčanik?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nije potrebna nijedna dozvola"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Trenutno podrazumevana"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne pitaj ponovo"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Podesi kao podrazum."</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Ažuriranja za deljenje podataka"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Neke aplikacije su promenile način na koji mogu da dele podatke o lokaciji"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Podešavanja"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Pristupano: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Pristupano juče: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Pristupano: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Jednokratna lozinka je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-be-v34/strings.xml b/PermissionController/res/values-be-v34/strings.xml
index 330681ded..0d1c77eaf 100644
--- a/PermissionController/res/values-be-v34/strings.xml
+++ b/PermissionController/res/values-be-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Доступ да даных геалакацыі"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Для праграм і сэрвісаў. Нават калі гэта налада выключана, даныя з мікрафона будуць абагульвацца падчас выкліку нумара экстраннай службы"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Для праграм і сэрвісаў"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Абмежаваная налада"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"У мэтах бяспекі гэта налада цяпер недаступная."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Даведацца больш"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-be-watch/strings.xml b/PermissionController/res/values-be-watch/strings.xml
index 242f6306d..c237932f5 100644
--- a/PermissionController/res/values-be-watch/strings.xml
+++ b/PermissionController/res/values-be-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Не ўдалося змяніць"</string>
<string name="generic_yes" msgid="2489207724988649846">"Так"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Скасаваць"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Заўсёды"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Пры выкарыстанні праграмы"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Заўсёды"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Пры выкарыстанні праграмы"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Заўсёды"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Пры выкарыстанні праграмы"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Заўсёды"</string>
</resources>
diff --git a/PermissionController/res/values-be/strings.xml b/PermissionController/res/values-be/strings.xml
index ef9983065..e0b502867 100644
--- a/PermissionController/res/values-be/strings.xml
+++ b/PermissionController/res/values-be/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Усе дазволы"</string>
<string name="other_permissions" msgid="2901186127193849594">"Іншыя магчымасці праграмы"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Запыт дазволу"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Дзеянні па ўсталяванні або выдаленні не падтрымліваюцца на Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Выберыце, да чаго дазволіць доступ праграме &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Праграма &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; была абноўлена. Выберыце, да чаго ёй дазволіць доступ."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Скасаваць"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Выдаляць дазволы, калі праграма не выкарыстоўваецца"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Выдаліць дазволы і вызваліць месца"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Прыпыніць дзеянні ў неактыўнай праграме"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Кіраваць праграмай, якой не карыстаюцца"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Выдаліць дазволы, часовыя файлы і спыніць апавяшчэнні"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Выдаліць дазволы і часовыя файлы, спыніць адпраўку апавяшчэнняў і архіваваць праграму"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Калі праграма не выкарыстоўваецца на працягу некалькіх месяцаў, то ў мэтах абароны вашых даных з яе будуць выдалены дазволы."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Калі праграма не выкарыстоўваецца на працягу некалькіх месяцаў, у мэтах абароны вашых даных будуць выдалены наступныя дазволы: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"У мэтах абароны вашых даных выдалены дазволы для праграм, якія не выкарыстоўваліся некалькі месяцаў."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Праграма для нататак"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Праграмы, якія дазваляюць рабіць нататкі на прыладзе"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"нататкі"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Стандартная праграма-кашалёк"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Праграма-кашалёк"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"У праграмах-кашальках можна захоўваць крэдытныя карткі, карткі лаяльнасці, ключы ад аўтамабіля і іншыя лічбавыя аб\'екты, што дае магчымасць ажыццяўляць розныя формы трансакцый."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Задаць у якасці стандартнай праграмы-кашалька праграму \"<xliff:g id="APP_NAME">%1$s</xliff:g>\"?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Дазволы не патрэбныя"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Цяперашняя стандартная"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Больш не пытацца"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Зрабіць стандартнай"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Змяненні ў абагульванні даных"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Для некаторых праграм спосаб абагульвання даных пра месцазнаходжанне змяніўся"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Налады"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Апошні раз доступ быў атрыманы ў <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Апошні раз доступ быў атрыманы ўчора ў <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Апошні раз доступ быў атрыманы ў <xliff:g id="TIME_DATE_1">%2$s</xliff:g> <xliff:g id="TIME_DATE_0">%1$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ваш аднаразовы пароль: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-bg-v34/strings.xml b/PermissionController/res/values-bg-v34/strings.xml
index 33b3a52f0..f54f4e756 100644
--- a/PermissionController/res/values-bg-v34/strings.xml
+++ b/PermissionController/res/values-bg-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Достъп до местоположението"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"За приложения и услуги. Ако тази настройка е изключена, данните от микрофона пак може да бъдат споделени, когато се обадите на номер за спешни случаи"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"За приложения и услуги"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ограничена настройка"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"От съображения за сигурност понастоящем тази настройка не е налице."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Научете повече"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-bg-watch/strings.xml b/PermissionController/res/values-bg-watch/strings.xml
index d09f250c4..48692ee7b 100644
--- a/PermissionController/res/values-bg-watch/strings.xml
+++ b/PermissionController/res/values-bg-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Без промяна"</string>
<string name="generic_yes" msgid="2489207724988649846">"Да"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Отказ"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"През цялото време"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"При използване на прилож."</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"През цялото време"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"При използване на прилож."</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"През цялото време"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"При използване на прилож."</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"През цялото време"</string>
</resources>
diff --git a/PermissionController/res/values-bg/strings.xml b/PermissionController/res/values-bg/strings.xml
index fb5d670c7..b8b519d21 100644
--- a/PermissionController/res/values-bg/strings.xml
+++ b/PermissionController/res/values-bg/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Всички разрешения"</string>
<string name="other_permissions" msgid="2901186127193849594">"Други възможности на приложението"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Заявка за разрешение"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Действията инсталиране и деинсталиране не се поддържат на устройства с Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Изберете до какво да има достъп &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Приложението &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; е актуализирано. Изберете до какво да има достъп."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Отказ"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Премахване на разрешенията, ако приложението не се използва"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Премахване на разреш. и освоб. на място"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Поставяне на активн. в прилож. на пауза, ако не се ползва"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Управление на прилож., ако не се ползва"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Премахване на разрешенията, изтриване на временните файлове и спиране на известията"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Премахване на разрешенията, изтриване на временните файлове, спиране на известията и архивиране на приложението"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"За да защитим данните ви, разрешенията за това приложение ще бъдат премахнати, ако не го използвате няколко месеца."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"За да защитим данните ви, следните разрешения ще бъдат премахнати, ако не използвате приложението няколко месеца: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"За да защитим данните ви, премахнахме разрешенията за приложенията, които не сте използвали от няколко месеца."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Приложение за бележки"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Приложения, които ви дават възможност да си водите бележки на устройството си"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"бележки"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Основно приложение за портфейл"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Приложение за портфейл"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Приложенията за портфейли могат да съхраняват кредитни карти, карти за лоялност, ключове за автомобил и други неща, за да ви помагат при различни видове транзакции."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Да се зададе ли <xliff:g id="APP_NAME">%1$s</xliff:g> като основно приложение за портфейл?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Не са необходими разрешения"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Текущо стандартно приложение"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Без повторно питане"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Задаване"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Актуализации за споделянето на данни"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Някои приложения са променили как може да споделят данни за местоположението ви"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Настройки"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Осъществен достъп: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Осъществен достъп: вчера, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Осъществен достъп: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Еднократната ви парола е 132435"</string>
</resources>
diff --git a/PermissionController/res/values-bn-v34/strings.xml b/PermissionController/res/values-bn-v34/strings.xml
index c93980dd1..9a5bd790d 100644
--- a/PermissionController/res/values-bn-v34/strings.xml
+++ b/PermissionController/res/values-bn-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"লোকেশন অ্যাক্সেস করা"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"অ্যাপ ও পরিষেবার জন্য। আপনি কোনও জরুরি নম্বরে কল করলে, এই সেটিং বন্ধ করা থাকলেও, মাইক্রোফোনের ডেটা শেয়ার করা হতে পারে"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"অ্যাপ ও পরিষেবার জন্য"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"বিধিনিষেধযুক্ত সেটিংস"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"আপনার নিরাপত্তার জন্য, এই সেটিং বর্তমানে উপলভ্য নেই।"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"আরও জানুন"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-bn-watch/strings.xml b/PermissionController/res/values-bn-watch/strings.xml
index f8c2968f8..698bdc32c 100644
--- a/PermissionController/res/values-bn-watch/strings.xml
+++ b/PermissionController/res/values-bn-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"পাল্টানো যাবে না"</string>
<string name="generic_yes" msgid="2489207724988649846">"হ্যাঁ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"বাতিল করুন"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"সব সময়ের জন্য"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"অ্যাপ ব্যবহার করার সময়"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"সব সময়ের জন্য"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"অ্যাপ ব্যবহার করার সময়"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"সব সময়ের জন্য"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"অ্যাপ ব্যবহার করার সময়"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"সব সময়ের জন্য"</string>
</resources>
diff --git a/PermissionController/res/values-bn/strings.xml b/PermissionController/res/values-bn/strings.xml
index c17a53046..346af68d2 100644
--- a/PermissionController/res/values-bn/strings.xml
+++ b/PermissionController/res/values-bn/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"সব অনুমতি"</string>
<string name="other_permissions" msgid="2901186127193849594">"অ্যাপের অন্যান্য কার্যক্ষমতা"</string>
<string name="permission_request_title" msgid="8790310151025020126">"অনুমতির অনুরোধ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear-এ ইনস্টল/আনইনস্টল করা যাবে না।"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; অ্যাপটিকে কিসে কিসে অ্যাক্সেস দেবেন তা বেছে নিন"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; আপডেট করা হয়েছে৷ অ্যাপটিকে কিসে কিসে অ্যাক্সেস দেবেন তা বেছে নিন।"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"বাতিল করুন"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"অ্যাপ ব্যবহার করা না হলে সেটি থেকে অনুমতি প্রত্যাহার করে নিন"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"অনুমতি সরান এবং স্পেস খালি করুন"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ব্যবহার না হলে অ্যাপ অ্যাক্টিভিটি পজ করুন"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ব্যবহার না করা হলে অ্যাপ ম্যানেজ করুন"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"অনুমতি সরান, অস্থায়ী ফাইল মুছুন এবং বিজ্ঞপ্তি বন্ধ করুন"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"অনুমতি সরান, অস্থায়ী ফাইল মুছুন, বিজ্ঞপ্তি বন্ধ করুন এবং অ্যাপ আর্কাইভ করুন"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"আপনার ডেটা সুরক্ষিত রাখতে এই অ্যাপ কয়েক মাস ব্যবহার করা না হলে, এটিকে দেওয়া অনুমতি প্রত্যাহার করে নেওয়া হবে।"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"আপনার ডেটা সুরক্ষিত রাখতে অ্যাপটি কয়েক মাস ব্যবহার করা না হলে, এই অনুমতি প্রত্যাহার করে নেওয়া হবে: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"আপনার ডেটা সুরক্ষিত রাখতে যেসব অ্যাপ গত কয়েক মাস ব্যবহার করা হয়নি সেগুলি থেকে অনুমতি প্রত্যাহার করে নেওয়া হয়েছে।"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"নোট অ্যাপ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"অ্যাপ, যা আপনার ডিভাইসে নোট নেওয়ার অনুমতি দেয়"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"নোট"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ডিফল্ট ওয়ালেট অ্যাপ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"ওয়ালেট অ্যাপ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"বিভিন্ন ধরনের ট্রানজ্যাকশনের ক্ষেত্রে আপনাকে সাহায্য করতে, ওয়ালেট অ্যাপ আপনার ক্রেডিট ও লয়ালটি কার্ড, গাড়ির \'কী\' এবং অন্যান্য জিনিস সেভ করতে পারবে।"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> অ্যাপকে আপনার ডিফল্ট ওয়ালেট অ্যাপ হিসেবে সেট করবেন?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"কোনও অনুমতির প্রয়োজন নেই"</string>
<string name="request_role_current_default" msgid="738722892438247184">"বর্তমান ডিফল্ট"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"আর দেখতে চাই না"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ডিফল্ট হিসেবে রাখুন"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ডেটা শেয়ারিং সংক্রান্ত আপডেট"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"কিছু অ্যাপ আপনার লোকেশন ডেটা শেয়ার করার উপায়ের ক্ষেত্রে পরিবর্তন করেছে"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"সেটিংস"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"গতকাল <xliff:g id="TIME_DATE">%1$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>-এ অ্যাক্সেস করা হয়েছে"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"আপনার একবার ব্যবহারের পাসওয়ার্ড হল ১২৩৪৩৫"</string>
</resources>
diff --git a/PermissionController/res/values-bs-v34/strings.xml b/PermissionController/res/values-bs-v34/strings.xml
index e2b8445df..5da04308f 100644
--- a/PermissionController/res/values-bs-v34/strings.xml
+++ b/PermissionController/res/values-bs-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Pristup lokaciji"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Za aplikacije i usluge. Ako je ova postavka isključena, podaci mikrofona se i dalje mogu dijeliti kada pozovete broj za hitne slučajeve"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Za aplikacije i usluge"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Zabranjena postavka"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Radi vaše sigurnosti postavka trenutno nije dostupna."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saznajte više"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-bs-watch/strings.xml b/PermissionController/res/values-bs-watch/strings.xml
index 1a15ad0b3..68f066963 100644
--- a/PermissionController/res/values-bs-watch/strings.xml
+++ b/PermissionController/res/values-bs-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ne mijenja se"</string>
<string name="generic_yes" msgid="2489207724988649846">"Da"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Otkaži"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Cijelo vrijeme"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Dok se aplikacija koristi"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Cijelo vrijeme"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Dok se aplikacija koristi"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Cijelo vrijeme"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Dok se aplikacija koristi"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Cijelo vrijeme"</string>
</resources>
diff --git a/PermissionController/res/values-bs/strings.xml b/PermissionController/res/values-bs/strings.xml
index 061ed86a1..4f7936f39 100644
--- a/PermissionController/res/values-bs/strings.xml
+++ b/PermissionController/res/values-bs/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Sva odobrenja"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ostale mogućnosti aplikacije"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Zahtjev za odobrenje"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Instaliranje/deinstaliranje nije podržano na Wearu."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Izaberite čemu aplikacija &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&amp;Lt;/b&gt; može pristupiti"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikacija &amp;Lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&amp;Lt;/b&gt; je ažurirana. Izaberite čemu ova aplikacija može pristupiti."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Otkaži"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni odobrenja ako se aplikacija ne koristi"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ukloni odobrenja i oslobodi prostor"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pauziraj aktivnost apl. ako se ne koristi"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Upravljanje aplikacijom ako se ne koristi"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Uklonite odobrenja, izbrišite privremene fajlove i zaustavite obavještenja"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Uklonite odobrenja, izbrišite privremene fajlove, zaustavite obavještenja i arhivirajte aplikaciju"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Zbog zaštite vaših podataka, odobrenja za ovu aplikaciju će se ukloniti ako se ona ne bude koristila nekoliko mjeseci."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Radi zaštite vaših podataka, ako se aplikacija ne bude koristila nekoliko mjeseci, uklonit će se sljedeća odobrenja: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Zbog zaštite vaših podataka uklonjena su odobrenja iz aplikacija koje niste koristili nekoliko mjeseci."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacija za bilješke"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacije koje vam dozvoljavaju da pravite bilješke na uređaju"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"bilješke"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Zadana aplikacija za novčanik"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacija za novčanik"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikacije za novčanik mogu pohranjivati kreditne kartice, kartice lojalnosti, ključeve automobila i druge stvari da vam pomognu pri raznim vrstama transakcija."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Postaviti aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> kao zadanu aplikaciju za novčanik?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nije potrebno odobrenje"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Trenutno zadano"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne pitaj ponovo"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Postavi kao zadano"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Promjene u dijeljenju podataka"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Neke aplikacije mogu promijeniti način na koji mogu dijeliti podatke o lokaciji"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Postavke"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Pristupljeno je u <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Pristupljeno je jučer u <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Pristupljeno je <xliff:g id="TIME_DATE_0">%1$s</xliff:g> u <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Jednokratna lozinka je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ca-v34/strings.xml b/PermissionController/res/values-ca-v34/strings.xml
index 8aad7b657..623ae52cd 100644
--- a/PermissionController/res/values-ca-v34/strings.xml
+++ b/PermissionController/res/values-ca-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Accés a la ubicació"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Per a aplicacions i serveis. És possible que les dades del micròfon es comparteixin si truques a un número d\'emergència encara que aquesta opció estigui desactivada."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Per a aplicacions i serveis"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Opció de configuració restringida"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Per a la teva seguretat, aquesta opció de configuració no està disponible en aquests moments."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Més informació"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ca-watch/strings.xml b/PermissionController/res/values-ca-watch/strings.xml
index a7ba423ff..41bdada45 100644
--- a/PermissionController/res/values-ca-watch/strings.xml
+++ b/PermissionController/res/values-ca-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"No es pot canviar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sí"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancel·la"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"En tot moment"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Quan s\'utilitza l\'aplicació"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"En tot moment"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Quan s\'utilitza l\'aplicació"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"En tot moment"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Quan s\'utilitza l\'aplicació"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"En tot moment"</string>
</resources>
diff --git a/PermissionController/res/values-ca/strings.xml b/PermissionController/res/values-ca/strings.xml
index 729b8f20f..49c5c058c 100644
--- a/PermissionController/res/values-ca/strings.xml
+++ b/PermissionController/res/values-ca/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Tots els permisos"</string>
<string name="other_permissions" msgid="2901186127193849594">"Altres competències de l\'aplicació"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Sol·licitud de permís"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Les accions d\'instal·lar o de desinstal·lar no s\'admeten a Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Tria a què vols que tingui accés &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"S\'ha actualitzat &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Tria a què vols que tingui accés aquesta aplicació."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancel·la"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Suprimeix els permisos si no s\'utilitza l\'aplicació"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Suprimeix els permisos i allibera espai"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Activitat a l\'app en pausa si no s\'usa"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gestiona l\'aplicació si no s\'utilitza"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Suprimeix els permisos i els fitxers temporals, i atura les notificacions"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Suprimeix els permisos, elimina els fitxers temporals, atura les notificacions i arxiva l\'aplicació"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Per protegir les teves dades, els permisos d\'aquesta aplicació se suprimiran si no la utilitzes durant uns mesos."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Si l\'aplicació no s\'utilitza durant uns mesos, se suprimiran els permisos següents per protegir les teves dades: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Per protegir les teves dades, s\'han suprimit els permisos de les aplicacions que no has utilitzat durant els darrers mesos."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplicació de notes"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplicacions que et permeten prendre notes al dispositiu"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"App de cartera predeterminada"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplicació de cartera"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Les aplicacions de cartera poden emmagatzemar les targetes de crèdit i de fidelització, les claus del cotxe i altres elements per ajudar-te amb diverses formes de transaccions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Vols definir <xliff:g id="APP_NAME">%1$s</xliff:g> com l\'aplicació de cartera predeterminada?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No calen permisos"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Predeterminada actualment"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"No m\'ho tornis a preguntar"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Estableix com a predeterminada"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Canvis en la compartició de dades"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Algunes aplicacions han canviat la manera en què poden compartir les teves dades d\'ubicació"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Configuració"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"S\'hi ha accedit a les <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"S\'hi va accedir ahir a les <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"S\'hi ha accedit el dia <xliff:g id="TIME_DATE_0">%1$s</xliff:g> a les <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"La contrasenya d\'un sol ús és 132435"</string>
</resources>
diff --git a/PermissionController/res/values-cs-v34/strings.xml b/PermissionController/res/values-cs-v34/strings.xml
index b7e982b21..6a5a84fe2 100644
--- a/PermissionController/res/values-cs-v34/strings.xml
+++ b/PermissionController/res/values-cs-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Přístup k poloze"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Aplikace a služby. Pokud je toto nastavení vypnuté a zavoláte na číslo tísňového volání, data z mikrofonu bude možné nadále sdílet"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Aplikace a služby"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Blokované nastavení"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Z důvodu vaší bezpečnosti toto nastavení momentálně není dostupné."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Další informace"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-cs-watch/strings.xml b/PermissionController/res/values-cs-watch/strings.xml
index eca4682c4..5e1a4b022 100644
--- a/PermissionController/res/values-cs-watch/strings.xml
+++ b/PermissionController/res/values-cs-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nelze změnit"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ano"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Zrušit"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Neustále"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Při používání aplikace"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Neustále"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Při používání aplikace"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Neustále"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Při používání aplikace"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Neustále"</string>
</resources>
diff --git a/PermissionController/res/values-cs/strings.xml b/PermissionController/res/values-cs/strings.xml
index 20c594403..acfa06514 100644
--- a/PermissionController/res/values-cs/strings.xml
+++ b/PermissionController/res/values-cs/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Všechna oprávnění"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ostatní oprávnění aplikace"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Žádost o oprávnění"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Akce instalace/odinstalace nejsou v zařízení Wear podporovány."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Určete, k čemu aplikaci &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; povolíte přístup"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikace &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; byla aktualizována. Určete, k čemu jí povolíte přístup."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Zrušit"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Odebrat oprávnění, pokud se aplikace nepoužívá"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Odebrat oprávnění a uvolnit místo"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pozastavit aktivitu při nepoužívání"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Spravovat aplikaci, pokud se nepoužívá"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Odebrat oprávnění, smazat dočasné soubory a zastavit oznámení"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Odebrat oprávnění, smazat dočasné soubory, zastavit oznámení a archivovat aplikaci"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Pokud tuto aplikaci několik měsíců nepoužijete, kvůli ochraně vašich dat jí budou oprávnění odebrána."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Pokud tuto aplikaci několik měsíců nepoužijete, budou jí kvůli ochraně vašich dat odebrána následující oprávnění: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Za účelem ochrany vašich dat byla odebrána oprávnění aplikacím, které jste několik měsíců nepoužili."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikace pro poznámky"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikace, které umožňují dělat si na zařízení poznámky."</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"poznámky"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Výchozí aplikace typu peněženka"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikace typu peněženka"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikace typu peněženka můžou uložit vaše platební a věrnostní karty, klíče od auta a další věci, a usnadnit vám různé transakce."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Nastavit aplikaci <xliff:g id="APP_NAME">%1$s</xliff:g> jako výchozí peněženku?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nejsou potřeba žádná oprávnění"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aktuálně výchozí"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Příště se neptat"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Změnit na výchozí"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Aktualizace sdílení dat"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Některé aplikace změnily způsob, kterým mohou sdílet údaje o vaší poloze"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Nastavení"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Poslední přístup: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Poslední přístup: včera v <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Poslední přístup: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Vaše jednorázové heslo je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-da-v34/strings.xml b/PermissionController/res/values-da-v34/strings.xml
index 5777a6832..575b88b73 100644
--- a/PermissionController/res/values-da-v34/strings.xml
+++ b/PermissionController/res/values-da-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Lokationsadgang"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apps og tjenester. Hvis denne indstilling er deaktiveret, deles mikrofondata muligvis stadig, når du ringer til et alarmnummer"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apps og tjenester"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Begrænset indstilling"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Af hensyn til din sikkerhed er denne indstilling i øjeblikket ikke tilgængelig."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Få flere oplysninger"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-da-watch/strings.xml b/PermissionController/res/values-da-watch/strings.xml
index 022b2f562..d78c45ff4 100644
--- a/PermissionController/res/values-da-watch/strings.xml
+++ b/PermissionController/res/values-da-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Kan ikke ændres"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Annuller"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Hele tiden"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Når appen er i brug"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Hele tiden"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Når appen er i brug"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Hele tiden"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Når appen er i brug"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Hele tiden"</string>
</resources>
diff --git a/PermissionController/res/values-da/strings.xml b/PermissionController/res/values-da/strings.xml
index 7655150ee..18a899717 100644
--- a/PermissionController/res/values-da/strings.xml
+++ b/PermissionController/res/values-da/strings.xml
@@ -31,7 +31,7 @@
<string name="grant_dialog_button_deny_and_dont_ask_again" msgid="1748925431574312595">"Tillad ikke, og spørg ikke igen"</string>
<string name="grant_dialog_button_no_upgrade" msgid="8344732743633736625">"Behold \"Mens appen er i brug\""</string>
<string name="grant_dialog_button_no_upgrade_one_time" msgid="5125892775684968694">"Behold \"Kun denne ene gang\""</string>
- <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Mere info"</string>
+ <string name="grant_dialog_button_more_info" msgid="213350268561945193">"Flere oplysninger"</string>
<string name="grant_dialog_button_allow_all" msgid="5939066403732409516">"Tillad alle"</string>
<string name="grant_dialog_button_always_allow_all" msgid="1719900027660252167">"Tillad altid alle"</string>
<string name="grant_dialog_button_allow_limited_access" msgid="5713551784422137594">"Tillad begrænset adgang"</string>
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alle tilladelser"</string>
<string name="other_permissions" msgid="2901186127193849594">"Andre app-egenskaber"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Anmodning om tilladelse"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Det er ikke muligt at installere/afinstallere på Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Vælg, hvad &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; må få adgang til"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; er blevet opdateret. Vælg, hvad denne app må få adgang til."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Annuller"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjern tilladelser, hvis appen ikke bruges"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Fjern tilladelser, og frigør plads"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Sæt appaktivitet på pause ved inaktivitet"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Administrer appen, hvis den ikke bruges"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Fjern tilladelser, slet midlertidige filer, og stop notifikationer"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Fjern tilladelser, slet midlertidige filer, deaktiver notifikationer, og arkivér appen"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Hvis appen ikke bliver brugt i et par måneder, fjernes tilladelser for appen for at beskytte dine data."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Hvis appen ikke bliver brugt i et par måneder, fjernes følgende tilladelser for at beskytte dine data: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Tilladelserne til apps, du ikke har brugt i et par måneder, er blevet fjernet for at beskytte dine data."</string>
@@ -352,10 +352,10 @@
<string name="role_assistant_label" msgid="4727586018198208128">"Standardapp for digital assistent"</string>
<string name="role_assistant_short_label" msgid="3369003713187703399">"App for digital assistent"</string>
<string name="role_assistant_description" msgid="6622458130459922952">"Assistanceapps kan hjælpe dig på baggrund af oplysningerne på den aktuelle skærm. Nogle apps understøtter både startertjenester og tjenester til indtaling for at give dig integreret assistance."</string>
- <string name="role_browser_label" msgid="2877796144554070207">"Standardbrowserapp"</string>
+ <string name="role_browser_label" msgid="2877796144554070207">"Standardapp til browsing"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"Browserapp"</string>
<string name="role_browser_description" msgid="3465253637499842671">"Apps, der giver dig adgang til internettet og viser links, som du trykker på"</string>
- <string name="role_browser_request_title" msgid="2895200507835937192">"Vil du angive <xliff:g id="APP_NAME">%1$s</xliff:g> som din standardbrowserapp?"</string>
+ <string name="role_browser_request_title" msgid="2895200507835937192">"Vil du angive <xliff:g id="APP_NAME">%1$s</xliff:g> som din standardapp til browsing?"</string>
<string name="role_browser_request_description" msgid="5888803407905985941">"Der kræves ingen tilladelser"</string>
<string name="role_dialer_label" msgid="1100224146343237968">"Standardapp til opkald"</string>
<string name="role_dialer_short_label" msgid="7186888549465352489">"Opkaldsapp"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App til notetagning"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps, som giver dig mulighed for at tage noter på din enhed"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"noter"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Standardapp til digital pung"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App til digital pung"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Apps til digitale punge kan gemme dine kredit- og loyalitetskort, bilnøgler m.m. for at hjælpe med forskellige former for transaktioner."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Vil du angive <xliff:g id="APP_NAME">%1$s</xliff:g> som din standardapp til digital pung?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Der kræves ingen tilladelser"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Nuværende standardapp"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Spørg ikke igen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Angiv som standard"</string>
@@ -622,8 +627,8 @@
<string name="permission_rationale_data_sharing_source_message" msgid="8330794595417986883">"Udvikleren gav oplysninger til "<annotation id="link"><annotation id="install_source" example="App Store">"%1$s"</annotation></annotation>" om, hvordan denne app deler data. Udvikleren opdaterer muligvis disse oplysninger senere."</string>
<string name="permission_rationale_location_purpose_title" msgid="5115877143670012618">"Denne app deler muligvis lokationsdata for:"</string>
<string name="permission_rationale_permission_data_sharing_varies_title" msgid="9103718980919908316">"Datadeling varierer"</string>
- <string name="permission_rationale_data_sharing_varies_message" msgid="4224469559084489222">"Databehandlingen kan variere afhængigt af din appversion, din brug, dit område og din alder. "<annotation id="link">"Flere oplysninger om datadeling"</annotation></string>
- <string name="permission_rationale_data_sharing_varies_message_without_link" msgid="4912763761399025094">"Databehandlingen kan variere afhængigt af din appversion, din brug, dit område og din alder."</string>
+ <string name="permission_rationale_data_sharing_varies_message" msgid="4224469559084489222">"Databehandlingen kan variere afhængigt af din appversion, din brug, din region og din alder. "<annotation id="link">"Flere oplysninger om datadeling"</annotation></string>
+ <string name="permission_rationale_data_sharing_varies_message_without_link" msgid="4912763761399025094">"Databehandlingen kan variere afhængigt af din appversion, din brug, din region og din alder."</string>
<string name="permission_rationale_location_settings_title" msgid="7204145004850190953">"Dine lokationsdata"</string>
<string name="permission_rationale_permission_settings_message" msgid="631286040979660267">"Skift denne apps adgang i "<annotation id="link">"privatlivsindstillingerne"</annotation></string>
<string name="permission_rationale_purpose_app_functionality" msgid="8397736681065841405">"Appfunktionalitet"</string>
@@ -639,7 +644,7 @@
<string name="data_sharing_updates_title" msgid="7996933386875213859">"Opdateringer om deling af lokationsdata"</string>
<string name="data_sharing_updates_summary" msgid="764113985772233889">"Gennemse apps, der har ændret måden, hvorpå de kan dele dine lokationsdata"</string>
<string name="data_sharing_updates_subtitle" msgid="6311537708950632329">"Disse apps har ændret den måde, hvorpå de kan dele dine lokationsdata. De har muligvis ikke delt dataene før eller kan nu anvende dem til annoncering eller marketing."</string>
- <string name="data_sharing_updates_footer_message" msgid="1582711655172892107">"Udviklerne af disse apps har givet oplysninger om deres procedurer for datadeling til en appbutik. De kan opdatere procedurerne med tiden.\n\nProcedurer for datadeling kan variere afhængigt af din appversion, din brug, dit område og din alder."</string>
+ <string name="data_sharing_updates_footer_message" msgid="1582711655172892107">"Udviklerne af disse apps har givet oplysninger om deres procedurer for datadeling til en appbutik. De kan opdatere procedurerne med tiden.\n\nProcedurer for datadeling kan variere afhængigt af din appversion, din brug, din region og din alder."</string>
<string name="learn_about_data_sharing" msgid="4200480587079488045">"Få flere oplysninger om deling af data"</string>
<string name="shares_location_with_third_parties" msgid="2278051743742057767">"Dine lokationsdata deles nu med tredjeparter"</string>
<string name="shares_location_with_third_parties_for_advertising" msgid="1918588064014480513">"Dine lokationsdata deles nu med tredjeparter med henblik på annoncering eller marketing"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Opdateringer om datadeling"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Nogle apps har ændret måden, hvorpå de kan dele dine lokationsdata"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Indstillinger"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Tilgået kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Tilgået i går kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Tilgået <xliff:g id="TIME_DATE_0">%1$s</xliff:g> kl. <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Din engangskode er 132435"</string>
</resources>
diff --git a/PermissionController/res/values-de-v34/strings.xml b/PermissionController/res/values-de-v34/strings.xml
index ed699cce3..a07944023 100644
--- a/PermissionController/res/values-de-v34/strings.xml
+++ b/PermissionController/res/values-de-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Standortzugriff"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Für Apps und Dienste. Wenn du eine Notrufnummer wählst, können Mikrofondaten trotz Deaktivierung dieser Berechtigung weitergegeben werden."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Für Apps und Dienste"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Eingeschränkte Einstellung"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Aus Sicherheitsgründen ist diese Einstellung derzeit nicht verfügbar."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Weitere Informationen"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-de-watch/strings.xml b/PermissionController/res/values-de-watch/strings.xml
index 617413a19..dbe09e316 100644
--- a/PermissionController/res/values-de-watch/strings.xml
+++ b/PermissionController/res/values-de-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Änderung unmöglich"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Abbrechen"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Immer"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Beim Verwenden der App"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Immer"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Beim Verwenden der App"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Immer"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Beim Verwenden der App"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Immer"</string>
</resources>
diff --git a/PermissionController/res/values-de/strings.xml b/PermissionController/res/values-de/strings.xml
index 4b862e97d..3372801fe 100644
--- a/PermissionController/res/values-de/strings.xml
+++ b/PermissionController/res/values-de/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alle Berechtigungen"</string>
<string name="other_permissions" msgid="2901186127193849594">"Andere App-Funktionen"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Berechtigungsanfrage"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Installations-/Deinstallationsaktion auf Android Wear nicht unterstützt."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Worauf darf die App &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; zugreifen?"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Die App &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; wurde aktualisiert. Worauf darf diese App zugreifen?"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Abbrechen"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Berechtigungen entfernen, wenn die App nicht verwendet wird"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Berechtigungen löschen und Speicherplatz freigeben"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"App-Aktivität bei Nichtnutzung stoppen"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"App-Verhalten bei Nichtnutzung verwalten"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Berechtigungen entfernen, temporäre Dateien löschen und Benachrichtigungen stoppen"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Berechtigungen entfernen, temporäre Dateien löschen, Benachrichtigungen stoppen und die App archivieren"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Zum Schutz deiner Daten werden dieser App die Berechtigungen entzogen, wenn du sie einige Monate nicht verwendest."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Zum Schutz deiner Daten werden dieser App die folgenden Berechtigungen entzogen, wenn du sie einige Monate nicht verwendest: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Zum Schutz deiner Daten wurden Apps, die du einige Monate nicht verwendet hast, Berechtigungen entzogen."</string>
@@ -351,7 +351,7 @@
<string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"Diese Apps können deinen Bildschirm, deine Aktionen und deine Eingaben sehen, Aktionen ausführen und den Bildschirm steuern."</string>
<string name="role_assistant_label" msgid="4727586018198208128">"Standard-App digit. Assistent"</string>
<string name="role_assistant_short_label" msgid="3369003713187703399">"App für digitalen Assistenten"</string>
- <string name="role_assistant_description" msgid="6622458130459922952">"Assistent-Apps können dir bei bestimmten Dingen helfen. Dazu greifen sie auf die Informationen zu, die aktuell auf deinem Bildschirm angezeigt werden. Damit sie dir eine umfassende Hilfe sind, unterstützen einige Apps sowohl Launcher- als auch Spracheingabedienste."</string>
+ <string name="role_assistant_description" msgid="6622458130459922952">"Assistent-Apps können dir bei bestimmten Dingen helfen. Dazu greifen sie auf die Informationen zu, die aktuell auf deinem Bildschirm angezeigt werden. Einige Apps unterstützen sowohl Launcher- als auch Spracheingabedienste."</string>
<string name="role_browser_label" msgid="2877796144554070207">"Standard-Browser-App"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"Browser-App"</string>
<string name="role_browser_description" msgid="3465253637499842671">"Apps, mit denen du auf das Internet zugreifen kannst und die die entsprechende Seite öffnen, wenn du auf einen Link tippst"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notizen-App"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps zum Erstellen von Notizen auf deinem Gerät"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"Notizen"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Standard-Wallet-App"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet-App"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"In Wallet-Apps kannst du deine Kredit- und Kundenkarten, Autoschlüssel und andere Dinge speichern, was dir bei verschiedenen Arten von Transaktionen hilft."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> als Standard-Wallet-App festlegen?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Keine Berechtigungen erforderlich"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aktueller Standard"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Nicht mehr fragen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Als Standard festlegen"</string>
@@ -625,7 +630,7 @@
<string name="permission_rationale_data_sharing_varies_message" msgid="4224469559084489222">"Die Art der Datennutzung kann von der Version und Verwendung der App, von der Region und vom Alter des Nutzers abhängen. "<annotation id="link">"Weitere Informationen zur Datenweitergabe"</annotation></string>
<string name="permission_rationale_data_sharing_varies_message_without_link" msgid="4912763761399025094">"Die Datenschutz- und Sicherheitspraktiken können je nach App-Version, Verwendung, Region und Alter des Nutzers variieren."</string>
<string name="permission_rationale_location_settings_title" msgid="7204145004850190953">"Deine Standortdaten"</string>
- <string name="permission_rationale_permission_settings_message" msgid="631286040979660267">"Du kannst den Zugriff dieser App in den "<annotation id="link">"Datenschutzeinstellungen"</annotation>" ändern"</string>
+ <string name="permission_rationale_permission_settings_message" msgid="631286040979660267">"Du kannst den Zugriff dieser App in den "<annotation id="link">"Daten­schutz­ein­stel­lun­gen"</annotation>" ändern"</string>
<string name="permission_rationale_purpose_app_functionality" msgid="8397736681065841405">"Funktionen der App"</string>
<string name="permission_rationale_purpose_analytics" msgid="2070800501189620712">"Analytics"</string>
<string name="permission_rationale_purpose_developer_communications" msgid="6453047018892062374">"Mitteilungen des Entwicklers"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Änderungen bei der Datenweitergabepraxis"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Bei einigen Apps hat sich die Art der Weitergabe deiner Standortdaten geändert"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Einstellungen"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Zugriff: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Zugriff: gestern, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Zugriff: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Dein Einmalpasswort lautet 132435"</string>
</resources>
diff --git a/PermissionController/res/values-el-car/strings.xml b/PermissionController/res/values-el-car/strings.xml
index 605dfdf64..762f42d2b 100644
--- a/PermissionController/res/values-el-car/strings.xml
+++ b/PermissionController/res/values-el-car/strings.xml
@@ -17,5 +17,5 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="unused_apps_page_summary" msgid="7505839764289846511">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για μερικούς μήνες:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Τα προσωρινά αρχεία καταργούνται για την απελευθέρωση χώρου"</string>
+ <string name="unused_apps_page_summary" msgid="7505839764289846511">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για μερικούς μήνες:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Τα προσωρινά αρχεία καταργούνται για την αποδέσμευση χώρου"</string>
</resources>
diff --git a/PermissionController/res/values-el-v34/strings.xml b/PermissionController/res/values-el-v34/strings.xml
index 0c8541787..80e496ea0 100644
--- a/PermissionController/res/values-el-v34/strings.xml
+++ b/PermissionController/res/values-el-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Πρόσβαση στην τοποθεσία"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Για εφαρμογές και υπηρεσίες. Εάν είναι απενεργοποιημένη αυτή η ρύθμιση, τα δεδομένα μικροφώνου ενδέχεται να κοινοποιούνται όταν καλείτε έναν αριθμό έκτακτης ανάγκης."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Για εφαρμογές και υπηρεσίες"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Περιορισμένη ρύθμιση"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Για την ασφάλειά σας, αυτή η ρύθμιση δεν είναι διαθέσιμη αυτή τη στιγμή."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Μάθετε περισσότερα"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-el-watch/strings.xml b/PermissionController/res/values-el-watch/strings.xml
index 05063253d..6f461e93d 100644
--- a/PermissionController/res/values-el-watch/strings.xml
+++ b/PermissionController/res/values-el-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Αδυναμία αλλαγής"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ναι"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Ακύρωση"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Να επιτρέπεται πάντα"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Με τη χρήση της εφαρμογής"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Να επιτρέπεται πάντα"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Με τη χρήση της εφαρμογής"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Να επιτρέπεται πάντα"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Με τη χρήση της εφαρμογής"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Να επιτρέπεται πάντα"</string>
</resources>
diff --git a/PermissionController/res/values-el/strings.xml b/PermissionController/res/values-el/strings.xml
index a8039d2d9..32d792cce 100644
--- a/PermissionController/res/values-el/strings.xml
+++ b/PermissionController/res/values-el/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Όλες οι άδειες"</string>
<string name="other_permissions" msgid="2901186127193849594">"Άλλες δυνατότητες εφαρμογής"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Αίτημα άδειας"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Οι ενέργειες εγκατάστασης/απεγκατάστασης δεν υποστηρίζονται στο Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Επιλέξτε σε τι θα έχει πρόσβαση η εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Η εφαρμογή &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ενημερώθηκε. Επιλέξτε σε τι θα έχει πρόσβαση αυτή η εφαρμογή."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Ακύρωση"</string>
@@ -204,9 +202,11 @@
<string name="assistant_mic_label" msgid="1011432357152323896">"Εμφάνιση χρήσης μικροφώνου βοηθού"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ρυθμίσεις μη χρησιμοποιούμενων εφαρμογών"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Καταργήστε τις άδειες, εάν η εφαρμογή δεν χρησιμοποιείται."</string>
- <string name="unused_apps_label" msgid="2595428768404901064">"Κατάργηση αδειών και απελευθέρωση χώρου"</string>
+ <string name="unused_apps_label" msgid="2595428768404901064">"Κατάργηση αδειών και αποδέσμευση χώρου"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Παύση δραστηριότητας αδρανούς εφαρμογής"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Διαχείρ. εφαρμ. αν δεν χρησιμοποιείται"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Κατάργηση αδειών, διαγραφή προσωρινών αρχείων και διακοπή ειδοποιήσεων"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Κατάργηση αδειών, διαγραφή προσωρινών αρχείων, διακοπή ειδοποιήσεων και αρχειοθέτηση της εφαρμογής"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Για την προστασία των δεδομένων σας, οι άδειες για αυτή την εφαρμογή θα καταργηθούν εάν η εφαρμογή δεν χρησιμοποιηθεί για μερικούς μήνες."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Για την προστασία των δεδομένων σας, εάν δεν έχει χρησιμοποιηθεί η εφαρμογή για μερικούς μήνες, οι παρακάτω άδειες θα καταργηθούν: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Για την προστασία των δεδομένων σας, έχουν καταργηθεί οι άδειες εφαρμογών που δεν έχετε χρησιμοποιήσει κατά τους τελευταίους μήνες."</string>
@@ -221,8 +221,8 @@
<string name="auto_revoked_app_summary_two" msgid="1910545340763709389">"Καταργήθηκαν οι άδειες <xliff:g id="PERMISSION_NAME_0">%1$s</xliff:g> και <xliff:g id="PERMISSION_NAME_1">%2$s</xliff:g>"</string>
<string name="auto_revoked_app_summary_many" msgid="5930976230827378798">"Καταργήθηκε η άδεια <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> και <xliff:g id="NUMBER">%2$s</xliff:g> ακόμη άδειες"</string>
<string name="unused_apps_page_title" msgid="6986983535677572559">"Εφαρμογές που δεν χρησιμοποιούνται"</string>
- <string name="unused_apps_page_summary" msgid="1867593913217272155">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για λίγους μήνες:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Οι ειδοποιήσεις διακόπτονται για την εξοικονόμηση μπαταρίας\n• Τα προσωρινά αρχεία καταργούνται για την απελευθέρωση χώρου\n\nΓια να επιτρέψετε ξανά τις άδειες και τις ειδοποιήσεις, ανοίξτε την εφαρμογή."</string>
- <string name="unused_apps_page_tv_summary" msgid="2624911608663778308">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για έναν μήνα:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Τα προσωρινά αρχεία καταργούνται για την απελευθέρωση χώρου\n\nΓια να επιτρέψετε ξανά τις άδειες, ανοίξτε την εφαρμογή."</string>
+ <string name="unused_apps_page_summary" msgid="1867593913217272155">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για λίγους μήνες:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Οι ειδοποιήσεις διακόπτονται για την εξοικονόμηση μπαταρίας\n• Τα προσωρινά αρχεία καταργούνται για την αποδέσμευση χώρου\n\nΓια να επιτρέψετε ξανά τις άδειες και τις ειδοποιήσεις, ανοίξτε την εφαρμογή."</string>
+ <string name="unused_apps_page_tv_summary" msgid="2624911608663778308">"Εάν μια εφαρμογή δεν χρησιμοποιηθεί για έναν μήνα:\n\n• Οι άδειες καταργούνται για την προστασία των δεδομένων σας\n• Τα προσωρινά αρχεία καταργούνται για την αποδέσμευση χώρου\n\nΓια να επιτρέψετε ξανά τις άδειες, ανοίξτε την εφαρμογή."</string>
<string name="last_opened_category_title" msgid="8796557894614236128">"{count,plural, =1{Τελευταίο άνοιγμα πάνω από # μήνα πριν}other{Τελευταίο άνοιγμα πάνω από # μήνες πριν}}"</string>
<string name="last_opened_summary" msgid="5248984030024968808">"Τελευταίο άνοιγμα εφαρμογής <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="last_opened_summary_short" msgid="1646067226191176825">"Τελευταίο άνοιγμα <xliff:g id="DATE">%s</xliff:g>"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Εφαρμογή σημειώσεων"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Εφαρμογές που σας επιτρέπουν να κρατάτε σημειώσεις στη συσκευή σας"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"σημειώσεις"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Προεπιλ. εφαρμογή πορτοφολιού"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Εφαρμογή πορτοφολιού"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Οι εφαρμογές πορτοφολιού μπορούν να αποθηκεύσουν πιστωτικές κάρτες και κάρτες επιβράβευσης αφοσιωμένων πελατών, κλειδιά αυτοκινήτου και άλλα στοιχεία για να σας βοηθήσουν με διάφορες μορφές συναλλαγών."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Ορισμός της εφαρμογής <xliff:g id="APP_NAME">%1$s</xliff:g> ως προεπιλεγμένης εφαρμογής πορτοφολιού;"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Δεν απαιτούνται άδειες"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Τρέχουσα προεπιλογή"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Να μην ερωτηθώ ξανά"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Προεπιλογή"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Ενημερώσεις κοινοποίησης δεδομένων"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Ορισμένες εφαρμογές άλλαξαν τον τρόπο με τον οποίο ενδέχεται να κοινοποιούν τα δεδομένα τοποθεσίας σας"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ρυθμίσεις"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Πρόσβαση στις <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Πρόσβαση χθες, στις <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Πρόσβαση στις <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ο κωδικός πρόσβασης μίας χρήσης είναι 132435"</string>
</resources>
diff --git a/PermissionController/res/values-en-rAU-v34/strings.xml b/PermissionController/res/values-en-rAU-v34/strings.xml
index 4800f8a91..95a1512af 100644
--- a/PermissionController/res/values-en-rAU-v34/strings.xml
+++ b/PermissionController/res/values-en-rAU-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Location access"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apps and services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Restricted setting"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"For your security, this setting is currently unavailable."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Learn more"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-en-rAU-watch/strings.xml b/PermissionController/res/values-en-rAU-watch/strings.xml
index 70643f521..e3f48cb2c 100644
--- a/PermissionController/res/values-en-rAU-watch/strings.xml
+++ b/PermissionController/res/values-en-rAU-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Can\'t be changed"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yes"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancel"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"All the time"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"While using app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"All the time"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"While using app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"All the time"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"While using app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"All the time"</string>
</resources>
diff --git a/PermissionController/res/values-en-rAU/strings.xml b/PermissionController/res/values-en-rAU/strings.xml
index 6fb7994a8..15d895d09 100644
--- a/PermissionController/res/values-en-rAU/strings.xml
+++ b/PermissionController/res/values-en-rAU/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"All permissions"</string>
<string name="other_permissions" msgid="2901186127193849594">"Other app capabilities"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permission request"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Install/Uninstall actions not supported on Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Choose what to allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; has been updated. Choose what access to allow this app."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancel"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remove permissions and free up space"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pause app activity if unused"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Manage app if unused"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissions, delete temporary files and stop notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove permissions, delete temporary files, stop notifications and archive the app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"To protect your data, permissions for this app will be removed if the app is unused for a few months."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"To protect your data, if the app is unused for a few months, the following permissions will be removed: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"To protect your data, permissions have been removed from apps that you haven’t used in a few months."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notes app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps that allow you to take notes on your device"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Default wallet app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Set <xliff:g id="APP_NAME">%1$s</xliff:g> as your default wallet app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No permissions needed"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Current default"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Don\'t ask again"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Set as default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Data sharing updates"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Some apps changed the way that they may share your location data"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Settings"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Accessed <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Your one-time password is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-en-rCA-v34/strings.xml b/PermissionController/res/values-en-rCA-v34/strings.xml
index 4800f8a91..95a1512af 100644
--- a/PermissionController/res/values-en-rCA-v34/strings.xml
+++ b/PermissionController/res/values-en-rCA-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Location access"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apps and services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Restricted setting"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"For your security, this setting is currently unavailable."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Learn more"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-en-rCA-watch/strings.xml b/PermissionController/res/values-en-rCA-watch/strings.xml
index adecb65b9..aa97f28cc 100644
--- a/PermissionController/res/values-en-rCA-watch/strings.xml
+++ b/PermissionController/res/values-en-rCA-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Can\'t be changed"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yes"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancel"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"All the time"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"While using app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"All the time"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"While using app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"All the time"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"While using app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"All the time"</string>
</resources>
diff --git a/PermissionController/res/values-en-rCA/strings.xml b/PermissionController/res/values-en-rCA/strings.xml
index a01a0cef2..b6a481aa6 100644
--- a/PermissionController/res/values-en-rCA/strings.xml
+++ b/PermissionController/res/values-en-rCA/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"All permissions"</string>
<string name="other_permissions" msgid="2901186127193849594">"Other app capabilities"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permission request"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Install/Uninstall actions not supported on Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Choose what to allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; has been updated. Choose what to allow this app to access."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancel"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remove permissions and free up space"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pause app activity if unused"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Manage app if unused"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissions, delete temporary files, and stop notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove permissions, delete temporary files, stop notifications, and archive the app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"To protect your data, permissions for this app will be removed if the app is unused for a few months."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"To protect your data, if the app is unused for a few months, the following permissions will be removed: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"To protect your data, permissions have been removed from apps that you haven’t used in a few months."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notes app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps that allow you to take notes on your device"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Default wallet app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Set <xliff:g id="APP_NAME">%1$s</xliff:g> as your default wallet app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No permissions needed"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Current default"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Don’t ask again"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Set as default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Data sharing updates"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Some apps changed the way they may share your location data"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Settings"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Accessed <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Your one time password is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-en-rGB-v34/strings.xml b/PermissionController/res/values-en-rGB-v34/strings.xml
index 4800f8a91..95a1512af 100644
--- a/PermissionController/res/values-en-rGB-v34/strings.xml
+++ b/PermissionController/res/values-en-rGB-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Location access"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apps and services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Restricted setting"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"For your security, this setting is currently unavailable."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Learn more"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-en-rGB-watch/strings.xml b/PermissionController/res/values-en-rGB-watch/strings.xml
index 70643f521..e3f48cb2c 100644
--- a/PermissionController/res/values-en-rGB-watch/strings.xml
+++ b/PermissionController/res/values-en-rGB-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Can\'t be changed"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yes"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancel"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"All the time"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"While using app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"All the time"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"While using app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"All the time"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"While using app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"All the time"</string>
</resources>
diff --git a/PermissionController/res/values-en-rGB/strings.xml b/PermissionController/res/values-en-rGB/strings.xml
index bfaca7355..37c963e18 100644
--- a/PermissionController/res/values-en-rGB/strings.xml
+++ b/PermissionController/res/values-en-rGB/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"All permissions"</string>
<string name="other_permissions" msgid="2901186127193849594">"Other app capabilities"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permission request"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Install/Uninstall actions not supported on Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Choose what to allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; has been updated. Choose what access to allow this app."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancel"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remove permissions and free up space"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pause app activity if unused"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Manage app if unused"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissions, delete temporary files and stop notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove permissions, delete temporary files, stop notifications and archive the app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"To protect your data, permissions for this app will be removed if the app is unused for a few months."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"To protect your data, if the app is unused for a few months, the following permissions will be removed: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"To protect your data, permissions have been removed from apps that you haven’t used in a few months."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notes app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps that allow you to take notes on your device"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Default wallet app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Set <xliff:g id="APP_NAME">%1$s</xliff:g> as your default wallet app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No permissions needed"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Current default"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Don\'t ask again"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Set as default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Data sharing updates"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Some apps changed the way that they may share your location data"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Settings"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Accessed <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Your one-time password is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-en-rIN-v34/strings.xml b/PermissionController/res/values-en-rIN-v34/strings.xml
index 4800f8a91..95a1512af 100644
--- a/PermissionController/res/values-en-rIN-v34/strings.xml
+++ b/PermissionController/res/values-en-rIN-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Location access"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apps and services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Restricted setting"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"For your security, this setting is currently unavailable."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Learn more"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-en-rIN-watch/strings.xml b/PermissionController/res/values-en-rIN-watch/strings.xml
index 70643f521..e3f48cb2c 100644
--- a/PermissionController/res/values-en-rIN-watch/strings.xml
+++ b/PermissionController/res/values-en-rIN-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Can\'t be changed"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yes"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancel"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"All the time"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"While using app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"All the time"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"While using app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"All the time"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"While using app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"All the time"</string>
</resources>
diff --git a/PermissionController/res/values-en-rIN/strings.xml b/PermissionController/res/values-en-rIN/strings.xml
index bfaca7355..37c963e18 100644
--- a/PermissionController/res/values-en-rIN/strings.xml
+++ b/PermissionController/res/values-en-rIN/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"All permissions"</string>
<string name="other_permissions" msgid="2901186127193849594">"Other app capabilities"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permission request"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Install/Uninstall actions not supported on Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Choose what to allow &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; to access"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; has been updated. Choose what access to allow this app."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancel"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remove permissions and free up space"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pause app activity if unused"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Manage app if unused"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissions, delete temporary files and stop notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove permissions, delete temporary files, stop notifications and archive the app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"To protect your data, permissions for this app will be removed if the app is unused for a few months."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"To protect your data, if the app is unused for a few months, the following permissions will be removed: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"To protect your data, permissions have been removed from apps that you haven’t used in a few months."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notes app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps that allow you to take notes on your device"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Default wallet app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Set <xliff:g id="APP_NAME">%1$s</xliff:g> as your default wallet app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No permissions needed"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Current default"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Don\'t ask again"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Set as default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Data sharing updates"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Some apps changed the way that they may share your location data"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Settings"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Accessed <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Accessed yesterday <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Accessed <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Your one-time password is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-en-rXC-v34/strings.xml b/PermissionController/res/values-en-rXC-v34/strings.xml
index 525a410b1..aa13222be 100644
--- a/PermissionController/res/values-en-rXC-v34/strings.xml
+++ b/PermissionController/res/values-en-rXC-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‎‏‏‏‏‎‎‎‏‏‎‎Location access‎‏‎‎‏‎"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‏‏‏‎‏‎‎‎‏‎‏‎‎‏‏‎‏‎‏‏‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‎‎‎‎For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number‎‏‎‎‏‎"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‏‏‎For apps and services‎‏‎‎‏‎"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‎‎‎‏‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‎‎‎Restricted setting‎‏‎‎‏‎"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‎‎‎‎‎‏‎‎‏‎‎‎‎‏‎‏‎‎‏‏‏‎‏‏‏‎‏‎For your security, this setting is currently unavailable.‎‏‎‎‏‎"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‏‏‏‎‏‏‏‎‎‎‎‎‏‏‏‏‎‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎Learn more‎‏‎‎‏‎"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-en-rXC-watch/strings.xml b/PermissionController/res/values-en-rXC-watch/strings.xml
index 75a8de56f..c8631b66a 100644
--- a/PermissionController/res/values-en-rXC-watch/strings.xml
+++ b/PermissionController/res/values-en-rXC-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‎‏‎‎‏‏‎‎‏‏‎Can\'t be changed‎‏‎‎‏‎"</string>
<string name="generic_yes" msgid="2489207724988649846">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‏‎‎‏‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‏‏‎‏‏‎‎Yes‎‏‎‎‏‎"</string>
<string name="generic_cancel" msgid="2631708607129269698">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‎‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎Cancel‎‏‎‎‏‎"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‎‏‎‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎‎‎‏‏‏‎‎‎‎All the time‎‏‎‎‏‎"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‎‏‎‏‎‎‎‎‎‎‎‎‏‏‎‎‏‏‎‎‏‎‎‏‎‎While using app‎‏‎‎‏‎"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‏‏‎‎All the time‎‏‎‎‏‎"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‏‎‎‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‏‎‎‏‏‏‏‏‎‎While using app‎‏‎‎‏‎"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‏‎‏‎‏‎‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‏‏‎‎‏‎‎‎‏‏‏‎‏‎‏‎‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎All the time‎‏‎‎‏‎"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‎‎‎‏‏‎‏‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‎‎‎‎‎‏‎‎‏‎‎‏‎‏‏‏‏‎‏‏‎‎‏‎‎While using app‎‏‎‎‏‎"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‎‎‏‎‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎‎‏‎‏‎All the time‎‏‎‎‏‎"</string>
</resources>
diff --git a/PermissionController/res/values-en-rXC/strings.xml b/PermissionController/res/values-en-rXC/strings.xml
index 34a84175e..0d9eb03d4 100644
--- a/PermissionController/res/values-en-rXC/strings.xml
+++ b/PermissionController/res/values-en-rXC/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‎‏‎‏‎‎All permissions‎‏‎‎‏‎"</string>
<string name="other_permissions" msgid="2901186127193849594">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‎‎‎‎‏‏‎‎‎‏‎‏‎‏‎‏‏‎‏‎‎‏‎‏‎‏‏‎‏‎‏‎‏‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎Other app capabilities‎‏‎‎‏‎"</string>
<string name="permission_request_title" msgid="8790310151025020126">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‎‎‏‎‎‏‏‎‎‎‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‎‏‏‎‏‏‏‏‎‎Permission request‎‏‎‎‏‎"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‎‎‏‏‏‏‏‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‏‏‎‏‏‎‏‎‎‏‎Android Wear‎‏‎‎‏‎"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎Install/Uninstall actions not supported on Wear.‎‏‎‎‏‎"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‎‎‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎Choose what to allow &lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; to access‎‏‎‎‏‎"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‎‎‏‎‎‎‏‎‎‎‏‏‏‎‎‎‏‎&lt;b&gt;‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎&lt;/b&gt; has been updated. Choose what to allow this app to access.‎‏‎‎‏‎"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‏‎‎Cancel‎‏‎‎‏‎"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‎‏‎‎‎‏‏‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‎Remove permissions if app isn’t used‎‏‎‎‏‎"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎Remove permissions and free up space‎‏‎‎‏‎"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‏‎‏‏‏‎‏‎‎‎‎‎‎‎‏‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‏‎‏‏‏‎‎‎Pause app activity if unused‎‏‎‎‏‎"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎Manage app if unused‎‏‎‎‏‎"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‎‏‏‎‎‎‎‏‎‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‏‎‎‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‏‏‎Remove permissions, delete temporary files, and stop notifications‎‏‎‎‏‎"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‎‎‏‎‏‏‎‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‎‎‎‎‏‏‎‏‎‎Remove permissions, delete temporary files, stop notifications, and archive the app‎‏‎‎‏‎"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‏‎‎‎‏‎‎‎‏‎‎‏‎‏‏‎‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‏‎To protect your data, permissions for this app will be removed if the app is unused for a few months.‎‏‎‎‏‎"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‎‎‎‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‎‏‎‏‎To protect your data, if the app is unused for a few months, the following permissions will be removed: ‎‏‎‎‏‏‎<xliff:g id="PERMS">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‎‎‎‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‏‏‏‎‎‎‎To protect your data, permissions have been removed from apps that you haven’t used in a few months.‎‏‎‎‏‎"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‏‎‎‏‎‏‎Notes app‎‏‎‎‏‎"</string>
<string name="role_notes_description" msgid="8496852798616883551">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‏‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‏‎‏‎‎‎‏‎‎‎‏‎‎‏‎‏‎‏‏‏‏‏‎‏‎‎‎‏‎‏‎‏‏‏‏‏‎Apps that allow you to take notes on your device‎‏‎‎‏‎"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‎‎‎‏‎‎‎‎‏‏‏‎‎‎‏‎‏‏‏‎‎‏‎‎‎‎‎‏‎‏‎‏‎‏‏‏‎‎‏‎‏‏‏‎‏‎‎‏‏‎‏‏‏‎notes‎‏‎‎‏‎"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‏‏‏‏‎‎‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‎‎‏‏‏‎‏‎‎‏‏‏‏‎‏‎‏‏‏‏‎Default wallet app‎‏‎‎‏‎"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‎‎‎‎‎‏‎‎‎‎‎‎‎‎‎‏‎‎‎‏‎‏‎‏‎‏‎‏‏‎‏‏‎‏‏‎‎‎Wallet app‎‏‎‎‏‎"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‎‏‎‏‎‎‎‎‏‎‎‏‏‎‎‏‎‏‎‏‎‏‎‏‎‏‏‎‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‎‎Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions.‎‏‎‎‏‎"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‏‏‏‏‎‏‎‏‏‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‏‎‎‏‏‎‎‎‏‎‏‎Set ‎‏‎‎‏‏‎<xliff:g id="APP_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ as your default wallet app?‎‏‎‎‏‎"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‏‎‎‎‎‎‎‏‏‎‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‏‏‎‎‏‎‏‎‎‏‎‏‎‎‎‏‎‏‏‏‏‎‏‎‎‏‎‏‏‎‏‎No permissions needed‎‏‎‎‏‎"</string>
<string name="request_role_current_default" msgid="738722892438247184">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‏‎‎‎‏‎‎‎‏‏‏‎‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‎‎‎Current default‎‏‎‎‏‎"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‎‎‎‎‎‏‏‎‏‏‎‏‏‎‏‎‎‏‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‎Don’t ask again‎‏‎‎‏‎"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‏‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎Set as default‎‏‎‎‏‎"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‏‏‏‏‏‎Data sharing updates‎‏‎‎‏‎"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‎‏‏‎‏‏‎‏‎‏‏‏‎‏‏‏‏‎‎‏‎‎‏‏‎‎‏‏‎Some apps changed the way they may share your location data‎‏‎‎‏‎"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‏‏‎‏‏‏‎‎‏‏‎‏‏‏‎‏‎‏‎‎‏‎‎‎‎‏‎‏‎‏‏‎‏‏‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎Settings‎‏‎‎‏‎"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‎Accessed ‎‏‎‎‏‏‎<xliff:g id="TIME_DATE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‏‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‏‏‏‏‏‎Accessed yesterday ‎‏‎‎‏‏‎<xliff:g id="TIME_DATE">%1$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‏‏‏‎‏‏‏‏‎‏‏‎‎‏‎‏‎‎‏‏‎‏‎‏‎‎‏‏‎‏‎‎‎‎‎Accessed ‎‏‎‎‏‏‎<xliff:g id="TIME_DATE_0">%1$s</xliff:g>‎‏‎‎‏‏‏‎ ‎‏‎‎‏‏‎<xliff:g id="TIME_DATE_1">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‏‎‏‏‏‏‏‏‎‎Your one time password is 132435‎‏‎‎‏‎"</string>
</resources>
diff --git a/PermissionController/res/values-es-rUS-v34/strings.xml b/PermissionController/res/values-es-rUS-v34/strings.xml
index e180c0b7c..3168add4e 100644
--- a/PermissionController/res/values-es-rUS-v34/strings.xml
+++ b/PermissionController/res/values-es-rUS-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acceso a la ubicación"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para apps y servicios. Aunque se desactive este parámetro de configuración, es posible que se sigan compartiendo los datos del micrófono cuando llames a un número de emergencia."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para apps y servicios"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Parámetro restringido"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Por seguridad, este parámetro de configuración no está disponible actualmente."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Más información"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-es-rUS-watch/strings.xml b/PermissionController/res/values-es-rUS-watch/strings.xml
index 25fa4d5f5..ce3aa4a86 100644
--- a/PermissionController/res/values-es-rUS-watch/strings.xml
+++ b/PermissionController/res/values-es-rUS-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"No puedes cambiar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sí"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Todo el tiempo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Con la app en uso"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Todo el tiempo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Con la app en uso"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Todo el tiempo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Con la app en uso"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Todo el tiempo"</string>
</resources>
diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml
index ba8386062..5a6bfa675 100644
--- a/PermissionController/res/values-es-rUS/strings.xml
+++ b/PermissionController/res/values-es-rUS/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todos los permisos"</string>
<string name="other_permissions" msgid="2901186127193849594">"Otras funciones de la app"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitud de permiso"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear no admite las acciones de instalación y desinstalación"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Selecciona los permisos de acceso para &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Se actualizó &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Selecciona los permisos de acceso para esta app."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar los permisos si la app no se usa"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Quitar permisos y liberar espacio"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar actividad en la app si no se usa"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Administrar la app si no se usa"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Quitar permisos, borrar archivos temporales y detener notificaciones"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Quita permisos, borra archivos temporales, detiene notificaciones y archiva la app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger tus datos, se quitarán los permisos de esta app si no la usas durante varios meses."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger tus datos, si no usas la app durante varios meses, se quitarán los siguientes permisos: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger tus datos, se quitaron los permisos de las apps que están en desuso hace varios meses."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps que te permiten tomar notas en tu dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Billetera predeterminada"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App de billetera"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Las apps de billetera pueden almacenar tus tarjetas de crédito y lealtad, las llaves de tu vehículo y otros elementos para ayudarte con los diferentes tipos de transacciones."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"¿Quieres configurar <xliff:g id="APP_NAME">%1$s</xliff:g> como tu app de billetera predeterminada?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No se requieren permisos"</string>
<string name="request_role_current_default" msgid="738722892438247184">"App predeterminada actualmente"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"No volver a preguntar"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Hacer predeterminada"</string>
@@ -448,7 +453,7 @@
<string name="incident_report_dialog_text" msgid="5675553296891757523">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> solicita subir un informe de errores de este dispositivo generado el <xliff:g id="DATE">%2$s</xliff:g> a las <xliff:g id="TIME">%3$s</xliff:g>. Los informes de errores pueden incluir información personal sobre tu dispositivo o registrada por apps, como nombres de usuario, datos de ubicación, identificadores del dispositivo y datos de red. Solo debes compartir los informes de errores con personas y apps de confianza. ¿Permitir que <xliff:g id="APP_NAME_1">%4$s</xliff:g> suba un informe de errores?"</string>
<string name="incident_report_error_dialog_text" msgid="4189647113387092272">"Se produjo un error al procesar el informe de errores para <xliff:g id="APP_NAME">%1$s</xliff:g>. Por lo tanto, no es posible compartir los datos detallados de depuración. Lamentamos la interrupción."</string>
<string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Permitir"</string>
- <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Denegar"</string>
+ <string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Rechazar"</string>
<string name="adjust_user_sensitive_title" msgid="4196724451314280527">"Configuración avanzada"</string>
<string name="menu_adjust_user_sensitive" msgid="6497923610654425780">"Configuración avanzada"</string>
<string name="adjust_user_sensitive_globally_title" msgid="8649190949066029174">"Mostrar uso de las apps del sistema"</string>
@@ -503,7 +508,7 @@
<string name="permgroupupgraderequestdetail_microphone" msgid="2870497719571464239">"Esta app quiere grabar audio todo el tiempo, incluso cuando no la uses. "<annotation id="link">"Permite el acceso en Configuración."</annotation></string>
<string name="permgrouprequest_activityRecognition" msgid="5415121592794230330">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a tu actividad física?"</string>
<string name="permgrouprequest_device_aware_activityRecognition" msgid="3408326850847755759">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; acceda a la actividad física en tu &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt;?"</string>
- <string name="permgrouprequest_camera" msgid="5123097035410002594">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tome fotos y grabe videos?"</string>
+ <string name="permgrouprequest_camera" msgid="5123097035410002594">"¿Quieres permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tome fotos y grabe videos?"</string>
<string name="permgrouprequest_device_aware_camera" msgid="3525106924487608868">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tome fotos y grabe videos en tu &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt;?"</string>
<string name="permgrouprequestdetail_camera" msgid="9085323239764667883">"La app solo podrá tomar fotos y grabar videos cuando esté en uso"</string>
<string name="permgroupbackgroundrequest_camera" msgid="1274286575704213875">"¿Permitir que &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; tome fotos y grabe videos?"</string>
@@ -644,8 +649,12 @@
<string name="shares_location_with_third_parties" msgid="2278051743742057767">"Tus datos de ubicación ahora se comparten con terceros"</string>
<string name="shares_location_with_third_parties_for_advertising" msgid="1918588064014480513">"Tus datos de ubicación ahora se comparten con terceros para publicidad o marketing"</string>
<string name="updated_in_last_days" msgid="8371811947153042322">"{count,plural, =0{Se actualizó en el último día}=1{Se actualizó en el último día}many{Se actualizó en los últimos # de días}other{Se actualizó en los últimos # días}}"</string>
- <string name="no_updates_at_this_time" msgid="9031085635689982935">"No hay novedades por el momento"</string>
+ <string name="no_updates_at_this_time" msgid="9031085635689982935">"No hay actualizaciones por el momento"</string>
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Actualizaciones del uso compartido de datos"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Algunas apps cambiaron la forma en que podrían compartir tus datos de ubicación"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Configuración"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Último acceso: ayer a la(s) <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> a la(s) <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Tu contraseña de un solo uso es 132435"</string>
</resources>
diff --git a/PermissionController/res/values-es-v34/strings.xml b/PermissionController/res/values-es-v34/strings.xml
index 8253d9b47..ad8d83026 100644
--- a/PermissionController/res/values-es-v34/strings.xml
+++ b/PermissionController/res/values-es-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acceso a la ubicación"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para aplicaciones y servicios. Aunque este ajuste esté desactivado, se pueden compartir datos del micrófono si llamas a un número de emergencia."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para aplicaciones y servicios"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ajuste restringido"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Por seguridad, este ajuste no está disponible actualmente."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Más información"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-es-watch/strings.xml b/PermissionController/res/values-es-watch/strings.xml
index db42f6961..92bbdd057 100644
--- a/PermissionController/res/values-es-watch/strings.xml
+++ b/PermissionController/res/values-es-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"No cambiar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sí"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Todo el tiempo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Mientras se usa la app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Todo el tiempo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Mientras se usa la app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Todo el tiempo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Mientras se usa la app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Todo el tiempo"</string>
</resources>
diff --git a/PermissionController/res/values-es/strings.xml b/PermissionController/res/values-es/strings.xml
index 54f7751c2..e16809347 100644
--- a/PermissionController/res/values-es/strings.xml
+++ b/PermissionController/res/values-es/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todos los permisos"</string>
<string name="other_permissions" msgid="2901186127193849594">"Otras funciones de la aplicación"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitud de permiso"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Las acciones de instalar y desinstalar no pueden realizarse en Wear"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Elige los permisos de acceso que quieres conceder a &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; se ha actualizado. Elige los permisos de acceso que quieres conceder a esta aplicación."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -195,7 +193,7 @@
<string name="app_permission_button_deny" msgid="6016454069832050300">"No permitir"</string>
<string name="precise_image_description" msgid="6349638632303619872">"Ubicación precisa"</string>
<string name="approximate_image_description" msgid="938803699637069884">"Ubicación aproximada"</string>
- <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Usar ubicación precisa"</string>
+ <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Usar ubic. precisa"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Cuando la ubicación precisa está desactivada, las aplicaciones pueden consultar tu ubicación aproximada"</string>
<string name="app_permission_title" msgid="2090897901051370711">"Permiso de <xliff:g id="PERM">%1$s</xliff:g>"</string>
<string name="app_permission_header" msgid="2951363137032603806">"Acceso a <xliff:g id="PERM">%1$s</xliff:g> para esta aplicación"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar permisos si la aplicación no se usa"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Quitar permisos y liberar espacio"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar actividad de la aplicación si no se usa"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gestionar la aplicación si no se usa"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Quita permisos, elimina archivos temporales y detiene las notificaciones"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Quita permisos, elimina archivos temporales, detiene las notificaciones y archiva la aplicación"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger tus datos, se quitarán los permisos de esta aplicación si no la usas durante unos meses."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger tus datos, si la aplicación no se ha utilizado durante unos meses, se quitarán los siguientes permisos: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger tus datos, se han quitado los permisos de las aplicaciones que llevas unos meses sin usar."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplicación de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplicaciones que te permiten tomar notas en tu dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"App de cartera predeterminada"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplicación de cartera"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Las aplicaciones de cartera pueden almacenar tus tarjetas de crédito y de fidelización, tus llaves del coche y otros elementos para ayudarte con los distintos tipos de transacciones."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"¿Establecer <xliff:g id="APP_NAME">%1$s</xliff:g> como aplicación de cartera predeterminada?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"No se necesita ningún permiso"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Predeterminada"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"No volver a preguntar"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Establecer como predeterminado"</string>
@@ -627,7 +632,7 @@
<string name="permission_rationale_location_settings_title" msgid="7204145004850190953">"Tus datos de ubicación"</string>
<string name="permission_rationale_permission_settings_message" msgid="631286040979660267">"Cambia el acceso de esta aplicación en la "<annotation id="link">"configuración de privacidad"</annotation></string>
<string name="permission_rationale_purpose_app_functionality" msgid="8397736681065841405">"Funcionalidad de la aplicación"</string>
- <string name="permission_rationale_purpose_analytics" msgid="2070800501189620712">"Analítica"</string>
+ <string name="permission_rationale_purpose_analytics" msgid="2070800501189620712">"Estadísticas"</string>
<string name="permission_rationale_purpose_developer_communications" msgid="6453047018892062374">"Comunicaciones del desarrollador"</string>
<string name="permission_rationale_purpose_advertising" msgid="7156966429245180236">"Publicidad o marketing"</string>
<string name="permission_rationale_purpose_fraud_prevention_security" msgid="4262104770357031902">"Prevención de fraudes, seguridad y cumplimiento"</string>
@@ -644,8 +649,12 @@
<string name="shares_location_with_third_parties" msgid="2278051743742057767">"Tus datos de ubicación ahora se comparten con terceros"</string>
<string name="shares_location_with_third_parties_for_advertising" msgid="1918588064014480513">"Tus datos de ubicación ahora se comparten con terceros para fines de publicidad o marketing"</string>
<string name="updated_in_last_days" msgid="8371811947153042322">"{count,plural, =0{Se ha actualizado en el último día}=1{Se ha actualizado en el último día}many{Se ha actualizado en los últimos # días}other{Se ha actualizado en los últimos # días}}"</string>
- <string name="no_updates_at_this_time" msgid="9031085635689982935">"No hay novedades por el momento"</string>
+ <string name="no_updates_at_this_time" msgid="9031085635689982935">"No hay cambios por el momento"</string>
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Cambios en cómo se comparten los datos"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Algunas aplicaciones han cambiado cómo pueden compartir tus datos de ubicación"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ajustes"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Último acceso: ayer, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Tu contraseña de un solo uso es 132435"</string>
</resources>
diff --git a/PermissionController/res/values-et-v34/strings.xml b/PermissionController/res/values-et-v34/strings.xml
index 4476aecdd..856e95a8e 100644
--- a/PermissionController/res/values-et-v34/strings.xml
+++ b/PermissionController/res/values-et-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Juurdepääs asukohale"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Rakenduste ja teenuste jaoks. Isegi kui see seade on välja lülitatud, võidakse mikrofoni andmeid siiski jagada hädaabinumbrile helistades."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Rakenduste ja teenuste jaoks"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Piiratud seade"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Teie turvalisuse huvides pole see seade praegu saadaval."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Lisateave"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-et-watch/strings.xml b/PermissionController/res/values-et-watch/strings.xml
index b96aab80f..9813469ea 100644
--- a/PermissionController/res/values-et-watch/strings.xml
+++ b/PermissionController/res/values-et-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ei saa muuta"</string>
<string name="generic_yes" msgid="2489207724988649846">"Jah"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Tühista"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Kogu aeg"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Rakenduse kasutamise ajal"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Kogu aeg"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Rakenduse kasutamise ajal"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Kogu aeg"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Rakenduse kasutamise ajal"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Kogu aeg"</string>
</resources>
diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml
index f17cbd1f8..1bbda2532 100644
--- a/PermissionController/res/values-et/strings.xml
+++ b/PermissionController/res/values-et/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Kõik load"</string>
<string name="other_permissions" msgid="2901186127193849594">"Rakenduse muud funktsioonid"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Loa taotlus"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ei toeta installimist/desinstallimist."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Valige, millele lubate rakendusel &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; juurde pääseda"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Rakendust &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; värskendati. Valige, millele lubate sellel rakendusel juurde pääseda."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Tühista"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Eemalda load, kui rakendust ei kasutata"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Eemalda load ja vabasta ruumi"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Tegevusetuna rakenduse tegevuste peatamine"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Halda kasutamata rakendusi"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Eemaldatakse load, kustutatakse ajutised failid ja peatatakse märguanded"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Eemalda load, kustuta ajutised failid, peata märguanded ja arhiivi rakendus"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Teie andmete kaitsmiseks eemaldatakse selle rakenduse load, kui seda mõne kuu jooksul ei kasutata."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Teie andmete kaitsmiseks eemaldatakse selle rakenduse järgmised load, kui rakendust mõne kuu jooksul ei kasutata: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Teie andmete kaitsmiseks eemaldati load rakendustelt, mida te ei ole mõne kuu jooksul kasutanud."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Märkmerakendus"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Rakendused, mis võimaldavad teie seadmes märkmeid teha"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"märkmed"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Vaikerahakotirakendus"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Rahakotirakendus"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Rahakotirakendused võivad salvestada teie krediit- ja kliendikaarte, autovõtmeid ning muid asju, et eri tehinguvormide puhul aidata."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Kas määrata <xliff:g id="APP_NAME">%1$s</xliff:g> vaikimisi teie rahakotirakenduseks?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Lube ei ole vaja"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Praegune vaikeseade"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ära enam küsi"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Määra vaikeseadeks"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Andmete jagamise värskendused"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Mõni rakendus on muutnud teie asukohaandmete jagamise viisi"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Seaded"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Juurde pääsetud <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Juurde pääsetud eile <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Juurde pääsetud <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Teie ühekordne parool on 132435"</string>
</resources>
diff --git a/PermissionController/res/values-eu-v34/strings.xml b/PermissionController/res/values-eu-v34/strings.xml
index 5b1882738..50037e47a 100644
--- a/PermissionController/res/values-eu-v34/strings.xml
+++ b/PermissionController/res/values-eu-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Kokapena erabiltzeko baimena"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Aplikazio eta zerbitzuetarako. Ezarpena desaktibatuta badago ere, baliteke mikrofonoaren bidez lortutako datuak partekatzea larrialdietarako zenbaki batera deitzean."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Aplikazio eta zerbitzuetarako"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Murriztapenak ditu ezarpenak"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Zure segurtasuna bermatzeko, ezarpena ez dago erabilgarri une honetan."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Lortu informazio gehiago"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-eu-watch/strings.xml b/PermissionController/res/values-eu-watch/strings.xml
index 840f6faef..0617758e9 100644
--- a/PermissionController/res/values-eu-watch/strings.xml
+++ b/PermissionController/res/values-eu-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ezin da aldatu"</string>
<string name="generic_yes" msgid="2489207724988649846">"Bai"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Utzi"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Beti"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Aplikazioa erabili bitartean"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Beti"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Aplikazioa erabili bitartean"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Beti"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Aplikazioa erabili bitartean"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Beti"</string>
</resources>
diff --git a/PermissionController/res/values-eu/strings.xml b/PermissionController/res/values-eu/strings.xml
index a84c1f9ca..dfb15a8ae 100644
--- a/PermissionController/res/values-eu/strings.xml
+++ b/PermissionController/res/values-eu/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Baimen guztiak"</string>
<string name="other_permissions" msgid="2901186127193849594">"Aplikazioaren beste gaitasun batzuk"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Baimen-eskaera"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Instalatzeko eta desinstalatzeko ekintzak ezin dira gauzatu Wear gailuetan."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Aukeratu zer atzi dezakeen &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aplikazioak"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Eguneratu egin da &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Aukeratu aplikazioak zer atzi dezakeen."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Utzi"</string>
@@ -202,11 +200,13 @@
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ikusi <xliff:g id="APP">%1$s</xliff:g> aplikazioaren baimen guztiak"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ikusi baimen hau duten aplikazio guztiak"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Erakutsi laguntzaileak mikrofonoa erabiltzeko duen baimena"</string>
- <string name="unused_apps_category_title" msgid="2988455616845243901">"Erabili gabeko aplikazio-ezarpenak"</string>
+ <string name="unused_apps_category_title" msgid="2988455616845243901">"Erabili gabeko aplikazioen ezarpenak"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Kendu baimenak aplikazioa erabiltzen ez bada"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Kendu baimenak eta egin tokia"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausatu aplikazioko jarduerak, erabiltzen ez bada"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Kudeatu aplikazioa erabiltzen ez bada"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Kendu baimenak, ezabatu aldi baterako fitxategiak eta geldiarazi jakinarazpenak"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Kendu baimenak, ezabatu aldi baterako fitxategiak, geldiarazi jakinarazpenak eta artxibatu aplikazioa"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Zure datuak babeste aldera, aplikazio honen baimenak kendu egingo dira aplikazioa ez baduzu erabiltzen zenbait hilabetez."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Zure datuak babeste aldera, kendu egingo dira honako baimen hauek zenbait hilabetez aplikazioa erabiltzen ez baduzu: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Zure datuak babeste aldera, kendu egin dira zenbait hilabetez erabili ez dituzun aplikazioen baimenak."</string>
@@ -377,7 +377,7 @@
<string name="role_emergency_search_keywords" msgid="1920007722599213358">"ice"</string>
<string name="role_home_label" msgid="3871847846649769412">"Hasierako aplikazio lehenetsia"</string>
<string name="role_home_short_label" msgid="8544733747952272337">"Hasierako aplikazioa"</string>
- <string name="role_home_description" msgid="7997371519626556675">"Android-eko gailuko hasierako pantailak ordezten dituzten aplikazioak (\"abiarazle\" ere deitzen zaie). Gailuko eduki eta eginbideetarako sarbidea ematen dute."</string>
+ <string name="role_home_description" msgid="7997371519626556675">"Android-eko gailuko orri nagusiak ordezten dituzten aplikazioak (\"abiarazle\" ere deitzen zaie). Gailuko eduki eta eginbideetarako sarbidea ematen dute."</string>
<string name="role_home_request_title" msgid="738136983453341081">"<xliff:g id="APP_NAME">%1$s</xliff:g> ezarri nahi duzu hasierako aplikazio lehenetsi gisa?"</string>
<string name="role_home_request_description" msgid="2658833966716057673">"Ez du behar baimenik"</string>
<string name="role_home_search_keywords" msgid="3830755001192666285">"abiarazlea"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Oharren aplikazioa"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Gailuan oharrak idazteko aukera ematen dizuten aplikazioak"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"oharrak"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Diru-zorro lehenetsia"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Diru-zorroaren aplikazioa"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Diru-zorroaren aplikazioetan zure saldoa eta fideltasun-txartelak, autoko giltzak nahiz bestelako gauzak gorde ditzakezu, errazagoa izan dadin askotariko transakzioak egitea."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> diru-zorro lehenetsi gisa ezarri nahi duzu?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Ez du behar baimenik"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aplikazio lehenetsia"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ez galdetu berriro"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Ezarri lehenetsi gisa"</string>
@@ -445,7 +450,7 @@
<string name="incident_report_notification_text" msgid="3376480583513587923">"<xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioak arazketa-informazioa kargatu nahi du."</string>
<string name="incident_report_dialog_title" msgid="669104389325204095">"Arazketa-datuak partekatu nahi dituzu?"</string>
<string name="incident_report_dialog_intro" msgid="5897733669850951832">"Arazo bat hauteman du sistemak."</string>
- <string name="incident_report_dialog_text" msgid="5675553296891757523">"<xliff:g id="DATE">%2$s</xliff:g> (<xliff:g id="TIME">%3$s</xliff:g>) datan sortutako akatsen txostena kargatzeko baimena eskatzen ari da <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Akatsen txostenek zure gailuari buruzkoa den edo aplikazioek erregistratu duten informazio pertsonala dute; adibidez, erabiltzaile-izenak, kokapenari buruzko datuak, gailuaren identifikatzaileak eta sareari buruzko informazioa. Informazio hori izateko fidagarriak iruditzen zaizkizun pertsona eta aplikazioekin soilik partekatu beharko zenituzke akatsen txostenak. <xliff:g id="APP_NAME_1">%4$s</xliff:g> aplikazioari akatsen txostena kargatzeko baimena eman nahi diozu?"</string>
+ <string name="incident_report_dialog_text" msgid="5675553296891757523">"<xliff:g id="DATE">%2$s</xliff:g> (<xliff:g id="TIME">%3$s</xliff:g>) datan sortutako akatsen txostena kargatzeko baimena eskatzen ari da <xliff:g id="APP_NAME_0">%1$s</xliff:g>. Akatsen txostenek zure gailuari buruzkoa den edo aplikazioek erregistratu duten informazio pertsonala dute; adibidez, erabiltzaile-izenak, kokapenari buruzko datuak, gailu-identifikatzaileak eta sareari buruzko informazioa. Informazio hori izateko fidagarriak iruditzen zaizkizun pertsona eta aplikazioekin soilik partekatu beharko zenituzke akatsen txostenak. <xliff:g id="APP_NAME_1">%4$s</xliff:g> aplikazioari akatsen txostena kargatzeko baimena eman nahi diozu?"</string>
<string name="incident_report_error_dialog_text" msgid="4189647113387092272">"Errore bat gertatu da <xliff:g id="APP_NAME">%1$s</xliff:g> aplikazioaren akatsen txostena prozesatzean; beraz, ezin izan dira partekatu arazketa-datu xehatuak. Barkatu eragozpenak."</string>
<string name="incident_report_dialog_allow_label" msgid="2970242967721155239">"Eman baimena"</string>
<string name="incident_report_dialog_deny_label" msgid="3535314290677579383">"Ukatu"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Datuak partekatzeko aukeraren berritasunak"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Kokapen-datuak partekatzeko modua aldatu dute aplikazio batzuek"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ezarpenak"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Atzitze-data: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Atzo atzitu zen (<xliff:g id="TIME_DATE">%1$s</xliff:g>)"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Atzitze-data: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> (<xliff:g id="TIME_DATE_1">%2$s</xliff:g>)"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Zure erabilera bakarreko pasahitza 132435 da"</string>
</resources>
diff --git a/PermissionController/res/values-fa-v34/strings.xml b/PermissionController/res/values-fa-v34/strings.xml
index de8036122..38de211a4 100644
--- a/PermissionController/res/values-fa-v34/strings.xml
+++ b/PermissionController/res/values-fa-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"دسترسی به مکان"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"برای برنامه‌ها و سرویس‌ها. اگر این تنظیم خاموش باشد، ممکن است وقتی با شماره تلفنی اضطراری تماس می‌گیرید داده‌های میکروفون همچنان هم‌رسانی شود"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"برای برنامه‌ها و سرویس‌ها"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"تنظیم محدودشده"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"برای حفظ امنیت شما، درحال‌حاضر این تنظیم دردسترس نیست."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"بیشتر بدانید"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-fa-watch/strings.xml b/PermissionController/res/values-fa-watch/strings.xml
index 17b225913..b602b38f3 100644
--- a/PermissionController/res/values-fa-watch/strings.xml
+++ b/PermissionController/res/values-fa-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"امکان تغییر نیست"</string>
<string name="generic_yes" msgid="2489207724988649846">"بله"</string>
<string name="generic_cancel" msgid="2631708607129269698">"لغو"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"همیشه"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"درحین استفاده از برنامه"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"همیشه"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"درحین استفاده از برنامه"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"همیشه"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"درحین استفاده از برنامه"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"همیشه"</string>
</resources>
diff --git a/PermissionController/res/values-fa/strings.xml b/PermissionController/res/values-fa/strings.xml
index 671694e0d..69cb984cc 100644
--- a/PermissionController/res/values-fa/strings.xml
+++ b/PermissionController/res/values-fa/strings.xml
@@ -50,12 +50,12 @@
<string name="permission_revoked_all" msgid="3397649017727222283">"همه مجوزها غیرفعال است"</string>
<string name="permission_revoked_none" msgid="9213345075484381180">"هیچ‌ موردی غیرفعال نیست"</string>
<string name="grant_dialog_button_allow" msgid="5314677880021102550">"اجازه دادن"</string>
- <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"همیشه مجاز است"</string>
+ <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"همیشه مجاز"</string>
<string name="grant_dialog_button_allow_foreground" msgid="501896824973636533">"هنگام استفاده از برنامه"</string>
<string name="grant_dialog_button_change_to_precise_location" msgid="3273115879467236033">"تغییر به مکان دقیق"</string>
<string name="grant_dialog_button_keey_approximate_location" msgid="438025182769080011">"حفظ مکان تقریبی"</string>
<string name="grant_dialog_button_allow_one_time" msgid="2618088516449706391">"فقط این بار"</string>
- <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"همیشه مجاز است"</string>
+ <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"همیشه مجاز"</string>
<string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"اجازه دادن برای مدیریت همه فایل‌ها"</string>
<string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"اجازه دادن برای دسترسی به فایل‌های رسانه"</string>
<string name="app_permissions_breadcrumb" msgid="5136969550489411650">"برنامه‌ها"</string>
@@ -109,15 +109,13 @@
<!-- no translation found for background_access_chooser_dialog_choices:0 (1351721623256561996) -->
<!-- no translation found for background_access_chooser_dialog_choices:1 (9127301153688725448) -->
<!-- no translation found for background_access_chooser_dialog_choices:2 (4305536986042401191) -->
- <string name="permission_access_always" msgid="1474641821883823446">"همیشه مجاز است"</string>
- <string name="permission_access_only_foreground" msgid="7801170728159326195">"فقط هنگام استفاده از برنامه مجاز است"</string>
+ <string name="permission_access_always" msgid="1474641821883823446">"همیشه مجاز"</string>
+ <string name="permission_access_only_foreground" msgid="7801170728159326195">"مجاز فقط هنگام استفاده از برنامه"</string>
<string name="permission_access_never" msgid="4647014230217936900">"اجازه ندادن"</string>
<string name="loading" msgid="4789365003890741082">"درحال بارگیری…"</string>
<string name="all_permissions" msgid="6911125611996872522">"همه اجازه‌ها"</string>
<string name="other_permissions" msgid="2901186127193849594">"سایر قابلیت‌های برنامه"</string>
<string name="permission_request_title" msgid="8790310151025020126">"درخواست اجازه"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"‏کنش‌های نصب/حذف نصب در Wear پشتیبانی نمی‌شود."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"‏انتخاب کنید &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اجازه دارد به چه چیزی دسترسی پیدا کند"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; به‌روزرسانی شده است. انتخاب کنید این برنامه اجازه دارد به چه چیزی دسترسی پیدا کند."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"لغو"</string>
@@ -188,8 +186,8 @@
<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_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>
+ <string name="app_permission_button_allow_always" msgid="4573292371734011171">"همیشه مجاز"</string>
+ <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"مجاز فقط هنگام استفاده از برنامه"</string>
<string name="app_permission_button_always_allow_all" msgid="4905699259378428855">"همه موارد همیشه مجازاند"</string>
<string name="app_permission_button_ask" msgid="3342950658789427">"هربار پرسیده شود"</string>
<string name="app_permission_button_deny" msgid="6016454069832050300">"اجازه ندادن"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"اگر از برنامه استفاده نمی‌شود، اجازه‌ها برداشته شوند"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"برداشتن اجازه‌ها و آزاد کردن فضا"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"مکث فعالیت‌ها در برنامه درصورت عدم‌استفاده"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"مدیریت برنامه درصورت عدم استفاده"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"اجازه‌ها برداشته می‌شود، فایل‌های موقت حذف می‌شود، و اعلان‌ها متوقف می‌شوند"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"برداشتن اجازه‌ها، حذف فایل‌های موقت، توقف اعلان‌ها، و بایگانی کردن برنامه"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"برای محافظت از داده‌هایتان، اگر طی چند ماه گذشته از این برنامه استفاده نشده باشد، اجازه‌های آن برداشته خواهد شد."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"برای محافظت از داده‌هایتان، اگر طی چند ماه گذشته از این برنامه استفاده نشده باشد، اجازه‌های زیر برداشته خواهد شد: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"برای محافظت از داده‌هایتان، اجازه‌ها از برنامه‌هایی که طی چند ماه گذشته استفاده نشده‌اند برداشته شده است."</string>
@@ -403,15 +403,20 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"برنامه یادداشت‌ها"</string>
<string name="role_notes_description" msgid="8496852798616883551">"برنامه‌هایی که به شما اجازه می‌دهند در دستگاهتان یادداشت‌برداری کنید"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"یادداشت"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"برنامه کیف پول پیش‌فرض"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"برنامه کیف پول"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"برنامه‌های کیف پول می‌تواند با ذخیره کردن کارت‌های اعتباری و وفاداری، کلید خودرو، و موارد دیگر در انجام انواع مختلف تراکنش به شما کمک کند."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> به‌عنوان برنامه کیف پول پیش‌فرض تنظیم شود؟"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"اجازه‌ای لازم نیست"</string>
<string name="request_role_current_default" msgid="738722892438247184">"برنامه پیش‌فرض کنونی"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"دوباره سؤال نشود"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"تنظیم برای پیش‌فرض"</string>
<string name="phone_call_uses_microphone" msgid="233569591461187177">"‏در &lt;b&gt;تماس تلفنی&lt;/b&gt; از میکروفون استفاده می‌شود"</string>
<string name="phone_call_uses_microphone_and_camera" msgid="6291898755681748189">"‏در &lt;b&gt;تماس تصویری&lt;/b&gt; از دوربین و میکروفون استفاده می‌شود"</string>
<string name="phone_call_uses_camera" msgid="2048417022147857418">"‏در &lt;b&gt;تماس تصویری&lt;/b&gt; از دوربین استفاده می‌شود"</string>
- <string name="system_uses_microphone" msgid="576672130318877143">"سرویس سیستم به میکروفون دسترسی دارد"</string>
- <string name="system_uses_microphone_and_camera" msgid="5124478304275138804">"سرویس سیستم به دوربین و میکروفون دسترسی دارد"</string>
- <string name="system_uses_camera" msgid="1911223105234441470">"سرویس سیستم به دوربین دسترسی دارد"</string>
+ <string name="system_uses_microphone" msgid="576672130318877143">"خدمات سیستم به میکروفون دسترسی دارد"</string>
+ <string name="system_uses_microphone_and_camera" msgid="5124478304275138804">"خدمات سیستم به دوربین و میکروفون دسترسی دارد"</string>
+ <string name="system_uses_camera" msgid="1911223105234441470">"خدمات سیستم به دوربین دسترسی دارد"</string>
<string name="other_use" msgid="6564855051022776692">"استفاده‌های دیگر:"</string>
<string name="ongoing_usage_dialog_ok" msgid="103556809118460072">"متوجه شدم"</string>
<string name="ongoing_usage_dialog_title" msgid="683836493556628569">"استفاده اخیر از <xliff:g id="TYPES_LIST">%s</xliff:g>"</string>
@@ -553,12 +558,12 @@
<string name="safety_center_rescan_button" msgid="4517514567809409596">"اسکن کردن دستگاه"</string>
<string name="safety_center_issue_card_dismiss_button" msgid="5113965506144222402">"رد کردن"</string>
<string name="safety_center_issue_card_dismiss_confirmation_title" msgid="2734809473425036382">"این هشدار رد شود؟"</string>
- <string name="safety_center_issue_card_dismiss_confirmation_message" msgid="3775418736671093563">"هرزمان خواستید تنظیمات امنیت و حریم خصوصی را مرور کنید تا محافظت بیشتری اضافه کنید"</string>
+ <string name="safety_center_issue_card_dismiss_confirmation_message" msgid="3775418736671093563">"هرزمان خواستید تنظیمات ایمنی و حریم خصوصی را مرور کنید تا محافظت بیشتری اضافه کنید"</string>
<string name="safety_center_issue_card_confirm_dismiss_button" msgid="5884137843083634556">"رد شدن"</string>
<string name="safety_center_issue_card_cancel_dismiss_button" msgid="2874578798877712346">"لغو"</string>
<string name="safety_center_entries_category_title" msgid="34356964062813115">"تنظیمات"</string>
<string name="safety_status_preference_title_and_summary_content_description" msgid="3511373256505058464">"وضعیت حریم خصوصی و امنیت. <xliff:g id="OVERALL_SAFETY_STATUS">%1$s</xliff:g>. <xliff:g id="SUMMARY_OF_DEVICE_STATUS">%2$s</xliff:g>"</string>
- <string name="security_settings" msgid="3808106921175271317">"تنظیمات امنیتی"</string>
+ <string name="security_settings" msgid="3808106921175271317">"تنظیمات ایمنی"</string>
<string name="sensor_permissions_qs" msgid="1022267900031317472">"اجازه‌ها"</string>
<string name="safety_privacy_qs_tile_title" msgid="727301867710374052">"امنیت و حریم خصوصی"</string>
<string name="safety_privacy_qs_tile_subtitle" msgid="3621544532041936749">"بررسی وضعیت"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"به‌روزرسانی‌های هم‌رسانی داده"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"برخی‌از برنامه‌ها روش هم‌رسانی داده‌های مکان شما را تغییر داده‌اند"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"تنظیمات"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"تاریخ دسترسی: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"دسترسی در روز گذشته ساعت <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"دسترسی در <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ساعت <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"گذرواژه یکبارمصرف شما 132435 است"</string>
</resources>
diff --git a/PermissionController/res/values-fi-v34/strings.xml b/PermissionController/res/values-fi-v34/strings.xml
index b2f95dc19..023474cf7 100644
--- a/PermissionController/res/values-fi-v34/strings.xml
+++ b/PermissionController/res/values-fi-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Pääsy sijaintiin"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Sovellukset ja palvelut. Vaikka asetus olisi poissa päältä, mikrofonidataa saatetaan silti jakaa, kun soitat hätänumeroon"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Sovellukset ja palvelut"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Rajoitettu asetus"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Asetus ei ole tällä hetkellä käytettävissä turvallisuussyistä."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Lue lisää"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-fi-watch/strings.xml b/PermissionController/res/values-fi-watch/strings.xml
index 843f06a71..296eedf2b 100644
--- a/PermissionController/res/values-fi-watch/strings.xml
+++ b/PermissionController/res/values-fi-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ei muutettavissa"</string>
<string name="generic_yes" msgid="2489207724988649846">"Kyllä"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Peru"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Aina"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Sovelluksen käytön aikana"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Aina"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Sovelluksen käytön aikana"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Aina"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Sovelluksen käytön aikana"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Aina"</string>
</resources>
diff --git a/PermissionController/res/values-fi/strings.xml b/PermissionController/res/values-fi/strings.xml
index ee85d8df2..e6b211bd8 100644
--- a/PermissionController/res/values-fi/strings.xml
+++ b/PermissionController/res/values-fi/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Kaikki luvat"</string>
<string name="other_permissions" msgid="2901186127193849594">"Muut sovellusluvat"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Lupapyyntö"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ei tue asennus- ja poistotoimintoja."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Valitse, mitä käyttöoikeuksia sovellukselle &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; myönnetään."</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; on päivitetty. Valitse, mitä käyttöoikeuksia tälle sovellukselle myönnetään."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Peru"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Poista luvat, jos sovellusta ei käytetä"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Poista lupia ja vapauta tilaa"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Keskeytä sovellustoim. jos ei käytössä"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Hallinnoi sovellusta, jos käyttämätön"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Poista käyttämättömät luvat ja väliaikaiset tiedostot ja pysäytä ilmoitukset"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Poista käyttämättömät luvat ja väliaikaiset tiedostot, pysäytä ilmoitukset ja arkistoi sovellus"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Datasi suojaamiseksi tämän sovelluksen luvat poistetaan, jos sovellusta ei käytetä muutamaan kuukauteen."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Jos sovellusta ei käytetä muutamaan kuukauteen, seuraavat luvat poistetaan datasi suojaamiseksi: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Datasi suojaamiseksi luvat on poistettu sovelluksilta, joita et ole käyttänyt muutamaan kuukauteen."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Muistiinpanosovellus"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Sovellukset, joilla voit ottaa muistiinpanoja laitteellasi"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"muistiinpanot"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Oletuslompakkosovellus"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Lompakkosovellus"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Lompakkosovelluksista on apua erilaisissa tapahtumissa, koska ne voivat tallentaa esimerkiksi credit- ja kanta-asiakaskortit ja autonavaimet"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Valitaanko <xliff:g id="APP_NAME">%1$s</xliff:g> oletuslompakkosovelluksesi?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Lupia ei tarvita"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Nykyinen oletus"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Älä kysy uudelleen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Aseta oletukseksi"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Datan jaon päivitykset"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Jotkin sovellukset ovat muuttaneet tapaa, jolla ne voivat jakaa sijaintitietoja"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Asetukset"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Avattu <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Avattu eilen klo <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Avattu <xliff:g id="TIME_DATE_0">%1$s</xliff:g> klo <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Kertakäyttöinen salasanasi on 132435"</string>
</resources>
diff --git a/PermissionController/res/values-fr-rCA-v34/strings.xml b/PermissionController/res/values-fr-rCA-v34/strings.xml
index 347b04cc8..e521a9bc2 100644
--- a/PermissionController/res/values-fr-rCA-v34/strings.xml
+++ b/PermissionController/res/values-fr-rCA-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Accès à la position"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Pour les applications et les services. Si ce paramètre est désactivé, il est possible que les données du microphone soient partagées lorsque vous appelez un numéro d\'urgence"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Pour les applications et les services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Paramètres restreints"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Pour protéger votre sécurité, ce paramètre n\'est pas accessible actuellement."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"En savoir plus"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-fr-rCA-watch/strings.xml b/PermissionController/res/values-fr-rCA-watch/strings.xml
index 8e92df18e..4d588d0c9 100644
--- a/PermissionController/res/values-fr-rCA-watch/strings.xml
+++ b/PermissionController/res/values-fr-rCA-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Inchangeable"</string>
<string name="generic_yes" msgid="2489207724988649846">"Oui"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Annuler"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"En tout temps"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Quand l\'appli est utilisée"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"En tout temps"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Quand l\'appli est utilisée"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"En tout temps"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Quand l\'appli est utilisée"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"En tout temps"</string>
</resources>
diff --git a/PermissionController/res/values-fr-rCA/strings.xml b/PermissionController/res/values-fr-rCA/strings.xml
index 50d896bcb..ea1ea6e3e 100644
--- a/PermissionController/res/values-fr-rCA/strings.xml
+++ b/PermissionController/res/values-fr-rCA/strings.xml
@@ -110,14 +110,12 @@
<!-- no translation found for background_access_chooser_dialog_choices:1 (9127301153688725448) -->
<!-- no translation found for background_access_chooser_dialog_choices:2 (4305536986042401191) -->
<string name="permission_access_always" msgid="1474641821883823446">"Toujours autoriser"</string>
- <string name="permission_access_only_foreground" msgid="7801170728159326195">"Autoriser si l\'application est utilisée"</string>
+ <string name="permission_access_only_foreground" msgid="7801170728159326195">"Autoriser uniquement lorsque l\'application est utilisée"</string>
<string name="permission_access_never" msgid="4647014230217936900">"Ne pas autoriser"</string>
<string name="loading" msgid="4789365003890741082">"Chargement en cours…"</string>
<string name="all_permissions" msgid="6911125611996872522">"Toutes les autorisations"</string>
<string name="other_permissions" msgid="2901186127193849594">"Autres autorisations de l\'application"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Demande d\'autorisation"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Les actions d\'installation et de désinstallation ne sont pas prises en charge par Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Définissez les autorisations d\'accès de l\'application « <xliff:g id="APP_NAME">%1$s</xliff:g> »"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"L\'application « <xliff:g id="APP_NAME">%1$s</xliff:g> » a été mise à jour. Définissez ses autorisations d\'accès."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Annuler"</string>
@@ -189,7 +187,7 @@
<string name="app_permission_button_allow_all_files" msgid="1792232272599018825">"Autoriser à gérer tous les fichiers"</string>
<string name="app_permission_button_allow_media_only" msgid="2834282724426046154">"Autoriser à accéder aux éléments multimédias seulement"</string>
<string name="app_permission_button_allow_always" msgid="4573292371734011171">"Toujours autoriser"</string>
- <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Autoriser uniquement lorsque l\'appli est en cours d\'utilisation"</string>
+ <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Autoriser uniquement lorsque l\'application est utilisée"</string>
<string name="app_permission_button_always_allow_all" msgid="4905699259378428855">"Toujours tout autoriser"</string>
<string name="app_permission_button_ask" msgid="3342950658789427">"Toujours demander"</string>
<string name="app_permission_button_deny" msgid="6016454069832050300">"Ne pas autoriser"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Retirer les autorisations si l\'application est inutilisée"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Retirer autorisations et libérer espace"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Suspendre l\'activité appli si inutilisée"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gérer l\'application si inutilisée"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Retirer les autorisations, supprimer les fichiers temporaires et arrêter les notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Retirer les autorisations, supprimer les fichiers temporaires, arrêter les notifications et archiver l\'application"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Afin de protéger vos données, les autorisations pour cette application seront retirées si elle n\'est pas utilisée pendant quelques mois."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Afin de protéger vos données, si l\'application n\'est pas utilisée pendant quelques mois, les autorisations suivantes seront supprimées : <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Afin de protéger vos données, les autorisations ont été supprimées pour les applications que vous n\'avez pas utilisées depuis quelques mois."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Application de prise de notes"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Applications qui vous permettent de prendre des notes sur votre appareil"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"remarques"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Appli portefeuille par défaut"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Application de portefeuille"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Les applications de portefeuille peuvent stocker vos cartes de crédit et de fidélité, vos clés de voiture et d\'autres données pour faciliter différentes modalités de transaction."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Définir <xliff:g id="APP_NAME">%1$s</xliff:g> comme application de portefeuille par défaut?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Aucune autorisation nécessaire"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Application par défaut actuelle"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne plus me demander"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Définir par défaut"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Mises à jour des pratiques de partage des données"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Certaines applis ont modifié comment elles peuvent partager vos données de localisation"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Paramètres"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Dernier accès : <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Accès hier (<xliff:g id="TIME_DATE">%1$s</xliff:g>)"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Accès : <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Votre mot de passe à usage unique est le suivant : 132435"</string>
</resources>
diff --git a/PermissionController/res/values-fr-v34/strings.xml b/PermissionController/res/values-fr-v34/strings.xml
index f7f584b75..a8848dc44 100644
--- a/PermissionController/res/values-fr-v34/strings.xml
+++ b/PermissionController/res/values-fr-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Accès à la position"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Pour les applis et services. Si ce paramètre est désactivé, il est possible que les données du micro soient quand même partagées quand vous appelez un numéro d\'urgence"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Pour les applis et services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Paramètre restreint"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Pour votre sécurité, ce paramètre est actuellement indisponible."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"En savoir plus"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-fr-watch/strings.xml b/PermissionController/res/values-fr-watch/strings.xml
index c9df92552..2ef84f46c 100644
--- a/PermissionController/res/values-fr-watch/strings.xml
+++ b/PermissionController/res/values-fr-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Non modifiable"</string>
<string name="generic_yes" msgid="2489207724988649846">"Oui"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Annuler"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Tout le temps"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Quand l\'appli est utilisée"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Tout le temps"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Quand l\'appli est utilisée"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Tout le temps"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Lorsque vous utilisez l\'appli"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Tout le temps"</string>
</resources>
diff --git a/PermissionController/res/values-fr/strings.xml b/PermissionController/res/values-fr/strings.xml
index 97c3461e5..e9513925a 100644
--- a/PermissionController/res/values-fr/strings.xml
+++ b/PermissionController/res/values-fr/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Toutes les autorisations"</string>
<string name="other_permissions" msgid="2901186127193849594">"Autres fonctionnalités de l\'application"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Demande d\'autorisation"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Opérations d\'installation et de désinstallation impossibles sur Android Wear"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Sélectionner les éléments auxquels &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; peut accéder"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"L\'application &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; a été mise à jour. Sélectionnez les éléments auxquels elle peut accéder."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Annuler"</string>
@@ -195,7 +193,7 @@
<string name="app_permission_button_deny" msgid="6016454069832050300">"Ne pas autoriser"</string>
<string name="precise_image_description" msgid="6349638632303619872">"Position exacte"</string>
<string name="approximate_image_description" msgid="938803699637069884">"Position approximative"</string>
- <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Utiliser la position exacte"</string>
+ <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Position exacte"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Si la position exacte est désactivée, les applis ont accès à votre position approximative"</string>
<string name="app_permission_title" msgid="2090897901051370711">"Autorisation d\'accès à \"<xliff:g id="PERM">%1$s</xliff:g>\""</string>
<string name="app_permission_header" msgid="2951363137032603806">"Accès à \"<xliff:g id="PERM">%1$s</xliff:g>\" pour cette appli"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Supprimer les autorisations si l\'application n\'est pas utilisée"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Supprimer autorisations et libérer espace"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Suspendre activité appli si inutilisée"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gérer l\'appli si inutilisée"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Retirer les autorisations, supprimer les fichiers temporaires et arrêter les notifications"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Retirer les autorisations, supprimer les fichiers temporaires, arrêter les notifications et archiver l\'appli"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Si cette application n\'est pas utilisée pendant plusieurs mois, ses autorisations seront supprimées afin de protéger vos données."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Pour protéger vos données, si l\'application n\'est pas utilisée pendant plusieurs mois, les autorisations suivantes seront supprimées : <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Afin de protéger vos données, les autorisations ont été supprimées pour les applications que vous n\'avez pas utilisées depuis plusieurs mois."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Appli de notes"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Applis vous permettant de prendre des notes sur votre appareil"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Portefeuille numérique par défaut"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Appli portefeuille numérique"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Les applis de portefeuille numérique stockent vos cartes bancaires, cartes de fidélité, clés de voiture et bien d\'autres choses vous permettant d\'effectuer diverses transactions."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Définir <xliff:g id="APP_NAME">%1$s</xliff:g> comme appli de portefeuille numérique par défaut ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Aucune autorisation nécessaire"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Appli par défaut actuelle"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne plus me demander"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Définir par défaut"</string>
@@ -620,17 +625,17 @@
<string name="permission_rationale_data_sharing_source_title" msgid="6874604543125814316">"Origine des informations sur le partage des données"</string>
<string name="permission_rationale_data_sharing_device_manufacturer_message" msgid="7569261218145653185">"Le développeur a fourni des infos au fabricant de cet appareil concernant la manière dont cette appli partage les données. Le développeur peut mettre à jour ces infos au fil du temps."</string>
<string name="permission_rationale_data_sharing_source_message" msgid="8330794595417986883">"Le développeur a fourni des infos sur "<annotation id="link"><annotation id="install_source" example="App Store">"%1$s"</annotation></annotation>" concernant la manière dont cette appli partage les données. Le développeur peut mettre à jour ces infos au fil du temps."</string>
- <string name="permission_rationale_location_purpose_title" msgid="5115877143670012618">"L\'appli peut partager données de localisation pour :"</string>
+ <string name="permission_rationale_location_purpose_title" msgid="5115877143670012618">"L\'appli peut partager des données de localis. pour :"</string>
<string name="permission_rationale_permission_data_sharing_varies_title" msgid="9103718980919908316">"Partage des données variable"</string>
<string name="permission_rationale_data_sharing_varies_message" msgid="4224469559084489222">"La gestion des données peut varier selon la version de l\'appli, l\'utilisation que vous en faites, votre région et votre âge. "<annotation id="link">"En savoir plus sur le partage des données"</annotation></string>
<string name="permission_rationale_data_sharing_varies_message_without_link" msgid="4912763761399025094">"La gestion des données peut varier selon la version de l\'appli, l\'utilisation que vous en faites, votre région et votre âge."</string>
<string name="permission_rationale_location_settings_title" msgid="7204145004850190953">"Vos données de localisation"</string>
<string name="permission_rationale_permission_settings_message" msgid="631286040979660267">"Modifiez l\'accès de cette appli dans les "<annotation id="link">"paramètres de confidentialité"</annotation></string>
- <string name="permission_rationale_purpose_app_functionality" msgid="8397736681065841405">"Fonctionnement de l\'appli"</string>
- <string name="permission_rationale_purpose_analytics" msgid="2070800501189620712">"Données analytiques"</string>
+ <string name="permission_rationale_purpose_app_functionality" msgid="8397736681065841405">"le fonctionnement de l\'appli ;"</string>
+ <string name="permission_rationale_purpose_analytics" msgid="2070800501189620712">"les données analytiques ;"</string>
<string name="permission_rationale_purpose_developer_communications" msgid="6453047018892062374">"Communications du développeur"</string>
- <string name="permission_rationale_purpose_advertising" msgid="7156966429245180236">"Publicité ou marketing"</string>
- <string name="permission_rationale_purpose_fraud_prevention_security" msgid="4262104770357031902">"Prévention des fraudes, sécurité et conformité"</string>
+ <string name="permission_rationale_purpose_advertising" msgid="7156966429245180236">"la publicité ou marketing ;"</string>
+ <string name="permission_rationale_purpose_fraud_prevention_security" msgid="4262104770357031902">"la prévention des fraudes, la sécurité et la conformité."</string>
<string name="permission_rationale_purpose_personalization" msgid="1589973273682238708">"Personnalisation"</string>
<string name="permission_rationale_purpose_account_management" msgid="2985772421946688879">"Gestion du compte"</string>
<string name="app_permission_rationale_message" msgid="8511466916077100713">"Sécurité des données"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Modifications du partage des données"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Certaines applis ont modifié la façon dont elles peuvent partager vos données de localisation"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Paramètres"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Dernière consultation : <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Dernière consultation : hier, à <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Dernière consultation : <xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Votre mot de passe à usage unique est le suivant : 132435"</string>
</resources>
diff --git a/PermissionController/res/values-gl-v34/strings.xml b/PermissionController/res/values-gl-v34/strings.xml
index cabf7a43a..f6becd800 100644
--- a/PermissionController/res/values-gl-v34/strings.xml
+++ b/PermissionController/res/values-gl-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acceso á localización"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para aplicacións e servizos. Aínda que esta opción de configuración se atope desactivada, poderán compartirse datos do micrófono se chamas a un número de emerxencias"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para aplicacións e servizos"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Opción de configuración restrinxida"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Pola túa seguranza, esta opción de configuración non está dispoñible nestes momentos."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Máis información"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-gl-watch/strings.xml b/PermissionController/res/values-gl-watch/strings.xml
index ddb8916bb..060385455 100644
--- a/PermissionController/res/values-gl-watch/strings.xml
+++ b/PermissionController/res/values-gl-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Cambio imposible"</string>
<string name="generic_yes" msgid="2489207724988649846">"Si"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Todo o tempo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Coa aplicación en uso"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Todo o tempo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Coa aplicación en uso"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Todo o tempo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Coa aplicación en uso"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Todo o tempo"</string>
</resources>
diff --git a/PermissionController/res/values-gl/strings.xml b/PermissionController/res/values-gl/strings.xml
index 5c5a61baf..3e1b82067 100644
--- a/PermissionController/res/values-gl/strings.xml
+++ b/PermissionController/res/values-gl/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todos os permisos"</string>
<string name="other_permissions" msgid="2901186127193849594">"Outras funcionalidades da aplicación"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitude de permiso"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"As accións de instalar e desinstalar non son compatibles con Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Seleccionar os permisos de acceso que queres dar á aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Actualizouse a aplicación &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Selecciona os permisos de acceso que lle queres dar."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar permisos se non se usa a aplicación"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Quitar permisos e liberar espazo"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pór en pausa actividade de apps sen uso"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Xestionar aplicación se non se usa"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Quita permisos, elimina ficheiros temporais e detén as notificacións"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Quita permisos, elimina os ficheiros temporais, detén as notificacións e arquiva a aplicación"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para protexer os teus datos, quitaranse os permisos desta aplicación se pasas varios meses sen utilizala."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para protexer os teus datos, se a aplicación leva varios meses sen usarse, quitaranse os seguintes permisos: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para protexer os teus datos, quitáronse os permisos das aplicacións que levas varios meses sen usar."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplicación de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplicacións que che permiten tomar notas no dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"App de carteira predeterminada"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplicación de carteira"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"As aplicacións de carteira poden almacenar as túas tarxetas de crédito e de fidelidade, as chaves do coche e outros obxectos para axudar en distintos tipos de transaccións."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Queres establecer <xliff:g id="APP_NAME">%1$s</xliff:g> como aplicación de carteira predeterminada?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Non se necesita ningún permiso"</string>
<string name="request_role_current_default" msgid="738722892438247184">"App predeterminada actual"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Non preguntar de novo"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"App predeterminada"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Actualizacións de uso compartido de datos"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Algunhas aplicacións cambiaron a forma en que poden compartir os teus datos de localización"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Configuración"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Último acceso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Último acceso: onte, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Último acceso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"O teu contrasinal dun só uso é 132435"</string>
</resources>
diff --git a/PermissionController/res/values-gu-v34/strings.xml b/PermissionController/res/values-gu-v34/strings.xml
index ba8a5deb0..37f73e144 100644
--- a/PermissionController/res/values-gu-v34/strings.xml
+++ b/PermissionController/res/values-gu-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"લોકેશન ઍક્સેસ"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ઍપ અને સેવાઓ માટે. આ સેટિંગ બંધ હોવા છતાં પણ, જ્યારે તમે ઇમર્જન્સી નંબર પર કૉલ કરો ત્યારે હજુ પણ માઇક્રોફોનનો ડેટા શેર કરવામાં આવી શકે"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ઍપ અને સેવાઓ માટે"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"પ્રતિબંધિત સેટિંગ"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"તમારી સુરક્ષા માટે, આ સેટિંગ હાલમાં ઉપલબ્ધ નથી."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"વધુ જાણો"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-gu-watch/strings.xml b/PermissionController/res/values-gu-watch/strings.xml
index 66f9cd41b..12db58045 100644
--- a/PermissionController/res/values-gu-watch/strings.xml
+++ b/PermissionController/res/values-gu-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"બદલી શકતાં નથી"</string>
<string name="generic_yes" msgid="2489207724988649846">"હા"</string>
<string name="generic_cancel" msgid="2631708607129269698">"રદ કરો"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"હંમેશાં"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ઍપનો ઉપયોગ કરતા હો ત્યારે"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"હંમેશાં"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ઍપનો ઉપયોગ કરતા હો ત્યારે"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"હંમેશાં"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ઍપનો ઉપયોગ કરતા હો ત્યારે"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"હંમેશાં"</string>
</resources>
diff --git a/PermissionController/res/values-gu/strings.xml b/PermissionController/res/values-gu/strings.xml
index bd5988260..037b54876 100644
--- a/PermissionController/res/values-gu/strings.xml
+++ b/PermissionController/res/values-gu/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"બધી પરવાનગીઓ"</string>
<string name="other_permissions" msgid="2901186127193849594">"અન્ય ઍપ સુવિધાઓ"</string>
<string name="permission_request_title" msgid="8790310151025020126">"પરવાનગીની વિનંતી"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear પર ઇન્સ્ટૉલ/અનઇન્સ્ટૉલ ક્રિયાઓ સમર્થિત નથી."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;ને શેના ઍક્સેસ માટેની મંજૂરી આપવી તે પસંદ કરો"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; અપડેટ કરવામાં આવી છે. આ ઍપને શેના ઍક્સેસ માટેની મંજૂરી આપવી તે પસંદ કરો."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"રદ કરો"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ઍપ ઉપયોગમાં ન હોવા પર પરવાનગીઓ કાઢી નાખો"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"પરવાનગીઓ કાઢી નાખો અને જગ્યા ખાલી કરો"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"જો ઉપયોગ કરતા ન હો, તો ઍપ પ્રવૃત્તિ થોભાવો"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"જો ઍપ વાપરતા ન હો, તો તેને મેનેજ કરો"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"પરવાનગીઓ કાઢી નાખો, હંગામી ફાઇલો ડિલીટ કરો અને નોટિફિકેશન બંધ કરો"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"પરવાનગીઓ કાઢી નાખો, હંગામી ફાઇલો ડિલીટ કરો, નોટિફિકેશન બંધ કરો અને ઍપને આર્કાઇવ કરો"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"તમારા ડેટાની સુરક્ષા કરવા માટે, જો ઍપનો કેટલાક મહિનાથી ઉપયોગ કરવામાં આવ્યો ન હોય, તો આ ઍપની પરવાનગીઓ કાઢી નાખવામાં આવશે."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"તમારા ડેટાની સુરક્ષા કરવા માટે, જો ઍપનો કેટલાક મહિનાથી ઉપયોગ કરવામાં આવ્યો ન હોય, તો નીચેની પરવાનગીઓ કાઢી નાખવામાં આવશે: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"તમારા ડેટાની સુરક્ષા માટે, તમારા દ્વારા કેટલાક મહિનાથી ઉપયોગમાં ન લેવાયેલી ઍપની પરવાનગીઓ કાઢી નાખવામાં આવી છે."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"નોંધ માટેની ઍપ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ઍપ કે જે તમને તમારા ડિવાઇસ પર નોંધ કરવાની મંજૂરી આપે છે"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"નોંધ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ડિફૉલ્ટ વૉલેટ ઍપ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet ઍપ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"વૉલેટ સંબંધી ઍપ તમારા ક્રેડિટ અને લૉયલ્ટિ કાર્ડ, કાર કી તેમજ વિવિધ વ્યવહારોમાં સહાય કરી શકતી અન્ય બાબતો સ્ટોર કરી શકે છે."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"શું <xliff:g id="APP_NAME">%1$s</xliff:g>ને તમારી ડિફૉલ્ટ વૉલેટ ઍપ તરીકે સેટ કરીએ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"કોઈ પરવાનગી જરૂરી નથી"</string>
<string name="request_role_current_default" msgid="738722892438247184">"હાલની ડિફૉલ્ટ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ફરીથી પૂછશો નહીં"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ડિફૉલ્ટ તરીકે સેટ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ડેટા શેરિંગ સંબંધિત અપડેટ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"કેટલીક ઍપ દ્વારા તમારા લોકેશન ડેટાને શેર કરવાની રીત બદલવામાં આવી હોઈ શકે છે"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"સેટિંગ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"ઍક્સેસ કર્યાનો સમય <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ઍક્સેસ કર્યાનો સમય ગઈકાલે <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"ઍક્સેસ કર્યાનો સમય <xliff:g id="TIME_DATE_0">%1$s</xliff:g>ના રોજ <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"તમારો એક-વખત વપરાશનો પાસવર્ડ 132435 છે"</string>
</resources>
diff --git a/PermissionController/res/values-hi-v34/strings.xml b/PermissionController/res/values-hi-v34/strings.xml
index 7b95fb793..daac533a8 100644
--- a/PermissionController/res/values-hi-v34/strings.xml
+++ b/PermissionController/res/values-hi-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"जगह की जानकारी का ऐक्सेस"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ऐप्लिकेशन और सेवाओं के लिए. इस सेटिंग के बंद होने पर भी, माइक्रोफ़ोन के डेटा को शेयर किया जा सकता है. ऐसा तब होता है, जब किसी आपातकालीन नंबर पर कॉल किया जाता है"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ऐप्लिकेशन और सेवाओं के लिए"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"प्रतिबंधित सेटिंग"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"आपकी सुरक्षा के लिए, यह सेटिंग फ़िलहाल उपलब्ध नहीं है."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ज़्यादा जानें"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-hi-watch/strings.xml b/PermissionController/res/values-hi-watch/strings.xml
index d8ddc7878..12d4356d3 100644
--- a/PermissionController/res/values-hi-watch/strings.xml
+++ b/PermissionController/res/values-hi-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"बदला नहीं जा सकता"</string>
<string name="generic_yes" msgid="2489207724988649846">"हां"</string>
<string name="generic_cancel" msgid="2631708607129269698">"रद्द करें"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"हर समय"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ऐप इस्तेमाल करते समय"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"हर समय"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ऐप इस्तेमाल करते समय"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"हर समय"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ऐप इस्तेमाल करते समय"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"हर समय"</string>
</resources>
diff --git a/PermissionController/res/values-hi/strings.xml b/PermissionController/res/values-hi/strings.xml
index 04b9167aa..b618fb833 100644
--- a/PermissionController/res/values-hi/strings.xml
+++ b/PermissionController/res/values-hi/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"सभी अनुमतियां"</string>
<string name="other_permissions" msgid="2901186127193849594">"ऐप्लिकेशन को ये अनुमतियां भी दी गई हैं"</string>
<string name="permission_request_title" msgid="8790310151025020126">"अनुमति पाने का अनुरोध"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear पर ऐप्लिकेशन इंस्टॉल या अनइंस्टॉल नहीं किए जा सकते."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"चुनें कि &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को किन चीज़ों को ऐक्सेस करने की अनुमति दी जाए"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; को अपडेट कर दिया गया है. चुनें कि इस ऐप्लिकेशन को किन चीज़ों को ऐक्सेस करने की अनुमति दी जाए."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"रद्द करें"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ऐप्लिकेशन का इस्तेमाल न होने पर अनुमतियां हटाएं"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"अनुमतियां हटाएं और जगह खाली करें"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"इस्तेमाल न होने पर ऐप गतिविधि रोकें"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"इस्तेमाल नहीं हुआ ऐप्लिकेशन मैनेज करें"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ऐप्लिकेशन की अनुमतियां हटाएं, डिवाइस में कुछ समय के लिए रहने वाली फ़ाइलें मिटाएं, और सूचनाएं रोकें"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ऐप्लिकेशन की अनुमतियां हटाएं, डिवाइस में कुछ समय के लिए रहने वाली फ़ाइलें मिटाएं, सूचनाएं रोकें, और ऐप्लिकेशन संग्रहित करें"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"अगर इस ऐप्लिकेशन का इस्तेमाल कुछ महीनों तक नहीं किया गया, तो इसे दी गई अनुमतियां हटा दी जाएंगी. ऐसा आपके डेटा को सुरक्षित रखने के लिए किया जाएगा."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"अगर ऐप्लिकेशन कुछ महीनों से इस्तेमाल नहीं हुआ है, तो आपके डेटा को सुरक्षित रखने के लिए ये अनुमतियां हटा दी जाएंगी: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"जिन ऐप्लिकेशन का इस्तेमाल कुछ महीनों से नहीं हुआ है उन्हें दी गई अनुमतियां हटा दी गई हैं. ऐसा आपके डेटा को सुरक्षित रखने के लिए किया गया है."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"नोट लिखने के लिए ऐप्लिकेशन"</string>
<string name="role_notes_description" msgid="8496852798616883551">"आपके डिवाइस पर नोट लिखने की सुविधा देने वाले ऐप्लिकेशन"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"नोट"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"डिफ़ॉल्ट वॉलेट ऐप्लिकेशन"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"वॉलेट ऐप्लिकेशन"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"वॉलेट ऐप्लिकेशन में, अलग-अलग तरह के लेन-देन में इस्तेमाल होने वाली चीज़ों को स्टोर किया जा सकता है. जैसे, क्रेडिट कार्ड, लॉयल्टी कार्ड, कार की डिजिटल कुंजी वगैरह."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"क्या <xliff:g id="APP_NAME">%1$s</xliff:g> को अपने डिफ़ॉल्ट वॉलेट ऐप्लिकेशन के तौर पर सेट करना है?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"अनुमति लेना ज़रूरी नहीं है"</string>
<string name="request_role_current_default" msgid="738722892438247184">"मौजूदा डिफ़ॉल्ट"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"फिर से न पूछें"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"डिफ़ॉल्ट के रूप में सेट करें"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"डेटा शेयर करने के तरीके के बारे में अपडेट"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"कुछ ऐप्लिकेशन ने आपकी जगह की जानकारी के डेटा को शेयर करने का तरीका बदल दिया है"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"सेटिंग"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> को ऐक्सेस किया गया"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"<xliff:g id="TIME_DATE">%1$s</xliff:g> को कल ऐक्सेस किया गया था"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> को ऐक्सेस किया गया"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"एक बार इस्तेमाल होने वाला पासवर्ड 132435 है"</string>
</resources>
diff --git a/PermissionController/res/values-hr-v34/strings.xml b/PermissionController/res/values-hr-v34/strings.xml
index 74a1d7d1e..e8e16a715 100644
--- a/PermissionController/res/values-hr-v34/strings.xml
+++ b/PermissionController/res/values-hr-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Pristup lokaciji"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Za aplikacije i usluge. Ako je ta postavka isključena, podaci mikrofona i dalje se mogu dijeliti kad nazovete broj hitne službe"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Za aplikacije i usluge"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ograničena postavka"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Radi vaše sigurnosti ova je postavka trenutačno nedostupna."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saznajte više"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-hr-watch/strings.xml b/PermissionController/res/values-hr-watch/strings.xml
index cb04d90e9..3e1f56a9a 100644
--- a/PermissionController/res/values-hr-watch/strings.xml
+++ b/PermissionController/res/values-hr-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Promjena nemoguća"</string>
<string name="generic_yes" msgid="2489207724988649846">"Da"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Otkaži"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Cijelo vrijeme"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Dok se aplikacija koristi"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Cijelo vrijeme"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Dok se aplikacija koristi"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Cijelo vrijeme"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Dok se aplikacija koristi"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Cijelo vrijeme"</string>
</resources>
diff --git a/PermissionController/res/values-hr/strings.xml b/PermissionController/res/values-hr/strings.xml
index d45180846..52efe1e5e 100644
--- a/PermissionController/res/values-hr/strings.xml
+++ b/PermissionController/res/values-hr/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Sva dopuštenja"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ostale mogućnosti aplikacije"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Zahtijevanje dopuštenja"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Radnje instaliranja i deinstaliranja nisu podržane na Wearu."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Odaberite čemu će &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; moći pristupiti"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikacija &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ažurirana je. Odaberite čemu će moći pristupiti."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Otkaži"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni dopuštenja ako se aplikacija ne upotrebljava"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ukloni dopuštenja i oslobodi prostor"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pauziraj aktivnosti u aplikacijama ako se ne koriste"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Upravljajte nekorištenom aplikacijom"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Uklonite dopuštenja, izbrišite privremene datoteke i zaustavite obavijesti"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Uklonite dopuštenja, izbrišite privremene datoteke, zaustavite obavijesti i arhivirajte aplikaciju"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Kako bi se vaši podaci zaštitili, dopuštenja za ovu aplikaciju uklonit će se ako se aplikacija ne upotrebljava nekoliko mjeseci."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Kako bi se vaši podaci zaštitili, ako se aplikacija ne upotrebljava nekoliko mjeseci, uklonit će se sljedeća dopuštenja: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Radi zaštite vaših podataka uklonjena su dopuštenja aplikacijama koje nekoliko mjeseci niste upotrebljavali."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacija za bilješke"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacije koje vam omogućuju vođenje bilješki na uređaju"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"napomene"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Zadana aplikacija za novčanik"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacija za novčanik"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikacije za novčanik mogu pohraniti vaše kreditne kartice i kartice vjernosti, automobilske ključeve i druge stvari kako bi vam razne vrste transakcija bile praktičnije."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Želite li aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g> postaviti kao zadanu aplikaciju za novčanik?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Dopuštenja nisu potrebna"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Trenutačna zadana"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Više me ne pitaj"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Postavi kao zadano"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Ažuriranja o dijeljenju podataka"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Neke su aplikacije promijenile način na koji mogu dijeliti vaše podatke o lokaciji"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Postavke"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Pristupljeno: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Pristupljeno jučer: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Pristupljeno: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Vaša jednokratna zaporka je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-hu-v34/strings.xml b/PermissionController/res/values-hu-v34/strings.xml
index 1a01b1cc0..11211d785 100644
--- a/PermissionController/res/values-hu-v34/strings.xml
+++ b/PermissionController/res/values-hu-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Helyhozzáférés"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Alkalmazásoknál és szolgáltatásoknál. Ha ki van kapcsolva ez a beállítás, segélyhívó szám hívásakor a rendszer továbbra is megoszthatja a mikrofonadatokat."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Alkalmazásoknál és szolgáltatásoknál"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Korlátozott beállítás"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Biztonsága érdekében ez a beállítás jelenleg nem használható."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"További információ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-hu-watch/strings.xml b/PermissionController/res/values-hu-watch/strings.xml
index 6022530fa..54ef0998b 100644
--- a/PermissionController/res/values-hu-watch/strings.xml
+++ b/PermissionController/res/values-hu-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nem változtatható"</string>
<string name="generic_yes" msgid="2489207724988649846">"Igen"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Mégse"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Mindig"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Az app használata közben"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Mindig"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Az app használata közben"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Mindig"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Az app használata közben"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Mindig"</string>
</resources>
diff --git a/PermissionController/res/values-hu/strings.xml b/PermissionController/res/values-hu/strings.xml
index c47c9ee9f..3833384e8 100644
--- a/PermissionController/res/values-hu/strings.xml
+++ b/PermissionController/res/values-hu/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Az összes engedély"</string>
<string name="other_permissions" msgid="2901186127193849594">"Egyéb alkalmazáslehetőségek"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Engedélykérés"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"A Wear nem támogatja a telepítés/eltávolítás műveletet."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Válassza ki, hogy a(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; mihez férjen hozzá"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"A(z) &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; frissítése megtörtént. Válassza ki, hogy mihez férjen hozzá ez az alkalmazás."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Mégse"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Engedélyek eltávolítása, ha nem használja az alkalmazást"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Engedélytörlés és tárhely-felszabadítás"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"App szüneteltetése, ha nem használja"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Nem használt alkalmazás kezelése"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Engedélyek eltávolítása, ideiglenes fájlok törlése és értesítések leállítása"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Engedélyek eltávolítása, ideiglenes fájlok törlése, értesítések leállítása és az alkalmazás archiválása"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Az adatok védelme érdekében az ennek az alkalmazásnak adott engedélyek visszavonásra kerülnek, ha néhány hónapon át nem használja az alkalmazást."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ha néhány hónapon át nem használja az alkalmazást, az adatok védelme érdekében a rendszer visszavonja a következő engedélyeket: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Az adatok védelme érdekében a rendszer eltávolította a néhány hónapja nem használt alkalmazások engedélyeit."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Jegyzetkészítő alkalmazás"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Alkalmazások, amelyek lehetővé teszik, hogy jegyzeteket készítsen az eszközén."</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"jegyzetek"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Alapértelmezett Wallet-app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet-app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"A Wallet-alkalmazások tárolhatják a hitel- és hűségkártyákat, az autókulcsokat és egyebeket a tranzakciók különböző formáinak támogatása érdekében."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> beállítása alapértelmezett Wallet-appként?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nincs szükség engedélyre"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aktuális alapérték"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne jelenjen meg többé"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Alapértelmezett"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Adatmegosztási frissítések"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Egyes alkalmazások módosították, hogy miként oszthatják meg az Ön helyadatait"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Beállítások"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Hozzáférés: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Hozzáférés: tegnap, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Hozzáférés: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Az Ön egyszer használatos jelszava: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-hy-v34/strings.xml b/PermissionController/res/values-hy-v34/strings.xml
index fb8997eb1..e2aef0600 100644
--- a/PermissionController/res/values-hy-v34/strings.xml
+++ b/PermissionController/res/values-hy-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Տեղորոշման թույլտվություն"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Հավելվածների և ծառայությունների համար։ Եթե այս կարգավորումն անջատված է, խոսափողի տվյալները միևնույն է կարող են փոխանցվել, երբ զանգեք արտակարգ իրավիճակների որևէ հեռախոսահամարի"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Հավելվածների և ծառայությունների համար"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Սահմանափակ ռեժիմի կարգավորում"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Անվտանգության նկատառումներից ելնելով՝ այս կարգավորումը ներկայումս անհասանելի է։"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Իմանալ ավելին"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-hy-watch/strings.xml b/PermissionController/res/values-hy-watch/strings.xml
index 77f8f5afe..b62e2d035 100644
--- a/PermissionController/res/values-hy-watch/strings.xml
+++ b/PermissionController/res/values-hy-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Հնարավոր չէ փոխել"</string>
<string name="generic_yes" msgid="2489207724988649846">"Այո"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Չեղարկել"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Միշտ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Հավելվածն օգտագործելիս"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Միշտ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Հավելվածն օգտագործելիս"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Միշտ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Հավելվածն օգտագործելիս"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Միշտ"</string>
</resources>
diff --git a/PermissionController/res/values-hy/strings.xml b/PermissionController/res/values-hy/strings.xml
index 8d92099d2..b268638ee 100644
--- a/PermissionController/res/values-hy/strings.xml
+++ b/PermissionController/res/values-hy/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Բոլոր թույլտվությունները"</string>
<string name="other_permissions" msgid="2901186127193849594">"Էլ ինչ կարող է անել հավելվածը"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Թույլտվության հարցում"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Տեղադրման/հեռացման գործողությունները Android Wear-ում չեն աջակցվում:"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Ընտրեք՝ ինչ թույլտվություններ եք ուզում տրամադրել &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածին"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; հավելվածը թարմացվել է: Ընտրեք՝ ինչ թույլտվություններ եք ուզում տրամադրել այդ հավելվածին:"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Չեղարկել"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Հեռացնել թույլտվությունները, եթե հավելվածը չի օգտագործվում"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Հեռացնել թույլտվությունները և տարածք ազատել"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Դադարեցնել աշխատանքը ոչ ակտիվ վիճակում"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Կառավարել հավելվածը, եթե չի օգտագործվում"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Հեռացնել թույլտվությունները, ջնջել ժամանակավոր ֆայլերը և դադարեցնել ծանուցումները"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Հեռացնել թույլտվությունները, ջնջել ժամանակավոր ֆայլերը, դադարեցնել ծանուցումները և արխիվացնել հավելվածը"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Եթե հավելվածը չի օգտագործվել մի քանի ամիս, դրա թույլտվությունները կհեռացվեն՝ ձեր տվյալները պաշտպանելու համար։"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Եթե հավելվածը չի օգտագործվել մի քանի ամիս, ձեր տվյալները պաշտպանելու համար հետևյալ թույլտվությունները կհեռացվեն՝ <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Հավելվածներից, որոնք մի քանի ամիս չեք օգտագործել, թույլտվությունները հեռացվել են՝ ձեր տվյալները պաշտպանելու համար։"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Նշումների հավելված"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Հավելվածներ, որոնք թույլ են տալիս նշումներ ստեղծել ձեր սարքում"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"նշումներ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Դրամապանակի կանխադրվ. հավելված"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Դրամապանակի հավելված"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Դրամապանակի հավելվածները կարող են պահել ձեր վարկային և մշտական հաճախորդի քարտերը, մեքենայի բանալիները և այլ բաներ, որոնք կհեշտացնեն ձեր գործարքները։"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Նշե՞լ <xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածը որպես դրամապանակի կանխադրված հավելված"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Թույլտվություններ հարկավոր չեն"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Օգտագործվում է ըստ կանխադրման"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Նորից չհարցնել"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Նշել կանխադրված"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Տվյալներով կիսվելու եղանակի փոփոխություն"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Որոշ հավելվածներ փոխել են ձեր տեղադրության տվյալներով կիսվելու եղանակը"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Կարգավորումներ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Բացվել է <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Բացվել է երեկ, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Բացվել է <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Մեկանգամյա օգտագործման ձեր գաղտնաբառը՝ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-in-v34/strings.xml b/PermissionController/res/values-in-v34/strings.xml
index 7e0c0a609..6c1f82977 100644
--- a/PermissionController/res/values-in-v34/strings.xml
+++ b/PermissionController/res/values-in-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Akses lokasi"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Untuk aplikasi dan layanan. Jika setelan ini nonaktif, data mikrofon mungkin tetap dibagikan saat Anda menelepon nomor darurat"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Untuk aplikasi dan layanan"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Setelan yang dibatasi"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Demi keamanan Anda, setelan ini tidak tersedia untuk saat ini."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Pelajari lebih lanjut"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-in-watch/strings.xml b/PermissionController/res/values-in-watch/strings.xml
index 91c107aa0..c124feda4 100644
--- a/PermissionController/res/values-in-watch/strings.xml
+++ b/PermissionController/res/values-in-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Tidak dapat diubah"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ya"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Batal"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Semua"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Saat menggunakan aplikasi"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Semua"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Saat menggunakan aplikasi"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Semua"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Saat menggunakan aplikasi"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Semua"</string>
</resources>
diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml
index 37df6c326..fb430fc10 100644
--- a/PermissionController/res/values-in/strings.xml
+++ b/PermissionController/res/values-in/strings.xml
@@ -50,12 +50,12 @@
<string name="permission_revoked_all" msgid="3397649017727222283">"semua dinonaktifkan"</string>
<string name="permission_revoked_none" msgid="9213345075484381180">"tidak ada yang dinonaktifkan"</string>
<string name="grant_dialog_button_allow" msgid="5314677880021102550">"Izinkan"</string>
- <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"Izinkan sepanjang waktu"</string>
+ <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"Selalu izinkan"</string>
<string name="grant_dialog_button_allow_foreground" msgid="501896824973636533">"Saat aplikasi digunakan"</string>
<string name="grant_dialog_button_change_to_precise_location" msgid="3273115879467236033">"Ubah ke lokasi presisi"</string>
<string name="grant_dialog_button_keey_approximate_location" msgid="438025182769080011">"Tetap gunakan perkiraan"</string>
<string name="grant_dialog_button_allow_one_time" msgid="2618088516449706391">"Hanya kali ini"</string>
- <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"Izinkan sepanjang waktu"</string>
+ <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"Selalu izinkan"</string>
<string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"Izinkan pengelolaan semua file"</string>
<string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"Izinkan akses ke file media"</string>
<string name="app_permissions_breadcrumb" msgid="5136969550489411650">"Aplikasi"</string>
@@ -109,15 +109,13 @@
<!-- no translation found for background_access_chooser_dialog_choices:0 (1351721623256561996) -->
<!-- no translation found for background_access_chooser_dialog_choices:1 (9127301153688725448) -->
<!-- no translation found for background_access_chooser_dialog_choices:2 (4305536986042401191) -->
- <string name="permission_access_always" msgid="1474641821883823446">"Izinkan sepanjang waktu"</string>
+ <string name="permission_access_always" msgid="1474641821883823446">"Selalu izinkan"</string>
<string name="permission_access_only_foreground" msgid="7801170728159326195">"Izinkan saat aplikasi digunakan"</string>
<string name="permission_access_never" msgid="4647014230217936900">"Jangan izinkan"</string>
<string name="loading" msgid="4789365003890741082">"Memuat…"</string>
<string name="all_permissions" msgid="6911125611996872522">"Semua izin"</string>
<string name="other_permissions" msgid="2901186127193849594">"Kemampuan aplikasi lainnya"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permintaan izin"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Instal/Uninstal tidak didukung di Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Pilih item yang boleh diakses oleh &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; telah diperbarui. Pilih item yang boleh diakses oleh aplikasi ini."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Batal"</string>
@@ -188,8 +186,8 @@
<string name="app_permission_button_allow" msgid="5808039516494774647">"Izinkan"</string>
<string name="app_permission_button_allow_all_files" msgid="1792232272599018825">"Izinkan pengelolaan semua file"</string>
<string name="app_permission_button_allow_media_only" msgid="2834282724426046154">"Izinkan akses hanya ke media"</string>
- <string name="app_permission_button_allow_always" msgid="4573292371734011171">"Izinkan sepanjang waktu"</string>
- <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Izinkan hanya saat aplikasi digunakan"</string>
+ <string name="app_permission_button_allow_always" msgid="4573292371734011171">"Selalu izinkan"</string>
+ <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Izinkan saat aplikasi digunakan"</string>
<string name="app_permission_button_always_allow_all" msgid="4905699259378428855">"Selalu izinkan semua"</string>
<string name="app_permission_button_ask" msgid="3342950658789427">"Selalu tanya"</string>
<string name="app_permission_button_deny" msgid="6016454069832050300">"Jangan izinkan"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Hapus izin jika aplikasi tidak digunakan"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Hapus izin &amp; kosongkan ruang penyimpanan"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Jeda aktivitas aplikasi jika tak dipakai"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Kelola aplikasi jika tidak digunakan"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Hapus izin dan file sementara, serta hentikan notifikasi"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Hapus izin dan file sementara, hentikan notifikasi, dan arsipkan aplikasi"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Untuk melindungi data Anda, izin aplikasi ini akan dihapus jika aplikasi tidak digunakan dalam beberapa bulan."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Untuk melindungi data Anda, izin berikut akan dihapus jika aplikasi tidak digunakan dalam beberapa bulan: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Untuk melindungi data Anda, izin dari aplikasi yang tidak digunakan dalam beberapa bulan telah dihapus."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikasi catatan"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikasi untuk membuat catatan di perangkat"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"catatan"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Aplikasi dompet default"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikasi dompet"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikasi dompet dapat menyimpan kartu kredit dan kartu loyalitas, kunci mobil, serta hal lainnya untuk membantu berbagai bentuk transaksi."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Setel <xliff:g id="APP_NAME">%1$s</xliff:g> sebagai aplikasi dompet default?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Tidak ada izin yang diperlukan"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Default saat ini"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Jangan tanya lagi"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Jadikan default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Pembaruan berbagi data"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Beberapa aplikasi mengubah caranya berbagi data lokasi Anda"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Setelan"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Diakses <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Diakses kemarin <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Diakses <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Sandi sekali pakai Anda adalah 132435"</string>
</resources>
diff --git a/PermissionController/res/values-is-v34/strings.xml b/PermissionController/res/values-is-v34/strings.xml
index b897bcc71..e26f44ba6 100644
--- a/PermissionController/res/values-is-v34/strings.xml
+++ b/PermissionController/res/values-is-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Aðgangur að staðsetningu"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Fyrir forrit og þjónustur. Þegar slökkt er á þessari stillingu verður hljóðnemagögnum þó hugsanlega deilt þegar þú hringir í neyðarnúmer"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Fyrir forrit og þjónustur"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Takmörkuð stilling"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Til að tryggja öryggi þitt er þessi stilling ekki tiltæk eins og er."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Nánar"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-is-watch/strings.xml b/PermissionController/res/values-is-watch/strings.xml
index 7f01f675c..6bfd6c7f4 100644
--- a/PermissionController/res/values-is-watch/strings.xml
+++ b/PermissionController/res/values-is-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Má ekki breyta"</string>
<string name="generic_yes" msgid="2489207724988649846">"Já"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Hætta við"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Alltaf"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Þegar forrit er notað"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Alltaf"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Þegar forrit er notað"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Alltaf"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Þegar forrit er notað"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Alltaf"</string>
</resources>
diff --git a/PermissionController/res/values-is/strings.xml b/PermissionController/res/values-is/strings.xml
index 4a472afa0..3a8a40665 100644
--- a/PermissionController/res/values-is/strings.xml
+++ b/PermissionController/res/values-is/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Allar heimildir"</string>
<string name="other_permissions" msgid="2901186127193849594">"Aðrir forritseiginleikar"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Beiðni um heimild"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Aðgerðir til að setja upp / fjarlægja eru ekki studdar í Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Veldu hverju &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; fær aðgang að"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; hefur verið uppfært. Veldu hverju forritið fær aðgang að."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Hætta við"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjarlægja heimildir ef forrit er ekki notað"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Fjarlægja heimildir og losa um pláss"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Gera hlé á forritavirkni ef ekki notað"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Stjórna forriti ef það er ónotað"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Fjarlægja heimildir, eyða tímabundnum skrám og stöðva tilkynningar"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Fjarlægja heimildir, eyða tímabundnum skrám, stöðva tilkynningar og setja forritið í geymslu"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Til að vernda gögnin þín verða heimildir þessa forrits fjarlægðar ef það er ekki notað í nokkra mánuði."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Til að vernda gögnin þín verða eftirfarandi heimildir fjarlægðar ef forritið er ekki notað í nokkra mánuði: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Til að vernda gögnin þín voru heimildir fjarlægðar úr forritum sem þú hefur ekki notað í nokkra mánuði."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Glósuforrit"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Forrit sem gera þér kleift að taka glósur í tækinu þínu"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"glósur"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Sjálfgefið veskisforrit"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Veskisforrit"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Veskisforrit geta geymt kredit- og tryggðarkortin þín, bíllyklana og aðra hluti til að auðvelda þér að ganga frá ýmiskonar greiðslum."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Stilla <xliff:g id="APP_NAME">%1$s</xliff:g> sem sjálfgefið veskisforrit?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Engra heimilda krafist"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Núverandi sjálfgefið forrit"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ekki spyrja aftur"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Velja sem sjálfgefið"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Gagnadeilingaruppfærslur"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Deiling staðsetningargagna hefur breyst í sumum forritum"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Stillingar"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Opnað kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Opnað í gær kl. <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Opnað <xliff:g id="TIME_DATE_0">%1$s</xliff:g> kl. <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Einnota aðgangsorðið þitt er 132435"</string>
</resources>
diff --git a/PermissionController/res/values-it-v34/strings.xml b/PermissionController/res/values-it-v34/strings.xml
index 27da7e634..058a10459 100644
--- a/PermissionController/res/values-it-v34/strings.xml
+++ b/PermissionController/res/values-it-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Accesso alla posizione"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Per app e servizi. Se questa impostazione viene disattivata, i dati del microfono potrebbero comunque essere condivisi quando chiami un numero di emergenza"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Per app e servizi"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Impostazione con limitazioni"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Per la tua sicurezza, questa impostazione non è al momento disponibile."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Scopri di più"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-it-watch/strings.xml b/PermissionController/res/values-it-watch/strings.xml
index 6cb0ce756..7e5106952 100644
--- a/PermissionController/res/values-it-watch/strings.xml
+++ b/PermissionController/res/values-it-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Impos. modificare"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sì"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Annulla"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Sempre"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Con app in uso"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Sempre"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Con app in uso"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Sempre"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Con app in uso"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Sempre"</string>
</resources>
diff --git a/PermissionController/res/values-it/strings.xml b/PermissionController/res/values-it/strings.xml
index 27a1ec703..32d7b9bfd 100644
--- a/PermissionController/res/values-it/strings.xml
+++ b/PermissionController/res/values-it/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Tutte le autorizzazioni"</string>
<string name="other_permissions" msgid="2901186127193849594">"Altre funzionalità dell\'app"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Richiesta di autorizzazione"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Le azioni di installazione/disinstallazione non sono supportate su Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Scegli i dati a cui l\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; può accedere"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"L\'app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; è stata aggiornata. Scegli i dati a cui può accedere."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Annulla"</string>
@@ -195,7 +193,7 @@
<string name="app_permission_button_deny" msgid="6016454069832050300">"Non consentire"</string>
<string name="precise_image_description" msgid="6349638632303619872">"Posizione esatta"</string>
<string name="approximate_image_description" msgid="938803699637069884">"Posizione approssimativa"</string>
- <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Utilizza posizione esatta"</string>
+ <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Posizione esatta"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Quando la posizione esatta non è attiva, le app possono accedere alla tua posizione approssimativa"</string>
<string name="app_permission_title" msgid="2090897901051370711">"Autorizzazione <xliff:g id="PERM">%1$s</xliff:g>"</string>
<string name="app_permission_header" msgid="2951363137032603806">"Accesso a <xliff:g id="PERM">%1$s</xliff:g> per questa app"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Rimuovi autorizzazioni se non in uso"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Rimuovi autorizzazioni e libera spazio"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Sospendi attività app se inutilizzata"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gestisci l\'app se inutilizzata"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Rimuovi le autorizzazioni, elimina i file temporanei e interrompi le notifiche"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Rimuovi le autorizzazioni, elimina i file temporanei, interrompi le notifiche e archivia l\'app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Per proteggere i tuoi dati, le autorizzazioni di questa app verranno rimosse se l\'app non viene usata per alcuni mesi."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Per proteggere i tuoi dati, se l\'app non viene usata per alcuni mesi, le seguenti autorizzazioni verranno rimosse: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Per proteggere i tuoi dati, sono state rimosse le autorizzazioni dalle app che non hai utilizzato per alcuni mesi."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App per le note"</string>
<string name="role_notes_description" msgid="8496852798616883551">"App che ti permettono di prendere appunti sul tuo dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"note"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"App portafoglio predefinita"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App portafoglio"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Le app portafoglio possono memorizzare carte di credito e fedeltà, chiavi della macchina e altro per facilitare varie forme di transazioni."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Impostare <xliff:g id="APP_NAME">%1$s</xliff:g> come app portafoglio predefinita?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nessuna autorizzazione necessaria"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Valore predefinito attuale"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Non chiedermelo più"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Imposta predefinito"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Aggiornamenti relativi alla condivisione dei dati"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Alcune app hanno cambiato la modalità di condivisione dei tuoi dati sulla posizione"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Impostazioni"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Ultimo accesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Ultimo accesso ieri: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Ultimo accesso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"La password monouso è: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-iw-v34/strings.xml b/PermissionController/res/values-iw-v34/strings.xml
index 370a20dcb..0ff1145a1 100644
--- a/PermissionController/res/values-iw-v34/strings.xml
+++ b/PermissionController/res/values-iw-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"גישה למיקום"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"לאפליקציות ולשירותים. אם ההגדרה מושבתת, יכול להיות שנתוני המיקרופון ישותפו בכל זאת כשתתבצע שיחה למספר חירום"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"לאפליקציות ולשירותים"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"הגדרה מוגבלת"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"מטעמי אבטחה, ההגדרה הזו לא זמינה כרגע."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"מידע נוסף"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-iw-watch/strings.xml b/PermissionController/res/values-iw-watch/strings.xml
index 3db39b59b..bdf113146 100644
--- a/PermissionController/res/values-iw-watch/strings.xml
+++ b/PermissionController/res/values-iw-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"לא ניתן לשנות"</string>
<string name="generic_yes" msgid="2489207724988649846">"כן"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ביטול"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"כל הזמן"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"בזמן השימוש באפליקציה"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"כל הזמן"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"בזמן השימוש באפליקציה"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"כל הזמן"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"בזמן השימוש באפליקציה"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"כל הזמן"</string>
</resources>
diff --git a/PermissionController/res/values-iw/strings.xml b/PermissionController/res/values-iw/strings.xml
index 3ab567cb3..878788def 100644
--- a/PermissionController/res/values-iw/strings.xml
+++ b/PermissionController/res/values-iw/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"כל ההרשאות"</string>
<string name="other_permissions" msgid="2901186127193849594">"הרשאות אחרות של האפליקציה"</string>
<string name="permission_request_title" msgid="8790310151025020126">"בקשת הרשאה"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"‏פעולות התקנה/הסרת התקנה אינן נתמכות ב-Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"‏בחירה בהרשאות הגישה שברצונך לתת לאפליקציה &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"‏אפליקציית &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; עודכנה. יש לבחור הרשאות גישה לאפליקציה הזו."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ביטול"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"הסרת ההרשאות כשלא בשימוש"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"הסרת הרשאות ופינוי מקום אחסון"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"השהיית הפעילות באפליקציה אם אין בה שימוש"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ניהול האפליקציה כשהיא לא בשימוש"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ההרשאות של האפליקציה יוסרו, הקבצים הזמניים יימחקו ותופסק קבלת ההתראות ממנה"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"הסרת ההרשאות, מחיקה של הקבצים הזמניים, הפסקה של קבלת ההתראות והעברת האפליקציה לארכיון"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"כדי להגן על הנתונים שלך, אם האפליקציה הזו לא תהיה בשימוש במשך מספר חודשים, ההרשאות שניתנו לה יוסרו."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"כדי להגן על הנתונים שלך, אם האפליקציה לא תהיה בשימוש במשך מספר חודשים, ההרשאות הבאות יוסרו: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"כדי להגן על הנתונים שלך, הוסרו הרשאות מאפליקציות שלא השתמשת בהן במשך מספר חודשים."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"אפליקציית פתקים"</string>
<string name="role_notes_description" msgid="8496852798616883551">"אפליקציות שמאפשרות לך לרשום הערות במכשיר"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"הערות"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ברירת המחדל של אפליקציית הארנק"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"אפליקציית ארנק"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"אפליקציות ארנק מאחסנות את כרטיסי האשראי ואת כרטיסי מועדון הלקוחות שלך, את מפתחות הרכב ועוד כדי לעזור בסוגים שונים של עסקאות."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"להגדיר את <xliff:g id="APP_NAME">%1$s</xliff:g> כברירת המחדל של אפליקציית הארנק?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"אין צורך בהרשאות"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ברירת המחדל הנוכחית"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"לא לשאול שוב"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"הגדרה כברירת מחדל"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"עדכונים לגבי שיתוף הנתונים"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"בחלק מהאפליקציות, השתנה האופן שבו הן עשויות לשתף את נתוני המיקום שלך"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"הגדרות"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"תאריך גישה: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"גישה אתמול: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"תאריך גישה: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ב-<xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"הסיסמה החד-פעמית שלך היא 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ja-v34/strings.xml b/PermissionController/res/values-ja-v34/strings.xml
index 1a27a1df1..e4a413de6 100644
--- a/PermissionController/res/values-ja-v34/strings.xml
+++ b/PermissionController/res/values-ja-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"位置情報へのアクセス"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"アプリとサービスによるアクセス。この設定が OFF の場合でも、緊急通報番号に発信したときは、マイクのデータが共有されることがあります"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"アプリとサービスによるアクセス"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"制限付き設定"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"セキュリティ保護のため、この設定は現在利用できません。"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"詳細"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ja-watch/strings.xml b/PermissionController/res/values-ja-watch/strings.xml
index f47df141c..edd0d5c64 100644
--- a/PermissionController/res/values-ja-watch/strings.xml
+++ b/PermissionController/res/values-ja-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"変更不可"</string>
<string name="generic_yes" msgid="2489207724988649846">"はい"</string>
<string name="generic_cancel" msgid="2631708607129269698">"キャンセル"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"常時"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"アプリの使用中"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"常時"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"アプリの使用中"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"常時"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"アプリの使用中"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"常時"</string>
</resources>
diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml
index b861cbf0d..c7d8a4c2d 100644
--- a/PermissionController/res/values-ja/strings.xml
+++ b/PermissionController/res/values-ja/strings.xml
@@ -56,8 +56,8 @@
<string name="grant_dialog_button_keey_approximate_location" msgid="438025182769080011">"おおよその位置情報を保持"</string>
<string name="grant_dialog_button_allow_one_time" msgid="2618088516449706391">"今回のみ"</string>
<string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"常に許可"</string>
- <string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"すべてのファイルの管理を許可"</string>
- <string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"メディア ファイルへのアクセスを許可"</string>
+ <string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"すべての管理を許可"</string>
+ <string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"アクセスのみ許可"</string>
<string name="app_permissions_breadcrumb" msgid="5136969550489411650">"アプリ"</string>
<string name="app_permissions" msgid="3369917736607944781">"アプリの権限"</string>
<string name="unused_apps" msgid="2058057455175955094">"使用されていないアプリ"</string>
@@ -86,7 +86,7 @@
<string name="app_permissions_group_summary" msgid="8788419008958284002">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="COUNT_1">%2$d</xliff:g> 個のアプリを許可"</string>
<string name="app_permissions_group_summary2" msgid="4329922444840521150">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="COUNT_1">%2$d</xliff:g> 件のアプリを許可"</string>
<string name="menu_show_system" msgid="4254021607027872504">"システムアプリを表示"</string>
- <string name="menu_hide_system" msgid="3855390843744028465">"システムアプリを表示しない"</string>
+ <string name="menu_hide_system" msgid="3855390843744028465">"システムアプリを非表示"</string>
<string name="menu_show_7_days_data" msgid="8979611198508523706">"過去 7 日間を表示"</string>
<string name="menu_show_24_hours_data" msgid="8228054833323380780">"過去 24 時間を表示"</string>
<string name="manage_permission" msgid="2895385393037061964">"権限の管理"</string>
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"すべての権限"</string>
<string name="other_permissions" msgid="2901186127193849594">"その他のアプリ機能"</string>
<string name="permission_request_title" msgid="8790310151025020126">"権限のリクエスト"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ではインストールやアンインストールはできません。"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; に許可する権限の選択"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; が更新されました。このアプリに許可する権限を選択してください。"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"キャンセル"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"アプリが使用されていない場合に権限を削除"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"権限を削除して空き容量を増やす"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"使用していないアプリを一時停止する"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"使用していないアプリを管理する"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"権限と一時ファイルを削除し、通知を停止します"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"権限と一時ファイルを削除し、通知を停止し、アプリをアーカイブします"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"データ保護のため、このアプリが数か月使用されていない場合はアプリの権限が取り消されます。"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"データ保護のため、アプリが数か月使用されていない場合は以下の権限が取り消されます。<xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"データ保護のため、数か月使用していないアプリの権限を削除しました。"</string>
@@ -351,7 +351,7 @@
<string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"これらのアプリでは、画面、アクション、入力の表示、アクションの実行、ディスプレイの操作を行えます。"</string>
<string name="role_assistant_label" msgid="4727586018198208128">"デフォルトのデジタル アシスタント アプリ"</string>
<string name="role_assistant_short_label" msgid="3369003713187703399">"デジタル アシスタント アプリ"</string>
- <string name="role_assistant_description" msgid="6622458130459922952">"アシストアプリは、表示している画面の情報に基づいてアシスタントを提供します。一部のアプリはランチャーと音声入力サービスの両方に対応しており、統合されたアシスタントを提供します。"</string>
+ <string name="role_assistant_description" msgid="6622458130459922952">"アシストアプリは、表示している画面の情報に基づいてサポートを提供します。一部のアプリはランチャーと音声入力サービスの両方に対応しており、統合されたサポートを提供します。"</string>
<string name="role_browser_label" msgid="2877796144554070207">"デフォルトのブラウザアプリ"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"ブラウザアプリ"</string>
<string name="role_browser_description" msgid="3465253637499842671">"インターネットにアクセスするためのアプリです。タップしたリンクは、このアプリで開きます。"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"メモアプリ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"デバイスでメモの作成に使うアプリ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"メモ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"デフォルトのウォレット アプリ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"ウォレット アプリ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"ウォレット アプリにクレジット カード、ポイントカード、車のキーなどの情報を保存して、さまざまな取引に対応できます。"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> をデフォルトのウォレット アプリに設定しますか?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"権限は必要ありません"</string>
<string name="request_role_current_default" msgid="738722892438247184">"現在のデフォルト"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"次回から表示しない"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"デフォルトに設定"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"データ共有に関する更新"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"ユーザーの位置情報を共有する方法が変更されたアプリがあります"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"設定"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> にアクセス"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"昨日の <xliff:g id="TIME_DATE">%1$s</xliff:g> にアクセス"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> にアクセス"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ワンタイム パスワードは 132435 です"</string>
</resources>
diff --git a/PermissionController/res/values-ka-v34/strings.xml b/PermissionController/res/values-ka-v34/strings.xml
index c3e4c7715..9fb7d79b4 100644
--- a/PermissionController/res/values-ka-v34/strings.xml
+++ b/PermissionController/res/values-ka-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"მდებარეობაზე წვდომა"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"აპებისა და სერვისებისთვის. მიკროფონის მონაცემები, შესაძლოა, მაინც გაზიარდეს გადაუდებელი დახმარების სამსახურის ნომერზე დარეკვისას, როცა ეს პარამეტრი გამორთულია"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"აპებისა და სერვისებისთვის"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"შეზღუდული პარამეტრი"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"პარამეტრი ამჟამად მიუწვდომელია თქვენივე უსაფრთხოებისთვის."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"შეიტყვეთ მეტი"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ka-watch/strings.xml b/PermissionController/res/values-ka-watch/strings.xml
index f3ca03402..357e9cd00 100644
--- a/PermissionController/res/values-ka-watch/strings.xml
+++ b/PermissionController/res/values-ka-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ვერ შეიცვლება"</string>
<string name="generic_yes" msgid="2489207724988649846">"დიახ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"გაუქმება"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Მუდმივად"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"აპის გამოყენებისას"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Მუდმივად"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"აპის გამოყენებისას"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Მუდმივად"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"აპის გამოყენებისას"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Მუდმივად"</string>
</resources>
diff --git a/PermissionController/res/values-ka/strings.xml b/PermissionController/res/values-ka/strings.xml
index b8bc6fd95..f4d0ca15c 100644
--- a/PermissionController/res/values-ka/strings.xml
+++ b/PermissionController/res/values-ka/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ყველა ნებართვა"</string>
<string name="other_permissions" msgid="2901186127193849594">"აპის სხვა შესაძლებლობები"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ნებართვის მოთხოვნა"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ინსტალაციის/დეინსტალაციის მოქმედებები არ არის მხარდაჭერილი Wear-ზე."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"აირჩიეთ, რაზე ჰქონდეს წვდომა &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-ს"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; განახლდა. აირჩიეთ, რაზე ჰქონდეს წვდომა ამ აპს."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"გაუქმება"</string>
@@ -202,11 +200,13 @@
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"ყველა ნებართვის ნახვა: <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"ამ ნებართვის მქონე ყველა აპის ნახვა"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"ასისტენტის მიკროფონის გამოყენების ჩვენება"</string>
- <string name="unused_apps_category_title" msgid="2988455616845243901">"აპის გამოუყენებელი პარამეტრები"</string>
+ <string name="unused_apps_category_title" msgid="2988455616845243901">"გამოუყენებელი აპის პარამეტრები"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"ნებართვების ამოშლა აპის გამოუყენებლობის შემთხვევაში."</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ნებართვების ამოშლა და მეხსიერების გათავისუფლება"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"დაპაუზდეს აპში აქტივობა, თუ არ იყენებენ"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"აპის მართვა გამოუყენებლობის შემთხვევაში"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ნებართვების ამოშლა, დროებითი ფაილების წაშლა და შეტყობინებების გამორთვა"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ნებართვების ამოშლა, დროებითი ფაილების წაშლა, შეტყობინებების გამორთვა და აპის დაარქივება"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"თქვენი მონაცემების დასაცავად ნებართვები ამოიშლება ამ აპიდან, თუ ის რამდენიმე თვის განმავლობაში არ გამოგიყენებიათ."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"თქვენი მონაცემების დაცვის მიზნით, თუ აპს რამდენიმე თვის განმავლობაში არ გამოიყენებთ, ამოიშლება შემდეგი ნებართვები: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"თქვენი მონაცემების დასაცავად ნებართვები ამოიშალა აპებიდან, რომლებიც რამდენიმე თვის განმავლობაში არ გამოგიყენებიათ."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"ჩანიშვნების აპი"</string>
<string name="role_notes_description" msgid="8496852798616883551">"აპები, რომლებიც საშუალებას გაძლევთ, გააკეთოთ ჩანიშვნები თქვენს მოწყობილობაზე"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ჩანიშვნები"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ნაგულისხმევი საფულის აპი"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"საფულის აპი"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"საფულის აპებს შეუძლიათ საკრედიტო და ერთგული კლიენტის ბარათების, მანქანის გასაღებების და სხვა ნივთების შენახვა, რაც დაგეხმარებათ სხვადასხვა სახის ტრანზაქციებში."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"გსურთ დააყენოთ <xliff:g id="APP_NAME">%1$s</xliff:g> თქვენს ნაგულისხმევ საფულის აპად?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ნებართვები არ არის საჭირო"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ამჟამინდელი ნაგულისხმევი"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"აღარ მკითხოთ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ნაგულისხმ. დაყენება"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"მონაცემთა გაზიარების განახლება"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"ზოგიერთმა აპმა შეცვალა თქვენი მდებარეობის მონაც. გაზიარების გზები"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"პარამეტრები"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"წვდომა განხორციელდა: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"წვდომა განხორციელდა გუშინ: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"წვდომა განხორციელდა: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"თქვენი ერთჯერადი პაროლია: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-kk-v34/strings.xml b/PermissionController/res/values-kk-v34/strings.xml
index 002624b5a..8547fb6e1 100644
--- a/PermissionController/res/values-kk-v34/strings.xml
+++ b/PermissionController/res/values-kk-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Локацияны пайдалану рұқсаты"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Қолданбалар мен қызметтерге арналған. Бұл параметр өшірілсе де, құтқару қызметінің нөміріне қоңырау шалғанда, микрофон деректері жіберілуі мүмкін."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Қолданбалар мен қызметтерге арналған."</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Шектелген параметрлер"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Қауіпсіздік мақсатында бұл параметрді қазір пайдалану мүмкін емес."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Толық ақпарат"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-kk-watch/strings.xml b/PermissionController/res/values-kk-watch/strings.xml
index 1adaab343..8cbb401c4 100644
--- a/PermissionController/res/values-kk-watch/strings.xml
+++ b/PermissionController/res/values-kk-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Өзгерту мүмкін емес"</string>
<string name="generic_yes" msgid="2489207724988649846">"Иә"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Бас тарту"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Әрдайым"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Қолданбаны пайдаланғанда"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Әрдайым"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Қолданбаны пайдаланғанда"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Әрдайым"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Қолданбаны пайдаланғанда"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Әрдайым"</string>
</resources>
diff --git a/PermissionController/res/values-kk/strings.xml b/PermissionController/res/values-kk/strings.xml
index b39b229c3..7d90c2333 100644
--- a/PermissionController/res/values-kk/strings.xml
+++ b/PermissionController/res/values-kk/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Барлық рұқсаттар"</string>
<string name="other_permissions" msgid="2901186127193849594">"Басқа қолданба мүмкіндіктері"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Рұқсат сұрау"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear жүйесінде \"Орнату\"/\"Жою\" әрекеттері қолданылмайды."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасы қайда кіре алатынын таңдаңыз"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; қолданбасы жаңартылды. Бұл қолданбаның қайда кіре алатынын таңдаңыз."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Бас тарту"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Қолданба пайдаланылмаса, рұқсаттарды өшіру"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Рұқсаттарды өшіру және орын босату"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Әрекетсіз қолданба жұмысын кідірту"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Пайдаланылмайтын қолданбалардың жұмысын кідірту"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Рұқсаттарды өшіру, уақытша файлдарды жою және хабарландыруларды тоқтату"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Рұқсаттарды өшіру, уақытша файлдарды жою, хабарландыруларды тоқтату және қолданбаны мұрағаттау"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Бұл қолданба бірнеше ай бойы пайдаланылмаса, деректеріңізді қорғау үшін оған берілген рұқсаттар өшіріледі."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Қолданба бірнеше ай бойы пайдаланылмаса, деректеріңізді қорғау үшін мына рұқсаттар өшіріледі: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Бірнеше ай бойы пайдаланылмаған қолданбаларға берілген рұқсаттар деректеріңізді қорғау үшін өшірілді."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Ескертпелер қолданбасы"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Құрылғыда ескертпелер жазуға арналған қолданбалар"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ескертпелер"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Әдепкі әмиян қолданбасы"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Әмиян қолданбасы"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Әмиян қолданбаларында несиелік және тұрақты клиент карталарын, көлік кілттерін, сондай-ақ басқа да транзакция түрлері үшін қолайлы заттарды сақтауға болады."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасын әдепкі әмиян қолданбасы ретінде орнату керек пе?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Рұқсаттар қажет емес."</string>
<string name="request_role_current_default" msgid="738722892438247184">"Ағымдағы әдепкі қолданба"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Қайта сұралмасын"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Әдепкі етіп орнату"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Деректерді бөлісуге қатысты жаңалық"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Кейбір қолданбалар локация деректеріңізді бөлісу жолын өзгертті."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Параметрлер"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Пайдаланылған уақыты: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Кеше пайдаланылған уақыты: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Пайдаланылған уақыты: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Бір реттік құпия сөзіңіз: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-km-v34/strings.xml b/PermissionController/res/values-km-v34/strings.xml
index ccf92d186..4578bdde3 100644
--- a/PermissionController/res/values-km-v34/strings.xml
+++ b/PermissionController/res/values-km-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ការចូលប្រើប្រាស់ទីតាំង"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"សម្រាប់កម្មវិធី និងសេវាកម្ម។ ប្រសិនបើការកំណត់នេះ​ត្រូវ​បាន​បិទ ទិន្នន័យមីក្រូហ្វូននៅតែអាចត្រូវបានចែករំលែកដដែល នៅពេលអ្នកហៅទៅលេខសង្គ្រោះបន្ទាន់"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"សម្រាប់កម្មវិធី និងសេវាកម្ម"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ការកំណត់​ដែលបានរឹតបន្តឹង"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ដើម្បីសុវត្ថិភាព​របស់អ្នក បច្ចុប្បន្នមិនអាចប្រើការកំណត់នេះបានទេ។"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ស្វែងយល់បន្ថែម"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-km-watch/strings.xml b/PermissionController/res/values-km-watch/strings.xml
index de12569e2..08504f8f1 100644
--- a/PermissionController/res/values-km-watch/strings.xml
+++ b/PermissionController/res/values-km-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"មិនអាចប្តូរបានទេ"</string>
<string name="generic_yes" msgid="2489207724988649846">"បាទ/ចាស"</string>
<string name="generic_cancel" msgid="2631708607129269698">"បោះបង់"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"គ្រប់ពេល"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ពេលកំពុងប្រើកម្មវិធី"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"គ្រប់ពេល"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ពេលកំពុងប្រើកម្មវិធី"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"គ្រប់ពេល"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ពេលកំពុងប្រើកម្មវិធី"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"គ្រប់ពេល"</string>
</resources>
diff --git a/PermissionController/res/values-km/strings.xml b/PermissionController/res/values-km/strings.xml
index d1b60ad11..0528d78a7 100644
--- a/PermissionController/res/values-km/strings.xml
+++ b/PermissionController/res/values-km/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ការអនុញ្ញាត​ទាំងអស់"</string>
<string name="other_permissions" msgid="2901186127193849594">"សមត្ថភាពកម្មវិធីផ្សេងទៀត"</string>
<string name="permission_request_title" msgid="8790310151025020126">"សំណើសុំ​ការអនុញ្ញាត"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"សកម្មភាព​ដំឡើង/លុបចេញមិនអាចប្រើ​នៅលើ Wear បានទេ។"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"ជ្រើសរើស​អ្វីដែលត្រូវ​អនុញ្ញាតឱ្យ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ចូលប្រើ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ត្រូវបាន​ដំឡើងជំនាន់។ ជ្រើសរើស​អ្វីដែលត្រូវ​អនុញ្ញាតឱ្យ​កម្មវិធីនេះ​ចូលប្រើ។"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"បោះបង់"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ដកការ​អនុញ្ញាតចេញ ប្រសិនបើ​មិនប្រើប្រាស់​កម្មវិធី"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ដក​ការអនុញ្ញាតចេញ និងបង្កើន​ទំហំផ្ទុក"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ផ្អាក​សកម្មភាព​កម្មវិធី ប្រសិនបើមិនប្រើ"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"គ្រប់គ្រងកម្មវិធី ប្រសិនបើមិនបានប្រើ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ដកការអនុញ្ញាតចេញ លុបឯកសារបណ្ដោះអាសន្ន និងបញ្ឈប់ការជូនដំណឹង"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ដកការអនុញ្ញាតចេញ លុបឯកសារបណ្ដោះអាសន្ន បញ្ឈប់ការជូនដំណឹង និងទុកកម្មវិធីក្នុងបណ្ណសារ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ដើម្បីការពារ​ទិន្នន័យរបស់អ្នក ការអនុញ្ញាត​សម្រាប់កម្មវិធីនេះ​នឹងត្រូវ​ដកចេញ ប្រសិនបើ​មិនប្រើប្រាស់​កម្មវិធីនេះ​រយៈពេល​ពីរបីខែ។"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ដើម្បីការពារ​ទិន្នន័យរបស់អ្នក ការអនុញ្ញាត​ខាងក្រោម​នឹងត្រូវដកចេញ ប្រសិនបើ​មិនប្រើប្រាស់​កម្មវិធីនេះ​រយៈពេល​ពីរបីខែ៖ <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ដើម្បីការពារ​ទិន្នន័យរបស់អ្នក ការអនុញ្ញាត​ត្រូវបាន​ដកចេញ​ពីកម្មវិធី​ដែល​អ្នកមិនបាន​ប្រើប្រាស់​រយៈពេល​ពីរបីខែ។"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"កម្មវិធី​កំណត់ចំណាំ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"កម្មវិធីដែលអនុញ្ញាតឱ្យអ្នក​កត់ចំណាំនៅលើឧបករណ៍របស់អ្នក"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"កំណត់ចំណាំ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"កម្មវិធីកាបូបលំនាំដើម"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"កម្មវិធីកាបូប"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"កម្មវិធីកាបូបអាចរក្សាទុកកាតឥណទាននិងកាតសមាជិក សោរថយន្ត និងអ្វីៗផ្សេងទៀតរបស់អ្នក ដើម្បីជួយពាក់ព័ន្ធនឹងទម្រង់ផ្សេងៗរបស់ប្រតិបត្តិការ។"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"កំណត់ <xliff:g id="APP_NAME">%1$s</xliff:g> ជាកម្មវិធីកាបូបលំនាំដើមរបស់អ្នកឬ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"មិនត្រូវការ​ការអនុញ្ញាត​ទេ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"លំនាំដើម​បច្ចុប្បន្ន"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"កុំសួរទៀត"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"កំណត់ជាលំនាំដើម"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"បច្ចុប្បន្នភាពការចែករំលែកទិន្នន័យ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"កម្មវិធីមួយចំនួន​បានផ្លាស់ប្ដូររបៀបដែលវាអាចចែករំលែកទិន្នន័យ​ទីតាំងរបស់អ្នក"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ការកំណត់"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"បានចូលប្រើនៅម៉ោង <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"បានចូលប្រើម្សិលមិញនៅម៉ោង <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"បានចូលប្រើនៅថ្ងៃទី <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ពាក្យ​សម្ងាត់​ប្រើបាន​តែ​ម្ដងរបស់អ្នកគឺ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-kn-v34/strings.xml b/PermissionController/res/values-kn-v34/strings.xml
index 34a939459..333b92a40 100644
--- a/PermissionController/res/values-kn-v34/strings.xml
+++ b/PermissionController/res/values-kn-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ಸ್ಥಳದ ಆ್ಯಕ್ಸೆಸ್"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳಿಗಾಗಿ. ಈ ಸೆಟ್ಟಿಂಗ್ ಆಫ್ ಆಗಿದ್ದಾಗಲೂ, ನೀವು ತುರ್ತು ಸಂಖ್ಯೆಯೊಂದಕ್ಕೆ ಕರೆ ಮಾಡಿದಾಗ ಮೈಕ್ರೊಫೋನ್ ಡೇಟಾವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ಆ್ಯಪ್‌ಗಳು ಮತ್ತು ಸೇವೆಗಳಿಗಾಗಿ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಗಾಗಿ ಈ ಸೆಟ್ಟಿಂಗ್ ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-kn-watch/strings.xml b/PermissionController/res/values-kn-watch/strings.xml
index a05c39b72..1aae70857 100644
--- a/PermissionController/res/values-kn-watch/strings.xml
+++ b/PermissionController/res/values-kn-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ಬದಲಿಸಲಾಗುವುದಿಲ್ಲ"</string>
<string name="generic_yes" msgid="2489207724988649846">"ಹೌದು"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ರದ್ದುಮಾಡಿ"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ಯಾವಾಗಲೂ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ಆ್ಯಪ್ ಬಳಸುವಾಗ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ಯಾವಾಗಲೂ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ಆ್ಯಪ್ ಬಳಸುವಾಗ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ಯಾವಾಗಲೂ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ಆ್ಯಪ್ ಬಳಸುವಾಗ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ಯಾವಾಗಲೂ"</string>
</resources>
diff --git a/PermissionController/res/values-kn/strings.xml b/PermissionController/res/values-kn/strings.xml
index 547116264..d55497042 100644
--- a/PermissionController/res/values-kn/strings.xml
+++ b/PermissionController/res/values-kn/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ಎಲ್ಲಾ ಅನುಮತಿಗಳು"</string>
<string name="other_permissions" msgid="2901186127193849594">"ಇತರ ಆ್ಯಪ್‌ ಸಾಮರ್ಥ್ಯಗಳು"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ಅನುಮತಿಯ ವಿನಂತಿ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ನಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್/ಅನ್ಇನ್‌ಸ್ಟಾಲ್ ಕ್ರಿಯೆಗಳು ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಆ್ಯಪ್‌ಗೆ ಪ್ರವೇಶಿಸಲು ಯಾವುದನ್ನು ಅನುಮತಿಸಬೇಕು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ಆ್ಯಪ್ ಅನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ. ಈ ಆ್ಯಪ್‌ಗೆ ಪ್ರವೇಶಿಸಲು ಯಾವುದನ್ನು ಅನುಮತಿಸಬೇಕು ಎಂಬುದನ್ನು ಆಯ್ಕೆಮಾಡಿ."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ರದ್ದುಮಾಡಿ"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ಆ್ಯಪ್‌ ಬಳಸದಿದ್ದರೆ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿ"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ಅನುಮತಿಗಳನ್ನು ತೆಗೆಯಿರಿ, ಸ್ಥಳ ಮುಕ್ತಗೊಳಿಸಿ"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ಬಳಸದಿದ್ದರೆ, ಆ್ಯಪ್‌ನ ಚಟುವಟಿಕೆಯನ್ನು ವಿರಾಮಗೊಳಿಸಿ"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ಬಳಸದಿದ್ದರೆ ಆ್ಯಪ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿ, ತಾತ್ಕಾಲಿಕ ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ ಹಾಗೂ ಅಧಿಸೂಚನೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಿ, ತಾತ್ಕಾಲಿಕ ಫೈಲ್‌ಗಳನ್ನು ಅಳಿಸಿ, ನೋಟಿಫಿಕೇಶನ್‌ಗಳನ್ನು ನಿಲ್ಲಿಸಿ ಮತ್ತು ಆ್ಯಪ್ ಅನ್ನು ಆರ್ಕೈವ್ ಮಾಡಿ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ಆ್ಯಪ್ ಅನ್ನು ಕೆಲವು ತಿಂಗಳುಗಳ ಕಾಲ ಬಳಸದಿದ್ದರೆ, ನಿಮ್ಮ ಡೇಟಾವನ್ನು ರಕ್ಷಿಸಲು ಈ ಆ್ಯಪ್‌ನ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುವುದು."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ಆ್ಯಪ್ ಅನ್ನು ಕೆಲವು ತಿಂಗಳುಗಳ ಕಾಲ ಬಳಸದಿದ್ದರೆ, ನಿಮ್ಮ ಡೇಟಾವನ್ನು ರಕ್ಷಿಸಲು, ಈ ಕೆಳಗಿನ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗುವುದು: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ನಿಮ್ಮ ಡೇಟಾವನ್ನು ರಕ್ಷಿಸಲು, ಕೆಲವು ತಿಂಗಳುಗಳಿಂದ ನೀವು ಬಳಸದಿರುವ ಆ್ಯಪ್‌ಗಳಿಂದ ಅನುಮತಿಗಳನ್ನು ತೆಗೆದುಹಾಕಲಾಗಿದೆ."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"ಟಿಪ್ಪಣಿಗಳು ಆ್ಯಪ್"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಟಿಪ್ಪಣಿಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ನಿಮಗೆ ಅನುಮತಿಸುವ ಆ್ಯಪ್‌ಗಳು"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ಟಿಪ್ಪಣಿಗಳು"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ಡೀಫಾಲ್ಟ್ ವಾಲೆಟ್ ಆ್ಯಪ್"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet ಆ್ಯಪ್"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"ವಾಲೆಟ್ ಆ್ಯಪ್‌ಗಳು ನಿಮ್ಮ ಕ್ರೆಡಿಟ್ ಮತ್ತು ಲಾಯಲ್ಟಿ ಕಾರ್ಡ್‌ಗಳು, ಕಾರ್ ಕೀಗಳು ಮತ್ತು ವಿವಿಧ ವಹಿವಾಟುಗಳಿಗೆ ಸಹಾಯ ಮಾಡುವ ಇತರ ವಿಷಯಗಳನ್ನು ಸಂಗ್ರಹಿಸಬಹುದು."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಆ್ಯಪ್ ಅನ್ನು ನಿಮ್ಮ ಡೀಫಾಲ್ಟ್ ವಾಲೆಟ್ ಆ್ಯಪ್ ಆಗಿ ಸೆಟ್ ಮಾಡಬೇಕೆ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ಯಾವುದೇ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿಲ್ಲ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ಪ್ರಸ್ತುತ ಡೀಫಾಲ್ಟ್"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ಮತ್ತೆ ಕೇಳಬೇಡ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡಿ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ಡೇಟಾ ಹಂಚಿಕೆ ಅಪ್‌ಡೇಟ್‌ಗಳು"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"ಕೆಲವು ಆ್ಯಪ್‌ಗಳು, ನಿಮ್ಮ ಸ್ಥಳ ಡೇಟಾವನ್ನು ಅವು ಹಂಚಿಕೊಳ್ಳಬಹುದಾದ ವಿಧಾನವನ್ನು ಬದಲಾಯಿಸಿವೆ"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ನಿನ್ನೆ <xliff:g id="TIME_DATE">%1$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ಸಮಯಕ್ಕೆ ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ನಿಮ್ಮ ಒನ್‌-ಟೈಮ್ ಪಾಸ್‌ವರ್ಡ್ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ko-v34/strings.xml b/PermissionController/res/values-ko-v34/strings.xml
index 7b3091170..c8117979a 100644
--- a/PermissionController/res/values-ko-v34/strings.xml
+++ b/PermissionController/res/values-ko-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"위치 정보 액세스"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"앱 및 서비스에 적용됩니다. 설정이 꺼져 있어도 긴급 전화번호로 전화를 걸 때 마이크 데이터가 계속 공유될 수 있습니다."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"앱 및 서비스에 적용"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"제한된 설정"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"보안을 위해 이 설정은 현재 사용할 수 없습니다."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"자세히 알아보기"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ko-watch/strings.xml b/PermissionController/res/values-ko-watch/strings.xml
index fbe07c16c..89299a26f 100644
--- a/PermissionController/res/values-ko-watch/strings.xml
+++ b/PermissionController/res/values-ko-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"변경할 수 없음"</string>
<string name="generic_yes" msgid="2489207724988649846">"예"</string>
<string name="generic_cancel" msgid="2631708607129269698">"취소"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"항상"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"앱을 사용 중일 때"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"항상"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"앱을 사용 중일 때"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"항상"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"앱을 사용 중일 때"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"항상"</string>
</resources>
diff --git a/PermissionController/res/values-ko/strings.xml b/PermissionController/res/values-ko/strings.xml
index cc06d56d7..4db6dc626 100644
--- a/PermissionController/res/values-ko/strings.xml
+++ b/PermissionController/res/values-ko/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"모든 권한"</string>
<string name="other_permissions" msgid="2901186127193849594">"다른 앱 기능"</string>
<string name="permission_request_title" msgid="8790310151025020126">"권한 요청"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear에서는 설치/제거 작업이 지원되지 않습니다"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;에서 액세스하도록 허용할 항목 선택"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;이(가) 업데이트되었습니다. 이 앱에서 액세스하도록 허용할 항목을 선택하세요."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"취소"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"앱이 사용되지 않는 경우 권한 삭제"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"권한을 삭제하고 여유 공간 확보"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"사용하지 않을 때 앱 활동 일시중지"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"사용하지 않는 앱 관리"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"권한 제거, 임시 파일 삭제, 알림 중지"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"권한 제거, 임시 파일 삭제, 알림 중지, 앱 보관처리"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"데이터 보호를 위해 몇 개월 동안 앱을 사용하지 않으면 앱의 권한이 삭제됩니다."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"데이터 보호를 위해 몇 개월 동안 앱을 사용하지 않으면 다음 권한이 삭제됩니다. <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"데이터 보호를 위해 몇 개월 동안 사용하지 않은 앱에서 권한이 삭제되었습니다."</string>
@@ -351,7 +351,7 @@
<string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"이 앱이 내 화면, 작업, 입력 내용을 보고 작업을 실행하며 디스플레이를 제어할 수 있습니다."</string>
<string name="role_assistant_label" msgid="4727586018198208128">"기본 디지털 어시스턴트 앱"</string>
<string name="role_assistant_short_label" msgid="3369003713187703399">"디지털 어시스턴트 앱"</string>
- <string name="role_assistant_description" msgid="6622458130459922952">"지원 앱은 화면에 표시된 정보에 맞게 도움을 줄 수 있습니다. 일부 앱은 통합된 지원을 제공하기 위해 런처와 음성 입력 서비스를 모두 지원합니다."</string>
+ <string name="role_assistant_description" msgid="6622458130459922952">"지원 앱은 화면에 표시된 정보를 기반으로 도움을 줄 수 있습니다. 일부 앱은 통합된 지원을 제공하기 위해 런처와 음성 입력 서비스를 모두 지원합니다."</string>
<string name="role_browser_label" msgid="2877796144554070207">"기본 브라우저 앱"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"브라우저 앱"</string>
<string name="role_browser_description" msgid="3465253637499842671">"인터넷에 액세스하고 탭하는 링크를 표시하는 앱"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"메모 앱"</string>
<string name="role_notes_description" msgid="8496852798616883551">"이 기기에서 메모할 수 있게 해주는 앱"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"메모"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"기본 월렛 앱"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"월렛 앱"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"다양한 형태의 거래에 사용할 수 있도록 월렛 앱에 신용카드 및 포인트 카드, 자동차 키 등을 저장할 수 있습니다."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱을 기본 월렛 앱으로 설정하시겠습니까?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"권한 필요 없음"</string>
<string name="request_role_current_default" msgid="738722892438247184">"현재 기본 앱"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"다시 묻지 않음"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"기본 앱으로 설정"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"데이터 공유 업데이트"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"일부 앱에서 위치 데이터 공유 방법이 변경되었습니다."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"설정"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>에 액세스함"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"어제 <xliff:g id="TIME_DATE">%1$s</xliff:g>에 액세스함"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>에 액세스함"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"일회용 비밀번호는 132435입니다"</string>
</resources>
diff --git a/PermissionController/res/values-ky-v34/strings.xml b/PermissionController/res/values-ky-v34/strings.xml
index 15fc8424e..d6f815d3a 100644
--- a/PermissionController/res/values-ky-v34/strings.xml
+++ b/PermissionController/res/values-ky-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Жайгашкан жерди көрсөтүү"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Колдонмолор жана кызматтар үчүн. Бул параметр өчүп турса да, кырсыктаганда жардамга келчү кызматтын номерине чалганыңызда микрофондогу нерселер өткөрүлүшү мүмкүн."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Колдонмолор жана кызматтар үчүн"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Чектелген функция"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Коопсуздук максатында бул параметр азырынча иштебейт."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Кеңири маалымат"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ky-watch/strings.xml b/PermissionController/res/values-ky-watch/strings.xml
index d6ca47fc1..84b891bee 100644
--- a/PermissionController/res/values-ky-watch/strings.xml
+++ b/PermissionController/res/values-ky-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Өзгөртүүгө болбойт"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ооба"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Жок"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Ар дайым"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Колдонмону пайдаланууда"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Ар дайым"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Колдонмону пайдаланууда"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Ар дайым"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Колдонмону пайдаланууда"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Ар дайым"</string>
</resources>
diff --git a/PermissionController/res/values-ky/strings.xml b/PermissionController/res/values-ky/strings.xml
index 1f1ee13a1..7ef241ca5 100644
--- a/PermissionController/res/values-ky/strings.xml
+++ b/PermissionController/res/values-ky/strings.xml
@@ -48,7 +48,7 @@
<string name="deny_permission_deny_and_dont_ask_again" msgid="6106035221490102341">"Тыюу салам жана экинчи суралбасын"</string>
<string name="permission_revoked_count" msgid="4785082705441547086">"<xliff:g id="COUNT">%1$d</xliff:g> өчүрүлгөн"</string>
<string name="permission_revoked_all" msgid="3397649017727222283">"баары өчүрүлгөн"</string>
- <string name="permission_revoked_none" msgid="9213345075484381180">"эч бири өчүрүлгөн жок"</string>
+ <string name="permission_revoked_none" msgid="9213345075484381180">"эч бири өчкөн жок"</string>
<string name="grant_dialog_button_allow" msgid="5314677880021102550">"Уруксат берүү"</string>
<string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"Бардык учурда уруксат берилет"</string>
<string name="grant_dialog_button_allow_foreground" msgid="501896824973636533">"Колдонмо ачылып турганда"</string>
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Бардык уруксаттар"</string>
<string name="other_permissions" msgid="2901186127193849594">"Колдонмонун башка мүмкүнчүлүктөрү"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Уруксат суроо"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Орнотуу/чыгарып салуу аракеттери Android Wear\'де колдоого алынбайт."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; колдонмосу үчүн уруксаттарды тандаңыз"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; жаңырды. Ал үчүн уруксаттарды тандаңыз."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Жок"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Эгер колдонмо пайдаланылбаса, уруксаттар өчүрүлсүн"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Уруксаттарды өчүрүп, орун бошотуу"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Колдонулбаган колдонмолордун ишин тындыруу"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Колдонмо колдонулбаса, аны тескеңиз"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Уруксаттар өчүрүлүп, убактылуу файлдар тазаланып, билдирмелер келбей калат"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Уруксаттарды алып салып, убактылуу файлдарды жок кылып, билдирмелерди токтотуңуз жана колдонмону архивдеңиз"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Эгер колдонмо бир нече ай пайдаланылбаса, жеке маалыматтарыңызды коргоо үчүн бул колдонмого берилген уруксаттар өчүрүлөт."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Эгер колдонмо бир нече ай пайдаланылбаса, жеке дайын-даректериңизди коргоо максатында төмөнкү уруксаттар өчүрүлөт: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Жеке дайын-даректериңизди коргоо максатында, бир нече айдан бери ачылбаган колдонмолордогу уруксаттар өчүрүлдү."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Кыска жазуулар колдонмосу"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Түзмөгүңүздө кыска жазууларды терүү мүмкүнчүлүгүн берген колдонмолор"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"кыска жазуулар"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Демейки капчык колдонмосу"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Капчык колдонмосу"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Капчык колдонмосунда насыя жана туруктуу кардардын карталары, унаанын ачкычтары сыяктуу санарип нерселер сакталат. Алардын жардамы менен ар кандай транзакцияларды аткара аласыз."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> демейки капчык колдонмоңуз катары тууралансынбы?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Уруксаттардын кереги жок"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Учурдагы демейки колдонмо"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Экинчи суралбасын"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Демейки катары коюу"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Маалыматты бөлүшүү жаңыртуулары"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Айрым колдонмолор турган жериңизди билдирүү ыкмасын өзгөрттү"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Параметрлер"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Cаат <xliff:g id="TIME_DATE">%1$s</xliff:g> колдонулду"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Кечээ саат <xliff:g id="TIME_DATE">%1$s</xliff:g> колдонулду"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> саат <xliff:g id="TIME_DATE_1">%2$s</xliff:g> колдонулду"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Бир жолу гана колдонулуучу кодуңуз: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-lo-v34/strings.xml b/PermissionController/res/values-lo-v34/strings.xml
index 431b80ec1..a949ef8c8 100644
--- a/PermissionController/res/values-lo-v34/strings.xml
+++ b/PermissionController/res/values-lo-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ສິດເຂົ້າເຖິງສະຖານທີ່"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ສຳລັບແອັບ ແລະ ບໍລິການຕ່າງໆ. ຫາກປິດການຕັ້ງຄ່ານີ້ໄວ້, ຂໍ້ມູນໄມໂຄຣໂຟນອາດຍັງຖືກແບ່ງປັນເມື່ອທ່ານໂທຫາເບີໂທສຸກເສີນ"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ສຳລັບແອັບ ແລະ ບໍລິການຕ່າງໆ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ການຕັ້ງຄ່າທີ່ຈຳກັດ"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ການຕັ້ງຄ່ານີ້ຈຶ່ງບໍ່ສາມາດໃຊ້ໄດ້ໃນຕອນນີ້."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ສຶກສາເພີ່ມເຕີມ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-lo-watch/strings.xml b/PermissionController/res/values-lo-watch/strings.xml
index f0c39134f..bc1fbad9f 100644
--- a/PermissionController/res/values-lo-watch/strings.xml
+++ b/PermissionController/res/values-lo-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ບໍ່ສາມາດປ່ຽນແປງໄດ້"</string>
<string name="generic_yes" msgid="2489207724988649846">"ໄປ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ຍົກເລີກ"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ຕະຫຼອດເວລາ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ໃນເວລາໃຊ້ແອັບ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ຕະຫຼອດເວລາ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ໃນເວລາໃຊ້ແອັບ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ຕະຫຼອດເວລາ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ໃນເວລາໃຊ້ແອັບ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ຕະຫຼອດເວລາ"</string>
</resources>
diff --git a/PermissionController/res/values-lo/strings.xml b/PermissionController/res/values-lo/strings.xml
index b78db29c8..295521254 100644
--- a/PermissionController/res/values-lo/strings.xml
+++ b/PermissionController/res/values-lo/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ທຸກການອະນຸຍາດ"</string>
<string name="other_permissions" msgid="2901186127193849594">"ຄວາມສາມາດອື່ນຂອງແອັບ"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ການຮ້ອງຂໍການອະນຸຍາດ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ຕິດຕັ້ງ/ຖອນການຕິດຕັ້ງ ຄຳສັ່ງທີ່ບໍ່ຮອງຮັບຢູ່ Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"ເລືອກວ່າຈະອະນຸຍາດໃຫ້ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ເຂົ້າເຖິງຫຍັງໄດ້ແດ່"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"ອັບເດດ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ແລ້ວ. ກະລຸນາເລືອກວ່າຈະໃຫ້ແອັບນີ້ເຂົ້າເຖິງຫຍັງໄດ້ແດ່."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ຍົກເລີກ"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ລຶບສິດອະນຸຍາດຫາກບໍ່ໄດ້ໃຊ້ແອັບ"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ລຶບການອະນຸຍາດອອກ ແລະ ສ້າງພື້ນທີ່ຫວ່າງ"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ຢຸດການເຄື່ອນໄຫວແອັບຊົ່ວຄາວຫາກບໍ່ໄດ້ໃຊ້"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ຈັດການແອັບຫາກບໍ່ໄດ້ໃຊ້"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ລຶບການອະນຸຍາດອອກ, ລຶບໄຟລ໌ຊົ່ວຄາວ ແລະ ຢຸດການແຈ້ງເຕືອນ"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ລຶບການອະນຸຍາດອອກ, ລຶບໄຟລ໌ຊົ່ວຄາວ, ຢຸດການແຈ້ງເຕືອນ ແລະ ເກັບແອັບໄວ້ໃນແຟ້ມ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ເພື່ອປົກປ້ອງຂໍ້ມູນຂອງທ່ານ, ສິດອະນຸຍາດສຳລັບແອັບນີ້ຈະຖືກລຶບອອກຫາກບໍ່ໄດ້ໃຊ້ແອັບສອງສາມເດືອນ."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ເພື່ອປົກປ້ອງຂໍ້ມູນຂອງທ່ານ, ຫາກບໍ່ໄດ້ໃຊ້ແອັບສອງສາມເດືອນ, ສິດອະນຸຍາດຕໍ່ໄປນີ້ຈະຖືກລຶບອອກ: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ເພື່ອປົກປ້ອງຂໍ້ມູນຂອງທ່ານ, ລະບົບໄດ້ລຶບສິດອະນຸຍາດອອກຈາກແອັບຕ່າງໆທີ່ທ່ານບໍ່ໄດ້ໃຊ້ສອງສາມເດືອນແລ້ວ."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"ແອັບຂຽນບັນທຶກ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ແອັບທີ່ອະນຸຍາດໃຫ້ທ່ານຈົດບັນທຶກຢູ່ອຸປະກອນຂອງທ່ານ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ບັນທຶກ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ແອັບ Wallet ເລີ່ມຕົ້ນ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"ແອັບ Wallet"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"ແອັບ Wallet ສາມາດຈັດເກັບບັດເຄຣດິດ ແລະ ບັດສະມາຊິກ, ກະແຈລົດ ແລະ ສິ່ງອື່ນໆຂອງທ່ານເພື່ອຊ່ວຍໃນການເຮັດທຸລະກຳຮູບແບບຕ່າງໆ."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"ຕັ້ງ <xliff:g id="APP_NAME">%1$s</xliff:g> ເປັນແອັບ Wallet ເລີ່ມຕົ້ນຂອງທ່ານບໍ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ບໍ່ຈຳເປັນຕ້ອງມີການອະນຸຍາດ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ຄ່າເລີ່ມຕົ້ນປັດຈຸບັນ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ບໍ່ຕ້ອງຖາມອີກ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ຕັ້ງເປັນຄ່າເລີ່ມຕົ້ນ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ການອັບເດດການແບ່ງປັນຂໍ້ມູນ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"ບາງແອັບໄດ້ປ່ຽນແປງວິທີທີ່ແອັບອາດແບ່ງປັນຂໍ້ມູນສະຖານທີ່ຂອງທ່ານແລ້ວ"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ການຕັ້ງຄ່າ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"ເຂົ້າເຖິງເມື່ອ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ເຂົ້າເຖິງມື້ວານນີ້ເມື່ອ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"ເຂົ້າເຖິງເມື່ອ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ລະຫັດຜ່ານແບບໃຊ້ໄດ້ເທື່ອດຽວຂອງທ່ານແມ່ນ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-lt-v34/strings.xml b/PermissionController/res/values-lt-v34/strings.xml
index f7a60d198..04e9cfe1b 100644
--- a/PermissionController/res/values-lt-v34/strings.xml
+++ b/PermissionController/res/values-lt-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Prieiga prie vietovės"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Programos ir paslaugos. Jei šis nustatymas išjungtas, mikrofono duomenys vis tiek gali būti bendrinami, skambinant pagalbos numeriu"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Programos ir paslaugos"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Apribotas nustatymas"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Šis nustatymas šiuo metu nepasiekiamas dėl jūsų saugumo."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Sužinokite daugiau"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-lt-watch/strings.xml b/PermissionController/res/values-lt-watch/strings.xml
index c852a6508..b875ee94e 100644
--- a/PermissionController/res/values-lt-watch/strings.xml
+++ b/PermissionController/res/values-lt-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Negalima pakeisti"</string>
<string name="generic_yes" msgid="2489207724988649846">"Taip"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Atšaukti"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Visą laiką"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Kai programa naudojama"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Visą laiką"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Kai programa naudojama"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Visą laiką"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Kai programa naudojama"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Visą laiką"</string>
</resources>
diff --git a/PermissionController/res/values-lt/strings.xml b/PermissionController/res/values-lt/strings.xml
index d7fbc6af8..3c2c37db8 100644
--- a/PermissionController/res/values-lt/strings.xml
+++ b/PermissionController/res/values-lt/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Visi leidimai"</string>
<string name="other_permissions" msgid="2901186127193849594">"Kitos programos galimybės"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Leidimo užklausa"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Diegimo / pašalinimo veiksmai nepalaikomi sistemoje „Wear“."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Pasirinkite, ką norite leisti programai &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; pasiekti"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Programa &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; buvo atnaujinta. Pasirinkite, ką norite leisti šiai programai pasiekti."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Atšaukti"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Pašalinti leidimus, jei programa nenaudojama"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Pašalinti leidimus ir atlaisvinti vietos"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pristabdyti nenaudojamų programų veiklą"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Tvarkyti programą, jei nenaudojama"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Pašalinkite leidimus, ištrinkite laikinus failus ir sustabdykite pranešimus"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Pašalinti leidimus, ištrinti laikinus failus, sustabdyti pranešimus ir archyvuoti programą"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Siekiant apsaugoti duomenis, šios programos leidimai bus pašalinti, jei programos nenaudosite kelis mėnesius."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Siekiant apsaugoti duomenis, jei programos nenaudosite kelis mėnesius, bus pašalinti nurodyti leidimai: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Siekiant apsaugoti duomenis, leidimai buvo pašalinti iš programų, kurių nenaudojote kelis mėnesius"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Užrašų programa"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Programos, leidžiančios rašyti užrašus jūsų įrenginyje"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"užrašai"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Numatytoji piniginės programa"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Piniginės programa"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Piniginės programos gali saugoti jūsų kredito ir lojalumo kortelių, automobilių raktų ir kitus duomenis, kad lengviau atliktumėte įvairias operacijas."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Nustatyti „<xliff:g id="APP_NAME">%1$s</xliff:g>“ kaip numatytąją piniginės programą?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nereikia jokių leidimų"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Dabartinė numatytoji"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Daugiau neklausti"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Nustatyti numatytąja"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Duomenų bendrinimo naujiniai"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Kai kuriose programose pakeisti vietovės duomenų bendrinimo metodai"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Nustatymai"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Pasiekta <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Pasiekta vakar <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Pasiekta <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Jūsų vienkartinis slaptažodis yra 132435"</string>
</resources>
diff --git a/PermissionController/res/values-lv-v34/strings.xml b/PermissionController/res/values-lv-v34/strings.xml
index 3c99e3275..c87eb4b5a 100644
--- a/PermissionController/res/values-lv-v34/strings.xml
+++ b/PermissionController/res/values-lv-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Piekļuve atrašanās vietai"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Lietotnēm un pakalpojumiem. Ja šis iestatījums ir izslēgts, mikrofona dati joprojām var tikt kopīgoti, kad zvanīsiet uz ārkārtas numuru."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Lietotnēm un pakalpojumiem"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ierobežots iestatījums"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Drošības apsvērumu dēļ šis iestatījums pašlaik nav pieejams."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Uzzināt vairāk"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-lv-watch/strings.xml b/PermissionController/res/values-lv-watch/strings.xml
index 7ee4ab980..b3ca497f6 100644
--- a/PermissionController/res/values-lv-watch/strings.xml
+++ b/PermissionController/res/values-lv-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nevar mainīt"</string>
<string name="generic_yes" msgid="2489207724988649846">"Jā"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Atcelt"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Vienmēr"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Izmantojot lietotni"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Vienmēr"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Izmantojot lietotni"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Vienmēr"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Izmantojot lietotni"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Vienmēr"</string>
</resources>
diff --git a/PermissionController/res/values-lv/strings.xml b/PermissionController/res/values-lv/strings.xml
index 10b79f45d..05dc0ec59 100644
--- a/PermissionController/res/values-lv/strings.xml
+++ b/PermissionController/res/values-lv/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Visas atļaujas"</string>
<string name="other_permissions" msgid="2901186127193849594">"Citas lietotnes atļaujas"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Atļaujas pieprasījums"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ierīcē netiek atbalstīta instalēšana/atinstalēšana"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Izvēlieties, kādas piekļuves atļaujas piešķirt lietotnei &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Lietotne &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ir atjaunināta. Izvēlieties, kādas piekļuves atļaujas tai piešķirt."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Atcelt"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Noņemt atļaujas, ja lietotne netiek izmantota"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Noņemt atļaujas un atbrīvot vietu"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Apturēt lietotni, ja tā netiek izmantota"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Pārvaldīt lietotni, ja tā netiek lietota"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Atsaukt atļaujas, dzēst pagaidu failus un izslēgt paziņojumus"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Noņemt atļaujas, dzēst pagaidu failus, apturēt paziņojumus un arhivēt lietotni"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Ja lietotni dažus mēnešus neizmantosiet, tai tiks noņemtas tālāk norādītās atļaujas, lai aizsargātu jūsu datus."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ja lietotni dažus mēnešus neizmantosiet, tai tiks noņemtas tālāk norādītās atļaujas, lai aizsargātu jūsu datus: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Lai aizsargātu jūsu datus, tika atsauktas atļaujas tām lietotnēm, kas nav izmantotas vairākus mēnešus."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Piezīmju lietotne"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Lietotnes, kas ļauj ierīcē veikt piezīmes"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"piezīmes"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Noklusējuma maka lietotne"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Maka lietotne"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Maka lietotnēs var glabāt informāciju par kredītkartēm un lojalitātes kartēm, automašīnas šifratslēgas un citu informāciju, kas palīdz veikt dažādu veidu darījumus."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Vai iestatīt lietotni <xliff:g id="APP_NAME">%1$s</xliff:g> kā noklusējuma maka lietotni?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nav nepieciešamas nekādas atļaujas."</string>
<string name="request_role_current_default" msgid="738722892438247184">"Pašreizējais noklusējums"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Nejautāt atkārtoti"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Iest. kā noklusējumu"</string>
@@ -648,4 +653,9 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Datu kopīgošanas atjauninājumi"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Dažās lietotnēs tika mainīti atrašanās vietas datu kopīgošanas veidi."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Iestatījumi"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Pēdējā piekļuves reize: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Pēdējā piekļuves reize vakar: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Pēdējā piekļuves reize: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <!-- no translation found for test_otp_msg (7559110574222727550) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-mk-v34/strings.xml b/PermissionController/res/values-mk-v34/strings.xml
index e8f9afc25..875b6dbe9 100644
--- a/PermissionController/res/values-mk-v34/strings.xml
+++ b/PermissionController/res/values-mk-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Пристап до локацијата"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"За апликации и услуги. Ако поставкава е исклучена, податоците од микрофонот може сепак да се споделат кога ќе се јавите на број за итни случаи"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"За апликации и услуги"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ограничена поставка"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"За ваша безбедност, поставкава е недостапна во моментов."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Дознајте повеќе"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-mk-watch/strings.xml b/PermissionController/res/values-mk-watch/strings.xml
index 5d37a6175..9b39c1ce1 100644
--- a/PermissionController/res/values-mk-watch/strings.xml
+++ b/PermissionController/res/values-mk-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Не може да се смени"</string>
<string name="generic_yes" msgid="2489207724988649846">"Да"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Откажи"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Цело време"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"При користење на аплик."</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Цело време"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"При користење на аплик."</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Цело време"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"При користење на аплик."</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Цело време"</string>
</resources>
diff --git a/PermissionController/res/values-mk/strings.xml b/PermissionController/res/values-mk/strings.xml
index 3270a4ea6..86b363f0e 100644
--- a/PermissionController/res/values-mk/strings.xml
+++ b/PermissionController/res/values-mk/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Сите дозволи"</string>
<string name="other_permissions" msgid="2901186127193849594">"Други можности на апликацијата"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Барање за дозвола"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Дејствата „Инсталирај/деинсталирај“ не се поддржани на Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Изберете до што може да пристапува &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; е ажурирана. Изберете до што може да пристапува апликацијава."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Откажи"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Отстрани ги дозволите ако апликацијата не се користи"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Отстранувај дозволи и ослободувај простор"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Паузирај некористени апликации"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Управување со апликацијата при некористење"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Отстранува дозволи, брише привремени датотеки и запира известувања"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Отстранува дозволи, брише привремени датотеки, сопира известувања и ја архивира апликацијата"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"За да се заштитат вашите податоци, дозволите за апликацијава ќе се отстранат ако апликацијата не се користи неколку месеци."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ако апликацијата не се користи неколку месеци, заради заштита на податоците, ќе се отстранат следниве дозволи: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"За заштита на податоците, отстранети се дозволите од апликациите што не сте ги користеле неколку месеци."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Апликација за белешки"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Апликации што ви овозможуваат да запишувате белешки на вашиот уред"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"белешки"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Стандардна аплик. за паричник"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Апликација за Wallet"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Апликациите за паричник може да ги складираат кредитните и картичките за лојалност, клучевите за автомобилот, како и други работи за олеснување на различните форми на трансакции."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Да се постави <xliff:g id="APP_NAME">%1$s</xliff:g> како стандардна апликација за Wallet?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Не се потребни дозволи"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Стандардна апликација сега"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Не прашувај повторно"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Нека биде стандардна"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Промени во споделувањето податоци"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Некои апликации го сменија начинот на кој ја споделуваат вашата локација"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Поставки"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Пристапено: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Пристапено вчера: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Пристапено: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Вашата еднократна лозинка е 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ml-v34/strings.xml b/PermissionController/res/values-ml-v34/strings.xml
index 7f22bbf9c..d0963a0cf 100644
--- a/PermissionController/res/values-ml-v34/strings.xml
+++ b/PermissionController/res/values-ml-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ലൊക്കേഷൻ ആക്‌സസ്"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ആപ്പുകൾക്കും സേവനങ്ങൾക്കും. ഈ ക്രമീകരണം ഓഫാണെങ്കിൽ, നിങ്ങൾ അടിയന്തര നമ്പറിൽ വിളിക്കുമ്പോഴും മൈക്രോഫോൺ ഡാറ്റ തുടർന്നും പങ്കിട്ടേക്കാം"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ആപ്പുകൾക്കും സേവനങ്ങൾക്കും"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"നിയന്ത്രിത ക്രമീകരണം"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഈ ക്രമീകരണം നിലവിൽ ലഭ്യമല്ല."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"കൂടുതലറിയുക"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ml-watch/strings.xml b/PermissionController/res/values-ml-watch/strings.xml
index 37ef4e919..2851731c9 100644
--- a/PermissionController/res/values-ml-watch/strings.xml
+++ b/PermissionController/res/values-ml-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"മാറ്റാനാവില്ല"</string>
<string name="generic_yes" msgid="2489207724988649846">"അതെ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"റദ്ദാക്കുക"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"എപ്പോഴും"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ആപ്പ് ഉപയോഗിക്കുമ്പോൾ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"എപ്പോഴും"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ആപ്പ് ഉപയോഗിക്കുമ്പോൾ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"എപ്പോഴും"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ആപ്പ് ഉപയോഗിക്കുമ്പോൾ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"എപ്പോഴും"</string>
</resources>
diff --git a/PermissionController/res/values-ml/strings.xml b/PermissionController/res/values-ml/strings.xml
index 2403dc6d3..e999c6741 100644
--- a/PermissionController/res/values-ml/strings.xml
+++ b/PermissionController/res/values-ml/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"എല്ലാ അനുമതികളും"</string>
<string name="other_permissions" msgid="2901186127193849594">"മറ്റ് ആപ്പ് ശേഷികൾ"</string>
<string name="permission_request_title" msgid="8790310151025020126">"അനുമതി അഭ്യർത്ഥന"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ഇൻസ്‌റ്റാൾ/അൺഇൻസ്‌റ്റാൾ ചെയ്യുന്നതിന് Wear-ൽ പിന്തുണയില്ല."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"എന്തൊക്കെ ആക്‌സസ് ചെയ്യാനാണ് &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ആപ്പിനെ അനുവദിക്കേണ്ടതെന്ന് തിരഞ്ഞെടുക്കുക"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; അപ്‌ഡേറ്റ് ചെയ്‌തിരിക്കുന്നു. എന്തൊക്കെ ആക്‌സസ് ചെയ്യാൻ ഈ ആപ്പിനെ അനുവദിക്കണമെന്ന് തിരഞ്ഞെടുക്കുക."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"റദ്ദാക്കുക"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ഉപയോഗിക്കാത്ത ആപ്പാണെങ്കിൽ അനുമതികൾ നീക്കം ചെയ്യുക"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"അനുമതികൾ നീക്കം ചെയ്‌ത് ഇടം സൃഷ്‌ടിക്കുക"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ഉപയോഗിച്ചിട്ടില്ലെങ്കിൽ ആപ്പ് ആക്റ്റിവിറ്റി പോസ് ചെയ്യുക"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ഉപയോഗിക്കാത്തപ്പോൾ ആപ്പ് മാനേജ് ചെയ്യൂ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"അനുമതികൾ നീക്കം ചെയ്യുക, താൽക്കാലിക ഫയലുകൾ ഇല്ലാതാക്കുക, അറിയിപ്പുകൾ നിർത്തുക"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"അനുമതികൾ നീക്കം ചെയ്യുക, താൽക്കാലിക ഫയലുകൾ ഇല്ലാതാക്കുക, അറിയിപ്പുകൾ നിർത്തുക, ആപ്പ് ആർക്കൈവ് ചെയ്യുക"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"മാസങ്ങളായി ഈ ആപ്പ് ഉപയോഗിക്കുന്നില്ലെങ്കിൽ നിങ്ങളുടെ ഡാറ്റ സംരക്ഷിക്കുന്നതിന്, ഈ ആപ്പിനുള്ള അനുമതികൾ നീക്കം ചെയ്യുന്നതായിരിക്കും."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"കുറച്ച് മാസം ആപ്പ് ഉപയോഗിച്ചില്ലെങ്കിൽ, നിങ്ങളുടെ ഡാറ്റ സംരക്ഷിക്കുന്നതിന്, ഇനിപ്പറയുന്ന അനുമതികൾ നീക്കം ചെയ്യുന്നതായിരിക്കും: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"നിങ്ങളുടെ ഡാറ്റ സംരക്ഷിക്കുന്നതിന്, കുറച്ച് മാസങ്ങളായി ഉപയോഗിക്കാത്ത ആപ്പുകളിൽ നിന്ന് അനുമതികൾ നീക്കം ചെയ്തിരിക്കുന്നു."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"കുറിപ്പ് ആപ്പ്"</string>
<string name="role_notes_description" msgid="8496852798616883551">"നിങ്ങളുടെ ഉപകരണത്തിൽ കുറിപ്പുകൾ രേഖപ്പെടുത്താൻ അനുവദിക്കുന്ന ആപ്പുകൾ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"കുറിപ്പുകൾ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ഡിഫോൾട്ട് വാലറ്റ് ആപ്പ്"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet ആപ്പ്"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"വ്യത്യസ്ത തരത്തിലുള്ള ഇടപാടുകളിൽ സഹായിക്കുന്നതിന് Wallet ആപ്പുകൾക്ക് നിങ്ങളുടെ ക്രെഡിറ്റ്, ലോയൽറ്റി കാർഡുകൾ, കാർ കീകൾ, മറ്റ് ഇനങ്ങൾ എന്നിവ സംഭരിക്കാൻ കഴിയും."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>, നിങ്ങളുടെ ഡിഫോൾട്ട് വാലറ്റ് ആപ്പ് ആക്കി സജ്ജീകരിക്കണോ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"അനുമതികളൊന്നും ആവശ്യമില്ല"</string>
<string name="request_role_current_default" msgid="738722892438247184">"നിലവിലെ ഡിഫോൾട്ട്"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"വീണ്ടും ആവശ്യപ്പെടരുത്"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ഡിഫോൾട്ടായി സജ്ജമാക്കൂ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ഡാറ്റ പങ്കിടുന്നത് സംബന്ധിച്ച അപ്‌ഡേറ്റുകൾ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"നിങ്ങളുടെ ലൊക്കേഷൻ ഡാറ്റ പങ്കിടുന്ന രീതി ചില ആപ്പുകൾ മാറ്റി"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ക്രമീകരണം"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ഇന്നലെ <xliff:g id="TIME_DATE">%1$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>-ന് ആക്‌സസ് ചെയ്തു"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"നിങ്ങളുടെ ഒറ്റത്തവണ പാസ്‌വേഡ് 132435 ആണ്"</string>
</resources>
diff --git a/PermissionController/res/values-mn-v34/strings.xml b/PermissionController/res/values-mn-v34/strings.xml
index fc5ac1818..92b260ee8 100644
--- a/PermissionController/res/values-mn-v34/strings.xml
+++ b/PermissionController/res/values-mn-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Байршлын хандалт"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Апп болон үйлчилгээнүүдэд. Энэ тохиргоо унтраалттай тохиолдолд таныг яаралтай тусламжийн утасны дугаар луу залгах үед микрофоны өгөгдлийг хуваалцсан хэвээр байж магадгүй"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Апп болон үйлчилгээнүүдэд"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Хязгаарлагдсан тохиргоо"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Таны аюулгүй байдлын үүднээс энэ тохиргоо одоогоор боломжгүй байна."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Нэмэлт мэдээлэл авах"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-mn-watch/strings.xml b/PermissionController/res/values-mn-watch/strings.xml
index 689766eda..cf4bdf502 100644
--- a/PermissionController/res/values-mn-watch/strings.xml
+++ b/PermissionController/res/values-mn-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Өөрчлөх боломжгүй"</string>
<string name="generic_yes" msgid="2489207724988649846">"Тийм"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Цуцлах"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Үргэлж"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Аппыг ашиглаж байх үед"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Үргэлж"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Аппыг ашиглаж байх үед"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Үргэлж"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Аппыг ашиглаж байх үед"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Үргэлж"</string>
</resources>
diff --git a/PermissionController/res/values-mn/strings.xml b/PermissionController/res/values-mn/strings.xml
index 8896ef931..1bf776db9 100644
--- a/PermissionController/res/values-mn/strings.xml
+++ b/PermissionController/res/values-mn/strings.xml
@@ -28,7 +28,7 @@
<string name="uninstall_or_disable" msgid="4496612999740858933">"Устгах эсвэл идэвхгүй болгох"</string>
<string name="app_not_found_dlg_title" msgid="6029482906093859756">"Апп олдсонгүй"</string>
<string name="grant_dialog_button_deny" msgid="88262611492697192">"Бүү зөвшөөр"</string>
- <string name="grant_dialog_button_deny_and_dont_ask_again" msgid="1748925431574312595">"Бүү зөвшөөрч, дахин битгий асуу"</string>
+ <string name="grant_dialog_button_deny_and_dont_ask_again" msgid="1748925431574312595">"Бүү зөвшөөр, дахин бүү асуу"</string>
<string name="grant_dialog_button_no_upgrade" msgid="8344732743633736625">"\"Аппыг ашиглаж байх үед\" хэвээр үлдээх"</string>
<string name="grant_dialog_button_no_upgrade_one_time" msgid="5125892775684968694">"“Зөвхөн энэ удаад зөвшөөрөх”-г хэвээр хадгалах"</string>
<string name="grant_dialog_button_more_info" msgid="213350268561945193">"Дэлгэрэнгүй мэдээлэл"</string>
@@ -45,7 +45,7 @@
<string name="permission_add_background_warning_template" msgid="1812914855915092273">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-д <xliff:g id="ACTION">%2$s</xliff:g>-г тогтмол зөвшөөрөх үү?"</string>
<string name="allow_permission_foreground_only" msgid="116465816039675404">"Зөвхөн апп ашиглах үед"</string>
<string name="allow_permission_always" msgid="5194342531206054051">"Тогтмол"</string>
- <string name="deny_permission_deny_and_dont_ask_again" msgid="6106035221490102341">"Бүү зөвшөөрч, дахин битгий асуу"</string>
+ <string name="deny_permission_deny_and_dont_ask_again" msgid="6106035221490102341">"Бүү зөвшөөр, дахин бүү асуу"</string>
<string name="permission_revoked_count" msgid="4785082705441547086">"<xliff:g id="COUNT">%1$d</xliff:g>-г цуцалсан"</string>
<string name="permission_revoked_all" msgid="3397649017727222283">"бүгдийг цуцалсан"</string>
<string name="permission_revoked_none" msgid="9213345075484381180">"алийг нь ч цуцлаагүй"</string>
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Бүх зөвшөөрөл"</string>
<string name="other_permissions" msgid="2901186127193849594">"Аппын бусад чадамж"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Зөвшөөрлийн хүсэлт"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Андройд Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear-д суулгах/устгах үйлдлийг дэмждэггүй."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-н хандаж болох зүйлсийг сонгоно уу"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;-г шинэчилсэн. Энэ аппын хандаж болох зүйлсийг сонгоно уу."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Цуцлах"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Аппыг ашигладаггүй бол зөвшөөрлийг нь хасах"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Зөвшөөрлийг хасаж, сул зай гаргах"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Ашиглаагүй бол аппын үйл ажиллагааг түр зогсоох"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Хэрэв ашиглаагүй бол аппыг удирдах"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Зөвшөөрлийг хасаж, түр зуурын файлыг устгаж мөн мэдэгдлийг зогсооно"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Зөвшөөрлийг хасаж, түр зуурын файлыг устгаж, мэдэгдлийг зогсоож мөн аппыг архивлана"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Таны өгөгдлийг хамгаалах үүднээс энэ аппыг хэдэн сарын турш ашиглахгүй бол зөвшөөрлийг нь хасах болно."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Таны өгөгдлийг хамгаалах үүднээс аппыг хэдэн сарын турш ашиглахгүй бол дараах зөвшөөрлүүдийг хасах болно: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Таны өгөгдлийг хамгаалах үүднээс таны хэдэн сарын турш ашиглаагүй аппуудын зөвшөөрлийг нь хассан."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Тэмдэглэлийн апп"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Таныг төхөөрөмж дээрээ тэмдэглэл хөтлөх боломж олгодог аппууд"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"тэмдэглэл"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Өгөгдмөл түрийвчийн апп"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Түрийвчийн апп"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Төрөл бүрийн гүйлгээнд туслахын тулд түрийвчийн аппууд таны кредит ба лояалти карт, машины түлхүүр болон бусад зүйлийг хадгалах боломжтой."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г таны өгөгдмөл түрийвчийн аппаар тохируулах уу?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Ямар ч зөвшөөрөл шаардлагагүй"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Одоогийн өгөгдмөл апп"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Дахиж бүү асуу"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Өгөгдмөлөөр тохируулах"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Өгөгдөл хуваалцах тухай шинэчлэлт"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Зарим апп таны байршлын өгөгдлийг хуваалцдаг аргаа өөрчилсөн"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Тохиргоо"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>-д хандсан"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Өчигдөр <xliff:g id="TIME_DATE">%1$s</xliff:g>-д хандсан"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>-д хандсан"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Таны нэг удаагийн нууц үг бол 132435"</string>
</resources>
diff --git a/PermissionController/res/values-mr-v34/strings.xml b/PermissionController/res/values-mr-v34/strings.xml
index 8c9152379..0b8fc665e 100644
--- a/PermissionController/res/values-mr-v34/strings.xml
+++ b/PermissionController/res/values-mr-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"स्थान अ‍ॅक्सेस"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ॲप्स आणि सेवांसाठी. हे सेटिंग बंद असल्यास, तुम्ही आणीबाणी नंबरवर कॉल करता, तेव्हा मायक्रोफोन डेटा तरीही शेअर केला जाऊ शकतो"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ॲप्स आणि सेवांसाठी"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"प्रतिबंधित सेटिंग"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"तुमच्या सुरक्षेसाठी, हे सेटिंग सध्या उपलब्ध नाही."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"अधिक जाणून घ्या"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-mr-watch/strings.xml b/PermissionController/res/values-mr-watch/strings.xml
index 474ea9d82..77d7ee44a 100644
--- a/PermissionController/res/values-mr-watch/strings.xml
+++ b/PermissionController/res/values-mr-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"बदलू शकत नाही"</string>
<string name="generic_yes" msgid="2489207724988649846">"होय"</string>
<string name="generic_cancel" msgid="2631708607129269698">"रद्द करा"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"पूर्ण वेळ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"अ‍ॅप वापरताना"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"पूर्ण वेळ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"अ‍ॅप वापरताना"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"पूर्ण वेळ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"अ‍ॅप वापरताना"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"पूर्ण वेळ"</string>
</resources>
diff --git a/PermissionController/res/values-mr/strings.xml b/PermissionController/res/values-mr/strings.xml
index f8757e5cf..0b94cda04 100644
--- a/PermissionController/res/values-mr/strings.xml
+++ b/PermissionController/res/values-mr/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"सर्व परवानग्या"</string>
<string name="other_permissions" msgid="2901186127193849594">"अन्य अ‍ॅप क्षमता"</string>
<string name="permission_request_title" msgid="8790310151025020126">"परवानगीची विनंती"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"इंस्टॉल करा/अनइंस्टॉल करा क्रिया Wear वर सपोर्ट करत नाहीत."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ला काय अ‍ॅक्सेस करण्‍याची परवानगी द्यावी ते निवडा"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; अपडेट केले गेले आहे. या ॲपला काय अ‍ॅक्सेस करण्‍याची परवानगी द्यावी ते निवडा."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"रद्द करा"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"अ‍ॅप वापरले नसल्यास, परवानग्या काढून टाका"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"परवानग्या काढा आणि जागा मोकळी करा"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"न वापरल्यास अ‍ॅप अ‍ॅक्टिव्हिटी थांबवा"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"वापरले नसल्यास ॲप व्यवस्थापित करा"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"परवानग्या काढून टाका, तात्पुरत्या फाइल हटवा आणि सूचना थांबवा"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"परवानग्या काढून टाका, तात्पुरत्या फाइल हटवा, सूचना थांबवा आणि ॲप संग्रहित करा"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"तुमच्या डेटाचे संरक्षण करण्यासाठी, अ‍ॅप काही महिन्यांत वापरले गेले नसल्यास, या अ‍ॅपच्या परवानग्या काढल्या जातील."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"तुमच्या डेटाचे संरक्षण करण्यासाठी, अ‍ॅप काही महिन्यांत वापरले गेले नसल्यास, पुढील परवानग्या काढल्या जातील: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"तुमच्या डेटाचे संरक्षण करण्यासाठी, तुम्ही काही महिन्यांत न वापरलेल्या ॲप्समधून परवानग्या काढल्या गेल्या आहेत."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"टिपांचे अ‍ॅप"</string>
<string name="role_notes_description" msgid="8496852798616883551">"तुमच्या डिव्हाइसवर तुम्हाला टिपा घेण्याची अनुमती देणारी अ‍ॅप्स"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"टिपा"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"डीफॉल्ट वॉलेट अ‍ॅप"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"वॉलेट अ‍ॅप"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"वॉलेट ॲप्स ही तुमची क्रेडिट आणि लॉयल्टी कार्ड, कार की व विविध प्रकारच्या व्यवहारांमध्ये मदत करण्यासाठी इतर गोष्टी स्टोअर करू शकतात."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> हे तुमचे डीफॉल्ट वॉलेट ॲप म्हणून सेट करायचे आहे का?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"कोणत्याही परवानगीची आवश्यकता नाही"</string>
<string name="request_role_current_default" msgid="738722892438247184">"सद्य डीफॉल्ट"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"पुन्हा विचारू नका"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"डीफॉल्ट सेट करा"</string>
@@ -581,7 +586,7 @@
<string name="recent_app_usage_1_qs" msgid="261450184773310741">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g>) द्वारे अलीकडे वापरले गेले"</string>
<string name="active_app_usage_2_qs" msgid="6107866785243565283">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) द्वारे वापरले जात आहे"</string>
<string name="recent_app_usage_2_qs" msgid="3591205954235694403">"<xliff:g id="APP_NAME">%1$s</xliff:g> (<xliff:g id="ATTRIBUTION_LABEL">%2$s</xliff:g> • <xliff:g id="PROXY_LABEL">%3$s</xliff:g>) द्वारे अलीकडे वापरले गेले"</string>
- <string name="media_confirm_dialog_positive_button" msgid="9020793594051526399">"कंफर्म करा"</string>
+ <string name="media_confirm_dialog_positive_button" msgid="9020793594051526399">"कन्फर्म करा"</string>
<string name="media_confirm_dialog_negative_button" msgid="226987376924861785">"मागे जा"</string>
<string name="media_confirm_dialog_title_a_to_p_aural_allow" msgid="8560601114044699903">"इतर फाइलच्या अ‍ॅक्सेसलादेखील अनुमती दिली जाईल"</string>
<string name="media_confirm_dialog_title_a_to_p_aural_deny" msgid="7841428716317307685">"इतर फाइलच्या अ‍ॅक्सेसलादेखील अनुमती दिली जाणार नाही"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"डेटा शेअरिंगचे अपडेट"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"काही अ‍ॅप्सनी तुमचा स्थान डेटा शेअर करण्याची त्यांची पद्धत बदलली"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"सेटिंग्ज"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> वाजता ॲक्सेस केले"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"काल <xliff:g id="TIME_DATE">%1$s</xliff:g> वाजता ॲक्सेस केले"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> ला <xliff:g id="TIME_DATE_1">%2$s</xliff:g> वाजता ॲक्सेस केले"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"तुमचा वन टाइम पासवर्ड १३२४३५ हा आहे"</string>
</resources>
diff --git a/PermissionController/res/values-ms-v34/strings.xml b/PermissionController/res/values-ms-v34/strings.xml
index 6fd21c7af..36de0c221 100644
--- a/PermissionController/res/values-ms-v34/strings.xml
+++ b/PermissionController/res/values-ms-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Akses lokasi"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Untuk apl dan perkhidmatan. Jika tetapan ini dimatikan, data mikrofon mungkin masih dikongsi apabila anda memanggil nombor kecemasan"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Untuk apl dan perkhidmatan"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Tetapan terhad"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Untuk keselamatan anda, tetapan ini tidak tersedia pada masa ini."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Ketahui lebih lanjut"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ms-watch/strings.xml b/PermissionController/res/values-ms-watch/strings.xml
index f762231d0..9791f6df8 100644
--- a/PermissionController/res/values-ms-watch/strings.xml
+++ b/PermissionController/res/values-ms-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Tidak dpt diubah"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ya"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Batal"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Sepanjang masa"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Semasa menggunakan apl"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Sepanjang masa"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Semasa menggunakan apl"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Sepanjang masa"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Semasa menggunakan apl"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Sepanjang masa"</string>
</resources>
diff --git a/PermissionController/res/values-ms/strings.xml b/PermissionController/res/values-ms/strings.xml
index a2e48b2bd..a0e35e291 100644
--- a/PermissionController/res/values-ms/strings.xml
+++ b/PermissionController/res/values-ms/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Semua kebenaran"</string>
<string name="other_permissions" msgid="2901186127193849594">"Keupayaan apl lain"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Permintaan kebenaran"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Tindakan pasang/nyahpasang tidak disokong pada Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Pilih perkara yang boleh diakses oleh &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; telah dikemas kini. Pilih perkara yang boleh diakses oleh apl ini."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Batal"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Alih keluar kebenaran jika apl tidak digunakan"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Alih keluar kebenaran dan kosongkan ruang"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Jeda aktiviti apl jika tidak digunakan"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Urus apl jika tidak digunakan"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Alih keluar kebenaran, padamkan fail sementara dan hentikan pemberitahuan"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Alih keluar kebenaran, padamkan fail sementara, hentikan pemberitahuan dan arkibkan apl tersebut"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Untuk melindungi data anda, kebenaran apl ini akan dialih keluar jika apl tidak digunakan selama beberapa bulan."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Untuk melindungi data anda, jika apl tidak digunakan selama beberapa bulan, kebenaran berikut akan dialih keluar: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Untuk melindungi data anda, kebenaran telah dialih keluar daripada apl yang tidak anda gunakan selama beberapa bulan."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Apl nota"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apl yang membolehkan anda mengambil nota pada peranti anda"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"nota"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Apl dompet lalai"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Apl dompet"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Apl dompet boleh menyimpan kad kredit dan kesetiaan anda, kunci kereta dan perkara lain untuk membantu pelbagai bentuk transaksi."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Tetapkan <xliff:g id="APP_NAME">%1$s</xliff:g> sebagai apl dompet lalai anda?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Kebenaran tidak diperlukan"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Lalai semasa"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Jangan tanya lagi"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Tetapkan sbg lalai"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Kemaskinian perkongsian data"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Sesetengah apl mengubah cara apl itu boleh berkongsi data lokasi anda"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Tetapan"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Diakses <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Diakses semalam <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Diakses <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Kata laluan sekali guna anda ialah 132435"</string>
</resources>
diff --git a/PermissionController/res/values-my-v34/strings.xml b/PermissionController/res/values-my-v34/strings.xml
index 4d4e03401..3063f7b22 100644
--- a/PermissionController/res/values-my-v34/strings.xml
+++ b/PermissionController/res/values-my-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"တည်နေရာသုံးခွင့်"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"အက်ပ်နှင့် ဝန်ဆောင်မှုများအတွက်။ ဤဆက်တင်ကို ပိတ်ထားသော်လည်း အရေးပေါ် နံပါတ်ကို သင်ခေါ်ဆိုချိန်တွင် မိုက်ခရိုဖုန်းဒေတာ မျှဝေနိုင်သေးသည်"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"အက်ပ်နှင့် ဝန်ဆောင်မှုများအတွက်"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ကန့်သတ်ထားသည့်ဆက်တင်"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"သင့်လုံခြုံရေးအတွက် ဤဆက်တင်ကို လောလောဆယ် မရနိုင်ပါ။"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ပိုမိုလေ့လာရန်"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-my-watch/strings.xml b/PermissionController/res/values-my-watch/strings.xml
index 6486ae7ff..cd9159fa6 100644
--- a/PermissionController/res/values-my-watch/strings.xml
+++ b/PermissionController/res/values-my-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ပြောင်းလဲ မရနိုင်ပါ"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yes"</string>
<string name="generic_cancel" msgid="2631708607129269698">"မလုပ်တော့"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"အချိန်တိုင်း"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"အက်ပ်ကို သုံးနေစဉ်"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"အချိန်တိုင်း"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"အက်ပ်ကို သုံးနေစဉ်"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"အချိန်တိုင်း"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"အက်ပ်ကို သုံးနေစဉ်"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"အချိန်တိုင်း"</string>
</resources>
diff --git a/PermissionController/res/values-my/strings.xml b/PermissionController/res/values-my/strings.xml
index cd68ad6e1..ea5968c3d 100644
--- a/PermissionController/res/values-my/strings.xml
+++ b/PermissionController/res/values-my/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ခွင့်ပြုချက် အားလုံး"</string>
<string name="other_permissions" msgid="2901186127193849594">"အခြားအက်ပ်၏ စွမ်းရည်များ"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ခွင့်ပြုချက် တောင်းခံမှု"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear ပေါ်တွင် ထည့်သွင်းခြင်း/ဖြုတ်ခြင်းများကို ပံ့ပိုးမထားပါ။"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&amp;It;b7gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&amp;It;/b&gt; က အသုံးပြုခွင့်ရမည့် အရာတို့ကို ရွေးပါ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&amp;It;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&amp;It;/b&gt; ကို အပ်ဒိတ်လုပ်ပြီးပါပြီ။ ဤအက်ပ်က အသုံးပြုခွင့်ရမည့်အရာတို့ကို ရွေးပါ။"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"မလုပ်တော့"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"အက်ပ်ကိုအသုံးမပြုလျှင် ခွင့်ပြုချက်များ ဖယ်ရှားရန်"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ခွင့်ပြုချက်များဖယ်ရှားပြီး နေရာလွတ်ပြုလုပ်ရန်"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"အသုံးမပြုပါက အက်ပ်လုပ်ဆောင်ချက် ခဏရပ်ရန်"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"အသုံးမပြုပါက အက်ပ်ကို စီမံရန်"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ခွင့်ပြုချက် ဖယ်ရှားခြင်း၊ ယာယီဖိုင် ဖျက်ခြင်း၊ အကြောင်းကြားချက် ရပ်ခြင်း"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ခွင့်ပြုချက်များ ဖယ်ရှားခြင်း၊ ယာယီဖိုင်များ ဖျက်ခြင်း၊ အကြောင်းကြားချက်များ ရပ်ခြင်းနှင့် အက်ပ်သိမ်းခြင်းတို့ ပြုလုပ်နိုင်သည်"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"အက်ပ်ကို လအနည်းငယ် အသုံးမပြုပါက သင်၏ဒေတာကိုကာကွယ်ရန် ဤအက်ပ်အတွက် ခွင့်ပြုချက်များကို ဖယ်ရှားပါမည်။"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"အက်ပ်ကို လအနည်းငယ် အသုံးမပြုပါက သင်၏ဒေတာကိုကာကွယ်ရန် အောက်ပါခွင့်ပြုချက်များကို ဖယ်ရှားပါမည်- <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"သင်၏ဒေတာကိုကာကွယ်ရန် လအနည်းငယ်အတွင်း အသုံးမပြုသော အက်ပ်များမှ ခွင့်ပြုချက်များကို ဖယ်ရှားလိုက်သည်။"</string>
@@ -349,8 +349,8 @@
<string name="accessibility_service_dialog_title_multiple" msgid="5527879210683548175">"အများသုံးစွဲနိုင်မှုဆိုင်ရာ အက်ပ် <xliff:g id="NUM_SERVICES">%s</xliff:g> ခုက သင့်စက်ပစ္စည်းကို အပြည့်အဝ အသုံးပြုခွင့်ရှိသည်"</string>
<string name="accessibility_service_dialog_bottom_text_single" msgid="1128666197822205958">"<xliff:g id="SERVICE_NAME">%s</xliff:g> သည် သင်၏ မျက်နှာပြင်၊ လုပ်ဆောင်ချက်များ၊ ထည့်သွင်းမှုများကို ကြည့်နိုင်ပြီး လုပ်ဆောင်ချက်များကို ဆောင်ရွက်နိုင်သည့်အပြင် မျက်နှာပြင်သမှုကိုလည်း ထိန်းချုပ်နိုင်သည်။"</string>
<string name="accessibility_service_dialog_bottom_text_multiple" msgid="7009848932395519852">"ဤအက်ပ်များက သင်၏ မျက်နှာပြင်၊ လုပ်ဆောင်ချက်များ၊ ထည့်သွင်းမှုများကို ကြည့်နိုင်ပြီး လုပ်ဆောင်ချက်များကို ဆောင်ရွက်နိုင်သည့်အပြင် မျက်နှာပြင်ပြသမှုကိုလည်း ထိန်းချုပ်နိုင်သည်။"</string>
- <string name="role_assistant_label" msgid="4727586018198208128">"မူလဒစ်ဂျစ်တယ် Assistant အက်ပ်"</string>
- <string name="role_assistant_short_label" msgid="3369003713187703399">"ဒစ်ဂျစ်တယ် Assistant အက်ပ်"</string>
+ <string name="role_assistant_label" msgid="4727586018198208128">"မူရင်း ဒစ်ဂျစ်တယ်အထောက်အကူ အက်ပ်"</string>
+ <string name="role_assistant_short_label" msgid="3369003713187703399">"ဒစ်ဂျစ်တယ်အထောက်အကူ အက်ပ်"</string>
<string name="role_assistant_description" msgid="6622458130459922952">"အကူအညီအက်ပ်များသည် သင်ကြည့်နေသည့် မျက်နှာပြင်မှ အချက်အလက်ကို အခြေခံ၍ ပံ့ပိုးပေးနိုင်ပါသည်။ ဘက်စုံ အထောက်အကူပေးနိုင်ရန်အတွက် အချို့အက်ပ်များသည် စဖွင့်စနစ်နှင့် အသံဖြင့်ထည့်သွင်းဝန်ဆောင်မှု နှစ်ခုလုံးကို ပံ့ပိုးပါသည်။"</string>
<string name="role_browser_label" msgid="2877796144554070207">"မူရင်း ဘရောင်ဇာအက်ပ်"</string>
<string name="role_browser_short_label" msgid="6745009127123292296">"ဘရောင်ဇာ အက်ပ်"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"မှတ်စုရေးသောအက်ပ်"</string>
<string name="role_notes_description" msgid="8496852798616883551">"စက်ပစ္စည်းတွင် မှတ်စုရေးခွင့်ပြုသော အက်ပ်များ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"မှတ်စုများ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"မူရင်း Wallet အက်ပ်"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet အက်ပ်"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Wallet အက်ပ်များသည် ငွေလွှဲပြောင်းသည့် ဖောင်အမျိုးမျိုးနှင့်ပတ်သက်ပြီး ကူညီရန် သင်၏ခရက်ဒစ်ကတ်၊ ဖောက်သည်ကတ်များ၊ ကားသော့နှင့် အခြားအရာများကို သိမ်းနိုင်သည်။"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို သင်၏မူရင်း Wallet အက်ပ်အဖြစ် သတ်မှတ်မလား။"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ခွင့်ပြုချက် မလိုပါ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"လက်ရှိ မူရင်း"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ထပ်မမေးပါနှင့်"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"မူရင်း သတ်မှတ်ရန်"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ဒေတာမျှဝေခြင်း အပ်ဒိတ်"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"အက်ပ်အချို့သည် ၎င်းတို့က သင်၏ တည်နေရာဒေတာ မျှဝေနိုင်သော နည်းလမ်းကို ပြောင်းထားသည်"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ဆက်တင်များ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> တွင် ဝင်ကြည့်ထားသည်"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"မနေ့ <xliff:g id="TIME_DATE">%1$s</xliff:g> တွင် ဝင်ကြည့်ထားသည်"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g> တွင် ဝင်ကြည့်ထားသည်"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"သင့်တစ်ခါသုံး စကားဝှက်သည် 132435 ဖြစ်သည်"</string>
</resources>
diff --git a/PermissionController/res/values-nb-v34/strings.xml b/PermissionController/res/values-nb-v34/strings.xml
index a7bb456d5..0120b98b9 100644
--- a/PermissionController/res/values-nb-v34/strings.xml
+++ b/PermissionController/res/values-nb-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Posisjonstilgang"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"For apper og tjenester. Hvis denne innstillingen er av, kan mikrofondata fremdeles deles når du ringer et nødnummer"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"For apper og tjenester"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Begrenset innstilling"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Av hensyn til sikkerheten er denne innstillingen utilgjengelig for øyeblikket."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Finn ut mer"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-nb-watch/strings.xml b/PermissionController/res/values-nb-watch/strings.xml
index 3fc35f2c9..3a4f05c10 100644
--- a/PermissionController/res/values-nb-watch/strings.xml
+++ b/PermissionController/res/values-nb-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Kan ikke endres"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Avbryt"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Hele tiden"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Når appen er i bruk"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Hele tiden"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Når appen er i bruk"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Hele tiden"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Når appen er i bruk"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Hele tiden"</string>
</resources>
diff --git a/PermissionController/res/values-nb/strings.xml b/PermissionController/res/values-nb/strings.xml
index fc86eb79d..2681a4c84 100644
--- a/PermissionController/res/values-nb/strings.xml
+++ b/PermissionController/res/values-nb/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alle tillatelser"</string>
<string name="other_permissions" msgid="2901186127193849594">"Andre appfunksjoner"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Forespørsel om tillatelse"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Handlinger for å installere og avinstallere støttes ikke på Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Velg hva du vil gi <xliff:g id="APP_NAME">%1$s</xliff:g> tilgang til"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"<xliff:g id="APP_NAME">%1$s</xliff:g> er oppdatert. Velg hva du vil gi denne appen tilgang til."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Avbryt"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjern tillatelser hvis appen ikke brukes"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Fjern tillatelser og frigjør plass"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Sett appaktivitet på pause hvis ubrukt"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Administrer appen hvis den ikke brukes"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Fjern tillatelser, slett midlertidige filer, og stopp varsler"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Fjern tillatelser, slett midlertidige filer, stopp varsler, og arkiver appen"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"For å beskytte dataene dine fjernes tillatelser for denne appen hvis appen ikke brukes på noen måneder."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Hvis appen ikke brukes på noen måneder, fjernes disse tillatelsene for å beskytte dataene dine: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"For å beskytte dataene dine har tillatelser blitt fjernet fra apper du ikke har brukt på noen måneder."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notatapp"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apper du kan bruke til å ta notater på enheten"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notater"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Standard lommebokapp"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Lommebokapp"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"I lommebokapper kan du lagre kreditt- og stamkundekort, bilnøkler og andre ting for å få hjelp med ulike transaksjonstyper."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Vil du bruke <xliff:g id="APP_NAME">%1$s</xliff:g> som standard lommebokapp?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Ingen tillatelser er nødvendige"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Gjeldende standard"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ikke spør igjen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Angi som standard"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Oppdateringer av datadeling"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Noen apper har endret hvordan de kan dele posisjonsdataene dine"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Innstillinger"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Åpnet <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Åpnet i går <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Åpnet <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Engangspassordet ditt er 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ne-v34/strings.xml b/PermissionController/res/values-ne-v34/strings.xml
index 421c5a8e0..5ff42bc16 100644
--- a/PermissionController/res/values-ne-v34/strings.xml
+++ b/PermissionController/res/values-ne-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"लोकेसन एक्सेस"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"एप तथा सेवाहरूका हकमा। यो सेटिङ अफ गरिएको अवस्थामा तपाईंले आपत्‍कालीन नम्बरमा कल गर्नुभयो भने माइक्रोफोनसम्बन्धी जानकारी अझै पनि सेयर गरिन सक्छ"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"एप तथा सेवाहरूका हकमा"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"प्रतिबन्ध लगाइएका सेटिङ"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"तपाईंको खाताको सुरक्षार्थ यो सेटिङ हाल उपलब्ध छैन।"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"थप जान्नुहोस्"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ne-watch/strings.xml b/PermissionController/res/values-ne-watch/strings.xml
index d5f1fc2ae..60374094c 100644
--- a/PermissionController/res/values-ne-watch/strings.xml
+++ b/PermissionController/res/values-ne-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"बदल्न मिल्दैन"</string>
<string name="generic_yes" msgid="2489207724988649846">"हुन्छ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"रद्द गर्नु…"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"सधैँ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"एप प्रयोग गर्दा"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"सधैँ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"एप प्रयोग गर्दा"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"सधैँ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"एप प्रयोग गर्दा"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"सधैँ"</string>
</resources>
diff --git a/PermissionController/res/values-ne/strings.xml b/PermissionController/res/values-ne/strings.xml
index c934729fd..8cefd760e 100644
--- a/PermissionController/res/values-ne/strings.xml
+++ b/PermissionController/res/values-ne/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"सबै अनुमति"</string>
<string name="other_permissions" msgid="2901186127193849594">"एपका अन्य क्षमताहरू"</string>
<string name="permission_request_title" msgid="8790310151025020126">"अनुमति दिन भनी गरिएको अनुरोध"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear मा स्थापना/स्थापना रद्द गर्ने कारबाहीहरू समर्थित छैनन्।"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; लाई केमाथि पहुँच राख्न दिने हो छनौट गर्नुहोस्"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; अद्यावधिक गरिएको छ। यस एपलाई केमाथि पहुँच राख्न दिने हो छनौट गर्नुहोस्।"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"रद्द गर्नुहोस्"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"यो एप प्रयोग नहुँदा यसलाई दिइएका अनुमतिहरू रद्द गरियोस्"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"अनुमतिहरू हटाई ठाउँ खाली गरियोस्"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"एप प्रयोग नगरिएको अवस्थामा उक्त एपमा बिताएको समय रेकर्ड नगरियोस्"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"एप प्रयोग गरिएको छैन भने व्यवस्थापन गरियोस्"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"अनुमतिहरू रद्द गरियोस्, अस्थायी फाइलहरू मेटाइयोस् र एपसम्बन्धी सूचना नपठाइयोस्"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"अनुमति रद्द गरियोस्, अस्थायी फाइलहरू मेटाइयोस्, सूचना नपठाइयोस् र एप अभिलेखमा राखियोस्"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"तपाईंका डेटाको सुरक्षार्थ यो एप केही महिनासम्म प्रयोग नगरिएका खण्डमा यसलाई दिइएका अनुमति रद्द गरिने छन्।"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"तपाईंका डेटाको सुरक्षार्थ यो एप केही महिनासम्म प्रयोग नगरिएका खण्डमा निम्न अनुमति रद्द गरिने छन्: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"तपाईंका डेटाको सुरक्षार्थ तपाईंले केही महिनादेखि प्रयोग नगरेका एपलाई दिइएका अनुमति रद्द गरिएका छन्।"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"नोट एप"</string>
<string name="role_notes_description" msgid="8496852798616883551">"तपाईंलाई आफ्नो डिभाइसमा नोट बनाउन दिने एपहरू"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"नोटहरू"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"डिफल्ट Wallet एप"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet एप"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"तपाईंलाई विभिन्न तरिकाले कारोबार गर्न सघाउन Wallet एपमा तपाईंका क्रेडिट कार्ड तथा लोयल्टी कार्ड, कार कीलगायतका कुराहरू पनि भण्डारण गर्न सकिन्छ।"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> लाई आफ्नो डिफल्ट Wallet एपका रूपमा सेट गर्ने हो?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"कुनै पनि अनुमति चाहिन्न"</string>
<string name="request_role_current_default" msgid="738722892438247184">"हालको डिफल्ट एप"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"फेरि नसोध्नुहोस्"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"डिफल्ट सेट गर्नुहोस्"</string>
@@ -429,7 +434,7 @@
<string name="default_apps_manage_domain_urls" msgid="6775566451561036069">"लिंकहरू खोल्दा"</string>
<string name="default_apps_for_work" msgid="4970308943596201811">"कार्यका लागि डिफल्ट"</string>
<string name="default_app_none" msgid="9084592086808194457">"कुनै पनि होइन"</string>
- <string name="default_app_system_default" msgid="6218386768175513760">"(डिफल्ट सिस्टम एप)"</string>
+ <string name="default_app_system_default" msgid="6218386768175513760">"(सिस्टम डिफल्ट)"</string>
<string name="default_app_no_apps" msgid="115720991680586885">"कुनै पनि एप छैन"</string>
<string name="car_default_app_selected" msgid="5416420830430644174">"चयन गरिएको"</string>
<string name="car_default_app_selected_with_info" msgid="1932204186080593500">"चयन गरिएको - <xliff:g id="ADDITIONAL_INFO">%1$s</xliff:g>"</string>
@@ -565,7 +570,7 @@
<string name="privacy_controls_qs" msgid="5780144882040591169">"तपाईंका गोपनीयतासम्बन्धी सेटिङ"</string>
<string name="security_settings_button_label_qs" msgid="8280343822465962330">"थप सेटिङ"</string>
<string name="camera_toggle_label_qs" msgid="3880261453066157285">"क्यामेरा प्रयोग गर्ने अनुमति"</string>
- <string name="microphone_toggle_label_qs" msgid="8132912469813396552">"माइक प्रयोग गर्ने अनुमति"</string>
+ <string name="microphone_toggle_label_qs" msgid="8132912469813396552">"माइक एक्सेस"</string>
<string name="permissions_removed_qs" msgid="8957319130625294572">"अनुमति हटाइएको छ"</string>
<string name="camera_usage_qs" msgid="4394233566086665994">"हालसालै गरिएको क्यामेराको प्रयोगसम्बन्धी जानकारी हेर्नुहोस्"</string>
<string name="microphone_usage_qs" msgid="8527666682168170417">"हालसालै गरिएको माइकको प्रयोगसम्बन्धी जानकारी हेर्नुहोस्"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"जानकारी सेयर गर्नेसम्बन्धी अभ्यासका बारेमा अद्यावधिक जानकारी"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"केही एपहरूले तपाईंको लोकेसन डेटा सेयर गर्न सक्ने तरिका परिवर्तन गरेका छन्"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"सेटिङ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> मा एक्सेस गरिएको"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"हिजो <xliff:g id="TIME_DATE">%1$s</xliff:g> मा एक्सेस गरिएको"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> मा एक्सेस गरिएको"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"तपाईंको एक पटके पासवर्ड 132435 हो"</string>
</resources>
diff --git a/PermissionController/res/values-nl-v34/strings.xml b/PermissionController/res/values-nl-v34/strings.xml
index b3265d254..76309db57 100644
--- a/PermissionController/res/values-nl-v34/strings.xml
+++ b/PermissionController/res/values-nl-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Locatietoegang"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Voor apps en services. Als deze instelling uitstaat, kunnen microfoongegevens nog altijd worden gedeeld als je een alarmnummer belt."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Voor apps en services"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Beperkte instelling"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ter beveiliging is deze instelling op dit moment niet beschikbaar."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Meer informatie"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-nl-watch/strings.xml b/PermissionController/res/values-nl-watch/strings.xml
index 454676644..4b70e1174 100644
--- a/PermissionController/res/values-nl-watch/strings.xml
+++ b/PermissionController/res/values-nl-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Niet aanpasbaar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Annuleren"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Altijd"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Bij gebruik van de app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Altijd"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Bij gebruik van de app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Altijd"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Bij gebruik van de app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Altijd"</string>
</resources>
diff --git a/PermissionController/res/values-nl/strings.xml b/PermissionController/res/values-nl/strings.xml
index 22be451af..b768d5543 100644
--- a/PermissionController/res/values-nl/strings.xml
+++ b/PermissionController/res/values-nl/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alle rechten"</string>
<string name="other_permissions" msgid="2901186127193849594">"Andere app-mogelijkheden"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Rechtenverzoek"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Acties voor installeren/verwijderen niet ondersteund op Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Kiezen waartoe &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; toegang krijgt"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; is geüpdatet. Kies waartoe je deze app toegang wilt geven."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Annuleren"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Rechten intrekken als app niet wordt gebruikt"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Rechten intrekken en ruimte vrijmaken"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"App-activiteit onderbreken indien niet gebruikt"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"App beheren indien ongebruikt"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Verwijder rechten en tijdelijke bestanden, en stop meldingen"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Verwijder rechten en tijdelijke bestanden, stop meldingen en archiveer de app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Om je gegevens te beschermen worden de rechten voor deze app verwijderd als de app een aantal maanden niet is gebruikt."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Om je gegevens te beschermen worden de volgende rechten ingetrokken als de app een paar maanden niet is gebruikt: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Om je gegevens te beschermen zijn de rechten verwijderd van apps die al een paar maanden niet zijn gebruikt."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notitie-app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps waarmee je notities op je apparaat kunt maken"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notities"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Standaard digitale portemonnee-app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Digitale portemonnee-app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Digitale portemonnee-apps kunnen je creditcards en klantenkaarten, autosleutels en andere zaken opslaan om je te helpen bij verschillende vormen van transacties."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> instellen als je standaard digitale portemonnee-app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Geen rechten nodig"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Huidige standaard-app"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Niet meer vragen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Standaard instellen"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Updates voor gegevens delen"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Sommige apps kunnen je locatiegegevens nu op een andere manier delen"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Instellingen"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Geopend: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Geopend: gisteren om <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Geopend: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> om <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Je eenmalige wachtwoord is 132435"</string>
</resources>
diff --git a/PermissionController/res/values-or-v34/strings.xml b/PermissionController/res/values-or-v34/strings.xml
index 2994a3f25..69329ba99 100644
--- a/PermissionController/res/values-or-v34/strings.xml
+++ b/PermissionController/res/values-or-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ଲୋକେସନ ଆକ୍ସେସ"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ଆପ୍ସ ଏବଂ ସେବାଗୁଡ଼ିକ ପାଇଁ। ଯଦି ଏହି ସେଟିଂ ବନ୍ଦ ଥାଏ, ତେବେ ଆପଣ ଏକ ଜରୁରୀକାଳୀନ ନମ୍ବରକୁ କଲ କରିବା ସମୟରେ ମାଇକ୍ରୋଫୋନ ଡାଟା ଏବେ ବି ସେୟାର କରାଯାଇପାରେ"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ଆପ୍ସ ଏବଂ ସେବାଗୁଡ଼ିକ ପାଇଁ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ ଏହି ସେଟିଂ ବର୍ତ୍ତମାନ ଅନୁପଲବ୍ଧ ଅଟେ।"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ଅଧିକ ଜାଣନ୍ତୁ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-or-watch/strings.xml b/PermissionController/res/values-or-watch/strings.xml
index ef9515f25..579128b3f 100644
--- a/PermissionController/res/values-or-watch/strings.xml
+++ b/PermissionController/res/values-or-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ଏହା ବଦଳାଯାଇପାରିବ ନାହିଁ"</string>
<string name="generic_yes" msgid="2489207724988649846">"ହଁ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ବାତିଲ କରନ୍ତୁ"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ସର୍ବଦା"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ଆପ ବ୍ୟବହାର କରିବା ସମୟରେ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ସର୍ବଦା"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ଆପ ବ୍ୟବହାର କରିବା ସମୟରେ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ସର୍ବଦା"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ଆପ ବ୍ୟବହାର କରିବା ସମୟରେ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ସର୍ବଦା"</string>
</resources>
diff --git a/PermissionController/res/values-or/strings.xml b/PermissionController/res/values-or/strings.xml
index beb7572ba..7b37bcb86 100644
--- a/PermissionController/res/values-or/strings.xml
+++ b/PermissionController/res/values-or/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ସମସ୍ତ ଅନୁମତିଗୁଡ଼ିକ"</string>
<string name="other_permissions" msgid="2901186127193849594">"ଅନ୍ୟାନ୍ୟ ଆପ୍‍ ଦକ୍ଷତା"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ଅନୁମତି ଅନୁରୋଧ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android ୱିୟର୍‌"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ୱିୟର୍‌ରେ ଇନଷ୍ଟଲ୍‍/ଅନଇନଷ୍ଟଲ୍‍ କାର୍ଯ୍ୟଗୁଡ଼ିକ ସମର୍ଥନ କରେନାହିଁ।"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ଆକ୍ସେସ୍‍ କରିବା ପାଇଁ କେଉଁସବୁ ଅନୁମତି ଦିଆଯିବ, ତାହା ବାଛନ୍ତୁ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ଅପଡେଟ୍‍ କରାଯାଇଛି। ଏହି ଆପ୍‍ କେଉଁସବୁ ଆକ୍ସେସ୍‍ କରିପାରିବ, ତାହା ବାଛନ୍ତୁ।"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ବାତିଲ କରନ୍ତୁ"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ଯଦି ଆପ୍ ବ୍ୟବହାର କରାଯାଇନାହିଁ, ତେବେ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ସ୍ପେସ୍ ଖାଲି କରନ୍ତୁ"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ବ୍ୟବହାର ହେଉନଥିଲେ ଆପ କାର୍ଯ୍ୟକଳାପ ବିରତ କରନ୍ତୁ"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ଆପକୁ ବ୍ୟବହାର କରାଯାଉନଥିଲେ ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଅନ୍ତୁ, ଅସ୍ଥାୟୀ ଫାଇଲଗୁଡ଼ିକୁ ଡିଲିଟ କରନ୍ତୁ ଏବଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଅନ୍ତୁ, ଅସ୍ଥାୟୀ ଫାଇଲଗୁଡ଼ିକୁ ଡିଲିଟ କରନ୍ତୁ, ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ବନ୍ଦ କରନ୍ତୁ ଏବଂ ଆପକୁ ଆର୍କାଇଭ କରନ୍ତୁ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ଯଦି ଏହି ଆପକୁ କିଛି ମାସ ପାଇଁ ବ୍ୟବହାର କରାଯାଇନାହିଁ, ତେବେ ଆପଣଙ୍କ ଡାଟାର ସୁରକ୍ଷା ନିମନ୍ତେ ଏହାର ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯିବ।"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ଯଦି ଏହି ଆପକୁ କିଛି ମାସ ପାଇଁ ବ୍ୟବହାର କରାଯାଇନାହିଁ ତେବେ ଆପଣଙ୍କ ଡାଟାର ସୁରକ୍ଷା ନିମନ୍ତେ, ନିମ୍ନୋକ୍ତ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯିବ: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ଆପଣଙ୍କ ଡାଟାର ସୁରକ୍ଷା ପାଇଁ, ଆପଣ କିଛି ମାସ ହେଲା ବ୍ୟବହାର କରିନଥିବା ଆପଗୁଡ଼ିକରୁ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଆଯାଇଛି।"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"ନୋଟ୍ସ ଆପ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପଣଙ୍କୁ ନୋଟ ନେବା ପାଇଁ ଅନୁମତି ଦେଉଥିବା ଆପ୍ସ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ନୋଟ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ଡିଫଲ୍ଟ ୱାଲେଟ ଆପ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"ୱାଲେଟ ଆପ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"ବିଭିନ୍ନ ପ୍ରକାରର ଟ୍ରାଞ୍ଜେକସନରେ ସାହାଯ୍ୟ କରିବାକୁ ୱାଲେଟ ଆପ୍ସ ଆପଣଙ୍କ କ୍ରେଡିଟ ଓ ଲୟାଲ୍ଟି କାର୍ଡ, କାର କୀ ଏବଂ ଅନ୍ୟ ଜିନିଷଗୁଡ଼ିକୁ ଷ୍ଟୋର କରିପାରିବ।"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>କୁ ଆପଣଙ୍କ ଡିଫଲ୍ଟ ୱାଲେଟ ଆପ ଭାବେ ସେଟ କରିବେ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"କୌଣସି ଅନୁମତି ଆବଶ୍ୟକ ନାହିଁ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ସମ୍ପ୍ରତ୍ତି ଡିଫଲ୍ଟ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ଆଉ ପଚାରନ୍ତୁ ନାହିଁ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ଡିଫଲ୍ଟ ଭାବେ ସେଟ୍ କରନ୍ତୁ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ଡାଟା ସେୟାରିଂ ଅପଡେଟଗୁଡ଼ିକ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"କିଛି ଆପ୍ସ ଆପଣଙ୍କ ଲୋକେସନ ଡାଟା ସେୟାର କରିବା ଉପାୟକୁ ପରିବର୍ତ୍ତନ କରିଛି"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ସେଟିଂସ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ଗତକାଲି <xliff:g id="TIME_DATE">%1$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>ରେ ଆକ୍ସେସ କରାଯାଇଛି"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ଆପଣଙ୍କ ଗୋଟିଏ ଥରର ପାସୱାର୍ଡ ହେଉଛି 132435"</string>
</resources>
diff --git a/PermissionController/res/values-pa-v33/strings.xml b/PermissionController/res/values-pa-v33/strings.xml
index 03e18ae50..0aa143302 100644
--- a/PermissionController/res/values-pa-v33/strings.xml
+++ b/PermissionController/res/values-pa-v33/strings.xml
@@ -28,9 +28,9 @@
<string name="safety_center_entry_group_item_content_description" msgid="7348298582877249787">"ਸੂਚੀ ਆਈਟਮ। <xliff:g id="ENTRY_ITEM_TITLE">%1$s</xliff:g>. <xliff:g id="ENTRY_ITEM_SUMMARY">%2$s</xliff:g>"</string>
<string name="safety_center_entry_content_description" msgid="3639565652938224321">"<xliff:g id="ENTRY_ITEM_TITLE">%1$s</xliff:g>. <xliff:g id="ENTRY_ITEM_SUMMARY">%2$s</xliff:g>"</string>
<string name="safety_center_more_issues_card_title" msgid="7425844746197493312">"ਹੋਰ ਅਲਰਟ"</string>
- <string name="safety_center_dismissed_issues_card_title" msgid="2340129842725145733">"ਖਾਰਜ ਕੀਤੀਆਂ ਗਈਆਂ ਸੁਚੇਤਨਾਵਾਂ"</string>
- <string name="safety_center_more_issues_card_expand_action" msgid="7109451851052272946">"{count,plural, =1{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ ਇੱਕ ਹੋਰ ਸੁਚੇਤਨਾ ਦੇਖੋ}one{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ # ਹੋਰ ਸੁਚੇਤਨਾ ਦੇਖੋ}other{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ # ਹੋਰ ਸੁਚੇਤਨਾਵਾਂ ਦੇਖੋ}}"</string>
- <string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"ਸੁਚੇਤਨਾ। <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
+ <string name="safety_center_dismissed_issues_card_title" msgid="2340129842725145733">"ਖਾਰਜ ਕੀਤੇ ਅਲਰਟ"</string>
+ <string name="safety_center_more_issues_card_expand_action" msgid="7109451851052272946">"{count,plural, =1{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ ਇੱਕ ਹੋਰ ਅਲਰਟ ਦੇਖੋ}one{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ # ਹੋਰ ਅਲਰਟ ਦੇਖੋ}other{ਵਿਸਤਾਰ ਕਰੋ ਅਤੇ # ਹੋਰ ਅਲਰਟ ਦੇਖੋ}}"</string>
+ <string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"ਅਲਰਟ। <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"ਕਾਰਵਾਈ ਪੂਰੀ ਹੋਈ"</string>
<string name="safety_center_qs_status_summary" msgid="5193925895830451177">"ਉਨ੍ਹਾਂ ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਕਰੋ ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਸੁਰੱਖਿਆ ਸ਼ਾਮਲ ਕਰ ਸਕਦੀਆਂ ਹਨ"</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"ਸੁਰੱਖਿਆ ਅਤੇ ਪਰਦੇਦਾਰੀ ਸੰਬੰਧੀ ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ"</string>
diff --git a/PermissionController/res/values-pa-v34/strings.xml b/PermissionController/res/values-pa-v34/strings.xml
index c0b70fb57..e9ec0ebab 100644
--- a/PermissionController/res/values-pa-v34/strings.xml
+++ b/PermissionController/res/values-pa-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ਟਿਕਾਣਾ ਪਹੁੰਚ"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਲਈ। ਇਸ ਸੈਟਿੰਗ ਦੇ ਬੰਦ ਹੋਣ \'ਤੇ, ਜਦੋਂ ਤੁਸੀਂ ਕਿਸੇ ਐਮਰਜੈਂਸੀ ਨੰਬਰ \'ਤੇ ਕਾਲ ਕਰਦੇ ਹੋ ਤਾਂ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਡਾਟੇ ਨੂੰ ਫਿਰ ਵੀ ਸਾਂਝਾ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ਐਪਾਂ ਅਤੇ ਸੇਵਾਵਾਂ ਲਈ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"ਪ੍ਰਤਿਬੰਧਿਤ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਇਹ ਸੈਟਿੰਗ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ਹੋਰ ਜਾਣੋ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-pa-watch/strings.xml b/PermissionController/res/values-pa-watch/strings.xml
index 8a46aef6f..3bac90bee 100644
--- a/PermissionController/res/values-pa-watch/strings.xml
+++ b/PermissionController/res/values-pa-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string>
<string name="generic_yes" msgid="2489207724988649846">"ਹਾਂ"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ਰੱਦ ਕਰੋ"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ਹਰ ਸਮੇਂ"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ਐਪ ਦੀ ਵਰਤੋਂ ਦੌਰਾਨ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ਹਰ ਸਮੇਂ"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ਐਪ ਦੀ ਵਰਤੋਂ ਦੌਰਾਨ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ਹਰ ਸਮੇਂ"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ਐਪ ਦੀ ਵਰਤੋਂ ਦੌਰਾਨ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ਹਰ ਸਮੇਂ"</string>
</resources>
diff --git a/PermissionController/res/values-pa/strings.xml b/PermissionController/res/values-pa/strings.xml
index b69db6992..3c321b806 100644
--- a/PermissionController/res/values-pa/strings.xml
+++ b/PermissionController/res/values-pa/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"ਸਾਰੀਆਂ ਇਜਾਜ਼ਤਾਂ"</string>
<string name="other_permissions" msgid="2901186127193849594">"ਐਪ ਦੀਆਂ ਹੋਰ ਸਮਰੱਥਤਾਵਾਂ"</string>
<string name="permission_request_title" msgid="8790310151025020126">"ਇਜਾਜ਼ਤ ਬੇਨਤੀ"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear \'ਤੇ ਸਥਾਪਤ/ਅਣਸਥਾਪਤ ਕਰਨ ਦੀਆਂ ਕਾਰਵਾਈਆਂ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"ਇਹ ਚੁਣੋ ਕਿ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਕਿਸ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ਨੂੰ ਅੱਪਡੇਟ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ। ਇਹ ਚੁਣੋ ਕਿ ਇਸ ਐਪ ਨੂੰ ਕਿਸ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੇਣੀ ਹੈ।"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ਰੱਦ ਕਰੋ"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ਐਪ ਨੂੰ ਨਾ ਵਰਤੇ ਜਾਣ \'ਤੇ ਇਸ ਲਈ ਦਿੱਤੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿਓ"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"ਇਜਾਜ਼ਤਾਂ ਹਟਾਓ ਅਤੇ ਜਗ੍ਹਾ ਖਾਲੀ ਕਰੋ"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"ਵਰਤੋਂ ਵਿੱਚ ਨਾ ਹੋਣ \'ਤੇ, ਐਪ ਸਰਗਰਮੀ ਰੋਕੋ"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ਵਰਤੋਂ ਵਿੱਚ ਨਾ ਹੋਣ \'ਤੇ, ਐਪ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"ਇਜਾਜ਼ਤਾਂ ਹਟਾਓ, ਅਸਥਾਈ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ ਅਤੇ ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"ਇਜਾਜ਼ਤਾਂ ਹਟਾਓ, ਅਸਥਾਈ ਫ਼ਾਈਲਾਂ ਮਿਟਾਓ, ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ ਅਤੇ ਐਪ ਨੂੰ ਪੁਰਾਲੇਖਬੱਧ ਕਰੋ"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ਤੁਹਾਡੀ ਡਾਟਾ ਸੁਰੱਖਿਆ ਲਈ, ਜੇ ਇਹ ਐਪ ਕੁਝ ਮਹੀਨਿਆਂ ਲਈ ਵਰਤੀ ਨਹੀਂ ਗਈ, ਤਾਂ ਇਸ ਐਪ ਲਈ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ਤੁਹਾਡੀ ਡਾਟਾ ਸੁਰੱਖਿਆ ਲਈ, ਜੇ ਇਹ ਐਪ ਕੁਝ ਮਹੀਨਿਆਂ ਲਈ ਵਰਤੀ ਨਹੀਂ ਗਈ, ਤਾਂ ਅੱਗੇ ਦਿੱਤੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ਤੁਹਾਡੀ ਡਾਟਾ ਸੁਰੱਖਿਆ ਲਈ, ਜੋ ਐਪਾਂ ਤੁਸੀਂ ਕੁਝ ਮਹੀਨਿਆਂ ਤੋਂ ਨਹੀਂ ਵਰਤੀਆਂ ਉਹਨਾਂ ਐਪਾਂ ਤੋਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।"</string>
@@ -371,7 +371,7 @@
<string name="role_sms_search_keywords" msgid="8022048144395047352">"ਲਿਖਤ ਸੁਨੇਹਾ, ਲਿਖਤ ਭੇਜਣਾ, ਸੁਨੇਹੇ, ਸੁਨੇਹਾ ਭੇਜਣਾ"</string>
<string name="role_emergency_label" msgid="7028825857206842366">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੰਕਟਕਾਲੀਨ ਐਪ"</string>
<string name="role_emergency_short_label" msgid="2388431453335350348">"ਸੰਕਟਕਾਲੀਨ ਐਪ"</string>
- <string name="role_emergency_description" msgid="5051840234887686630">"ਐਪਾਂ ਜੋ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਡਾਕਟਰੀ ਜਾਣਕਾਰੀ ਰਿਕਾਰਡ ਕਰਨ ਅਤੇ ਇਸਨੂੰ ਸੰਕਟਕਾਲੀਨ ਮਦਦਗਾਰਾਂ ਤੱਕ ਪਹੁੰਚਯੋਗ ਬਣਾਉਣ ਦਿੰਦੀਆਂ ਹਨ; ਗੰਭੀਰ ਮੌਸਮੀ ਘਟਨਾਵਾਂ ਅਤੇ ਆਫ਼ਤਾਂ ਬਾਰੇ ਸੁਚੇਤਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਦਿੰਦੀਆਂ ਹਨ; ਤੁਹਾਨੂੰ ਮਦਦ ਦੀ ਲੋੜ ਪੈਣ \'ਤੇ ਹੋਰਾਂ ਨੂੰ ਸੂਚਿਤ ਕਰਨ ਦਿੰਦੀਆਂ ਹਨ"</string>
+ <string name="role_emergency_description" msgid="5051840234887686630">"ਐਪਾਂ ਜੋ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਡਾਕਟਰੀ ਜਾਣਕਾਰੀ ਰਿਕਾਰਡ ਕਰਨ ਅਤੇ ਇਸਨੂੰ ਐਮਰਜੈਂਸੀ ਮਦਦਗਾਰਾਂ ਤੱਕ ਪਹੁੰਚਯੋਗ ਬਣਾਉਣ ਦਿੰਦੀਆਂ ਹਨ; ਬਹੁਤ ਜ਼ਿਆਦਾ ਖਰਾਬ ਮੌਸਮੀ ਘਟਨਾਵਾਂ ਅਤੇ ਆਫ਼ਤਾਂ ਬਾਰੇ ਅਲਰਟ ਪ੍ਰਾਪਤ ਕਰਨ ਦਿੰਦੀਆਂ ਹਨ; ਤੁਹਾਨੂੰ ਮਦਦ ਦੀ ਲੋੜ ਪੈਣ \'ਤੇ ਹੋਰਾਂ ਨੂੰ ਸੂਚਿਤ ਕਰਨ ਦਿੰਦੀਆਂ ਹਨ"</string>
<string name="role_emergency_request_title" msgid="8469579020654348567">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੀ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੰਕਟਕਾਲੀਨ ਐਪ ਵਜੋਂ ਸੈੱਟ ਕਰਨਾ ਹੈ?"</string>
<string name="role_emergency_request_description" msgid="131645948770262850">"ਕਿਸੇ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ"</string>
<string name="role_emergency_search_keywords" msgid="1920007722599213358">"ice"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"ਨੋਟ-ਕਥਨਾਂ ਲਈ ਐਪ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ਐਪਾਂ ਜੋ ਤੁਹਾਨੂੰ ਆਪਣੇ ਡੀਵਾਈਸ \'ਤੇ ਨੋਟ-ਕਥਨ ਲੈਣ ਦੀ ਆਗਿਆ ਦਿੰਦੀਆਂ ਹਨ"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ਨੋਟ-ਕਥਨ"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਾਲੇਟ ਐਪ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet ਐਪ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"ਲੈਣ-ਦੇਣ ਦੀਆਂ ਵੱਖ-ਵੱਖ ਕਿਸਮਾਂ ਸੰਬੰਧੀ ਮਦਦ ਕਰਨ ਲਈ, ਵਾਲੇਟ ਐਪਾਂ ਤੁਹਾਡੇ ਕ੍ਰੈਡਿਟ ਅਤੇ ਵਫ਼ਾਦਾਰੀ ਕਾਰਡਾਂ, ਕਾਰ ਦੀਆਂ ਕੁੰਜੀਆਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਸਟੋਰ ਕਰ ਸਕਦੀਆਂ ਹਨ।"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"ਕੀ <xliff:g id="APP_NAME">%1$s</xliff:g> ਨੂੰ ਤੁਹਾਡੀ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਵਾਲੇਟ ਐਪ ਵਜੋਂ ਸੈੱਟ ਕਰਨਾ ਹੈ?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ਕਿਸੇ ਇਜਾਜ਼ਤ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ਮੌਜੂਦਾ ਪੂਰਵ-ਨਿਰਧਾਰਤ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ਦੁਬਾਰਾ ਨਾ ਪੁੱਛੋ"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਵਜੋਂ ਸੈੱਟ ਕਰੋ"</string>
@@ -552,7 +557,7 @@
<string name="safety_center_dashboard_page_title" msgid="2810774008694315854">"ਸੁਰੱਖਿਆ ਅਤੇ ਪਰਦੇਦਾਰੀ"</string>
<string name="safety_center_rescan_button" msgid="4517514567809409596">"ਡੀਵਾਈਸ ਨੂੰ ਸਕੈਨ ਕਰੋ"</string>
<string name="safety_center_issue_card_dismiss_button" msgid="5113965506144222402">"ਖਾਰਜ ਕਰੋ"</string>
- <string name="safety_center_issue_card_dismiss_confirmation_title" msgid="2734809473425036382">"ਕੀ ਇਸ ਸੁਚੇਤਨਾ ਨੂੰ ਖਾਰਜ ਕਰਨਾ ਹੈ?"</string>
+ <string name="safety_center_issue_card_dismiss_confirmation_title" msgid="2734809473425036382">"ਕੀ ਇਸ ਅਲਰਟ ਨੂੰ ਖਾਰਜ ਕਰਨਾ ਹੈ?"</string>
<string name="safety_center_issue_card_dismiss_confirmation_message" msgid="3775418736671093563">"ਹੋਰ ਸੁਰੱਖਿਆ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕਿਸੇ ਵੀ ਸਮੇਂ ਆਪਣੀਆਂ ਸੁਰੱਖਿਆ ਅਤੇ ਪਰਦੇਦਾਰੀ ਸੈਟਿੰਗਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ"</string>
<string name="safety_center_issue_card_confirm_dismiss_button" msgid="5884137843083634556">"ਖਾਰਜ ਕਰੋ"</string>
<string name="safety_center_issue_card_cancel_dismiss_button" msgid="2874578798877712346">"ਰੱਦ ਕਰੋ"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ਡਾਟਾ ਸਾਂਝਾਕਰਨ ਅੱਪਡੇਟ"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"ਕੁਝ ਐਪਾਂ ਨੇ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਦੇ ਡਾਟੇ ਨੂੰ ਸਾਂਝਾ ਕਰਨ ਦਾ ਤਰੀਕਾ ਬਦਲ ਦਿੱਤਾ ਹੈ"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ਸੈਟਿੰਗਾਂ"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ਵਜੇ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"<xliff:g id="TIME_DATE">%1$s</xliff:g> ਵਜੇ ਕੱਲ੍ਹ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> ਨੂੰ <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ਵਜੇ ਪਹੁੰਚ ਕੀਤੀ ਗਈ"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ਤੁਹਾਡਾ ਇਕਹਰੀ-ਵਰਤੋਂ ਪਾਸਵਰਡ 132435 ਹੈ"</string>
</resources>
diff --git a/PermissionController/res/values-pl-v34/strings.xml b/PermissionController/res/values-pl-v34/strings.xml
index b69bf4c4f..ed715b985 100644
--- a/PermissionController/res/values-pl-v34/strings.xml
+++ b/PermissionController/res/values-pl-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Dostęp do lokalizacji"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Dotyczy aplikacji i usług. Jeśli wyłączysz to ustawienie, dane mikrofonu wciąż mogą być udostępniane podczas połączenia z numerem alarmowym"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Dotyczy aplikacji i usług"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ustawienie z ograniczonym dostępem"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ze względów bezpieczeństwa to ustawienie jest obecnie niedostępne."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Więcej informacji"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-pl-watch/strings.xml b/PermissionController/res/values-pl-watch/strings.xml
index 1fbfdf245..0fe2421f6 100644
--- a/PermissionController/res/values-pl-watch/strings.xml
+++ b/PermissionController/res/values-pl-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nie można zmienić"</string>
<string name="generic_yes" msgid="2489207724988649846">"Tak"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Anuluj"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Cały czas"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Gdy używasz aplikacji"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Cały czas"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Gdy używasz aplikacji"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Cały czas"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Gdy używasz aplikacji"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Cały czas"</string>
</resources>
diff --git a/PermissionController/res/values-pl/strings.xml b/PermissionController/res/values-pl/strings.xml
index 9ed891733..2b3256c05 100644
--- a/PermissionController/res/values-pl/strings.xml
+++ b/PermissionController/res/values-pl/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Wszystkie uprawnienia"</string>
<string name="other_permissions" msgid="2901186127193849594">"Inne funkcje aplikacji"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Prośba o pozwolenie"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear nie obsługuje instalowania ani odinstalowywania."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Wybierz, jakie uprawnienia dostępu ma mieć &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikacja &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; została zaktualizowana. Wybierz dla niej uprawnienia dostępu."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Anuluj"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Usuń uprawnienia, jeśli aplikacja jest nieużywana"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Usuń uprawnienia i zwolnij miejsce"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Wstrzymuj aktywność w aplikacji, jeśli jest nieużywana"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Zarządzaj nieużywanymi aplikacjami"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Usuń uprawnienia i pliki tymczasowe oraz zatrzymaj powiadomienia"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Usuń uprawnienia i pliki tymczasowe, zatrzymaj powiadomienia i zarchiwizuj aplikację"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Aby chronić Twoje dane, usuniemy uprawnienia tej aplikacji, jeśli nie była używana od kilku miesięcy."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Aby chronić Twoje dane, jeśli aplikacja nie będzie używana przez kilka miesięcy, usuniemy te uprawnienia: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Aby chronić Twoje dane, usunęliśmy uprawnienia aplikacji, których nie używano od kilku miesięcy."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacja do notatek"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacje umożliwiające robienie notatek na urządzeniu"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notatki"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Domyślna aplikacja portfela"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacja portfela cyfrowego"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aby ułatwić sobie wykonywanie różny form transakcji, w aplikacjach portfeli cyfrowych można przechowywać karty kredytowe i lojalnościowe, kluczyki do samochodu i inne rzeczy."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Ustawić aplikację <xliff:g id="APP_NAME">%1$s</xliff:g> jako domyślną aplikację portfela cyfrowego?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nie potrzebuje uprawnień"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Bieżąca aplikacja domyślna"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Nie pytaj ponownie"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Ustaw jako domyślną"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Zmiany w udostępnianiu danych"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Niektóre aplikacje zmieniły sposób udostępniania Twoich danych o lokalizacji"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ustawienia"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Ostatni dostęp <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Ostatni dostęp wczoraj, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Ostatni dostęp <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Twoje hasło jednorazowe to 132435"</string>
</resources>
diff --git a/PermissionController/res/values-pt-rBR-v34/strings.xml b/PermissionController/res/values-pt-rBR-v34/strings.xml
index 6e77e0432..570ce956b 100644
--- a/PermissionController/res/values-pt-rBR-v34/strings.xml
+++ b/PermissionController/res/values-pt-rBR-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acesso ao local"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para apps e serviços. Se esta configuração estiver desativada, os dados do microfone ainda poderão ser compartilhados quando você ligar para um número de emergência"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para apps e serviços"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Configuração restrita"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Para sua segurança, essa configuração está indisponível no momento."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saiba mais"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-pt-rBR-watch/strings.xml b/PermissionController/res/values-pt-rBR-watch/strings.xml
index aa3b75772..84379daa0 100644
--- a/PermissionController/res/values-pt-rBR-watch/strings.xml
+++ b/PermissionController/res/values-pt-rBR-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Impossível alterar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sim"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"O tempo todo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Durante o uso do app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"O tempo todo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Durante o uso do app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"O tempo todo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Durante o uso do app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"O tempo todo"</string>
</resources>
diff --git a/PermissionController/res/values-pt-rBR/strings.xml b/PermissionController/res/values-pt-rBR/strings.xml
index 03089b17c..1cd83f33a 100644
--- a/PermissionController/res/values-pt-rBR/strings.xml
+++ b/PermissionController/res/values-pt-rBR/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todas as permissões"</string>
<string name="other_permissions" msgid="2901186127193849594">"Outros recursos do app"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitação de permissão"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Escolha o que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; terá permissão para acessar"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"O app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; foi atualizado. Escolha o que esse app terá permissão para acessar."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover permissões se o app não for usado"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remover permissões e liberar espaço"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar atividade no app quando não usado"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gerenciar o app fora de uso"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissões, exclui arquivos temporários e para notificações"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remover permissões, excluir arquivos temporários, parar notificações e arquivar o app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger seus dados, as permissões serão removidas se o app não for usado por alguns meses."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger seus dados, se o app não for usado por alguns meses, as seguintes permissões serão removidas: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger seus dados, as permissões de apps que não foram usados nos últimos meses foram removidas."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps que permitem a criação de notas no dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Carteira digital padrão"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App de carteira"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Os apps de carteira digital armazenam seus cartões de crédito e de fidelidade,as chaves do carro, entre outros itens, para agilizar suas transações."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Definir <xliff:g id="APP_NAME">%1$s</xliff:g> como seu app de carteira padrão?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nenhuma permissão necessária"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Padrão atual"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Não perguntar novamente"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Definir como padrão"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Atualizações do compartilhamento de dados"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Alguns apps mudaram a forma como podem compartilhar seus dados de local"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Configurações"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Último acesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Último acesso: ontem, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Último acesso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Sua senha única é 132435"</string>
</resources>
diff --git a/PermissionController/res/values-pt-rPT-v34/strings.xml b/PermissionController/res/values-pt-rPT-v34/strings.xml
index 2f7ce1be2..1068dcb9e 100644
--- a/PermissionController/res/values-pt-rPT-v34/strings.xml
+++ b/PermissionController/res/values-pt-rPT-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acesso à localização"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para apps e serviços. Se esta definição estiver desativada, os dados do microfone ainda podem ser partilhados quando ligar para um número de emergência"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para apps e serviços"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Definição restrita"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Para sua segurança, esta definição está indisponível atualmente."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saber mais"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-pt-rPT-watch/strings.xml b/PermissionController/res/values-pt-rPT-watch/strings.xml
index 3c3a88806..60b1f5f4d 100644
--- a/PermissionController/res/values-pt-rPT-watch/strings.xml
+++ b/PermissionController/res/values-pt-rPT-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Impossív. alterar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sim"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Sempre"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Quando usar a app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Sempre"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Quando usar a app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Sempre"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Quando usar a app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Sempre"</string>
</resources>
diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml
index 437805f95..86a3df541 100644
--- a/PermissionController/res/values-pt-rPT/strings.xml
+++ b/PermissionController/res/values-pt-rPT/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todas as autorizações"</string>
<string name="other_permissions" msgid="2901186127193849594">"Outras capacidades de aplicações"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Pedido de autorização"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Escolher a que conteúdos permite que o &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; aceda"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"O &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; foi atualizado. Escolha a que conteúdos permite que esta app aceda."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -195,7 +193,7 @@
<string name="app_permission_button_deny" msgid="6016454069832050300">"Não permitir"</string>
<string name="precise_image_description" msgid="6349638632303619872">"Localização exata"</string>
<string name="approximate_image_description" msgid="938803699637069884">"Localização aproximada"</string>
- <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Usar localização exata"</string>
+ <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Localização exata"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Quando a localização exata está desativada, as apps podem aceder à sua localização aproximada"</string>
<string name="app_permission_title" msgid="2090897901051370711">"Autorização de <xliff:g id="PERM">%1$s</xliff:g>"</string>
<string name="app_permission_header" msgid="2951363137032603806">"Acesso desta app a <xliff:g id="PERM">%1$s</xliff:g>"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover autorizações se a app não for utilizada"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remover autorizações e libertar espaço"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar atividade de apps, se não usadas"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gerir app, se não for usada"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remova autorizações, elimine ficheiros temporários e pare notificações"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove autorizações, elimina ficheiros temporários, pára notificações e arquiva a app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger os seus dados, as autorizações desta app serão removidas se a mesma não for utilizada durante alguns meses."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger os seus dados, se a app não for utilizada há alguns meses, serão removidas as seguintes autorizações: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger os seus dados, foram removidas as autorizações para as apps que não utiliza há alguns meses."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps que lhe permitem tirar notas no seu dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"App de carteira predefinida"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App de carteira"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"As apps de carteira podem armazenar os seus cartões de crédito e de fidelidade, as chaves do carro, entre outras coisas, para ajudar em várias formas de transações."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Definir a app <xliff:g id="APP_NAME">%1$s</xliff:g> como a sua app de carteira predefinida?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Não são necessárias autorizações"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Predefinição atual"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Não perguntar novamente"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Definir como predef."</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Atualizações da partilha de dados"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Algumas apps alteraram a forma como podem partilhar os seus dados de localização"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Definições"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Acedido à(s) <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Acedido ontem à(s) <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Acedido a <xliff:g id="TIME_DATE_0">%1$s</xliff:g> à(s) <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"A sua palavra-passe de utilização única é 132435"</string>
</resources>
diff --git a/PermissionController/res/values-pt-v34/strings.xml b/PermissionController/res/values-pt-v34/strings.xml
index 6e77e0432..570ce956b 100644
--- a/PermissionController/res/values-pt-v34/strings.xml
+++ b/PermissionController/res/values-pt-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Acesso ao local"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para apps e serviços. Se esta configuração estiver desativada, os dados do microfone ainda poderão ser compartilhados quando você ligar para um número de emergência"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para apps e serviços"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Configuração restrita"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Para sua segurança, essa configuração está indisponível no momento."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Saiba mais"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-pt-watch/strings.xml b/PermissionController/res/values-pt-watch/strings.xml
index aa3b75772..84379daa0 100644
--- a/PermissionController/res/values-pt-watch/strings.xml
+++ b/PermissionController/res/values-pt-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Impossível alterar"</string>
<string name="generic_yes" msgid="2489207724988649846">"Sim"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Cancelar"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"O tempo todo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Durante o uso do app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"O tempo todo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Durante o uso do app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"O tempo todo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Durante o uso do app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"O tempo todo"</string>
</resources>
diff --git a/PermissionController/res/values-pt/strings.xml b/PermissionController/res/values-pt/strings.xml
index 03089b17c..1cd83f33a 100644
--- a/PermissionController/res/values-pt/strings.xml
+++ b/PermissionController/res/values-pt/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Todas as permissões"</string>
<string name="other_permissions" msgid="2901186127193849594">"Outros recursos do app"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitação de permissão"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"As ações de instalar/desinstalar não são compatíveis com o Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Escolha o que o app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; terá permissão para acessar"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"O app &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; foi atualizado. Escolha o que esse app terá permissão para acessar."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Cancelar"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover permissões se o app não for usado"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Remover permissões e liberar espaço"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar atividade no app quando não usado"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gerenciar o app fora de uso"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Remove permissões, exclui arquivos temporários e para notificações"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remover permissões, excluir arquivos temporários, parar notificações e arquivar o app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger seus dados, as permissões serão removidas se o app não for usado por alguns meses."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger seus dados, se o app não for usado por alguns meses, as seguintes permissões serão removidas: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger seus dados, as permissões de apps que não foram usados nos últimos meses foram removidas."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"App de notas"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Apps que permitem a criação de notas no dispositivo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notas"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Carteira digital padrão"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"App de carteira"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Os apps de carteira digital armazenam seus cartões de crédito e de fidelidade,as chaves do carro, entre outros itens, para agilizar suas transações."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Definir <xliff:g id="APP_NAME">%1$s</xliff:g> como seu app de carteira padrão?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nenhuma permissão necessária"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Padrão atual"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Não perguntar novamente"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Definir como padrão"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Atualizações do compartilhamento de dados"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Alguns apps mudaram a forma como podem compartilhar seus dados de local"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Configurações"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Último acesso: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Último acesso: ontem, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Último acesso: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Sua senha única é 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ro-v34/strings.xml b/PermissionController/res/values-ro-v34/strings.xml
index e57e8c91a..05a03617f 100644
--- a/PermissionController/res/values-ro-v34/strings.xml
+++ b/PermissionController/res/values-ro-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Accesul la locație"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Pentru aplicații și servicii. Chiar dacă setarea este dezactivată, datele de la microfon pot fi trimise când apelezi un număr de urgență."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Pentru aplicații și servicii"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Setare restricționată"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Pentru securitatea ta, setarea este momentan indisponibilă."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Află mai multe"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ro-watch/strings.xml b/PermissionController/res/values-ro-watch/strings.xml
index 2b5702c73..01b6310df 100644
--- a/PermissionController/res/values-ro-watch/strings.xml
+++ b/PermissionController/res/values-ro-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nu se poate modif"</string>
<string name="generic_yes" msgid="2489207724988649846">"Da"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Anulează"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Tot timpul"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Când folosești aplicația"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Tot timpul"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Când folosești aplicația"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Tot timpul"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Când folosești aplicația"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Tot timpul"</string>
</resources>
diff --git a/PermissionController/res/values-ro/strings.xml b/PermissionController/res/values-ro/strings.xml
index b4abb4142..a0d460a03 100644
--- a/PermissionController/res/values-ro/strings.xml
+++ b/PermissionController/res/values-ro/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Toate permisiunile"</string>
<string name="other_permissions" msgid="2901186127193849594">"Alte funcții ale aplicației"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Solicitare de permisiune"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Acțiunile Instalează/Dezinstalează nu sunt acceptate pe Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Alege ce va putea accesa &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplicația &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; a fost actualizată. Alege ce va putea accesa această aplicație."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Anulează"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Elimină permisiunile dacă aplicația nu este folosită"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Revocă permisiunile și eliberează spațiu"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Întrerupe activitatea în aplicațiile nefolosite"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Gestionează aplicația dacă nu e folosită"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Revocă permisiunile, șterge fișierele temporare și oprește notificările"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Elimină permisiunile, șterge fișierele temporare, oprește notificările și arhivează aplicația"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Pentru a-ți proteja datele, se vor elimina permisiunile pentru această aplicație dacă nu este folosită câteva luni."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Pentru a-ți proteja datele, dacă aplicația nu este folosită câteva luni, se vor elimina următoarele permisiuni: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Pentru a-ți proteja datele, s-au eliminat permisiunile din aplicațiile pe care nu le-ai folosit de câteva luni."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplicația pentru note"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplicații cu ajutorul cărora poți să iei notițe pe dispozitiv"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notițe"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Aplicația portofel prestabilită"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplicație portofel"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplicațiile portofel pot să stocheze credit și carduri de fidelitate, chei de mașină și alte date, pentru a simplifica diferite tipuri de tranzacții."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Setezi <xliff:g id="APP_NAME">%1$s</xliff:g> ca aplicație portofel prestabilită?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nu sunt necesare permisiuni"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aplicația prestabilită actuală"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Nu mai întreba"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Setează ca prestabilită"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Actualizări privind permiterea accesului la date"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Unele aplicații au schimbat modul în care pot permite accesul la datele tale privind locațiile"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Setări"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Data accesării: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Data accesării: ieri, <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Data accesării: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Parola ta unică este 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ru-v34/strings.xml b/PermissionController/res/values-ru-v34/strings.xml
index 64a927b69..a56cc7632 100644
--- a/PermissionController/res/values-ru-v34/strings.xml
+++ b/PermissionController/res/values-ru-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Доступ к геоданным"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Для приложений и сервисов. Даже если эта функция отключена, данные микрофона могут передаваться при звонке на номер экстренной службы."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Для приложений и сервисов"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Настройки с ограниченным доступом"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"В целях безопасности доступ к этой функции пока ограничен."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Подробнее"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ru-watch/strings.xml b/PermissionController/res/values-ru-watch/strings.xml
index a39697ff2..c7f4fd885 100644
--- a/PermissionController/res/values-ru-watch/strings.xml
+++ b/PermissionController/res/values-ru-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Нельзя изменить"</string>
<string name="generic_yes" msgid="2489207724988649846">"Да"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Отмена"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Всегда"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"При использовании"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Всегда"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"При использовании"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Всегда"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"При использовании"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Всегда"</string>
</resources>
diff --git a/PermissionController/res/values-ru/strings.xml b/PermissionController/res/values-ru/strings.xml
index ee9ccfb2b..940e602a4 100644
--- a/PermissionController/res/values-ru/strings.xml
+++ b/PermissionController/res/values-ru/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Все разрешения"</string>
<string name="other_permissions" msgid="2901186127193849594">"Что ещё может приложение"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Запрос разрешений"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Wear OS"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Установка и удаление не поддерживаются в Wear OS."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Выберите разрешения для приложения &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Приложение &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; обновлено. Выберите разрешения для него."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Отмена"</string>
@@ -195,7 +193,7 @@
<string name="app_permission_button_deny" msgid="6016454069832050300">"Запретить"</string>
<string name="precise_image_description" msgid="6349638632303619872">"Точное местоположение"</string>
<string name="approximate_image_description" msgid="938803699637069884">"Приблизительное местоположение"</string>
- <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Использовать точное местоположение"</string>
+ <string name="app_permission_location_accuracy" msgid="7166912915040018669">"Точное местоположение"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Если определение точного местоположения отключено, приложения могут использовать данные о примерном местоположении устройства"</string>
<string name="app_permission_title" msgid="2090897901051370711">"Разрешение \"<xliff:g id="PERM">%1$s</xliff:g>\""</string>
<string name="app_permission_header" msgid="2951363137032603806">"<xliff:g id="PERM">%1$s</xliff:g>: доступ для этого приложения"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Отзывать разрешения, если приложение не используется"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Удалять разрешения и освобождать место"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Приостановить работу в неактивный период"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Приостановить работу в неактивный период"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Удалить разрешения и временные файлы, прекратить отправку уведомлений"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Удалить разрешения и временные файлы, прекратить отправку уведомлений и перенести приложение в архив"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Для защиты ваших данных мы отзовем разрешения, предоставленные этому приложению, если вы не будете пользоваться им несколько месяцев."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Если вы не будете пользоваться приложением несколько месяцев, в целях защиты ваших данных мы отзовем следующие разрешения: <xliff:g id="PERMS">%1$s</xliff:g>."</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"В целях защиты ваших данных мы отозвали разрешения для приложений, которыми вы не пользовались несколько месяцев."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Приложение для заметок"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Приложения для написания заметок на вашем устройстве"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"заметки"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Кошелек по умолчанию"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Приложение-кошелек"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"В приложении-кошельке можно хранить кредитные карты, карты постоянного клиента, автомобильные ключи и другие цифровые продукты. С его помощью удобнее проводить различные типы транзакций."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Использовать приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" как кошелек по умолчанию?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Разрешения не требуются."</string>
<string name="request_role_current_default" msgid="738722892438247184">"Используется по умолчанию"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Больше не спрашивать"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"По умолчанию"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Обновление сведений о передаче данных"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Некоторые приложения изменили подход к передаче данных о вашем местоположении."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Настройки"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Последний доступ: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Последний доступ вчера: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Последний доступ: <xliff:g id="TIME_DATE_0">%1$s</xliff:g>, <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ваш одноразовый код: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-si-v34/strings.xml b/PermissionController/res/values-si-v34/strings.xml
index 26121467a..a5f474e0e 100644
--- a/PermissionController/res/values-si-v34/strings.xml
+++ b/PermissionController/res/values-si-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"ස්ථාන ප්‍රවේශය"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"යෙදුම් සහ සේවා සඳහා. මෙම සැකසීම ක්‍රියාවිරහිත නම්, ඔබ හදිසි ඇමතුම් අංකයක් අමතන විට මයික්‍රෆෝනයේ දත්ත තවම බෙදා ගත හැක."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"යෙදුම් සහ සේවා සඳහා"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"සීමා කළ සැකසීම"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"ඔබේ ආරක්ෂාව සඳහා, මෙම සැකසීම දැනට නොමැත."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"තව දැන ගන්න"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-si-watch/strings.xml b/PermissionController/res/values-si-watch/strings.xml
index 48c5164f6..a6292c8c3 100644
--- a/PermissionController/res/values-si-watch/strings.xml
+++ b/PermissionController/res/values-si-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"වෙනස් කළ නොහැකිය"</string>
<string name="generic_yes" msgid="2489207724988649846">"ඔව්"</string>
<string name="generic_cancel" msgid="2631708607129269698">"අවලංගු කරන්න"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"සෑම විටම"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"යෙදුම භාවිතා කරන අතරේ"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"සෑම විටම"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"යෙදුම භාවිතා කරන අතරේ"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"සෑම විටම"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"යෙදුම භාවිතා කරන අතරේ"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"සෑම විටම"</string>
</resources>
diff --git a/PermissionController/res/values-si/strings.xml b/PermissionController/res/values-si/strings.xml
index fc722dec7..d4f0c9ef5 100644
--- a/PermissionController/res/values-si/strings.xml
+++ b/PermissionController/res/values-si/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"සියලු අවසර"</string>
<string name="other_permissions" msgid="2901186127193849594">"වෙනත් යෙදුම් හැකියාවන්"</string>
<string name="permission_request_title" msgid="8790310151025020126">"අවසර ඉල්ලීම"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear මත ස්ථාපන/අස්ථාපනය ක්‍රියා සහාය දක්වන්නේ නැත."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; හට පිවිසීමට ඉඩ දෙන දේ තෝරන්න"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; යාවත්කාලීන කර ඇත. මෙම යෙදුමට පිවිසීමට ඉඩ දෙන දේ තෝරන්න."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"අවලංගු කරන්න"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"යෙදුම භාවිත කර නැති නම් අවසර ඉවත් කරන්න"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"අවසර ඉවත් කරන්න සහ ඉඩ හිස් කරන්න"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"භාවිත නොකළේ නම් යෙදුම් ක්‍රියාකාරකම් විරාම කරන්න"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"යෙදුම භාවිතා නොකළේ නම් කළමනාකරණය කරන්න"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"අවසර ඉවත් කරන්න, තාවකාලික ගොනු මකන්න සහ දැනුම්දීම් නවත්වන්න"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"අවසර ඉවත් කරන්න, තාවකාලික ගොනු මකා දමන්න, දැනුම්දීම් නවත්වන්න, සහ යෙදුම ලේඛනාරක්ෂණය කරන්න"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"ඔබගේ දත්ත ආරක්ෂා කිරීම සඳහා, යෙදුම මාස කිහිපයක් භාවිතා නොකරන්නේ නම් මෙම යෙදුම සඳහා අවසර ඉවත් කරනු ලැබේ."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"ඔබගේ දත්ත ආරක්ෂා කිරීම සඳහා, යෙදුම මාස කිහිපයක් භාවිතා නොකරන්නේ නම් පහත අවසර ඉවත් කරනු ලැබේ: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ඔබේ දත්ත ආරක්ෂා කිරීමට, ඔබ මාස කීපයක් තුළ භාවිත කර නැති යෙදුම්වලින් අවසර ඉවත් කර ඇත"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"සටහන් යෙදුම"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ඔබේ උපාංගයෙහි සටහන් ගැනීමට ඔබට ඉඩ දෙන යෙදුම්"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"සටහන්"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"පෙරනිමි පසුම්බි යෙදුම"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"පසුම්බි යෙදුම"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"පසුම්බි යෙදුම්වලට විවිධ ආකාරයේ ගනුදෙනුවලට උදවු කිරීමට ඔබේ ණය සහ ලැදියා කාඩ්පත්, මෝටර් රථ යතුරු සහ වෙනත් දේවල් ගබඩා කළ හැක."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"ඔබේ පෙරනිමි පසුම්බි යෙදුම ලෙස <xliff:g id="APP_NAME">%1$s</xliff:g> සකසන්න ද?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"අවසර අවශ්‍ය නැත"</string>
<string name="request_role_current_default" msgid="738722892438247184">"වත්මන් පෙරනිමිය"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"නැවත නොඅසන්න"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"පෙරනිමි ලෙස සකසන්න"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"දත්ත බෙදා ගැනීමේ යාවත්කාලීන"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"සමහර යෙදුම් ඒවා ඔබේ ස්ථාන දත්ත බෙදා ගත හැකි ආකාරය වෙනස් කර ඇත"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"සැකසීම්"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"ප්‍රවේශ වූයේ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"ප්‍රවේශ වූයේ ඊයේ <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"ප්‍රවේශ වූයේ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ඔබේ එක් වරක මුරපදය 132435 වේ"</string>
</resources>
diff --git a/PermissionController/res/values-sk-v34/strings.xml b/PermissionController/res/values-sk-v34/strings.xml
index 5f84f5059..9eeb35440 100644
--- a/PermissionController/res/values-sk-v34/strings.xml
+++ b/PermissionController/res/values-sk-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Prístup k polohe"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Pre aplikácie a služby. Keď je toto nastavenie vypnuté a zavoláte na tiesňovú linku, údaje mikrofónu sa môžu stále zdieľať."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Pre aplikácie a služby"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Obmedzené nastavenie"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Z bezpečnostných dôvodov nie je toto nastavenie momentálne k dispozícii."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Ďalšie informácie"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sk-watch/strings.xml b/PermissionController/res/values-sk-watch/strings.xml
index 8667362bb..1a7e89701 100644
--- a/PermissionController/res/values-sk-watch/strings.xml
+++ b/PermissionController/res/values-sk-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nedá sa zmeniť"</string>
<string name="generic_yes" msgid="2489207724988649846">"Áno"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Zrušiť"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Po celý čas"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Pri používaní"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Po celý čas"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Pri používaní"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Po celý čas"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Pri používaní"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Po celý čas"</string>
</resources>
diff --git a/PermissionController/res/values-sk/strings.xml b/PermissionController/res/values-sk/strings.xml
index 6680ddad9..c52eef65a 100644
--- a/PermissionController/res/values-sk/strings.xml
+++ b/PermissionController/res/values-sk/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Všetky povolenia"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ďalšie možnosti aplikácie"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Žiadosť o povolenie"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear nepodporuje akciu inštalácie/odinštalovania."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Vyberte, k čomu môže pristupovať aplikácia &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikácia &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; bola aktualizovaná. Vyberte, k čomu bude mať prístup."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Zrušiť"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Odstrániť povolenia, ak sa aplikácia nepoužíva"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Odstraňovať povol. a uvoľňovať priestor"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pozastaviť aktivitu v nepoužívaných apl."</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Spravovať aplikáciu, ak sa nepoužíva"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Odstrániť povolenia, vymazať dočasné súbory a zastaviť upozornenia"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Odstrániť povolenia, vymazať dočasné súbory, zastaviť upozornenia a archivovať aplikáciu"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Ak túto aplikáciu niekoľko mesiacov nepoužijete, v záujme ochrany vašich údajov budú odstránené jej povolenia."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ak túto aplikáciu niekoľko mesiacov nepoužijete, v záujme ochrany vašich údajov budú odstránené tieto povolenia: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"V záujme ochrany vašich údajov boli odobrané povolenia aplikáciám, ktoré ste niekoľko mesiacov nepoužívali."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikácia na poznámky"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikácie, ktoré vám v zariadení umožňujú písať poznámky"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"poznámky"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Predvolená aplik. s peňaženkou"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikácia s peňaženkou"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikácie s peňaženkou môžu uložiť vaše kreditné alebo vernostné karty, kľúče od auta a iné položky, aby vám mohli pomáhať s rôznymi druhmi transakcií."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Chcete nastaviť <xliff:g id="APP_NAME">%1$s</xliff:g> ako predvolenú aplikáciu s peňaženkou?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nie sú potrebné žiadne povolenia"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Aktuálne predvolená"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Nabudúce sa nepýtať"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Nastav. ako predvol."</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Aktualizácie zdieľania údajov"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Niektoré aplikácie zmenili spôsob zdieľania údajov o polohe"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Nastavenia"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Otvorené <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Otvorené včera <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Otvorené <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Jednorazové heslo je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-sl-v34/strings.xml b/PermissionController/res/values-sl-v34/strings.xml
index 18afff3d1..c2eb5036f 100644
--- a/PermissionController/res/values-sl-v34/strings.xml
+++ b/PermissionController/res/values-sl-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Dostop do lokacije"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Za aplikacije in storitve. Če je ta nastavitev izklopljena, bodo podatki mikrofona morda še vedno deljeni, ko pokličete številko za klic v sili."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Za aplikacije in storitve."</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Omejena nastavitev"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Zaradi vaše varnosti ta nastavitev trenutno ni na voljo."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Več o tem"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sl-watch/strings.xml b/PermissionController/res/values-sl-watch/strings.xml
index 83cff82ee..f93ba26b5 100644
--- a/PermissionController/res/values-sl-watch/strings.xml
+++ b/PermissionController/res/values-sl-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Ni mogoče sprem."</string>
<string name="generic_yes" msgid="2489207724988649846">"Da"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Prekliči"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Ves čas"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Med uporabo aplikacije"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Ves čas"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Med uporabo aplikacije"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Ves čas"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Med uporabo aplikacije"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Ves čas"</string>
</resources>
diff --git a/PermissionController/res/values-sl/strings.xml b/PermissionController/res/values-sl/strings.xml
index d4b8a1037..7d3e14d84 100644
--- a/PermissionController/res/values-sl/strings.xml
+++ b/PermissionController/res/values-sl/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Vsa dovoljenja"</string>
<string name="other_permissions" msgid="2901186127193849594">"Druge zmožnosti aplikacije"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Zahteva za dovoljenje"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Dejanja namestitve in odstranitve v sistemu Android Wear niso podprta."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Izberite, do česa aplikaciji &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; dovolite dostop"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Aplikacija &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; je posodobljena. Izberite, do česa tej aplikaciji dovolite dostop."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Prekliči"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Odstrani dovoljenja, če aplikacija ni v uporabi"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Odstrani dovoljenja in sprosti prostor"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Zaustavi dejavnost aplikacije ob neuporabi"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Upravljanje aplikacije ob neuporabi"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Dovoljenja se odstranijo, začasne datoteke se izbrišejo in prikazovanje obvestil se ustavi."</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Odstranitev dovoljenj, izbris začasnih datotek, ustavitev prikazovanja obvestil in arhiviranje aplikacije"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Z namenom zaščite podatkov bodo dovoljenja za to aplikacijo odstranjena, če je več mesecev ne boste uporabljali."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Če aplikacije več mesecev ne boste uporabljali, bodo z namenom zaščite podatkov odstranjena ta dovoljenja: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Z namenom zaščite podatkov so bila odstranjena dovoljenja za aplikacije, ki jih več mesecev niste uporabljali."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacija za zapiske"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacije, ki vam omogočajo ustvarjanje zapiskov v napravi."</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"zapiski"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Privzeta aplikacija denarnice"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacija denarnice"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"V aplikacijah denarnice lahko shranite kreditne kartice in kartice zvestobe, avtomobilske ključe ter druge stvari, ki vam omogočajo različne oblike transakcij."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Želite nastaviti <xliff:g id="APP_NAME">%1$s</xliff:g> kot privzeto aplikacijo denarnice?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nobeno dovoljenje ni potrebno"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Trenutna privzeta nastavitev"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ne vprašaj me več"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Nastavi kot privzeto"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Posodobitve deljenja podatkov"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Nekatere aplikacije so spremenile način deljenja vaših lokacijskih podatkov."</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Nastavitve"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Zadnji dostop: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Zadnji dostop včeraj: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Zadnji dostop: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Enkratno geslo je 132435"</string>
</resources>
diff --git a/PermissionController/res/values-sq-v34/strings.xml b/PermissionController/res/values-sq-v34/strings.xml
index bf9c922cd..65fc8e9ed 100644
--- a/PermissionController/res/values-sq-v34/strings.xml
+++ b/PermissionController/res/values-sq-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Qasja te vendndodhja"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Për aplikacionet dhe shërbimet. Nëse ky cilësim është joaktiv, të dhënat e mikrofonit mund të vazhdojnë të ndahen kur telefonon një numër urgjence."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Për aplikacionet dhe shërbimet"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Cilësim i kufizuar"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Për sigurinë tënde, ky cilësim nuk ofrohet për momentin."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Mëso më shumë"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sq-watch/strings.xml b/PermissionController/res/values-sq-watch/strings.xml
index 3043bf520..cddff97c5 100644
--- a/PermissionController/res/values-sq-watch/strings.xml
+++ b/PermissionController/res/values-sq-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Nuk mund të ndryshohet"</string>
<string name="generic_yes" msgid="2489207724988649846">"Po"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Anulo"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Gjatë gjithë kohës"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Kur përdor aplikacionin"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Gjatë gjithë kohës"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Kur përdor aplikacionin"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Gjatë gjithë kohës"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Kur përdor aplikacionin"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Gjatë gjithë kohës"</string>
</resources>
diff --git a/PermissionController/res/values-sq/strings.xml b/PermissionController/res/values-sq/strings.xml
index a32dfb4f7..6b3eb1f7e 100644
--- a/PermissionController/res/values-sq/strings.xml
+++ b/PermissionController/res/values-sq/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Të gjitha lejet"</string>
<string name="other_permissions" msgid="2901186127193849594">"Kapacitete të tjera të aplikacionit"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Kërkesa e lejes"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Instalo/çinstalo veprimet që nuk mbështeten në Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Zgjidh se ku do të lejohet të ketë qasje &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; është përditësuar. Zgjidh se ku do të lejohet të ketë qasje ky aplikacion."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Anulo"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Hiq lejet nëse aplikacioni nuk është përdorur"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Hiq lejet dhe liro hapësirën"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Ndërprit aktivitetin nëse nuk përdoret"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Menaxho aplikacionin nëse nuk përdoret"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Hiq lejet, fshi skedarët e përkohshëm dhe ndalo njoftimet"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Hiq lejet, fshi skedarët e përkohshëm, ndalo njoftimet dhe arkivo aplikacionin"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Për të mbrojtur të dhënat e tua, lejet për këtë aplikacion do të hiqen nëse aplikacioni nuk përdoret për disa muaj."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Për të mbrojtur të dhënat e tua, nëse aplikacioni nuk është përdorur për disa muaj, lejet e mëposhtme do të hiqen: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Për të mbrojtur të dhënat e tua, lejet janë hequr nga aplikacionet që nuk i ke përdorur për disa muaj."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Aplikacioni për shënime"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Aplikacione që të lejojnë të mbash shënime në pajisjen tënde"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"shënime"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Aplikacioni i parazgjedhur i portofolit"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Aplikacioni i portofolit"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Aplikacionet e portofolit mund të ruajnë kartat e tua të kreditit dhe të besnikërisë, çelësat e makinës dhe gjëra të tjera për të të ndihmuar për forma të ndryshme transaksionesh."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Të caktohet <xliff:g id="APP_NAME">%1$s</xliff:g> si aplikacioni yt i parazgjedhur i portofolit?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Nuk nevojitet asnjë leje"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Parazgjedhja aktuale"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Mos pyet më"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Cakto si parazgjedhje"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Përditësimet për ndarjen e të dhënave"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Disa aplikacione ndryshuan mënyrën se si mund të ndajnë të dhënat e vendndodhjes sate"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Cilësimet"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Qasja e fundit në <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Qasja e fundit dje në <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Qasja e fundit më <xliff:g id="TIME_DATE_0">%1$s</xliff:g> në <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Fjalëkalimi yt njëpërdorimësh është 132435"</string>
</resources>
diff --git a/PermissionController/res/values-sr-v34/strings.xml b/PermissionController/res/values-sr-v34/strings.xml
index 89233996c..b9476a83b 100644
--- a/PermissionController/res/values-sr-v34/strings.xml
+++ b/PermissionController/res/values-sr-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Приступ локацији"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"За апликације и услуге. Ако је ово подешавање искључено, подаци микрофона могу и даље да се деле када позовете број за хитне случајеве"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"За апликације и услуге"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Ограничено подешавање"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ово подешавање је тренутно недоступно ради ваше безбедности."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Сазнајте више"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sr-watch/strings.xml b/PermissionController/res/values-sr-watch/strings.xml
index 6d9cff946..6f21adc03 100644
--- a/PermissionController/res/values-sr-watch/strings.xml
+++ b/PermissionController/res/values-sr-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Не може да се промени"</string>
<string name="generic_yes" msgid="2489207724988649846">"Да"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Откажи"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Све време"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"При коришћењу апликације"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Све време"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"При коришћењу апликације"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Све време"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"При коришћењу апликације"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Све време"</string>
</resources>
diff --git a/PermissionController/res/values-sr/strings.xml b/PermissionController/res/values-sr/strings.xml
index 847f95fbb..67c85b7ca 100644
--- a/PermissionController/res/values-sr/strings.xml
+++ b/PermissionController/res/values-sr/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Све дозволе"</string>
<string name="other_permissions" msgid="2901186127193849594">"Остале могућности апликације"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Захтев за дозволу"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Радње Инсталирај/Деинсталирај нису подржане у Wear-у."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Изаберите чему &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; може да приступа"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Апликација &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; је ажурирана. Изаберите чему ова апликација може да приступа."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Откажи"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Уклони дозволе ако се апликација не користи"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Уклони дозволе и ослободи простор"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Паузирај активности ако се не користи"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Управљајте апликацијом ако се не користи"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Уклоните дозволе, избришите привремене фајлове и зауставите обавештења"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Уклоните дозволе, избришите привремене фајлове, зауставите обавештења и архивирајте апликацију"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Ради заштите података, дозволе за ову апликацију се уклањају ако се апликација не користи пар месеци."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ради заштите података, следеће дозволе се уклањају ако се апликација не користи пар месеци: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Ради заштите података, дозволе су уклоњене из апликација које нисте користили пар месеци."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Апликација за белешке"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Апликације које вам омогућавају да правите белешке на уређају"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"белешке"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Подразумевана апликација Новчаник"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Апликација Новчаник"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Апликације Новчаник могу да чувају ваше кредитне картице и картице лојалности, кључеве од аутомобила и друге ствари како би вам помогли при различитим трансакцијама."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Желите да подесите <xliff:g id="APP_NAME">%1$s</xliff:g> као подразумевану апликацију Новчаник?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Није потребна ниједна дозвола"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Тренутно подразумевана"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Не питај поново"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Подеси као подразум."</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Ажурирања за дељење података"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Неке апликације су промениле начин на који могу да деле податке о локацији"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Подешавања"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Приступано: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Приступано јуче: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Приступано: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Једнократна лозинка је 132435"</string>
</resources>
diff --git a/PermissionController/res/values-sv-v34/strings.xml b/PermissionController/res/values-sv-v34/strings.xml
index 09e204e2e..6d9e6c019 100644
--- a/PermissionController/res/values-sv-v34/strings.xml
+++ b/PermissionController/res/values-sv-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Platsåtkomst"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"För appar och tjänster. Om inställningen är inaktiverad kan mikrofondata fortfarande delas när du ringer ett nödnummer"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"För appar och tjänster"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Begränsad inställning"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Av säkerhetsskäl är den här inställningen inte tillgänglig för närvarande."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Läs mer"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sv-watch/strings.xml b/PermissionController/res/values-sv-watch/strings.xml
index 0a170e27e..9086da508 100644
--- a/PermissionController/res/values-sv-watch/strings.xml
+++ b/PermissionController/res/values-sv-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Kan inte ändras"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ja"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Avbryt"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Hela tiden"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"När appen används"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Hela tiden"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"När appen används"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Hela tiden"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"När appen används"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Hela tiden"</string>
</resources>
diff --git a/PermissionController/res/values-sv/strings.xml b/PermissionController/res/values-sv/strings.xml
index 350d6528c..e95503ed0 100644
--- a/PermissionController/res/values-sv/strings.xml
+++ b/PermissionController/res/values-sv/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Alla behörigheter"</string>
<string name="other_permissions" msgid="2901186127193849594">"Andra appbehörigheter"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Behörighetsbegäran"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Åtgärder för att installera/avinstallera stöds inte på Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Välj vad du vill ge &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; åtkomst till"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; har uppdaterats. Välj vad du vill ge appen åtkomst till."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Avbryt"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ta bort behörigheter om en app inte används"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ta bort behörigheter och frigör utrymme"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausa appaktivitet om appen inte används"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Hantera appen om den inte används"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Ta bort behörigheter, radera tillfälliga filer och hindra aviseringar"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Ta bort behörigheter, radera tillfälliga filer, hindra aviseringar och arkivera appen"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Behörigheter tas bort av säkerhetsskäl från den här appen om den inte används på några månader."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Följande behörigheter tas bort av säkerhetsskäl från appen om den inte används på några månader: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Behörigheter har tagits bort av säkerhetsskäl från appar som inte har använts på några månader."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Anteckningsapp"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Appar som låter dig göra anteckningar på enheten"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"anteckningar"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Standardplånboksapp"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Plånboksapp"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Plånboksappar kan lagra dina kredit- och stamkundskort, bilnycklar och andra saker som hjälper till med olika sorters transaktioner."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Vill du ställa in <xliff:g id="APP_NAME">%1$s</xliff:g> som din standardplånboksapp?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Inga behörigheter krävs"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Nuvarande standardapp"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Fråga inte igen"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Ange som standard"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Uppdateringar av datadelning"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"En del appar har ändrat hur de kan dela din platsdata"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Inställningar"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Öppnades <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Öppnades i går <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Öppnades <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ditt engångslösenord är 132435"</string>
</resources>
diff --git a/PermissionController/res/values-sw-v34/strings.xml b/PermissionController/res/values-sw-v34/strings.xml
index be6f2f72b..2d8e0c5b0 100644
--- a/PermissionController/res/values-sw-v34/strings.xml
+++ b/PermissionController/res/values-sw-v34/strings.xml
@@ -22,6 +22,15 @@
<string name="health_connect_title" msgid="2132233890867430855">"Health Connect"</string>
<string name="health_connect_summary" msgid="815473513776882296">"Dhibiti uwezo wa programu wa kufikia data ya afya"</string>
<string name="location_settings" msgid="8863940440881290182">"Uwezo wa kufikia mahali"</string>
- <string name="mic_toggle_description" msgid="1504101620086616040">"Kwenye programu na huduma. Mipangilio hii ikizimwa, data ya maikrofoni bado inaweza ikashirikiwa unapopiga nambari ya dharura"</string>
+ <string name="mic_toggle_description" msgid="1504101620086616040">"Kwenye programu na huduma. Mipangilio hii ikizimwa, data ya maikrofoni bado inaweza ikashirikiwa unapopiga namba ya dharura"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Kwenye programu na huduma"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Mipangilio iliyozuiliwa"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ili kulinda usalama wako, mpangilio huu haupatikani kwa sasa."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Pata maelezo zaidi"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-sw-watch/strings.xml b/PermissionController/res/values-sw-watch/strings.xml
index b23b8b022..e6eb0999d 100644
--- a/PermissionController/res/values-sw-watch/strings.xml
+++ b/PermissionController/res/values-sw-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Haiwezi kubadilishwa"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ndiyo"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Ghairi"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Muda wote"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Unapotumia programu"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Muda wote"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Unapotumia programu"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Muda wote"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Unapotumia programu"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Muda wote"</string>
</resources>
diff --git a/PermissionController/res/values-sw/strings.xml b/PermissionController/res/values-sw/strings.xml
index 689ed6f9e..213786fd0 100644
--- a/PermissionController/res/values-sw/strings.xml
+++ b/PermissionController/res/values-sw/strings.xml
@@ -67,7 +67,7 @@
<string name="review_permission_decisions" msgid="309559429150613632">"Uamuzi wa ruhusa wa hivi majuzi"</string>
<string name="review_permission_decisions_view_all" msgid="90391040431566130">"Angalia uamuzi wa ruhusa zote za hivi majuzi"</string>
<string name="review_permission_decisions_empty" msgid="8120775336417279806">"Hakuna uamuzi wa ruhusa wa hivi majuzi"</string>
- <string name="auto_permission_manager_summary" msgid="9157438376234301354">"Dhibiti ufikiaji wa data kwenye kalenda, rekodi za nambari za simu na zaidi"</string>
+ <string name="auto_permission_manager_summary" msgid="9157438376234301354">"Dhibiti ufikiaji wa data kwenye kalenda, rekodi za namba za simu na zaidi"</string>
<string name="granted_permission_decision" msgid="7824827491551861365">"Umeipa <xliff:g id="APP_NAME">%1$s</xliff:g> ruhusa ya kufikia <xliff:g id="PERMISSION_NAME">%2$s</xliff:g>"</string>
<string name="denied_permission_decision" msgid="5308961501779563781">"Umeinyima <xliff:g id="APP_NAME">%1$s</xliff:g> ruhusa ya kufikia <xliff:g id="PERMISSION_NAME">%2$s</xliff:g>"</string>
<string name="days_ago" msgid="6650359081551335629">"{count,plural, =0{Leo}=1{Siku moja iliyopita}other{Siku # zilizopita}}"</string>
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Ruhusa zote"</string>
<string name="other_permissions" msgid="2901186127193849594">"Uwezo mwingine wa programu"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Ombi la idhini"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Huduma ya Android Wear haiwezi kutekeleza vitendo vya Kusakinisha au Kuondoa vipengee."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Chagua vipengee ambavyo unaruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; imesasishwa. Chagua vipengee unavyoruhusu programu hii ifikie."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Ghairi"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ondoa ruhusa ikiwa programu haitumiki"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ondoa ruhusa na upate nafasi"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Simamisha shughuli kwenye programu ikiwa haitumiki"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Dhibiti programu iwapo haitumiki"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Ondoa ruhusa, futa faili za muda na usitishe arifa"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Ondoa ruhusa, futa faili za muda, komesha arifa na uweke programu kwenye kumbukumbu"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Ili kulinda data yako, ruhusa za programu hii zitaondolewa programu isipotumika kwa miezi michache."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ili kulinda data yako, programu isipotumika kwa miezi michache, ruhusa zifuatazo zitaondolewa: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Ili kulinda data yako, ruhusa zimeondolewa kwenye programu ambazo hujatumia kwa miezi michache."</string>
@@ -365,7 +365,7 @@
<string name="role_dialer_search_keywords" msgid="3324448983559188087">"kipiga simu"</string>
<string name="role_sms_label" msgid="8456999857547686640">"Programu chaguomsingi ya SMS"</string>
<string name="role_sms_short_label" msgid="4371444488034692243">"Programu ya SMS"</string>
- <string name="role_sms_description" msgid="3424020199148153513">"Programu zinazokuruhusu kutumia nambari yako ya simu kutuma na kupokea ujumbe mfupi, picha, video na zaidi"</string>
+ <string name="role_sms_description" msgid="3424020199148153513">"Programu zinazokuruhusu kutumia namba yako ya simu kutuma na kupokea ujumbe mfupi, picha, video na zaidi"</string>
<string name="role_sms_request_title" msgid="7953552109601185602">"Ungependa kuweka <xliff:g id="APP_NAME">%1$s</xliff:g> iwe programu yako chaguomsingi ya SMS?"</string>
<string name="role_sms_request_description" msgid="2691004766132144886">"Programu hii itapewa uwezo wa kufikia Kamera, Anwani, Faili na maudhui, Maikrofoni, Simu na SMS kwenye kifaa chako"</string>
<string name="role_sms_search_keywords" msgid="8022048144395047352">"SMS, kutuma SMS, ujumbe, kutuma ujumbe"</string>
@@ -383,12 +383,12 @@
<string name="role_home_search_keywords" msgid="3830755001192666285">"kifungua programu"</string>
<string name="role_call_redirection_label" msgid="5785304207206147590">"Programu chaguomsingi ya kuelekeza simu kwingine"</string>
<string name="role_call_redirection_short_label" msgid="7568143419571217757">"Programu ya kuelekeza simu"</string>
- <string name="role_call_redirection_description" msgid="6091669882014664420">"Programu zinazokuruhusu usambaze simu unazopiga kwenye nambari nyingine ya simu"</string>
+ <string name="role_call_redirection_description" msgid="6091669882014664420">"Programu zinazokuruhusu usambaze simu unazopiga kwenye namba nyingine ya simu"</string>
<string name="role_call_redirection_request_title" msgid="2816244455003562925">"Je, ungependa kuweka <xliff:g id="APP_NAME">%1$s</xliff:g> iwe programu yako chaguomsingi ya kuelekeza simu kwingine?"</string>
<string name="role_call_redirection_request_description" msgid="3118895714178527164">"Hakuna ruhusa zinazohitajika"</string>
<string name="role_call_screening_label" msgid="883935222060878724">"Kutambua taka na anayepiga: programu msingi"</string>
<string name="role_call_screening_short_label" msgid="2048465565063130834">"Kutambua anayepiga na taka"</string>
- <string name="role_call_screening_description" msgid="2349431420497468981">"Programu zinazokuruhusu utambue simu zinazoingia na kuzuia taka, simu zinazopigwa kiotomatiki au nambari zisizohitajika"</string>
+ <string name="role_call_screening_description" msgid="2349431420497468981">"Programu zinazokuruhusu utambue simu zinazoingia na kuzuia taka, simu zinazopigwa kiotomatiki au namba zisizohitajika"</string>
<string name="role_call_screening_request_title" msgid="7358309224566977290">"Je, ungependa kuweka <xliff:g id="APP_NAME">%1$s</xliff:g> iwe programu chaguomsingi ya kukagua kitambulisho cha anayepiga na taka?"</string>
<string name="role_call_screening_request_description" msgid="7338511921032446006">"Hakuna ruhusa zinazohitajika"</string>
<string name="role_automotive_navigation_label" msgid="2701890757955474751">"Programu chaguomsingi ya maelekezo"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Programu ya madokezo"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Programu zinazokuruhusu uandike madokezo kwenye kifaa chako"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"madokezo"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Programu chaguomsingi ya pochi"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Programu ya pochi"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Unaweza kuhifadhi kadi zako za mikopo na za kutuza uaminifu, funguo za magari na mengine kwenye programu za Pochi ili kukusaidia kufanya miamala mbalimbali."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Ungependa kuweka <xliff:g id="APP_NAME">%1$s</xliff:g> iwe programu yako chaguomsingi ya pochi?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Hakuna ruhusa zinazohitajika"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Chaguomsingi ya sasa"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Isiniulize tena"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Weka iwe chaguomsingi"</string>
@@ -512,8 +517,8 @@
<string name="permgroupupgraderequest_camera" msgid="640758449200241582">"Ungependa kubadilisha ruhusa za &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; za kufikia kamera?"</string>
<string name="permgroupupgraderequest_device_aware_camera" msgid="4198765626608612156">"Ungependa kubadilisha idhini ya kufikia ya kamera ya &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; kwenye &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt; yako?"</string>
<string name="permgroupupgraderequestdetail_camera" msgid="6642747548010962597">"Programu hii inataka kupiga picha na kurekodi video kila wakati, hata wakati huitumii."<annotation id="link">"Ruhusu katika mipangilio."</annotation></string>
- <string name="permgrouprequest_calllog" msgid="2065327180175371397">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie rekodi zako za nambari za simu?"</string>
- <string name="permgrouprequest_device_aware_calllog" msgid="735079772627778095">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie rekodi za nambari za simu yako kwenye &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt; yako?"</string>
+ <string name="permgrouprequest_calllog" msgid="2065327180175371397">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie rekodi zako za namba za simu?"</string>
+ <string name="permgrouprequest_device_aware_calllog" msgid="735079772627778095">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie rekodi za namba za simu yako kwenye &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt; yako?"</string>
<string name="permgrouprequest_phone" msgid="1829234136997316752">"Ungependa kuruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; kupiga na kudhibiti simu?"</string>
<string name="permgrouprequest_device_aware_phone" msgid="4389610977195521813">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ipige na kudhibiti simu kwenye &lt;b&gt;<xliff:g id="DEVICE">%2$s</xliff:g>&lt;/b&gt; yako?"</string>
<string name="permgrouprequest_sensors" msgid="4397358316850652235">"Ungependa kuiruhusu &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifikie data ya vitambuzi kuhusu viashiria muhimu vya mwili wako?"</string>
@@ -547,7 +552,7 @@
<string name="blocked_microphone_title" msgid="1631517143648232585">"Maikrofoni ya kifaa imezuiwa"</string>
<string name="blocked_location_title" msgid="2005608279812892383">"Utambuzi wa mahali kifaa kilipo umezimwa"</string>
<string name="blocked_sensor_summary" msgid="4443707628305027375">"Kwa ajili ya programu na huduma"</string>
- <string name="blocked_mic_summary" msgid="8960466941528458347">"Huenda bado data ya maikrofoni ikashirikiwa unapopigia nambari ya dharura."</string>
+ <string name="blocked_mic_summary" msgid="8960466941528458347">"Huenda bado data ya maikrofoni ikashirikiwa unapopigia namba ya dharura."</string>
<string name="blocked_sensor_button_label" msgid="6742092634984289658">"Badilisha"</string>
<string name="safety_center_dashboard_page_title" msgid="2810774008694315854">"Usalama na faragha"</string>
<string name="safety_center_rescan_button" msgid="4517514567809409596">"Kagua kifaa"</string>
@@ -609,7 +614,7 @@
<string name="camera_toggle_title" msgid="1251201397431837666">"Ufikiaji wa kamera"</string>
<string name="mic_toggle_title" msgid="2649991093496110162">"Ufikiaji wa maikrofoni"</string>
<string name="perm_toggle_description" msgid="7801326363741451379">"Kwenye programu na huduma"</string>
- <string name="mic_toggle_description" msgid="9163104307990677157">"Kwenye programu na huduma. Mipangilio hii ikizimwa, huenda data ya maikrofoni ikaendelea kushirikiwa unapopiga nambari ya dharura."</string>
+ <string name="mic_toggle_description" msgid="9163104307990677157">"Kwenye programu na huduma. Mipangilio hii ikizimwa, huenda data ya maikrofoni ikaendelea kushirikiwa unapopiga namba ya dharura."</string>
<string name="location_settings_subtitle" msgid="2328360561197430695">"Angalia huduma na programu zenye uwezo wa kufikia mipangilio ya mahali"</string>
<string name="show_clip_access_notification_title" msgid="5168467637351109096">"Onyesha ufikiaji wa ubao wa kunakili"</string>
<string name="show_clip_access_notification_summary" msgid="3532020182782112687">"Onyesha ujumbe programu zinapofikia maandishi, picha au maudhui mengine uliyonakili"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Masasisho ya kushiriki data"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Baadhi ya programu zimebadilisha jinsi zinavyoweza kushiriki data ya mahali ulipo"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Mipangilio"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Kilifunguliwa <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Kilifunguliwa jana <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Kilifunguliwa <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Nenosiri lako la wakati mmoja ni 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ta-v34/strings.xml b/PermissionController/res/values-ta-v34/strings.xml
index b92b9a184..88cf50765 100644
--- a/PermissionController/res/values-ta-v34/strings.xml
+++ b/PermissionController/res/values-ta-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"இருப்பிட அணுகல்"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ஆப்ஸ் மற்றும் சேவைகளுக்கு. இந்த அமைப்பு முடக்கப்பட்டிருந்தாலும் அவசர உதவி எண்ணை நீங்கள் அழைக்கும்போது மைக்ரோஃபோன் தரவு பகிரப்படலாம்"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ஆப்ஸ் &amp; சேவைகளுக்கு"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"கட்டுப்படுத்தப்பட்ட அமைப்பு"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"உங்கள் பாதுகாப்பிற்காக, இந்த அமைப்பு தற்போது இல்லை."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"மேலும் அறிக"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ta-watch/strings.xml b/PermissionController/res/values-ta-watch/strings.xml
index 8ba5ec786..51073c144 100644
--- a/PermissionController/res/values-ta-watch/strings.xml
+++ b/PermissionController/res/values-ta-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"மாற்ற இயலாது"</string>
<string name="generic_yes" msgid="2489207724988649846">"சரி"</string>
<string name="generic_cancel" msgid="2631708607129269698">"வேண்டாம்"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"எப்போதும்"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"எப்போதும்"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"எப்போதும்"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ஆப்ஸைப் பயன்படுத்தும்போது"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"எப்போதும்"</string>
</resources>
diff --git a/PermissionController/res/values-ta/strings.xml b/PermissionController/res/values-ta/strings.xml
index 70d71f31b..5d9b82bc5 100644
--- a/PermissionController/res/values-ta/strings.xml
+++ b/PermissionController/res/values-ta/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"அனைத்து அனுமதிகளும்"</string>
<string name="other_permissions" msgid="2901186127193849594">"ஆப்ஸிற்கான பிற அனுமதிகள்"</string>
<string name="permission_request_title" msgid="8790310151025020126">"அனுமதி கோரிக்கை"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"நிறுவல்/நிறுவல் நீக்குதலை Wearரில் செய்ய இயலாது."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; எவற்றையெல்லாம் அணுகலாம் என்பதைத் தேர்வுசெய்யவும்"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; புதுப்பிக்கப்பட்டது. இந்த ஆப்ஸ் எவற்றையெல்லாம் அணுகலாம் என்பதைத் தேர்வுசெய்யவும்."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"வேண்டாம்"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"இந்த ஆப்ஸ் பயன்படுத்தப்படவில்லை என்றால் அனுமதிகளை அகற்றவும்"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"அனுமதிகளை அகற்றி இடத்தைக் காலியாக்கு"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"செயலில் இல்லாதபோது ஆப்ஸை இடைநிறுத்துதல்"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"ஆப்ஸைப் பயன்படுத்தாதபோது நிர்வகித்தல்"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"அனுமதிகளை அகற்றும், தற்காலிக ஃபைல்களை நீக்கும், அறிவிப்புகளை நிறுத்தும்"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"அனுமதிகளை அகற்றும், தற்காலிக ஃபைல்களை நீக்கும், அறிவிப்புகளை நிறுத்தும், ஆப்ஸைக் காப்பிடும்"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"இந்த ஆப்ஸைச் சில மாதங்கள் பயன்படுத்தவில்லை என்றால் உங்கள் தரவைப் பாதுகாப்பதற்காக இதற்கான அனுமதிகள் அகற்றப்படும்."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"இந்த ஆப்ஸைச் சில மாதங்கள் பயன்படுத்தவில்லை என்றால் உங்கள் தரவைப் பாதுகாப்பதற்காக பின்வரும் அனுமதிகள் அகற்றப்படும்: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"உங்கள் தரவைப் பாதுகாப்பதற்காக, கடந்த சில மாதங்களில் நீங்கள் பயன்படுத்தாத ஆப்ஸில் இருந்து அனுமதிகள் அகற்றப்பட்டன."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"குறிப்பு எடுப்பதற்கான ஆப்ஸ்"</string>
<string name="role_notes_description" msgid="8496852798616883551">"உங்கள் சாதனத்தில் குறிப்புகள் எடுக்க அனுமதிக்கும் ஆப்ஸ்"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"குறிப்புகள்"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"இயல்புநிலை வாலட் ஆப்ஸ்"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"வாலட் ஆப்ஸ்"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"பல்வேறு வகையான பரிமாற்றங்கள் தொடர்பாக உங்களுக்கு உதவ கிரெடிட் கார்டுகள், லாயல்டி கார்டுகள், கார் சாவிகள் மற்றும் பிறவற்றை வாலட் ஆப்ஸில் சேமிக்கலாம்."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> ஆப்ஸை உங்கள் இயல்புநிலை வாலட் ஆப்ஸாக அமைக்கவா?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"அனுமதிகள் தேவையில்லை"</string>
<string name="request_role_current_default" msgid="738722892438247184">"தற்போதைய இயல்பான ஆப்ஸ்"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"மீண்டும் கேட்காதே"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"இயல்பு ஆப்ஸாக அமை"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"தரவுப் பகிர்வு குறித்த அறிவிப்புகள்"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"உங்கள் இருப்பிடத் தரவைப் பகிரும் விதத்தைச் சில ஆப்ஸ் மாற்றியுள்ளன"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"அமைப்புகள்"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"அணுகிய நேரம்: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"நேற்று அணுகிய நேரம்: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"அணுகிய நேரம்: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"ஒருமுறை பயன்படுத்தப்படும் கடவுச்சொல்: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-te-v34/strings.xml b/PermissionController/res/values-te-v34/strings.xml
index c8281ea1d..cf8d48f81 100644
--- a/PermissionController/res/values-te-v34/strings.xml
+++ b/PermissionController/res/values-te-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"లొకేషన్ యాక్సెస్"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"యాప్‌లు, సర్వీస్‌ల కోసం. ఈ సెట్టింగ్ ఆఫ్ చేసి ఉన్నా కూడా, మీరు ఎమర్జెన్సీ నంబర్‌కు కాల్ చేసినప్పుడు మైక్రోఫోన్ డేటా షేర్ చేయబడవచ్చు"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"యాప్‌లు, సర్వీస్‌ల కోసం"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"పరిమితం చేయబడిన సెట్టింగ్"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"మీ సెక్యూరిటీ కోసం, ఈ సెట్టింగ్ ప్రస్తుతం అందుబాటులో లేదు."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"మరింత తెలుసుకోండి"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-te-watch/strings.xml b/PermissionController/res/values-te-watch/strings.xml
index dfd5af38f..57f32b8d3 100644
--- a/PermissionController/res/values-te-watch/strings.xml
+++ b/PermissionController/res/values-te-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"మార్చడం సాధ్యపడదు"</string>
<string name="generic_yes" msgid="2489207724988649846">"అవును"</string>
<string name="generic_cancel" msgid="2631708607129269698">"రద్దు చేయండి"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"అన్ని సమయాలలో అనుమతించండి"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"యాప్‌ను వాడుతున్నప్పుడు"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"అన్ని సమయాలలో అనుమతించండి"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"యాప్‌ను వాడుతున్నప్పుడు"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"అన్ని సమయాలలో అనుమతించండి"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"యాప్‌ను వాడుతున్నప్పుడు"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"అన్ని సమయాలలో అనుమతించండి"</string>
</resources>
diff --git a/PermissionController/res/values-te/strings.xml b/PermissionController/res/values-te/strings.xml
index 22eae448d..85543ce60 100644
--- a/PermissionController/res/values-te/strings.xml
+++ b/PermissionController/res/values-te/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"అన్ని అనుమతులు"</string>
<string name="other_permissions" msgid="2901186127193849594">"ఇతర యాప్ సామర్థ్యాలు"</string>
<string name="permission_request_title" msgid="8790310151025020126">"అనుమతి రిక్వెస్ట్‌"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android వేర్"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wearలో ఇన్‌స్టాల్/అన్ఇన్‌స్టాల్ చర్యలకు మద్దతు లేదు."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; యాక్సెస్ చేయడానికి అనుమతించాల్సిన వాటిని ఎంచుకోండి"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; అప్‌డేట్ చేయబడింది. ఈ యాప్ యాక్సెస్ చేయడానికి అనుమతించాల్సిన వాటిని ఎంచుకోండి."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"రద్దు చేయండి"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"యాప్‌ని ఉపయోగించకపోతే, అనుమతులను తీసివేయండి"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"అనుమతులను తీసివేసి స్పేస్‌ను ఖాళీ చేయండి"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"యాప్‌ను ఉపయోగించకపోతే దాని యాక్టివిటీని పాజ్ చేయండి"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"యాప్‌ను ఉపయోగించకపోతే, మేనేజ్ చేయండి"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"అనుమతులను తీసివేయండి, తాత్కాలిక ఫైళ్లను తొలగించండి, అలాగే నోటిఫికేషన్‌లను ఆపివేయండి"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"అనుమతులను తీసివేయండి, తాత్కాలిక ఫైళ్లను తొలగించండి, నోటిఫికేషన్‌లను ఆపివేయండి, యాప్‌ను ఆర్కైవ్ చేయండి"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"మీ డేటాను సురక్షితంగా ఉంచడానికి, ఈ యాప్ కొన్ని నెలలుగా వినియోగంలో లేకుంటే, దాని అనుమతులు తీసివేయబడతాయి."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"మీ డేటాను సురక్షితంగా ఉంచడానికి, ఈ యాప్ కొన్ని నెలలుగా వినియోగంలో లేకుంటే, దానికి ఇచ్చిన కింది అనుమతులు తీసివేయబడతాయి: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"మీ డేటాను సురక్షితంగా ఉంచడానికి, కొన్ని నెలలుగా వినియోగంలో లేని యాప్‌ల అనుమతులు తీసివేయబడ్డాయి."</string>
@@ -268,7 +268,7 @@
<string name="unused_apps_notification_title" msgid="4314832015894238019">"{count,plural, =1{# ఉపయోగించని యాప్}other{# ఉపయోగించని యాప్‌లు}}"</string>
<string name="unused_apps_notification_content" msgid="9195026773244581246">"అనుమతులు, తాత్కాలిక ఫైళ్లు తీసివేయబడ్డాయి అలాగే నోటిఫికేషన్‌లు ఆపివేయబడ్డాయి. రివ్యూ చేయడానికి ట్యాప్ చేయండి."</string>
<string name="unused_apps_safety_center_card_title" msgid="5638409355530099149">"అనుమతులు తీసివేయబడిన యాప్‌లను రివ్యూ చేయండి"</string>
- <string name="unused_apps_safety_center_card_content" msgid="1088557243627427820">"కొంతకాలంగా మీరు ఉపయోగించని యాప్‌లకు సంబంధించిన అనుమతులు, తాత్కాలిక ఫైల్‌లు తొలగించబడ్డాయి, అలాగే నోటిఫికేషన్‌లు నిలిపివేయబడ్డాయి."</string>
+ <string name="unused_apps_safety_center_card_content" msgid="1088557243627427820">"కొంతకాలంగా మీరు ఉపయోగించని యాప్‌లకు సంబంధించిన అనుమతులు, తాత్కాలిక ఫైళ్లు తొలగించబడ్డాయి, అలాగే నోటిఫికేషన్‌లు నిలిపివేయబడ్డాయి."</string>
<string name="unused_apps_safety_center_action_title" msgid="8865914432518993194">"యాప్‌లను రివ్యూ చేయండి"</string>
<string name="post_drive_permission_decision_reminder_title" msgid="1290697371418139976">"ఇటీవలి అనుమతులను చెక్ చేయండి"</string>
<string name="post_drive_permission_decision_reminder_summary_1_app_1_permission" msgid="670521503734140711">"డ్రైవింగ్‌లో ఉన్నప్పుడు, మీరు <xliff:g id="APP">%1$s</xliff:g> యాప్‌నకు <xliff:g id="PERMISSION">%2$s</xliff:g>‌కు యాక్సెస్‌ను ఇచ్చారు"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"నోట్స్ యాప్"</string>
<string name="role_notes_description" msgid="8496852798616883551">"మీ పరికరంలో నోట్స్ తీసుకోవడానికి మిమ్మల్ని అనుమతించే యాప్‌లు"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"నోట్స్"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"డిఫాల్ట్ వాలెట్ యాప్"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"వాలెట్ యాప్"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"వాలెట్ యాప్‌లు మీ క్రెడిట్‌ను, లాయల్టీ కార్డ్‌లను, కార్ కీలను, ఇంకా వివిధ రకాల లావాదేవీలకు సహాయపడటానికి ఇతర వస్తువులను స్టోర్ చేయగలవు."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>‌ను డిఫాల్ట్ వాలెట్ యాప్‌గా సెట్ చేయాలా?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"అనుమతులు ఏవీ అవసరం లేదు"</string>
<string name="request_role_current_default" msgid="738722892438247184">"ప్రస్తుతం ఆటోమేటిక్‌గా ఉంది"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"మళ్లీ అడగవద్దు"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ఆటోమేటిక్ చేయండి"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"డేటా షేరింగ్ అప్‌డేట్‌లు"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"కొన్ని యాప్‌లు మీ లొకేషన్ డేటాను షేర్ చేయగల విధానాన్ని మార్చాయి"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"సెట్టింగ్‌లు"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>‌కు యాక్సెస్‌ చేశారు"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"నిన్న <xliff:g id="TIME_DATE">%1$s</xliff:g>‌కు యాక్సెస్‌ చేశారు"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g>‌న<xliff:g id="TIME_DATE_1">%2$s</xliff:g>‌కు యాక్సెస్‌ చేశారు"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"మీ ఒకసారి ఉపయోగించగల పాస్‌వర్డ్ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-th-v34/strings.xml b/PermissionController/res/values-th-v34/strings.xml
index 8e6bae837..6a3855708 100644
--- a/PermissionController/res/values-th-v34/strings.xml
+++ b/PermissionController/res/values-th-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"สิทธิ์เข้าถึงตำแหน่ง"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"สำหรับแอปและบริการ หากปิดการตั้งค่านี้ ระบบอาจยังคงแชร์ข้อมูลไมโครโฟนเมื่อคุณโทรหาหมายเลขฉุกเฉิน"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"สำหรับแอปและบริการ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"การตั้งค่าที่จำกัด"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"การตั้งค่านี้ใช้ไม่ได้ในตอนนี้เพื่อความปลอดภัยของคุณ"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"ดูข้อมูลเพิ่มเติม"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-th-watch/strings.xml b/PermissionController/res/values-th-watch/strings.xml
index db9d5dec6..8b6c60c76 100644
--- a/PermissionController/res/values-th-watch/strings.xml
+++ b/PermissionController/res/values-th-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"เปลี่ยนไม่ได้"</string>
<string name="generic_yes" msgid="2489207724988649846">"ใช่"</string>
<string name="generic_cancel" msgid="2631708607129269698">"ยกเลิก"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ตลอดเวลา"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ขณะกำลังใช้แอป"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ตลอดเวลา"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ขณะกำลังใช้แอป"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ตลอดเวลา"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ขณะกำลังใช้แอป"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ตลอดเวลา"</string>
</resources>
diff --git a/PermissionController/res/values-th/strings.xml b/PermissionController/res/values-th/strings.xml
index f960cfbaf..c9f7077fa 100644
--- a/PermissionController/res/values-th/strings.xml
+++ b/PermissionController/res/values-th/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"สิทธิ์ทั้งหมด"</string>
<string name="other_permissions" msgid="2901186127193849594">"ความสามารถอื่นๆ ของแอป"</string>
<string name="permission_request_title" msgid="8790310151025020126">"คำขอสิทธิ์"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"ไม่สามารถติดตั้ง/ถอนการติดตั้งบน Wear"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"โปรดเลือกข้อมูลที่อนุญาตให้ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; เข้าถึง"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"อัปเดต &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; แล้ว โปรดเลือกข้อมูลที่อนุญาตให้แอปนี้เข้าถึง"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"ยกเลิก"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"นำสิทธิ์ออกหากไม่ได้ใช้งานแอป"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"นำสิทธิ์ออกและเพิ่มพื้นที่ว่าง"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"หยุดกิจกรรมบนแอปไว้ชั่วคราวหากไม่ได้ใช้"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"จัดการแอปหากไม่ได้ใช้งาน"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"นำสิทธิ์ออก ลบไฟล์ชั่วคราว และหยุดการแจ้งเตือน"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"นำสิทธิ์ออก ลบไฟล์ชั่วคราว หยุดการแจ้งเตือน และเก็บแอป"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"หากคุณไม่ได้ใช้งานแอปนาน 2-3 เดือน ระบบจะนำสิทธิ์ของ​แอปนี้ออกเพื่อปกป้องข้อมูลของคุณ"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"หากไม่มีการใช้งานแอปนาน 2-3 เดือน ระบบจะปกป้องข้อมูลของคุณด้วยการนำสิทธิ์ต่อไปนี้ออก ได้แก่ <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"ระบบนำสิทธิ์ออกจากแอปที่คุณไม่ได้ใช้งานนาน 2-3 เดือนเพื่อปกป้องข้อมูลของคุณ"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"แอปโน้ต"</string>
<string name="role_notes_description" msgid="8496852798616883551">"แอปที่ให้คุณจดโน้ตในอุปกรณ์ได้"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"บันทึก"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"แอปกระเป๋าเงินเริ่มต้น"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"แอปกระเป๋าเงิน"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"แอปกระเป๋าเงินสามารถจัดเก็บบัตรเครดิต บัตรสะสมคะแนน กุญแจรถยนต์ รวมถึงสิ่งอื่นๆ เพื่อช่วยในการทำธุรกรรมรูปแบบต่างๆ"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"ตั้งค่า <xliff:g id="APP_NAME">%1$s</xliff:g> เป็นแอปกระเป๋าเงินเริ่มต้นไหม"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"ไม่ต้องใช้สิทธิ์"</string>
<string name="request_role_current_default" msgid="738722892438247184">"แอปเริ่มต้นปัจจุบัน"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"ไม่ต้องถามอีก"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"ตั้งเป็นแอปเริ่มต้น"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"การอัปเดตการแชร์ข้อมูล"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"มีบางแอปเปลี่ยนแปลงวิธีที่แอปอาจแชร์ข้อมูลตำแหน่งของคุณ"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"การตั้งค่า"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"เข้าถึงตอน <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"เข้าถึงเมื่อวานตอน <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"เข้าถึงเมื่อวันที่ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> ตอน <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"รหัสผ่านที่สามารถใช้งานได้เพียงครั้งเดียวของคุณคือ 132435"</string>
</resources>
diff --git a/PermissionController/res/values-tl-v34/strings.xml b/PermissionController/res/values-tl-v34/strings.xml
index 4ed588f80..e2948dd43 100644
--- a/PermissionController/res/values-tl-v34/strings.xml
+++ b/PermissionController/res/values-tl-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Access sa lokasyon"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Para sa mga app at serbisyo. Kung naka-off ang setting na ito, posible pa ring ibahagi ang data ng mikropono kapag tumawag ka sa isang pang-emergency na numero"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Para sa mga app at serbisyo"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Pinaghihigpitang setting"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Para sa iyong seguridad, hindi available ang setting na ito sa ngayon."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Matuto pa"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-tl-watch/strings.xml b/PermissionController/res/values-tl-watch/strings.xml
index 1719c5c5e..33191f04f 100644
--- a/PermissionController/res/values-tl-watch/strings.xml
+++ b/PermissionController/res/values-tl-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Hindi mababago"</string>
<string name="generic_yes" msgid="2489207724988649846">"Oo"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Kanselahin"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Palagi"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Habang ginagamit ang app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Palagi"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Habang ginagamit ang app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Palagi"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Habang ginagamit ang app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Palagi"</string>
</resources>
diff --git a/PermissionController/res/values-tl/strings.xml b/PermissionController/res/values-tl/strings.xml
index c17871ae5..893f939b4 100644
--- a/PermissionController/res/values-tl/strings.xml
+++ b/PermissionController/res/values-tl/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Lahat ng pahintulot"</string>
<string name="other_permissions" msgid="2901186127193849594">"Iba pang kakayahan ng app"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Kahilingan sa pagpapahintulot"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Ang mga pagkilos na I-install/I-uninstall ay hindi sinusuportahan sa Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Piliin kung ano ang papayagang i-access ng &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Na-update na ang &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Piliin kung ano ang papayagang i-access ng app na ito."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Kanselahin"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Alisin ang mga pahintulot kung hindi ginagamit ang app"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Alisin ang pahintulot, magbakante ng espasyo"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"I-pause ang aktibidad sa app kung hindi ginagamit"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Pamahalaan ang app kung hindi ginagamit"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Alisin ang mga pahintulot, i-delete ang mga pansamantalang file, at ihinto ang mga notification"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Alisin ang mga pahintulot, i-delete ang mga pansamantalang file, ihinto ang mga notification, at i-archive ang app"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Para maprotektahan ang iyong data, aalisin ang mga pahintulot para sa app na ito kapag ilang buwan nang hindi ginagamit ang app."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para maprotektahan ang iyong data, kapag ilang buwan nang hindi ginagamit ang app, aalisin ang mga sumusunod na pahintulot: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para protektahan ang iyong data, inalis na ang mga pahintulot sa mga app na ilang buwan mo nang hindi ginagamit."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notes app"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Mga app na nagbibigay-daan sa iyong magtala sa device mo"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"mga tala"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Default na wallet app"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Wallet app"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Puwedeng i-store ng mga wallet app ang iyong mga credit at loyalty card, susi ng kotse, at iba pang bagay para makatulong sa iba\'t ibang uri ng transaksyon."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Itakda ang <xliff:g id="APP_NAME">%1$s</xliff:g> bilang default mong wallet app?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Walang kailangang pahintulot"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Kasalukuyang default"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Huwag nang itanong muli"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Itakdang default"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Update sa pagbabahagi ng data"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Binago ng ilang app kung paano posibleng ibahagi ng mga ito ang iyong data ng lokasyon"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Mga Setting"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Na-access noong <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Na-access kahapon nang <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Na-access noong <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ang iyong pang-isang beses na password ay 132435"</string>
</resources>
diff --git a/PermissionController/res/values-tr-v34/strings.xml b/PermissionController/res/values-tr-v34/strings.xml
index 81d533562..0b3e0cfc4 100644
--- a/PermissionController/res/values-tr-v34/strings.xml
+++ b/PermissionController/res/values-tr-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Konum erişimi"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Uygulamalar ve hizmetler için. Bu ayar kapalıyken bir acil durum numarasını aradığınızda mikrofon verileri paylaşılmaya devam edebilir."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Uygulamalar ve hizmetler için"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Kısıtlanmış ayar"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Güvenliğiniz için bu ayar şu anda kullanılamıyor."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Daha fazla bilgi"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-tr-watch/strings.xml b/PermissionController/res/values-tr-watch/strings.xml
index d4845f76b..bdba397ff 100644
--- a/PermissionController/res/values-tr-watch/strings.xml
+++ b/PermissionController/res/values-tr-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Değiştirilemez"</string>
<string name="generic_yes" msgid="2489207724988649846">"Evet"</string>
<string name="generic_cancel" msgid="2631708607129269698">"İptal"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Her zaman"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Uygulama kullanılırken"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Her zaman"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Uygulama kullanılırken"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Her zaman"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Uygulama kullanılırken"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Her zaman"</string>
</resources>
diff --git a/PermissionController/res/values-tr/strings.xml b/PermissionController/res/values-tr/strings.xml
index 878e9155c..ec27c30c2 100644
--- a/PermissionController/res/values-tr/strings.xml
+++ b/PermissionController/res/values-tr/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Tüm izinler"</string>
<string name="other_permissions" msgid="2901186127193849594">"Diğer uygulama özellikleri"</string>
<string name="permission_request_title" msgid="8790310151025020126">"İzin isteği"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Yükleme/Yüklemeyi Kaldırma işlemleri Wear\'da desteklenmiyor."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uygulamasının nelere erişmesine izin vereceğinizi seçin"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; güncellendi. Bu uygulamanın nelere erişmesine izin verileceğini seçin."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"İptal"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Uygulama kullanılmıyorsa izinleri kaldır"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"İzinleri kaldırıp yer aç"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Kullanılmayan uygulama etkinliğini duraklat"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Kullanılmayan uygulamayı yönet"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"İzinleri kaldır, geçici dosyaları sil ve bildirimleri durdur"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"İzinleri kaldır, geçici dosyaları sil, bildirimleri durdur ve uygulamayı arşivle"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Bu uygulama birkaç ay boyunca kullanılmazsa verilerinizi korumak için uygulamanın izinleri kaldırılır."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Uygulama birkaç ay boyunca kullanılmazsa şu izinler verilerinizi korumak için kaldırılacak: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Birkaç aydır kullanmadığınız uygulamaların izinleri verilerinizi korumak için kaldırıldı."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Notlar uygulaması"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Cihazınızda not almanıza olanak tanıyan uygulamalar"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"notlar"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Varsayılan cüzdan uygulaması"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Cüzdan uygulaması"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Cüzdan uygulamaları; kredi ve bağlılık kartlarınızı, araba anahtarlarınızı ve diğer bilgileri depolayarak çeşitli işlem türlerinde size kolaylık sağlayabilir."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g>, varsayılan cüzdan uygulamanız olarak ayarlansın mı?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Herhangi bir izin gerekli değil"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Mevcut varsayılan"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Tekrar sorma"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Varsayılan olarak ayarla"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Veri paylaşımı güncellemeleri"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Bazı uygulamalar, konum verilerinizi paylaşma şeklini değiştirdi"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Ayarlar"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Erişim zamanı: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Dün saat <xliff:g id="TIME_DATE">%1$s</xliff:g> itibarıyla erişildi"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Erişim tarihi: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Tek kullanımlık şifreniz 132435"</string>
</resources>
diff --git a/PermissionController/res/values-uk-v34/strings.xml b/PermissionController/res/values-uk-v34/strings.xml
index 5d14c8ebe..a9e29e8a8 100644
--- a/PermissionController/res/values-uk-v34/strings.xml
+++ b/PermissionController/res/values-uk-v34/strings.xml
@@ -17,11 +17,20 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="security_privacy_brand_name" msgid="7303621734258440812">"Безпека й конфіденційність"</string>
+ <string name="security_privacy_brand_name" msgid="7303621734258440812">"Захист і конфіденційність"</string>
<string name="privacy_subpage_controls_header" msgid="4152396976713749322">"Параметри"</string>
<string name="health_connect_title" msgid="2132233890867430855">"Health Connect"</string>
<string name="health_connect_summary" msgid="815473513776882296">"Керуйте доступом додатків до даних про здоров’я"</string>
<string name="location_settings" msgid="8863940440881290182">"Доступ до геоданих"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Для додатків і сервісів. Якщо це налаштування вимкнено, дані мікрофона можуть усе одно передаватися під час виклику екстреного номера."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Для додатків і сервісів"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Налаштування з обмеженнями"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"З міркувань безпеки це налаштування наразі недоступне."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Докладніше"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-uk-watch/strings.xml b/PermissionController/res/values-uk-watch/strings.xml
index 244c24ec8..e83f408ef 100644
--- a/PermissionController/res/values-uk-watch/strings.xml
+++ b/PermissionController/res/values-uk-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Не можна змінити"</string>
<string name="generic_yes" msgid="2489207724988649846">"Так"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Скасувати"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Завжди"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Під час використ. додатка"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Завжди"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Під час використ. додатка"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Завжди"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Під час використ. додатка"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Завжди"</string>
</resources>
diff --git a/PermissionController/res/values-uk/strings.xml b/PermissionController/res/values-uk/strings.xml
index 9a39e12ee..d299438ee 100644
--- a/PermissionController/res/values-uk/strings.xml
+++ b/PermissionController/res/values-uk/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Усі дозволи"</string>
<string name="other_permissions" msgid="2901186127193849594">"Інші дозволи додатка"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Запит на дозвіл"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Встановлення й видалення не підтримуються на пристроях Android Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Виберіть, до чого додаток &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; матиме доступ"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Додаток &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; оновлено. Виберіть, до чого він матиме доступ."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Скасувати"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Відкликати дозволи, якщо додаток не використовується"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Вилучати дозволи й звільняти місце"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Призупиняти роботу в неактивний період"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Керувати невикористовуваним додатком"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Вилучити дозволи, видалити тимчасові файли та зупинити сповіщення"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Вилучити дозволи, видалити тимчасові файли, зупинити сповіщення й архівувати додаток"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Щоб захистити ваші дані, дозволи для цього додатка буде автоматично скасовано, якщо ви не будете користуватися ним кілька місяців."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Якщо додаток не використовується впродовж кількох місяців, для захисту ваших даних буде скасовано такі дозволи: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Щоб захистити ваші дані, було скасовано дозволи додатків, які не використовувалися впродовж кількох місяців."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Додаток для нотаток"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Додатки, у яких можна робити нотатки на вашому пристрої"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"нотатки"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Гаманець за умовчанням"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Гаманець"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"У гаманцях можуть зберігатися ваші картки постійного покупця й кредитні картки, автомобільні ключі та інші об’єкти, які полегшують здійснення різних трансакцій."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Зробити додаток <xliff:g id="APP_NAME">%1$s</xliff:g> гаманцем за умовчанням?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Дозволи не потрібні"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Поточний за умовчанням"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Не запитувати знову"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Вибрати за умовчанням"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Оновлення способу передавання даних"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Деякі додатки змінили спосіб передавання ваших геоданих"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Налаштування"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Доступ отримано: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Доступ отримано вчора: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Доступ отримано: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Ваш одноразовий пароль: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-ur-v34/strings.xml b/PermissionController/res/values-ur-v34/strings.xml
index 37b5ec635..ee12547a4 100644
--- a/PermissionController/res/values-ur-v34/strings.xml
+++ b/PermissionController/res/values-ur-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"مقام تک رسائی"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"ایپس اور سروسز کے لیے۔ اگر یہ ترتیب آف ہو تو آپ کے ایمرجنسی نمبر پر کال کرتے وقت بھی مائیکروفون کے ڈیٹا کا اشتراک کیا جا سکتا ہے"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"ایپس اور سروسز کے لیے"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"محدود ترتیب"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"آپ کی سیکیورٹی کے لیے، یہ ترتیب فی الحال دستیاب نہیں ہے۔"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"مزید جانیں"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-ur-watch/strings.xml b/PermissionController/res/values-ur-watch/strings.xml
index bb0273bc4..1dab4010d 100644
--- a/PermissionController/res/values-ur-watch/strings.xml
+++ b/PermissionController/res/values-ur-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"ناقابل تبدیل"</string>
<string name="generic_yes" msgid="2489207724988649846">"ہاں"</string>
<string name="generic_cancel" msgid="2631708607129269698">"منسوخ کریں"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"ہر وقت"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"ایپ استعمال کرنے کے دوران"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"ہر وقت"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"ایپ استعمال کرنے کے دوران"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"ہر وقت"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"ایپ استعمال کرنے کے دوران"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"ہر وقت"</string>
</resources>
diff --git a/PermissionController/res/values-ur/strings.xml b/PermissionController/res/values-ur/strings.xml
index f1d9a96dc..aad90c6c1 100644
--- a/PermissionController/res/values-ur/strings.xml
+++ b/PermissionController/res/values-ur/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"تمام اجازتیں"</string>
<string name="other_permissions" msgid="2901186127193849594">"ایپ کی دوسری اہلیتیں"</string>
<string name="permission_request_title" msgid="8790310151025020126">"اجازت کی درخواست"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"‏\'کارروائیاں انسٹال/اَن انسٹال کریں\' Wear پر تعاون یافتہ نہیں ہے۔"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"‏منتخب کریں کہ &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; کو کس چیز تک رسائی کی اجازت دینی ہے"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"‏&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; اپ ڈیٹ ہو گئی ہے۔ منتخب کریں کہ اس ایپ کو کس تک رسائی کی اجازت دینی ہے۔"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"منسوخ کریں"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"ایپ کے استعمال نہ ہونے پر اجازتیں ہٹائیں"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"اجازتوں کو ہٹائیں اور جگہ خالی کریں"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"غیر استعمال شدہ ہو تو ایپ سرگرمی روکیں"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"اگر غیر استعمال شدہ ہے تو ایپ کا نظم کریں"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"اجازتیں ہٹائیں، عارضی فائلز حذف کریں اور اطلاعات موقوف کریں"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"اجازتیں ہٹائیں، عارضی فائلوں کو حذف کریں، اطلاعات کو روکیں اور ایپ کو آرکائیو کریں"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"آپ کے ڈیٹا کی حفاظت کے لیے، اگر ایپ کو کچھ مہینوں تک استعمال نہیں کیا گیا تو اس ایپ کے لیے اجازتیں ہٹا دی جائیں گی۔"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"آپ کے ڈیٹا کی حفاظت کے لیے، اگر ایپ کو کچھ مہینوں تک استعمال نہیں کیا گيا تو درج ذیل اجازتیں ہٹا دی جائیں گی: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"آپ کے ڈیٹا کی حفاظت کے لیے، اجازتوں کو ان ایپس سے ہٹا دیا گیا ہے جنہیں آپ نے کچھ مہینوں سے استعمال نہیں کیا ہے۔"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"نوٹس ایپ"</string>
<string name="role_notes_description" msgid="8496852798616883551">"ایسی ایپس جو آپ کو آپ کے آلے پر نوٹس لینے کی اجازت دیتی ہیں"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"نوٹس"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"ڈیفالٹ والٹ ایپ"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"والٹ ایپ"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"والٹ ایپس آپ کے کریڈٹ اور لائلٹی کارڈز، کار کی کلیدوں اور دیگر چیزوں کو ٹرانزیکشنز کی مختلف شکلوں میں مدد کے لیے اسٹور کر سکتی ہیں۔"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> کو آپ کی ڈیفالٹ والٹ ایپ کے طور پر سیٹ کریں؟"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"کوئی اجازت درکار نہیں ہے"</string>
<string name="request_role_current_default" msgid="738722892438247184">"موجودہ ڈیفالٹ"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"دوبارہ نہ پوچھیں"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"بطور ڈیفالٹ سیٹ کریں"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"ڈیٹا کے اشتراک کی اپ ڈیٹس"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"کچھ ایپس نے آپ کے مقام کے ڈیٹا کے اشتراک کے اپنے ممکنہ طریقے کو تبدیل کر دیا"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"ترتیبات"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"گزشتہ کل <xliff:g id="TIME_DATE">%1$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g> پر رسائی حاصل کی گئی"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"آپ کا ایک وقتی پاس ورڈ 132435 ہے"</string>
</resources>
diff --git a/PermissionController/res/values-uz-v34/strings.xml b/PermissionController/res/values-uz-v34/strings.xml
index 3c48cd9d1..b0e84659b 100644
--- a/PermissionController/res/values-uz-v34/strings.xml
+++ b/PermissionController/res/values-uz-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Joylashuv axborotiga ruxsat"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Ilovalar va xizmatlar uchun. Bu sozlama yoqilmasa, favqulodda xizmat raqamiga telefon qilganingizda mikrofon maʼlumotlari hamon ulashilishi mumkin"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Ilovalar va xizmatlar uchun"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Cheklangan sozlama"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Xavfsizlik maqsadida bu sozlama hozir ishlamaydi."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Batafsil"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-uz-watch/strings.xml b/PermissionController/res/values-uz-watch/strings.xml
index dbc7ee1a5..9ac60d9bc 100644
--- a/PermissionController/res/values-uz-watch/strings.xml
+++ b/PermissionController/res/values-uz-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"O‘zgartirilmaydi"</string>
<string name="generic_yes" msgid="2489207724988649846">"Ha"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Bekor q-sh"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Doimo"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Ilova ishlatilayotganda"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Doimo"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Ilova ishlatilayotganda"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Doimo"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Ilova ishlatilayotganda"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Doimo"</string>
</resources>
diff --git a/PermissionController/res/values-uz/strings.xml b/PermissionController/res/values-uz/strings.xml
index 706ec1a6c..7ac48cf7c 100644
--- a/PermissionController/res/values-uz/strings.xml
+++ b/PermissionController/res/values-uz/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Barcha ruxsatlar"</string>
<string name="other_permissions" msgid="2901186127193849594">"Ilovaning boshqa imkoniyatlari"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Ruxsat olish talabi"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear qurilmasi o‘rnatish/o‘chirish amallarini qo‘llab-quvvatlamaydi."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; uchun beriladigan ruxsatlarni tanlang"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; yangilandi. Unga beriladigan ruxsatlarni tanlang."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Bekor qilish"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Ishlatilmayotgan ilovalardan ruxsatlarni olib tashlash"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Ruxsatlarni olib tashlash va joy ochish"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Ishlatilmayotgan ilovalarni pauzalash"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Ishlatilmagan ilovalarni boshqarish"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Ruxsatlarni olib tashlash, vaqtinchalik fayllarni oʻchirish va bildirishnomalarni toʻxtatish"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Ruxsatlarni olib tashlash, vaqtinchalik fayllarni oʻchirish, bildirishnomalarni toʻxtatish va ilovani arxivlash"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Xavfsizlik yuzasidan, bir necha oydan beri ishlatilmagan ilovalardan ruxsatlar olib tashlanadi"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Agar bu ilova bir necha oy ishlatilmasa, quyidagi ruxsatlar olib tashlanadi: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Xavfsizlik yuzasidan, bir necha oydan beri ishlatilmagan ilovalardan ruxsatlar olib tashlanadi"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Qaydlar ilovasi"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Qurilmangizda qaydlar olish imkonini beruvchi ilovalar"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"qaydlar"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Birlamchi hamyon ilovasi"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Hamyon ilovasi"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Hamyon ilovalarda kredit va sodiqlik kartalari, avtomobil kalitlari hamda boshqa raqamli mahsulotlarni saqlash mumkin. Bu har xil turdagi amaliyotlarni bajarishni yanada qulaylashtiradi."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"<xliff:g id="APP_NAME">%1$s</xliff:g> birlamchi hamyon ilovasi sifatida belgilansinmi?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Hech qanday ruxsat zarur emas"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Hozirda asosiy ilova"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Boshqa soʻralmasin"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Birlamchi deb belgilash"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Axborot ulashuvi yangilanishi"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Ayrim ilovalarda joylashuv axboroti ulashuvi oʻzgardi"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Sozlamalar"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Kirilgan: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Kecha kirilgan: <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Kirilgan: <xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Bir martalik parolingiz: 132435"</string>
</resources>
diff --git a/PermissionController/res/values-v33/styles.xml b/PermissionController/res/values-v33/styles.xml
index e4d8f5c54..94344615b 100644
--- a/PermissionController/res/values-v33/styles.xml
+++ b/PermissionController/res/values-v33/styles.xml
@@ -566,6 +566,12 @@
<item name="android:background">@drawable/safety_center_more_issues_card_background</item>
</style>
+ <style name="SafetyCenterMoreIssuesIcon"
+ parent="android:Widget.DeviceDefault">
+ <item name="android:layout_height">20dp</item>
+ <item name="android:layout_width">20dp</item>
+ </style>
+
<style name="SafetyCenterMoreIssuesTitle"
parent="SafetyCenterBaseTextContainer">
<item name="android:textAppearance">@style/TextAppearance.Material3.LabelLarge</item>
@@ -576,43 +582,22 @@
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxlarge</item>
<item name="android:maxLines">2</item>
<item name="android:ellipsize">end</item>
- <item name="layout_constraintTop_toTopOf">parent</item>
- <item name="layout_constraintBottom_toBottomOf">parent</item>
- <item name="layout_constraintStart_toEndOf">@id/status_icon</item>
- <item name="layout_constraintEnd_toStartOf">@android:id/widget_frame</item>
<item name="layout_constraintHorizontal_bias">0</item>
<item name="layout_goneMarginStart">0dp</item>
</style>
- <style name="SafetyCenterMoreIssuesIcon"
- parent="android:Widget.DeviceDefault">
- <item name="android:layout_height">20dp</item>
- <item name="android:layout_width">20dp</item>
- <item name="android:gravity">center</item>
- <item name="layout_constraintTop_toTopOf">parent</item>
- <item name="layout_constraintBottom_toBottomOf">parent</item>
- <item name="layout_constraintStart_toStartOf">parent</item>
- </style>
-
<style name="SafetyCenterMoreIssuesCounter"
parent="android:Widget.DeviceDefault">
- <item name="android:layout_height">24dp</item>
- <item name="android:layout_width">wrap_content</item>
- <item name="android:orientation">horizontal</item>
- <item name="android:paddingStart">@dimen/sc_spacing_xsmall</item>
- <item name="android:paddingEnd">@dimen/sc_spacing_xsmall</item>
+ <item name="android:layout_height">0dp</item>
+ <item name="android:layout_width">0dp</item>
<item name="android:background">@drawable/safety_center_card_widget_background</item>
- <item name="android:gravity">center_vertical</item>
- <item name="layout_constraintTop_toTopOf">parent</item>
- <item name="layout_constraintBottom_toBottomOf">parent</item>
- <item name="layout_constraintEnd_toEndOf">parent</item>
</style>
<style name="SafetyCenterMoreIssuesWidgetTitle"
parent="SafetyCenterBaseTextContainer">
<item name="android:textAppearance">@style/TextAppearance.SafetyCenter.Body</item>
- <item name="android:lineHeight">@dimen/sc_line_height_medium</item>
<item name="android:textColor">?android:attr/textColorPrimary</item>
+ <item name="android:paddingStart">@dimen/sc_spacing_xsmall</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_marginEnd">@dimen/sc_spacing_xxxsmall</item>
@@ -623,8 +608,8 @@
parent="android:Widget.DeviceDefault">
<item name="android:layout_height">16dp</item>
<item name="android:layout_width">16dp</item>
- <item name="android:gravity">center</item>
<item name="android:scaleType">fitCenter</item>
+ <item name="android:layout_marginEnd">@dimen/sc_spacing_xsmall</item>
</style>
<style name="SafetyCenterEntry"
diff --git a/PermissionController/res/values-v34/dimens.xml b/PermissionController/res/values-v34/dimens.xml
index 2e8b50fd0..a0eff1154 100644
--- a/PermissionController/res/values-v34/dimens.xml
+++ b/PermissionController/res/values-v34/dimens.xml
@@ -22,4 +22,11 @@
<dimen name="sc_button_corner_radius_small">4dp</dimen>
<dimen name="sc_brand_chip_corner_radius">20dp</dimen>
<dimen name="sc_brand_chip_padding">6dp</dimen>
+
+ <!-- START ENHANCED CONFIRMATION DIALOG -->
+ <dimen name="enhanced_confirmation_dialog_padding">24dp</dimen>
+ <dimen name="enhanced_confirmation_dialog_padding_bottom">32dp</dimen>
+ <dimen name="enhanced_confirmation_dialog_title_bottom_padding">16dp</dimen>
+ <dimen name="enhanced_confirmation_dialog_icon_size">32dp</dimen>
+ <!-- END ENHANCED CONFIRMATION DIALOG -->
</resources> \ No newline at end of file
diff --git a/PermissionController/res/values-v34/strings.xml b/PermissionController/res/values-v34/strings.xml
index 26a9b4bcc..a63586591 100644
--- a/PermissionController/res/values-v34/strings.xml
+++ b/PermissionController/res/values-v34/strings.xml
@@ -31,5 +31,4 @@
<!-- Describes what is affected by the mic toggle. Unlike the similar tc/9163104307990677157, there should NOT be a full stop at the end of this sentence. [CHAR LIMIT=NONE] -->
<string name="mic_toggle_description">For apps and services. If this setting is off, microphone data may still be shared when you call an emergency number</string>
<!-- Subtitle for the link to location settings [CHAR LIMIT=NONE] -->
- <string name="location_settings_subtitle">For apps and services</string>
</resources>
diff --git a/PermissionController/res/values-v34/styles.xml b/PermissionController/res/values-v34/styles.xml
index 53780ce76..9548acb5b 100644
--- a/PermissionController/res/values-v34/styles.xml
+++ b/PermissionController/res/values-v34/styles.xml
@@ -371,4 +371,15 @@
<!-- END SAFETY CENTER SUBPAGE -->
+ <!-- START ENHANCED CONFIRMATION DIALOG -->
+
+ <style name="TextAppearance.EnhancedConfirmationDialogHeadline"
+ parent="@android:style/TextAppearance.DeviceDefault.Headline">
+ </style>
+
+ <style name="TextAppearance.EnhancedConfirmationDialogMessage"
+ parent="@android:style/TextAppearance.DeviceDefault">
+ </style>
+
+ <!-- END ENHANCED CONFIRMATION DIALOG -->
</resources> \ No newline at end of file
diff --git a/PermissionController/res/values-vi-v34/strings.xml b/PermissionController/res/values-vi-v34/strings.xml
index 618a266d8..4a4643560 100644
--- a/PermissionController/res/values-vi-v34/strings.xml
+++ b/PermissionController/res/values-vi-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Quyền truy cập thông tin vị trí"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Áp dụng cho các ứng dụng và dịch vụ. Nếu bạn tắt chế độ cài đặt này, dữ liệu thu được qua micrô vẫn có thể được chia sẻ khi bạn gọi đến số khẩn cấp"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Áp dụng cho các ứng dụng và dịch vụ"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Chế độ cài đặt bị hạn chế"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Để đảm bảo an toàn cho bạn, chế độ cài đặt này hiện bị vô hiệu hoá."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Tìm hiểu thêm"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-vi-watch/strings.xml b/PermissionController/res/values-vi-watch/strings.xml
index 21054e6d4..21ff1bd5c 100644
--- a/PermissionController/res/values-vi-watch/strings.xml
+++ b/PermissionController/res/values-vi-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Không thể thay đổi"</string>
<string name="generic_yes" msgid="2489207724988649846">"Có"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Hủy"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Mọi lúc"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Khi dùng ứng dụng"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Mọi lúc"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Khi dùng ứng dụng"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Mọi lúc"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Khi dùng ứng dụng"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Mọi lúc"</string>
</resources>
diff --git a/PermissionController/res/values-vi/strings.xml b/PermissionController/res/values-vi/strings.xml
index 72275f442..f6d3ba433 100644
--- a/PermissionController/res/values-vi/strings.xml
+++ b/PermissionController/res/values-vi/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Tất cả các quyền"</string>
<string name="other_permissions" msgid="2901186127193849594">"Các khả năng khác của ứng dụng"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Yêu cầu quyền"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Các hành động Cài đặt/Gỡ cài đặt không được hỗ trợ trên Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Chọn nội dung &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; được phép truy cập vào"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"Đã cập nhật &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;. Chọn nội dung ứng dụng này được phép truy cập vào."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Hủy"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Thu hồi quyền nếu bạn không dùng ứng dụng"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Thu hồi quyền và giải phóng dung lượng"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Tạm dừng hoạt động trong ứng dụng nếu không dùng"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Quản lý ứng dụng nếu không dùng"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Loại bỏ quyền, xoá tệp tạm thời và dừng thông báo"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Loại bỏ quyền, xoá tệp tạm thời, dừng thông báo và lưu trữ ứng dụng"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Để bảo vệ dữ liệu của bạn, các quyền cấp cho ứng dụng này sẽ bị thu hồi nếu bạn không dùng ứng dụng trong vài tháng."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Để bảo vệ dữ liệu của bạn, nếu bạn không dùng ứng dụng này trong vài tháng thì các quyền sau đây sẽ bị thu hồi: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Để bảo vệ dữ liệu của bạn, quản trị viên CNTT đã thu hồi các quyền đối với những ứng dụng bạn không dùng trong vài tháng."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"Ứng dụng ghi chú"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Các ứng dụng cho phép bạn tạo ghi chú trên thiết bị"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"ghi chú"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"Ứng dụng ví mặc định"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"Ứng dụng ví"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Ứng dụng ví có thể lưu trữ thông tin thẻ tín dụng và thẻ khách hàng thân thiết của bạn, chìa khoá ô tô của bạn, cùng nhiều thông tin khác giúp bạn thực hiện nhiều hình thức giao dịch đa dạng."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Đặt <xliff:g id="APP_NAME">%1$s</xliff:g> làm ứng dụng ví mặc định?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Không cần quyền"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Ứng dụng mặc định hiện tại"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Không hỏi lại"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Đặt làm mặc định"</string>
@@ -564,7 +569,7 @@
<string name="safety_privacy_qs_tile_subtitle" msgid="3621544532041936749">"Kiểm tra trạng thái"</string>
<string name="privacy_controls_qs" msgid="5780144882040591169">"Các chế độ kiểm soát quyền riêng tư"</string>
<string name="security_settings_button_label_qs" msgid="8280343822465962330">"Tùy chọn cài đặt khác"</string>
- <string name="camera_toggle_label_qs" msgid="3880261453066157285">"Quyền truy cập máy ảnh"</string>
+ <string name="camera_toggle_label_qs" msgid="3880261453066157285">"Quyền truy cập camera"</string>
<string name="microphone_toggle_label_qs" msgid="8132912469813396552">"Quyền truy cập micrô"</string>
<string name="permissions_removed_qs" msgid="8957319130625294572">"Đã thu hồi quyền sử dụng"</string>
<string name="camera_usage_qs" msgid="4394233566086665994">"Xem mức sử dụng của máy ảnh gần đây"</string>
@@ -606,7 +611,7 @@
<string name="safety_center_background_location_access_revoked" msgid="6972274943343442213">"Đã thay đổi quyền truy cập"</string>
<string name="safety_center_view_recent_location_access" msgid="3524391299490678243">"Xem thông tin về hoạt động sử dụng thông tin vị trí gần đây"</string>
<string name="privacy_controls_title" msgid="7605929972256835199">"Chế độ kiểm soát quyền riêng tư"</string>
- <string name="camera_toggle_title" msgid="1251201397431837666">"Quyền truy cập máy ảnh"</string>
+ <string name="camera_toggle_title" msgid="1251201397431837666">"Quyền truy cập camera"</string>
<string name="mic_toggle_title" msgid="2649991093496110162">"Quyền truy cập micrô"</string>
<string name="perm_toggle_description" msgid="7801326363741451379">"Áp dụng cho các ứng dụng và dịch vụ"</string>
<string name="mic_toggle_description" msgid="9163104307990677157">"Áp dụng cho các ứng dụng và dịch vụ. Nếu bạn tắt chế độ cài đặt, dữ liệu thu được qua micrô vẫn có thể được chia sẻ khi bạn gọi đến số khẩn cấp."</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Nội dung cập nhật về cách thức chia sẻ dữ liệu"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Một số ứng dụng đã thay đổi cách thức có thể được dùng để chia sẻ dữ liệu vị trí của bạn"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Cài đặt"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Truy cập lúc <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Truy cập hôm qua lúc <xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Truy cập lúc <xliff:g id="TIME_DATE_1">%2$s</xliff:g> ngày <xliff:g id="TIME_DATE_0">%1$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Mật khẩu một lần của bạn là 132435"</string>
</resources>
diff --git a/PermissionController/res/values-watch/strings.xml b/PermissionController/res/values-watch/strings.xml
index f940eae65..60aca8fe9 100644
--- a/PermissionController/res/values-watch/strings.xml
+++ b/PermissionController/res/values-watch/strings.xml
@@ -35,4 +35,25 @@
<!-- Generic text to indicate Cancel. [CHAR LIMIT=10] -->
<string name="generic_cancel">Cancel</string>
+
+ <!-- [CHAR LIMIT=25] App can always (when app is in foreground or background) access the resource protected by the permission -->
+ <string name="permission_access_always">All the time</string>
+
+ <!-- App can only access the resource protected by the permission while app is in foreground [CHAR LIMIT=25]-->
+ <string name="permission_access_only_foreground">While using app</string>
+
+ <!-- Title for the dialog button to allow a permission grant when you can also only allow in the foreground. [CHAR LIMIT=25] -->
+ <string name="app_permission_button_allow_always">All the time</string>
+
+ <!-- Title for the dialog button to allow a permission grant only when the app is in the foreground. [CHAR LIMIT=25] -->
+ <string name="app_permission_button_allow_foreground">While using app</string>
+
+ <!-- Title for the dialog button to allow a permission grant when you can also only allow in the foreground. [CHAR LIMIT=25] -->
+ <string name="grant_dialog_button_allow_always">All the time</string>
+
+ <!-- Title for the dialog button to allow a permission grant only when the app is in the foreground. [CHAR LIMIT=25] -->
+ <string name="grant_dialog_button_allow_foreground">While using app</string>
+
+ <!-- Title for the dialog button to allow a change from foreground to background permission grant. [CHAR LIMIT=25] -->
+ <string name="grant_dialog_button_allow_background">All the time</string>
</resources>
diff --git a/PermissionController/res/values-zh-rCN-v34/strings.xml b/PermissionController/res/values-zh-rCN-v34/strings.xml
index 0ba05798b..7e41c4080 100644
--- a/PermissionController/res/values-zh-rCN-v34/strings.xml
+++ b/PermissionController/res/values-zh-rCN-v34/strings.xml
@@ -19,9 +19,18 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="security_privacy_brand_name" msgid="7303621734258440812">"安全和隐私"</string>
<string name="privacy_subpage_controls_header" msgid="4152396976713749322">"控件"</string>
- <string name="health_connect_title" msgid="2132233890867430855">"Health Connect"</string>
+ <string name="health_connect_title" msgid="2132233890867430855">"健康数据共享"</string>
<string name="health_connect_summary" msgid="815473513776882296">"管理应用对健康数据的访问权限"</string>
<string name="location_settings" msgid="8863940440881290182">"位置信息访问权限"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"针对应用和服务。关闭此设置后,系统仍可能在您拨打紧急电话号码时分享麦克风数据"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"针对应用和服务"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"受限设置"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"出于安全考虑,此设置目前不可用。"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"了解详情"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-zh-rCN-watch/strings.xml b/PermissionController/res/values-zh-rCN-watch/strings.xml
index 67671132f..b8860dfbb 100644
--- a/PermissionController/res/values-zh-rCN-watch/strings.xml
+++ b/PermissionController/res/values-zh-rCN-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"无法更改"</string>
<string name="generic_yes" msgid="2489207724988649846">"是"</string>
<string name="generic_cancel" msgid="2631708607129269698">"取消"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"始终"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"在使用应用时"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"始终"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"在使用应用时"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"始终"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"在使用应用时"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"始终"</string>
</resources>
diff --git a/PermissionController/res/values-zh-rCN/strings.xml b/PermissionController/res/values-zh-rCN/strings.xml
index 985bd4fc7..dd620629f 100644
--- a/PermissionController/res/values-zh-rCN/strings.xml
+++ b/PermissionController/res/values-zh-rCN/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"所有权限"</string>
<string name="other_permissions" msgid="2901186127193849594">"其他应用功能"</string>
<string name="permission_request_title" msgid="8790310151025020126">"权限请求"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear 不支持安装/卸载操作。"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"请选择要向&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;授予哪些权限"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt;已更新。请选择要向此应用授予哪些权限。"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"取消"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"如果未使用此应用,则移除相关权限"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"撤消权限并释放空间"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"暂停闲置应用的活动"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"管理闲置应用"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"移除权限、删除临时文件并停止发送通知"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"撤消权限、删除临时文件、停止发送通知并归档应用"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"为了保护您的数据,如果您连续几个月未使用此应用,系统会移除它的权限。"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"为了保护您的数据,如果您连续几个月未使用此应用,系统会移除其以下权限:<xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"为了保护您的数据,对于您连续几个月未使用过的应用,系统已将其权限移除。"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"记事应用"</string>
<string name="role_notes_description" msgid="8496852798616883551">"允许您在设备上记事的应用"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"记事"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"默认钱包应用"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"钱包应用"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"钱包应用可以存储信用卡和会员卡、车钥匙和其他内容,帮助您完成各种形式的交易。"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"要将“<xliff:g id="APP_NAME">%1$s</xliff:g>”设为默认钱包应用?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"无需任何权限"</string>
<string name="request_role_current_default" msgid="738722892438247184">"当前默认应用"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"不再询问"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"设为默认应用"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"数据分享方式变更"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"部分应用更改了位置数据分享方式"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"设置"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"<xliff:g id="TIME_DATE">%1$s</xliff:g>访问过"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>访问过"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>访问过"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"您的动态密码为 132435"</string>
</resources>
diff --git a/PermissionController/res/values-zh-rHK-v34/strings.xml b/PermissionController/res/values-zh-rHK-v34/strings.xml
index 65ad05bdb..34c7d43d0 100644
--- a/PermissionController/res/values-zh-rHK-v34/strings.xml
+++ b/PermissionController/res/values-zh-rHK-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"位置資料存取權"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"適用於應用程式和服務。如果關閉此設定,系統仍會在你撥打緊急電話號碼時提供麥克風的資料"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"應用程式和服務"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"受限設定"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"為安全起見,系統目前不提供此設定。"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"瞭解詳情"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-zh-rHK-watch/strings.xml b/PermissionController/res/values-zh-rHK-watch/strings.xml
index abe2f31f9..01f23b65c 100644
--- a/PermissionController/res/values-zh-rHK-watch/strings.xml
+++ b/PermissionController/res/values-zh-rHK-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"不可變更"</string>
<string name="generic_yes" msgid="2489207724988649846">"是"</string>
<string name="generic_cancel" msgid="2631708607129269698">"取消"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"一律允許"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"使用應用程式時"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"一律允許"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"使用應用程式時"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"一律允許"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"使用應用程式時"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"一律允許"</string>
</resources>
diff --git a/PermissionController/res/values-zh-rHK/strings.xml b/PermissionController/res/values-zh-rHK/strings.xml
index 4bb7a8338..8b1bd8aa9 100644
--- a/PermissionController/res/values-zh-rHK/strings.xml
+++ b/PermissionController/res/values-zh-rHK/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"所有權限"</string>
<string name="other_permissions" msgid="2901186127193849594">"其他應用程式功能"</string>
<string name="permission_request_title" msgid="8790310151025020126">"權限要求"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear 不支援安裝/解除安裝操作。"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"選擇允許「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;存取的內容"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"已更新「<xliff:g id="APP_NAME">%1$s</xliff:g>」&lt;b&gt;&lt;/b&gt;。選擇允許此應用程式存取的內容。"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"取消"</string>
@@ -202,11 +200,13 @@
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"查看「<xliff:g id="APP">%1$s</xliff:g>」的所有權限"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"查看擁有此權限的所有應用程式"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"顯示「Google 助理」麥克風使用情況"</string>
- <string name="unused_apps_category_title" msgid="2988455616845243901">"未使用的應用程式設定"</string>
+ <string name="unused_apps_category_title" msgid="2988455616845243901">"不使用的應用程式設定"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"如不使用應用程式,即移除權限"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"移除權限並騰出空間"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"暫停未使用應用程式的活動"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"管理應用程式 (如未使用)"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"移除權限、刪除暫存檔案和停止通知"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"移除權限、刪除暫存檔案、停止通知和封存應用程式"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"為保護你的資料,系統已移除你在過去幾個月未曾使用的應用程式的權限。"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"為保護你的資料,如果應用程式在過去幾個月未曾使用,系統將會移除以下權限:<xliff:g id="PERMS">%1$s</xliff:g>。"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"為保護你的資料,系統已移除你在過去幾個月未曾使用的應用程式的權限。"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"筆記應用程式"</string>
<string name="role_notes_description" msgid="8496852798616883551">"讓你可以在裝置上寫筆記的應用程式"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"筆記"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"預設錢包應用程式"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"錢包應用程式"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"錢包應用程式可存放信用卡、會員卡、車匙和其他資料,助你完成各種形式的交易。"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"要將「<xliff:g id="APP_NAME">%1$s</xliff:g>」設定為預設錢包應用程式嗎?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"無需任何權限"</string>
<string name="request_role_current_default" msgid="738722892438247184">"目前預設"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"不要再詢問"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"設定為預設"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"資料分享更新"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"部分應用程式已變更位置資料分享方式"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"設定"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"上次存取時間:<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"上次存取時間:昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"上次存取時間:<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"你的一次性密碼是 132435"</string>
</resources>
diff --git a/PermissionController/res/values-zh-rTW-v34/strings.xml b/PermissionController/res/values-zh-rTW-v34/strings.xml
index e473ca41b..4678b5e58 100644
--- a/PermissionController/res/values-zh-rTW-v34/strings.xml
+++ b/PermissionController/res/values-zh-rTW-v34/strings.xml
@@ -19,9 +19,18 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="security_privacy_brand_name" msgid="7303621734258440812">"安全性與隱私權"</string>
<string name="privacy_subpage_controls_header" msgid="4152396976713749322">"控制選項"</string>
- <string name="health_connect_title" msgid="2132233890867430855">"Health Connect"</string>
+ <string name="health_connect_title" msgid="2132233890867430855">"健康資料同步"</string>
<string name="health_connect_summary" msgid="815473513776882296">"管理應用程式的健康資料存取權"</string>
<string name="location_settings" msgid="8863940440881290182">"位置資訊存取權"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"適用於應用程式和服務。即使關閉這項設定,系統仍可能會在你撥打緊急電話號碼時,分享麥克風資料"</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"應用程式和服務"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"受限制的設定"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"為了安全起見,這項設定目前無法使用。"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"瞭解詳情"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-zh-rTW-watch/strings.xml b/PermissionController/res/values-zh-rTW-watch/strings.xml
index 2a91aa040..8173cc23f 100644
--- a/PermissionController/res/values-zh-rTW-watch/strings.xml
+++ b/PermissionController/res/values-zh-rTW-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"無法變更"</string>
<string name="generic_yes" msgid="2489207724988649846">"是"</string>
<string name="generic_cancel" msgid="2631708607129269698">"取消"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"一律允許"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"僅限使用應用程式時"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"一律允許"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"僅限使用應用程式時"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"一律允許"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"僅限使用應用程式時"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"一律允許"</string>
</resources>
diff --git a/PermissionController/res/values-zh-rTW/strings.xml b/PermissionController/res/values-zh-rTW/strings.xml
index c303926c1..731544f96 100644
--- a/PermissionController/res/values-zh-rTW/strings.xml
+++ b/PermissionController/res/values-zh-rTW/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"所有權限"</string>
<string name="other_permissions" msgid="2901186127193849594">"其他應用程式功能"</string>
<string name="permission_request_title" msgid="8790310151025020126">"權限要求"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Wear 不支援安裝及解除安裝操作。"</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"選擇要授予「<xliff:g id="APP_NAME">%1$s</xliff:g>」的存取權"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」已更新。請選擇要授予這個應用程式的存取權。"</string>
<string name="review_button_cancel" msgid="2191147944056548886">"取消"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"如果應用程式未使用,讓系統移除相關權限"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"移除權限並釋出空間"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"暫停未使用的應用程式活動"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"管理應用程式 (如未使用)"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"移除權限、刪除暫存檔及停止通知"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"移除權限、刪除暫存檔、停止通知並封存應用程式"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"為了保護你的資料,如果你連續幾個月都未使用這個應用程式,系統會移除其權限。"</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"為了保護你的資料,如果應用程式已有數個月未使用,系統將移除以下權限:<xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"為了保護你的資料,針對數個月未使用的應用程式,系統已移除相關權限。"</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"記事應用程式"</string>
<string name="role_notes_description" msgid="8496852798616883551">"可在裝置上記事的應用程式"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"記事"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"預設錢包應用程式"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"錢包應用程式"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"錢包應用程式可存放消費金、會員卡、車鑰和其他資訊,幫助完成各種形式的交易。"</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"要將「<xliff:g id="APP_NAME">%1$s</xliff:g>」設為預設錢包應用程式嗎?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"無需任何權限"</string>
<string name="request_role_current_default" msgid="738722892438247184">"目前的預設應用程式"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"不要再詢問"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"設為預設"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"資料分享方式異動"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"部分應用程式改變了位置資料的分享方式"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"設定"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"上次存取時間:<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"上次存取時間:昨天<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"上次存取時間:<xliff:g id="TIME_DATE_0">%1$s</xliff:g><xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"你的動態密碼為 132435"</string>
</resources>
diff --git a/PermissionController/res/values-zu-v34/strings.xml b/PermissionController/res/values-zu-v34/strings.xml
index cb348a889..b1b6ff091 100644
--- a/PermissionController/res/values-zu-v34/strings.xml
+++ b/PermissionController/res/values-zu-v34/strings.xml
@@ -24,4 +24,13 @@
<string name="location_settings" msgid="8863940440881290182">"Setha indawo"</string>
<string name="mic_toggle_description" msgid="1504101620086616040">"Okwama-app namasevisi. Uma leli sethingi livaliwe, idatha yemakrofoni ingabiwa uma ushayela inombolo yezimo eziphuthumayo."</string>
<string name="location_settings_subtitle" msgid="6846532794702613851">"Okwama-app namasevisi"</string>
+ <string name="enhanced_confirmation_dialog_title" msgid="2832934608609739884">"Amasethingi akhawulelwe"</string>
+ <string name="enhanced_confirmation_dialog_desc" msgid="6748252577225517533">"Ukuze uphephe, leli sethingi okwamanje alitholakali."</string>
+ <!-- no translation found for enhanced_confirmation_dialog_title_permission (4171764439444061362) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_dialog_desc_permission (824942107481213903) -->
+ <skip />
+ <string name="enhanced_confirmation_dialog_learn_more" msgid="3177813037495926648">"Funda kabanzi"</string>
+ <!-- no translation found for enhanced_confirmation_dialog_ok (3269454443884744764) -->
+ <skip />
</resources>
diff --git a/PermissionController/res/values-zu-watch/strings.xml b/PermissionController/res/values-zu-watch/strings.xml
index 01b82fd1a..f314b0699 100644
--- a/PermissionController/res/values-zu-watch/strings.xml
+++ b/PermissionController/res/values-zu-watch/strings.xml
@@ -22,4 +22,11 @@
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"Akukwazi ukushintshwa"</string>
<string name="generic_yes" msgid="2489207724988649846">"Yebo"</string>
<string name="generic_cancel" msgid="2631708607129269698">"Khansela"</string>
+ <string name="permission_access_always" msgid="2107115233573823032">"Ngaso sonke isikhathi"</string>
+ <string name="permission_access_only_foreground" msgid="4412115020089923986">"Ngenkathi isebenzisa i-app"</string>
+ <string name="app_permission_button_allow_always" msgid="4920899432212307102">"Ngaso sonke isikhathi"</string>
+ <string name="app_permission_button_allow_foreground" msgid="7186980598244864830">"Ngenkathi isebenzisa i-app"</string>
+ <string name="grant_dialog_button_allow_always" msgid="7130695257254694576">"Ngaso sonke isikhathi"</string>
+ <string name="grant_dialog_button_allow_foreground" msgid="8917595344037255090">"Ngenkathi isebenzisa i-app"</string>
+ <string name="grant_dialog_button_allow_background" msgid="6104993390936535493">"Ngaso sonke isikhathi"</string>
</resources>
diff --git a/PermissionController/res/values-zu/strings.xml b/PermissionController/res/values-zu/strings.xml
index 6fb918556..6581cf382 100644
--- a/PermissionController/res/values-zu/strings.xml
+++ b/PermissionController/res/values-zu/strings.xml
@@ -116,8 +116,6 @@
<string name="all_permissions" msgid="6911125611996872522">"Zonke izimvume"</string>
<string name="other_permissions" msgid="2901186127193849594">"Amanye amakhono wohlelo lokusebenza"</string>
<string name="permission_request_title" msgid="8790310151025020126">"Isicelo semvume"</string>
- <string name="wear_not_allowed_dlg_title" msgid="1429467891296932713">"I-Android Wear"</string>
- <string name="wear_not_allowed_dlg_text" msgid="512340555334769098">"Izenzo zokufaka/ukukhipha azisekelwe ku-Wear."</string>
<string name="permission_review_title_template_install" msgid="1284337937156289081">"Khetha ukuthi uzovumela ini ukuthi i-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ifinyelele kuyo"</string>
<string name="permission_review_title_template_update" msgid="3232333580548588657">"I-&lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; ibuyekeziwe. Khetha ukuthi uzovumela ini ukuthi ifinyelelwe ilolu hlelo lokusebenza."</string>
<string name="review_button_cancel" msgid="2191147944056548886">"Khansela"</string>
@@ -198,7 +196,7 @@
<string name="app_permission_location_accuracy" msgid="7166912915040018669">"Sebenzisa indawo eqondile"</string>
<string name="app_permission_location_accuracy_subtitle" msgid="2654077606404987210">"Uma indawo ngqo ivaliwe, ama-app angakwazi ukufinyelela indawo yakho elinganiselwayo"</string>
<string name="app_permission_title" msgid="2090897901051370711">"<xliff:g id="PERM">%1$s</xliff:g> imvume"</string>
- <string name="app_permission_header" msgid="2951363137032603806">"<xliff:g id="PERM">%1$s</xliff:g> ukufinyelela kwale app"</string>
+ <string name="app_permission_header" msgid="2951363137032603806">"ukufinyelela kwale app ku<xliff:g id="PERM">%1$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Bona zonke izimvume ze-<xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Bona zonke izinhlelo zokusebenza ngale mvume"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Bonisa ukusetshenziswa kwe-microphone kamsizi"</string>
@@ -206,7 +204,9 @@
<string name="auto_revoke_label" msgid="5068393642936571656">"Susa izimvume uma uhlelo lokusebenza lungasetshenziswa"</string>
<string name="unused_apps_label" msgid="2595428768404901064">"Susa izimvume uphinde ukhulule isikhala"</string>
<string name="unused_apps_label_v2" msgid="7058776770056517980">"Misa okwesikhashana umsebenzi we-app uma ingasetshenziswa"</string>
+ <string name="unused_apps_label_v3" msgid="693340578642156657">"Lawula i-app uma ingasetsheziswa"</string>
<string name="unused_apps_summary" msgid="8839466950318403115">"Susa izimvume, sula amafayela wesikhashana, futhi umise izaziso"</string>
+ <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Susa izimvume, sula amafayela esikhashana, futhi ufake i-app kungobo yomlando"</string>
<string name="auto_revoke_summary" msgid="5867548789805911683">"Ukuze kuvikelwe idatha yakho, izimvume zalolu hlelo lokusebenza zizosuswa uma uhlelo lokusebenza lungasetshenziswa izinyanga ezimbalwa."</string>
<string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Ukuze kuvikelwe idatha yakho, uma uhlelo lokusebenza lungasetshenzisiwe, izimvume ezilandelayo zizosuswa: <xliff:g id="PERMS">%1$s</xliff:g>"</string>
<string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Ukuze kuvikelwe idatha yakho, izimvume zisusiwe kusukela kuzinhlelo zokusebenza ongazange uzisebenzise ezinyangeni ezimbalwa."</string>
@@ -403,6 +403,11 @@
<string name="role_notes_short_label" msgid="8796604147546125285">"I-App yamanothi"</string>
<string name="role_notes_description" msgid="8496852798616883551">"Ama-app akuvumela ukuthi uthathe amanothi kudivayisi yakho"</string>
<string name="role_notes_search_keywords" msgid="7710756695666744631">"amanothi"</string>
+ <string name="role_wallet_label" msgid="3719419175656204207">"I-app ye-wallet engokuzenzakalelayo"</string>
+ <string name="role_wallet_short_label" msgid="6521288403762457452">"I-app ye-wallet"</string>
+ <string name="role_wallet_description" msgid="3726535836165949838">"Ama-app e-Wallet angagcina amakhredithi kanye namakhadi obuqotho akho, izikhiye zemoto kanye nezinye izino ukukusiza ngezinhlobo ezihlukahlukene zokuthenga."</string>
+ <string name="role_wallet_request_title" msgid="4770217108262737093">"Setha i-<xliff:g id="APP_NAME">%1$s</xliff:g> njenge-app ye-wallet yakho ezenzakalelayo?"</string>
+ <string name="role_wallet_request_description" msgid="6305487425777483053">"Azikho izimvume ezidingekayo"</string>
<string name="request_role_current_default" msgid="738722892438247184">"Okuzenzakalelayo kwamanje"</string>
<string name="request_role_dont_ask_again" msgid="3556017886029520306">"Ungabuzi futhi"</string>
<string name="request_role_set_as_default" msgid="4253949643984172880">"Setha njengokuzenzekelayo"</string>
@@ -648,4 +653,8 @@
<string name="safety_label_changes_notification_title" msgid="4479955083472203839">"Izibuyekezo zokwabelana ngedatha"</string>
<string name="safety_label_changes_notification_desc" msgid="7808764283266234675">"Amanye ama-app aguqule indlela angabelana ngayo ngedatha yendawo yakho"</string>
<string name="safety_label_changes_gear_description" msgid="2655887555599138509">"Amasethingi"</string>
+ <string name="wear_app_perms_24h_access" msgid="8668121661337328895">"Kufinyelelwe ngo-<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_24h_access_yest" msgid="7069312481704735679">"Kufinyelelwe izolo ngo-<xliff:g id="TIME_DATE">%1$s</xliff:g>"</string>
+ <string name="wear_app_perms_7d_access" msgid="4608069019194676432">"Kufinyelelwe ngo-<xliff:g id="TIME_DATE_0">%1$s</xliff:g> <xliff:g id="TIME_DATE_1">%2$s</xliff:g>"</string>
+ <string name="test_otp_msg" msgid="7559110574222727550">"Iphasiwedi yakho yesikhathi esisodwa ithi 132435"</string>
</resources>
diff --git a/PermissionController/res/values/dimens.xml b/PermissionController/res/values/dimens.xml
index f638e89df..53d5341fe 100644
--- a/PermissionController/res/values/dimens.xml
+++ b/PermissionController/res/values/dimens.xml
@@ -77,4 +77,5 @@
<dimen name="privhub_circle_stroke_width">8dp</dimen>
<dimen name="privhub_details_recycler_view_bottom_padding">96dp</dimen>
+
</resources>
diff --git a/PermissionController/res/values/overlayable.xml b/PermissionController/res/values/overlayable.xml
index 8f81e446b..dc0e90c71 100644
--- a/PermissionController/res/values/overlayable.xml
+++ b/PermissionController/res/values/overlayable.xml
@@ -24,6 +24,7 @@
<!-- START HELP LINKS -->
<item type="string" name="help_app_permissions" />
<item type="string" name="data_sharing_help_center_link" />
+ <item type="string" name="help_url_action_disabled_by_restricted_settings" />
<!-- END HELP LINKS -->
<!-- START PERMISSION GRANT DIALOG -->
diff --git a/PermissionController/res/values/strings.xml b/PermissionController/res/values/strings.xml
index d10c6fb90..6e8005ad0 100644
--- a/PermissionController/res/values/strings.xml
+++ b/PermissionController/res/values/strings.xml
@@ -645,9 +645,15 @@
<!-- Label for the hibernation / auto revoke switch on T+ devices [CHAR LIMIT=40] -->
<string name="unused_apps_label_v2">Pause app activity if unused</string>
+ <!-- Label of a switch preference that controls whether the system will pause app activity when the app has not been used for a while [CHAR LIMIT=40]-->
+ <string name="unused_apps_label_v3">Manage app if unused</string>
+
<!-- Hibernation switch preference summary which describes what the toggle does on T+ devices [CHAR LIMIT=NONE] -->
<string name="unused_apps_summary">Remove permissions, delete temporary files, and stop notifications</string>
+ <!-- Summary of the switch preference that controls whether the system will pause app activity when the app has not been used for a while [CHAR LIMIT=NONE]-->
+ <string name="unused_apps_summary_v2">Remove permissions, delete temporary files, stop notifications, and archive the app</string>
+
<!-- Summary for stating that permissions will be removed [CHAR LIMIT=none] -->
<string name="auto_revoke_summary">To protect your data, permissions for this app will be removed if the app is unused for a few months.</string>
@@ -1217,6 +1223,15 @@
<!-- Search keywords for the NOTES role. [CHAR LIMIT=NONE] -->
<string name="role_notes_search_keywords">notes</string>
+ <!-- Label for the wallet role. [CHAR LIMIT=30] -->
+ <string name="role_wallet_label">Default wallet app</string>
+ <!-- Short label for the wallet role. [CHAR LIMIT=30] -->
+ <string name="role_wallet_short_label">Wallet app</string>
+ <!-- Description for the wallet role. [CHAR LIMIT=NONE] -->
+ <string name="role_wallet_description">Wallet apps can store your credit and loyalty cards, car keys and other things to help with various forms of transactions.</string>
+ <string name="role_wallet_request_title">Set <xliff:g id="app_name" example="Super Wallet">%1$s</xliff:g> as your default wallet app?</string>
+ <string name="role_wallet_request_description">No permissions needed</string>
+
<!-- Subtitle for the application that is the current default application [CHAR LIMIT=30] -->
<string name="request_role_current_default">Current default</string>
@@ -1934,4 +1949,37 @@ Allow <xliff:g id="app_name" example="Gmail">%4$s</xliff:g> to upload a bug repo
<string name="safety_label_changes_gear_description">Settings</string>
<!-- Safety Label Change Notifications End -->
+
+ <!-- Summary for showing the last access text for today for Wear [CHAR LIMIT=50] -->
+ <string name="wear_app_perms_24h_access">Accessed <xliff:g id="time_date" example="12:42 PM">%1$s</xliff:g></string>
+
+ <!-- Summary for showing the last access text for yesterday for Wear [CHAR LIMIT=50] -->
+ <string name="wear_app_perms_24h_access_yest">Accessed yesterday <xliff:g id="time_date" example="12:42 PM">%1$s</xliff:g></string>
+
+ <!-- Summary for showing the last access text for 7 days for Wear [CHAR LIMIT=50] -->
+ <string name="wear_app_perms_7d_access">Accessed <xliff:g id="time_date" example="Jan 3">%1$s</xliff:g> <xliff:g id="time_date" example="12:42 PM">%2$s</xliff:g></string>
+
+ <!-- A string representing a message (sms, email, etc.) telling the user about a one time password. Used for testing [CHAR LIMIT=NONE] -->
+ <string name="test_otp_msg">Your one time password is 132435</string>
+
+ <!-- START ENHANCED CONFIRMATION DIALOG -->
+
+ <!--Title for dialog displayed to tell user that settings are blocked by setting restrictions [CHAR LIMIT=50] -->
+ <string name="enhanced_confirmation_dialog_title">Restricted setting</string>
+ <!--Content for dialog displayed to tell user that settings are blocked by setting restrictions [CHAR LIMIT=NONE] -->
+ <string name="enhanced_confirmation_dialog_desc">For your security, this setting is currently unavailable.</string>
+
+ <!--Title for dialog displayed to tell user that permissions are blocked by setting restrictions [CHAR LIMIT=50] -->
+ <string name="enhanced_confirmation_dialog_title_permission">Permission to use <xliff:g id="permission_name" example="contacts">%1$s</xliff:g> has been denied</string>
+ <!--Content for dialog displayed to tell user that settings are blocked by setting restrictions [CHAR LIMIT=NONE] -->
+ <string name="enhanced_confirmation_dialog_desc_permission">This app has requested the <xliff:g id="permission_name" example="contacts">%1$s</xliff:g> permission, which is a restricted setting because it can put your security &amp; privacy at risk. Restriction to this permission may prevent this app from working.</string>
+
+ <!-- Button label to allow the user to view additional information [CHAR LIMIT=NONE] -->
+ <string name="enhanced_confirmation_dialog_learn_more">Learn more</string>
+ <!-- Button label of the ok button [CHAR LIMIT=NONE] -->
+ <string name="enhanced_confirmation_dialog_ok">Got it</string>
+ <!-- Help URI, action disabled by restricted settings [DO NOT TRANSLATE] -->
+ <string name="help_url_action_disabled_by_restricted_settings" translatable="false"></string>
+
+ <!-- END ENHANCED CONFIRMATION DIALOG -->
</resources>
diff --git a/PermissionController/res/values/styles.xml b/PermissionController/res/values/styles.xml
index a03b71e9d..55181f066 100644
--- a/PermissionController/res/values/styles.xml
+++ b/PermissionController/res/values/styles.xml
@@ -195,6 +195,8 @@
<item name="android:paddingEnd">16dp</item>
<item name="android:orientation">horizontal</item>
<item name="android:background">@drawable/grant_dialog_permission_rationale_background</item>
+ <item name="android:minWidth">48dp</item>
+ <item name="android:minHeight">48dp</item>
</style>
<style name="PermissionGrantPermissionRationaleIcon">
@@ -1036,6 +1038,7 @@
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginStart">16dp</item>
+ <item name="android:background">@null</item>
</style>
<!-- END REQUEST ROLE DIALOG ITEM -->
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml
index 497bfbeb5..4e3a40ecf 100644
--- a/PermissionController/res/xml/roles.xml
+++ b/PermissionController/res/xml/roles.xml
@@ -141,6 +141,10 @@
minSdkVersion="33" />
<permission name="android.permission.EXECUTE_APP_ACTION"
minSdkVersion="34" />
+ <permission name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
+ minSdkVersion="35" optionalMinSdkVersion="34" />
+ <permission name="android.permission.EMBED_ANY_APP_IN_UNTRUSTED_MODE"
+ minSdkVersion="35" />
</permissions>
<app-op-permissions>
<app-op-permission name="android.permission.SYSTEM_ALERT_WINDOW" />
@@ -444,7 +448,9 @@
</preferred-activity>
</preferred-activities>
<permissions>
- <permission name="android.permission.READ_HOME_APP_SEARCH_DATA" minSdkVersion="33"/>
+ <permission name="android.permission.READ_HOME_APP_SEARCH_DATA" minSdkVersion="33" />
+ <permission name="android.permission.ALLOW_SLIPPERY_TOUCHES" minSdkVersion="33" optionalMinSdkVersion="30" />
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35" />
</permissions>
</role>
@@ -546,6 +552,9 @@
<permission-set name="contacts" />
<permission-set name="nearby_devices" />
<permission-set name="notifications" minSdkVersion="35" />
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
<app-op-permissions>
<app-op-permission name="android.permission.MANAGE_ONGOING_CALLS" />
@@ -581,6 +590,9 @@
<permission name="android.permission.TOGGLE_AUTOMOTIVE_PROJECTION" minSdkVersion="33" />
<permission name="android.permission.ADD_TRUSTED_DISPLAY" minSdkVersion="34"/>
<permission name="android.permission.ASSOCIATE_COMPANION_DEVICES" minSdkVersion="34"/>
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
</role>
@@ -631,6 +643,8 @@
<permission name="android.permission.MANAGE_DEVICE_POLICY_CALLS" minSdkVersion="34" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_CAMERA"
minSdkVersion="34" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_CONTENT_PROTECTION"
+ minSdkVersion="35" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_DEBUGGING_FEATURES"
minSdkVersion="34" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_FACTORY_RESET"
@@ -670,6 +684,10 @@
<permission name="android.permission.SET_TIME_ZONE" minSdkVersion="34" />
<permission name="android.permission.SATELLITE_COMMUNICATION" minSdkVersion="34" />
<permission name="android.permission.ALWAYS_UPDATE_WALLPAPER" minSdkVersion="35" />
+ <permission name="android.permission.EMBED_ANY_APP_IN_UNTRUSTED_MODE"
+ minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_AUDIT_LOGGING"
+ minSdkVersion="35" />
</permissions>
</role>
@@ -962,6 +980,9 @@
<permission-set name="notifications" />
<permission name="android.permission.REQUEST_NOTIFICATION_ASSISTANT_SERVICE" />
<permission name="android.permission.SYSTEM_APPLICATION_OVERLAY" />
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
</role>
@@ -1115,6 +1136,9 @@
<permission name="android.permission.MANAGE_SENSOR_PRIVACY" />
<permission name="android.permission.OBSERVE_SENSOR_PRIVACY" />
<permission name="android.permission.ACCESS_AMBIENT_CONTEXT_EVENT" minSdkVersion="33"/>
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
</role>
@@ -1177,6 +1201,9 @@
<permissions>
<permission-set name="notifications" />
<permission-set name="storage" />
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
</role>
@@ -1194,6 +1221,9 @@
<permission-set name="notifications" />
<permission-set name="phone" />
<permission-set name="sms" />
+ <!-- If this role holder has a NotificationListenerService, let that service receive
+ notifications with sensitive content unredacted-->
+ <permission name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS" minSdkVersion="35"/>
</permissions>
<app-op-permissions>
<app-op-permission name="android.permission.MANAGE_ONGOING_CALLS" />
@@ -1331,6 +1361,13 @@
<permission name="android.permission.MANAGE_DEVICE_POLICY_USB_FILE_TRANSFER" minSdkVersion="34" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_ACROSS_USERS_SECURITY_CRITICAL" minSdkVersion="34" />
<permission name="android.permission.MANAGE_DEVICE_POLICY_ACROSS_USERS" minSdkVersion="34" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_CONTENT_PROTECTION" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_QUERY_SYSTEM_UPDATES" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_BLOCK_UNINSTALL" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_CAMERA_TOGGLE" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_MICROPHONE_TOGGLE" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_THEFT_DETECTION" minSdkVersion="35" />
+ <permission name="android.permission.MANAGE_DEVICE_POLICY_AUDIT_LOGGING" minSdkVersion="35" />
</permissions>
</role>
@@ -1345,6 +1382,9 @@
<permissions>
<permission-set name="notifications" />
<permission name="android.permission.GET_HISTORICAL_APP_OPS_STATS" />
+ <permission name="android.permission.READ_SMS" />
+ <permission name="android.permission.RECEIVE_SMS" />
+ <permission name="android.permission.GET_BACKGROUND_INSTALLED_PACKAGES" minSdkVersion="35" />
</permissions>
</role>
@@ -1637,4 +1677,22 @@
<app-op-permission name="android.permission.PACKAGE_USAGE_STATS" />
</app-op-permissions>
</role>
+
+ <role
+ name="android.app.role.WALLET"
+ behavior="WalletRoleBehavior"
+ defaultHolders="config_defaultWallet"
+ description="@string/role_wallet_description"
+ exclusive="true"
+ label="@string/role_wallet_label"
+ minSdkVersion="35"
+ overrideUserWhenGranting="true"
+ requestable="true"
+ requestDescription="@string/role_wallet_request_description"
+ requestTitle="@string/role_wallet_request_title"
+ showNone="true"
+ shortLabel="@string/role_wallet_short_label"
+ uiBehavior="WalletRoleUiBehavior"/>
+
+
</roles>
diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
index 4bf5a6294..8c1446b50 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/HomeRoleBehavior.java
@@ -20,7 +20,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.UserHandle;
@@ -148,13 +147,6 @@ public class HomeRoleBehavior implements RoleBehavior {
true, false, true, false, false, user, context);
}
- // Before T, ALLOW_SLIPPERY_TOUCHES may either not exist, or may not be a role permission
- if (isRolePermission(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES, context)) {
- Permissions.grantAsUser(packageName,
- Arrays.asList(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES),
- true, false, true, false, false, user, context);
- }
-
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
if (SdkLevel.isAtLeastT()) {
Permissions.grantAsUser(packageName, WEAR_PERMISSIONS_T,
@@ -178,13 +170,6 @@ public class HomeRoleBehavior implements RoleBehavior {
user, context);
}
- // Before T, ALLOW_SLIPPERY_TOUCHES may either not exist, or may not be a role permission
- if (isRolePermission(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES, context)) {
- Permissions.revokeAsUser(packageName,
- Arrays.asList(android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES),
- true, false, false, user, context);
- }
-
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
if (SdkLevel.isAtLeastT()) {
Permissions.revokeAsUser(packageName, WEAR_PERMISSIONS_T, true, false, false,
@@ -200,21 +185,6 @@ public class HomeRoleBehavior implements RoleBehavior {
}
}
- /**
- * Return true if the permission exists, and has 'role' protection level.
- * Return false otherwise.
- */
- private boolean isRolePermission(@NonNull String permissionName, @NonNull Context context) {
- PermissionInfo permissionInfo;
- try {
- permissionInfo = context.getPackageManager().getPermissionInfo(permissionName, 0);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- final int flags = permissionInfo.getProtectionFlags();
- return (flags & PermissionInfo.PROTECTION_FLAG_ROLE) == PermissionInfo.PROTECTION_FLAG_ROLE;
- }
-
@Override
public boolean isVisibleAsUser(@NonNull Role role, @NonNull UserHandle user,
@NonNull Context context) {
diff --git a/PermissionController/role-controller/java/com/android/role/controller/behavior/WalletRoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/behavior/WalletRoleBehavior.java
new file mode 100644
index 000000000..855012cf1
--- /dev/null
+++ b/PermissionController/role-controller/java/com/android/role/controller/behavior/WalletRoleBehavior.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.role.controller.behavior;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.cardemulation.CardEmulation;
+import android.nfc.cardemulation.HostApduService;
+import android.nfc.cardemulation.OffHostApduService;
+import android.os.Build;
+import android.os.UserHandle;
+import android.permission.flags.Flags;
+import android.service.quickaccesswallet.QuickAccessWalletService;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
+import com.android.modules.utils.build.SdkLevel;
+import com.android.role.controller.model.Role;
+import com.android.role.controller.model.RoleBehavior;
+import com.android.role.controller.util.CollectionUtils;
+import com.android.role.controller.util.UserUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Handles the behavior of the wallet role.
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class WalletRoleBehavior implements RoleBehavior {
+
+ private static final String LOG_TAG = WalletRoleBehavior.class.getSimpleName();
+
+ @Override
+ public boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ return SdkLevel.isAtLeastV() && Flags.walletRoleEnabled()
+ && !UserUtils.isProfile(user, context);
+ }
+
+ @Nullable
+ @Override
+ public List<String> getDefaultHoldersAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ ComponentName preferredPaymentService =
+ CardEmulation.getPreferredPaymentService(userContext);
+ if (preferredPaymentService != null) {
+ return Collections.singletonList(preferredPaymentService.getPackageName());
+ }
+
+ return null;
+ }
+
+ @Nullable
+ @Override
+ public String getFallbackHolderAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ return CollectionUtils.firstOrNull(role.getDefaultHoldersAsUser(user, context));
+ }
+
+ @Nullable
+ @Override
+ public Boolean isPackageQualifiedAsUser(@NonNull Role role, @NonNull String packageName,
+ @NonNull UserHandle user, @NonNull Context context) {
+ return !getQualifyingPackageNamesInternal(packageName, user, context).isEmpty();
+ }
+
+ @Nullable
+ @Override
+ public List<String> getQualifyingPackagesAsUser(@NonNull Role role, @NonNull UserHandle user,
+ @NonNull Context context) {
+ return new ArrayList<>(getQualifyingPackageNamesInternal(null, user, context));
+ }
+
+ @NonNull
+ private static Set<String> getQualifyingPackageNamesInternal(@Nullable String packageName,
+ @NonNull UserHandle user, @NonNull Context context) {
+ Set<String> packageNames = resolvePackageNames(QuickAccessWalletService.SERVICE_INTERFACE,
+ packageName, user, context);
+ if (isNfcHostCardEmulationSupported(context)) {
+ packageNames.addAll(getQualifyingApduServicesAsUser(packageName, false, user,
+ context));
+ packageNames.addAll(getQualifyingApduServicesAsUser(packageName, true, user,
+ context));
+ }
+ return packageNames;
+ }
+
+ @NonNull
+ private static Set<String> resolvePackageNames(@NonNull String action,
+ @Nullable String packageName, @NonNull UserHandle user, @NonNull Context context) {
+ Intent intent = new Intent(action).setPackage(packageName);
+ PackageManager packageManager = context.getPackageManager();
+ List<ResolveInfo> resolveInfos = packageManager
+ .queryIntentServicesAsUser(intent, PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, user);
+ Set<String> packageNames = new ArraySet<>();
+ int resolveInfosSize = resolveInfos.size();
+ for (int i = 0; i < resolveInfosSize; i++) {
+ ServiceInfo serviceInfo = resolveInfos.get(i).serviceInfo;
+ if (!serviceInfo.exported) {
+ continue;
+ }
+ packageNames.add(serviceInfo.packageName);
+ }
+ return packageNames;
+ }
+
+ @NonNull
+ private static Set<String> getQualifyingApduServicesAsUser(@Nullable String packageName,
+ boolean onHost, @NonNull UserHandle user, @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
+ Intent intent = new Intent(
+ onHost ? HostApduService.SERVICE_INTERFACE : OffHostApduService.SERVICE_INTERFACE)
+ .setPackage(packageName);
+ List<ResolveInfo> resolveInfos = userPackageManager.queryIntentServices(intent,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.GET_META_DATA);
+ Set<String> packageNames = new ArraySet<>();
+ int resolveInfosSize = resolveInfos.size();
+ for (int i = 0; i < resolveInfosSize; i++) {
+ ResolveInfo resolveInfo = resolveInfos.get(i);
+ ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+ if (!serviceInfo.exported) {
+ continue;
+ }
+ ApduServiceInfo apduServiceInfo;
+ try {
+ apduServiceInfo = new ApduServiceInfo(userPackageManager, resolveInfo, onHost);
+ } catch (IOException | XmlPullParserException e) {
+ Log.w(LOG_TAG, "Unable to create ApduServiceInfo for " + resolveInfo, e);
+ continue;
+ }
+ if (apduServiceInfo.hasCategory(CardEmulation.CATEGORY_PAYMENT)) {
+ packageNames.add(resolveInfo.serviceInfo.packageName);
+ }
+ }
+ return packageNames;
+ }
+
+ private static boolean isNfcHostCardEmulationSupported(@NonNull Context context) {
+ return context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_NFC_HOST_CARD_EMULATION);
+ }
+}
diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java b/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java
index 6ded32d58..f999e5972 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/model/Permission.java
@@ -16,11 +16,16 @@
package com.android.role.controller.model;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
import android.os.Build;
+import android.os.UserHandle;
import androidx.annotation.NonNull;
import com.android.modules.utils.build.SdkLevel;
+import com.android.role.controller.util.UserUtils;
import java.util.Objects;
@@ -40,9 +45,15 @@ public class Permission {
*/
private final int mMinSdkVersion;
- public Permission(@NonNull String name, int minSdkVersion) {
+ /**
+ * The minimum SDK version for this permission to be optionally granted (when it is grantable).
+ */
+ private final int mOptionalMinSdkVersion;
+
+ public Permission(@NonNull String name, int minSdkVersion, int optionalMinSdkVersion) {
mName = name;
mMinSdkVersion = minSdkVersion;
+ mOptionalMinSdkVersion = optionalMinSdkVersion;
}
@NonNull
@@ -54,33 +65,56 @@ public class Permission {
return mMinSdkVersion;
}
+ public int getOptionalMinSdkVersion() {
+ return mOptionalMinSdkVersion;
+ }
+
/**
* Check whether this permission is available.
*
+ * @param user the user to check for
+ * @param context the {@code Context} to retrieve system services
+ *
* @return whether this permission is available
*/
- public boolean isAvailable() {
- // Workaround to match the value 35+ for V+ in roles.xml before SDK finalization.
- if (mMinSdkVersion >= 35) {
- return SdkLevel.isAtLeastV();
- } else {
- return Build.VERSION.SDK_INT >= mMinSdkVersion;
+ public boolean isAvailableAsUser(@NonNull UserHandle user, @NonNull Context context) {
+ if (Build.VERSION.SDK_INT >= mMinSdkVersion
+ // Workaround to match the value 35 for V in roles.xml before SDK finalization.
+ || (mMinSdkVersion == 35 && SdkLevel.isAtLeastV())) {
+ return true;
+ }
+ if (Build.VERSION.SDK_INT >= mOptionalMinSdkVersion) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
+ PermissionInfo permissionInfo;
+ try {
+ permissionInfo = userPackageManager.getPermissionInfo(mName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ return permissionInfo.getProtection() == PermissionInfo.PROTECTION_DANGEROUS
+ || (permissionInfo.getProtectionFlags() & PermissionInfo.PROTECTION_FLAG_ROLE)
+ == PermissionInfo.PROTECTION_FLAG_ROLE
+ || (permissionInfo.getProtectionFlags() & PermissionInfo.PROTECTION_FLAG_APPOP)
+ == PermissionInfo.PROTECTION_FLAG_APPOP;
}
+ return false;
}
/**
- * Return a new permission with the specified minimum SDK version, or this permission if it
- * already has the same minimum SDK version.
+ * Return a new permission with the specified SDK versions, or this permission if it already has
+ * the same SDK versions.
*
* @param minSdkVersion the minimum SDK version
- * @return a permission with the specified minimum SDK version
+ * @param optionalMinSdkVersion the optional minimum SDK version
+ * @return a permission with the specified SDK versions
*/
@NonNull
- public Permission withMinSdkVersion(int minSdkVersion) {
- if (mMinSdkVersion == minSdkVersion) {
+ public Permission withSdkVersions(int minSdkVersion, int optionalMinSdkVersion) {
+ if (mMinSdkVersion == minSdkVersion && mOptionalMinSdkVersion == optionalMinSdkVersion) {
return this;
}
- return new Permission(mName, minSdkVersion);
+ return new Permission(mName, minSdkVersion, optionalMinSdkVersion);
}
@Override
@@ -88,6 +122,7 @@ public class Permission {
return "Permission{"
+ "mName='" + mName + '\''
+ ", mMinSdkVersion=" + mMinSdkVersion
+ + ", mOptionalMinSdkVersion=" + mOptionalMinSdkVersion
+ '}';
}
@@ -101,11 +136,12 @@ public class Permission {
}
Permission that = (Permission) object;
return mMinSdkVersion == that.mMinSdkVersion
+ && mOptionalMinSdkVersion == that.mOptionalMinSdkVersion
&& mName.equals(that.mName);
}
@Override
public int hashCode() {
- return Objects.hash(mName, mMinSdkVersion);
+ return Objects.hash(mName, mMinSdkVersion, mOptionalMinSdkVersion);
}
}
diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/Permissions.java b/PermissionController/role-controller/java/com/android/role/controller/model/Permissions.java
index 8a15612b9..e788fdce1 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/model/Permissions.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/model/Permissions.java
@@ -61,16 +61,19 @@ public class Permissions {
* Filter a list of permissions based on their SDK versions.
*
* @param permissions the list of permissions
+ * @param user the user to check for
+ * @param context the {@code Context} to retrieve system services
*
* @return the filtered list of permission names.
*/
@NonNull
- public static List<String> filterBySdkVersion(@NonNull List<Permission> permissions) {
+ public static List<String> filterBySdkVersionAsUser(@NonNull List<Permission> permissions,
+ @NonNull UserHandle user, @NonNull Context context) {
List<String> permissionNames = new ArrayList<>();
int permissionsSize = permissions.size();
for (int i = 0; i < permissionsSize; i++) {
Permission permission = permissions.get(i);
- if (!permission.isAvailable()) {
+ if (!permission.isAvailableAsUser(user, context)) {
continue;
}
permissionNames.add(permission.getName());
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 6c7eb7d9e..c3541c83b 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
@@ -17,9 +17,12 @@
package com.android.role.controller.model;
import android.app.ActivityManager;
+import android.app.admin.DevicePolicyManager;
+import android.app.ecm.EnhancedConfirmationManager;
import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.SharedLibraryInfo;
@@ -27,6 +30,9 @@ import android.content.pm.Signature;
import android.content.res.Resources;
import android.os.Build;
import android.os.UserHandle;
+import android.os.UserManager;
+import android.permission.flags.Flags;
+import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -128,6 +134,11 @@ public class Role {
private final int mMinSdkVersion;
/**
+ * Whether this role should only grant privileges when a role holder is actively added.
+ */
+ private final boolean mOnlyGrantWhenAdded;
+
+ /**
* Whether this role should override user's choice about privileges when granting.
*/
private final boolean mOverrideUserWhenGranting;
@@ -224,11 +235,11 @@ public class Role {
@Nullable RoleBehavior behavior, @Nullable String defaultHoldersResourceName,
@StringRes int descriptionResource, boolean exclusive, boolean fallBackToDefaultHolder,
@StringRes int labelResource, int maxSdkVersion, int minSdkVersion,
- boolean overrideUserWhenGranting, @StringRes int requestDescriptionResource,
- @StringRes int requestTitleResource, boolean requestable,
- @StringRes int searchKeywordsResource, @StringRes int shortLabelResource,
- boolean showNone, boolean statik, boolean systemOnly, boolean visible,
- @NonNull List<RequiredComponent> requiredComponents,
+ boolean onlyGrantWhenAdded, boolean overrideUserWhenGranting,
+ @StringRes int requestDescriptionResource, @StringRes int requestTitleResource,
+ boolean requestable, @StringRes int searchKeywordsResource,
+ @StringRes int shortLabelResource, boolean showNone, boolean statik, boolean systemOnly,
+ boolean visible, @NonNull List<RequiredComponent> requiredComponents,
@NonNull List<Permission> permissions, @NonNull List<Permission> appOpPermissions,
@NonNull List<AppOp> appOps, @NonNull List<PreferredActivity> preferredActivities,
@Nullable String uiBehaviorName) {
@@ -242,6 +253,7 @@ public class Role {
mLabelResource = labelResource;
mMaxSdkVersion = maxSdkVersion;
mMinSdkVersion = minSdkVersion;
+ mOnlyGrantWhenAdded = onlyGrantWhenAdded;
mOverrideUserWhenGranting = overrideUserWhenGranting;
mRequestDescriptionResource = requestDescriptionResource;
mRequestTitleResource = requestTitleResource;
@@ -309,6 +321,13 @@ public class Role {
}
/**
+ * @see #mOnlyGrantWhenAdded
+ */
+ public boolean shouldOnlyGrantWhenAdded() {
+ return mOnlyGrantWhenAdded;
+ }
+
+ /**
* @see #mOverrideUserWhenGranting
*/
public boolean shouldOverrideUserWhenGranting() {
@@ -392,13 +411,10 @@ public class Role {
* @return whether this role is available based on SDK version
*/
boolean isAvailableBySdkVersion() {
- // Workaround to match the value 35+ for V+ in roles.xml before SDK finalization.
- if (mMinSdkVersion >= 35) {
- return SdkLevel.isAtLeastV();
- } else {
- return Build.VERSION.SDK_INT >= mMinSdkVersion
- && Build.VERSION.SDK_INT <= mMaxSdkVersion;
- }
+ return (Build.VERSION.SDK_INT >= mMinSdkVersion
+ // Workaround to match the value 35 for V in roles.xml before SDK finalization.
+ || (mMinSdkVersion == 35 && SdkLevel.isAtLeastV()))
+ && Build.VERSION.SDK_INT <= mMaxSdkVersion;
}
public boolean isStatic() {
@@ -416,10 +432,14 @@ public class Role {
@NonNull
public List<String> getDefaultHoldersAsUser(@NonNull UserHandle user,
@NonNull Context context) {
- if (mDefaultHoldersResourceName == null) {
- if (mBehavior != null) {
- return mBehavior.getDefaultHoldersAsUser(this, user, context);
+ if (mBehavior != null) {
+ List<String> defaultHolders = mBehavior.getDefaultHoldersAsUser(this, user, context);
+ if (defaultHolders != null) {
+ return defaultHolders;
}
+ }
+
+ if (mDefaultHoldersResourceName == null) {
return Collections.emptyList();
}
@@ -781,11 +801,12 @@ public class Role {
public void grantAsUser(@NonNull String packageName, boolean dontKillApp,
boolean overrideUser, @NonNull UserHandle user, @NonNull Context context) {
boolean permissionOrAppOpChanged = Permissions.grantAsUser(packageName,
- Permissions.filterBySdkVersion(mPermissions),
+ Permissions.filterBySdkVersionAsUser(mPermissions, user, context),
SdkLevel.isAtLeastS() ? !mSystemOnly : true, overrideUser, true, false, false,
user, context);
- List<String> appOpPermissionsToGrant = Permissions.filterBySdkVersion(mAppOpPermissions);
+ List<String> appOpPermissionsToGrant =
+ Permissions.filterBySdkVersionAsUser(mAppOpPermissions, user, context);
int appOpPermissionsSize = appOpPermissionsToGrant.size();
for (int i = 0; i < appOpPermissionsSize; i++) {
String appOpPermission = appOpPermissionsToGrant.get(i);
@@ -831,24 +852,27 @@ public class Role {
List<String> otherRoleNames = userRoleManager.getHeldRolesFromController(packageName);
otherRoleNames.remove(mName);
- List<String> permissionsToRevoke = Permissions.filterBySdkVersion(mPermissions);
+ List<String> permissionsToRevoke =
+ Permissions.filterBySdkVersionAsUser(mPermissions, user, context);
ArrayMap<String, Role> roles = Roles.get(context);
int otherRoleNamesSize = otherRoleNames.size();
for (int i = 0; i < otherRoleNamesSize; i++) {
String roleName = otherRoleNames.get(i);
Role role = roles.get(roleName);
- permissionsToRevoke.removeAll(Permissions.filterBySdkVersion(role.mPermissions));
+ permissionsToRevoke.removeAll(
+ Permissions.filterBySdkVersionAsUser(role.mPermissions, user, context));
}
boolean permissionOrAppOpChanged = Permissions.revokeAsUser(packageName,
permissionsToRevoke, true, false, overrideSystemFixedPermissions, user, context);
- List<String> appOpPermissionsToRevoke = Permissions.filterBySdkVersion(mAppOpPermissions);
+ List<String> appOpPermissionsToRevoke = Permissions.filterBySdkVersionAsUser(
+ mAppOpPermissions, user, context);
for (int i = 0; i < otherRoleNamesSize; i++) {
String roleName = otherRoleNames.get(i);
Role role = roles.get(roleName);
appOpPermissionsToRevoke.removeAll(
- Permissions.filterBySdkVersion(role.mAppOpPermissions));
+ Permissions.filterBySdkVersionAsUser(role.mAppOpPermissions, user, context));
}
int appOpPermissionsSize = appOpPermissionsToRevoke.size();
for (int i = 0; i < appOpPermissionsSize; i++) {
@@ -953,7 +977,7 @@ public class Role {
* Check whether this role should be visible to user.
*
* @param user the user to check for
- * @param context the `Context` to retrieve system services
+ * @param context the {@code Context} to retrieve system services
*
* @return whether this role should be visible to user
*/
@@ -983,6 +1007,76 @@ public class Role {
return behavior.isApplicationVisibleAsUser(this, applicationInfo, user, context);
}
+ /**
+ * Check whether this role is restricted and return the {@code Intent} for the restriction if it
+ * is.
+ * <p>
+ * If a role is restricted, it is implied that all applications are restricted for the role as
+ * well.
+ *
+ * @param user the user to check for
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return the {@code Intent} for the restriction if this role is restricted, or {@code null}
+ * otherwise.
+ */
+ @Nullable
+ public Intent getRestrictionIntentAsUser(@NonNull UserHandle user, @NonNull Context context) {
+ if (SdkLevel.isAtLeastU() && mExclusive) {
+ UserManager userManager = context.getSystemService(UserManager.class);
+ if (userManager.hasUserRestrictionForUser(UserManager.DISALLOW_CONFIG_DEFAULT_APPS,
+ user)) {
+ return new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS)
+ .putExtra(DevicePolicyManager.EXTRA_RESTRICTION,
+ UserManager.DISALLOW_CONFIG_DEFAULT_APPS);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Check whether an application is restricted for this role and return the {@code Intent} for
+ * the restriction if it is.
+ * <p>
+ * If a role is restricted, it is implied that all applications are restricted for the role as
+ * well.
+ *
+ * @param applicationInfo the {@link ApplicationInfo} for the application
+ * @param user the user to check for
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return the {@code Intent} for the restriction if the application is restricted for this
+ * role, or {@code null} otherwise.
+ */
+ @Nullable
+ public Intent getApplicationRestrictionIntentAsUser(@NonNull ApplicationInfo applicationInfo,
+ @NonNull UserHandle user, @NonNull Context context) {
+ if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ EnhancedConfirmationManager userEnhancedConfirmationManager =
+ userContext.getSystemService(EnhancedConfirmationManager.class);
+ String packageName = applicationInfo.packageName;
+ boolean isRestricted;
+ try {
+ isRestricted = userEnhancedConfirmationManager.isRestricted(packageName, mName);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(LOG_TAG, "Cannot check enhanced confirmation restriction for package: "
+ + packageName, e);
+ isRestricted = false;
+ }
+ if (isRestricted) {
+ try {
+ return userEnhancedConfirmationManager.createRestrictedSettingDialogIntent(
+ packageName, mName);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.w(LOG_TAG, "Cannot create enhanced confirmation restriction intent for"
+ + " package: " + packageName, e);
+ }
+ }
+ }
+ return getRestrictionIntentAsUser(user, context);
+ }
+
@Override
public String toString() {
return "Role{"
@@ -996,6 +1090,7 @@ public class Role {
+ ", mLabelResource=" + mLabelResource
+ ", mMaxSdkVersion=" + mMaxSdkVersion
+ ", mMinSdkVersion=" + mMinSdkVersion
+ + ", mOnlyGrantWhenAdded=" + mOnlyGrantWhenAdded
+ ", mOverrideUserWhenGranting=" + mOverrideUserWhenGranting
+ ", mRequestDescriptionResource=" + mRequestDescriptionResource
+ ", mRequestTitleResource=" + mRequestTitleResource
diff --git a/PermissionController/role-controller/java/com/android/role/controller/model/RoleBehavior.java b/PermissionController/role-controller/java/com/android/role/controller/model/RoleBehavior.java
index 4bc1873d5..3849a50e3 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/model/RoleBehavior.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/model/RoleBehavior.java
@@ -48,10 +48,10 @@ public interface RoleBehavior {
/**
* @see Role#getDefaultHolders(Context)
*/
- @NonNull
+ @Nullable
default List<String> getDefaultHoldersAsUser(@NonNull Role role, @NonNull UserHandle user,
@NonNull Context context) {
- return Collections.emptyList();
+ return null;
}
/**
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 cc2d102c8..ad9054727 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
@@ -24,6 +24,7 @@ import android.content.pm.PermissionInfo;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.Build;
+import android.os.Process;
import android.permission.flags.Flags;
import android.util.ArrayMap;
import android.util.Log;
@@ -92,6 +93,7 @@ public class RoleParser {
private static final String ATTRIBUTE_LABEL = "label";
private static final String ATTRIBUTE_MAX_SDK_VERSION = "maxSdkVersion";
private static final String ATTRIBUTE_MIN_SDK_VERSION = "minSdkVersion";
+ private static final String ATTRIBUTE_ONLY_GRANT_WHEN_ADDED = "onlyGrantWhenAdded";
private static final String ATTRIBUTE_OVERRIDE_USER_WHEN_GRANTING = "overrideUserWhenGranting";
private static final String ATTRIBUTE_QUERY_FLAGS = "queryFlags";
private static final String ATTRIBUTE_REQUEST_TITLE = "requestTitle";
@@ -106,6 +108,7 @@ public class RoleParser {
private static final String ATTRIBUTE_VISIBLE = "visible";
private static final String ATTRIBUTE_FLAGS = "flags";
private static final String ATTRIBUTE_MIN_TARGET_SDK_VERSION = "minTargetSdkVersion";
+ private static final String ATTRIBUTE_OPTIONAL_MIN_SDK_VERSION = "optionalMinSdkVersion";
private static final String ATTRIBUTE_PERMISSION = "permission";
private static final String ATTRIBUTE_PROHIBITED = "prohibited";
private static final String ATTRIBUTE_VALUE = "value";
@@ -272,6 +275,8 @@ public class RoleParser {
int minSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_MIN_SDK_VERSION,
Build.VERSION_CODES.BASE);
+ int optionalMinSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_OPTIONAL_MIN_SDK_VERSION,
+ minSdkVersion);
List<Permission> permissions = new ArrayList<>();
@@ -291,7 +296,10 @@ public class RoleParser {
continue;
}
int mergedMinSdkVersion = Math.max(permission.getMinSdkVersion(), minSdkVersion);
- permission = permission.withMinSdkVersion(mergedMinSdkVersion);
+ int mergedOptionalMinSdkVersion = Math.max(permission.getOptionalMinSdkVersion(),
+ optionalMinSdkVersion);
+ permission = permission.withSdkVersions(mergedMinSdkVersion,
+ mergedOptionalMinSdkVersion);
validateNoDuplicateElement(permission, permissions, "permission");
permissions.add(permission);
} else {
@@ -313,7 +321,9 @@ public class RoleParser {
}
int minSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_MIN_SDK_VERSION,
Build.VERSION_CODES.BASE);
- return new Permission(name, minSdkVersion);
+ int optionalMinSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_OPTIONAL_MIN_SDK_VERSION,
+ minSdkVersion);
+ return new Permission(name, minSdkVersion, optionalMinSdkVersion);
}
@Nullable
@@ -396,6 +406,9 @@ public class RoleParser {
return null;
}
+ boolean onlyGrantWhenAdded = getAttributeBooleanValue(parser,
+ ATTRIBUTE_ONLY_GRANT_WHEN_ADDED, false);
+
boolean overrideUserWhenGranting = getAttributeBooleanValue(parser,
ATTRIBUTE_OVERRIDE_USER_WHEN_GRANTING, false);
@@ -523,10 +536,11 @@ public class RoleParser {
}
return new Role(name, allowBypassingQualification, behavior, defaultHoldersResourceName,
descriptionResource, exclusive, fallBackToDefaultHolder, labelResource,
- maxSdkVersion, minSdkVersion, overrideUserWhenGranting, requestDescriptionResource,
- requestTitleResource, requestable, searchKeywordsResource, shortLabelResource,
- showNone, statik, systemOnly, visible, requiredComponents, permissions,
- appOpPermissions, appOps, preferredActivities, uiBehaviorName);
+ maxSdkVersion, minSdkVersion, onlyGrantWhenAdded, overrideUserWhenGranting,
+ requestDescriptionResource, requestTitleResource, requestable,
+ searchKeywordsResource, shortLabelResource, showNone, statik, systemOnly, visible,
+ requiredComponents, permissions, appOpPermissions, appOps, preferredActivities,
+ uiBehaviorName);
}
@NonNull
@@ -768,6 +782,8 @@ public class RoleParser {
}
int minSdkVersion = getAttributeIntValue(parser, ATTRIBUTE_MIN_SDK_VERSION,
Build.VERSION_CODES.BASE);
+ int optionalMinSdkVersion = getAttributeIntValue(parser,
+ ATTRIBUTE_OPTIONAL_MIN_SDK_VERSION, minSdkVersion);
List<Permission> permissionsInSet = permissionSet.getPermissions();
int permissionsInSetSize = permissionsInSet.size();
for (int permissionsInSetIndex = 0;
@@ -775,7 +791,10 @@ public class RoleParser {
Permission permission = permissionsInSet.get(permissionsInSetIndex);
int mergedMinSdkVersion =
Math.max(permission.getMinSdkVersion(), minSdkVersion);
- permission = permission.withMinSdkVersion(mergedMinSdkVersion);
+ int mergedOptionalMinSdkVersion = Math.max(
+ permission.getOptionalMinSdkVersion(), optionalMinSdkVersion);
+ permission = permission.withSdkVersions(mergedMinSdkVersion,
+ mergedOptionalMinSdkVersion);
// We do allow intersection between permission sets.
permissions.add(permission);
}
@@ -1144,7 +1163,7 @@ public class RoleParser {
}
private void validatePermission(@NonNull Permission permission) {
- if (!permission.isAvailable()) {
+ if (!permission.isAvailableAsUser(Process.myUserHandle(), mContext)) {
return;
}
validatePermission(permission.getName(), true);
@@ -1180,7 +1199,7 @@ public class RoleParser {
}
private void validateAppOpPermission(@NonNull Permission appOpPermission) {
- if (!appOpPermission.isAvailable()) {
+ if (!appOpPermission.isAvailableAsUser(Process.myUserHandle(), mContext)) {
return;
}
validateAppOpPermission(appOpPermission.getName());
diff --git a/PermissionController/role-controller/java/com/android/role/controller/service/RoleControllerServiceImpl.java b/PermissionController/role-controller/java/com/android/role/controller/service/RoleControllerServiceImpl.java
index 2a6010c4d..bc7562c11 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/service/RoleControllerServiceImpl.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/service/RoleControllerServiceImpl.java
@@ -131,10 +131,12 @@ public class RoleControllerServiceImpl extends RoleControllerService {
String packageName = currentPackageNames.get(currentPackageNamesIndex);
if (role.isPackageQualifiedAsUser(packageName, mUser, mContext)) {
- // We should not override user set or fixed permissions because we are only
- // redoing the grant here. Otherwise, user won't be able to revoke permissions
- // granted by role.
- addRoleHolderInternal(role, packageName, false, false, true);
+ if (!role.shouldOnlyGrantWhenAdded()) {
+ // We should not override user set or fixed permissions because we are only
+ // redoing the grant here. Otherwise, user won't be able to revoke
+ // permissions granted by role.
+ addRoleHolderInternal(role, packageName, false, false, true);
+ }
} else {
Log.i(LOG_TAG, "Removing package that no longer qualifies for the role,"
+ " package: " + packageName + ", role: " + roleName);
diff --git a/PermissionController/role-controller/lint-baseline.xml b/PermissionController/role-controller/lint-baseline.xml
index e7c119f3b..894dc1834 100644
--- a/PermissionController/role-controller/lint-baseline.xml
+++ b/PermissionController/role-controller/lint-baseline.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
message="Call requires API level 31 (current min is 30): `android.app.NotificationManager#setNotificationListenerAccessGranted`"
- errorLine1=" notificationManager.setNotificationListenerAccessGranted("
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ errorLine1=" userNotificationManager.setNotificationListenerAccessGranted("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="packages/modules/Permission/PermissionController/role-controller/java/com/android/role/controller/util/NotificationUtils.java"
- line="74"
- column="33"/>
+ line="78"
+ column="37"/>
</issue>
</issues> \ No newline at end of file
diff --git a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
index 719ef33b5..0ee0e0d01 100644
--- a/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/auto/DrivingDecisionReminderService.kt
@@ -140,6 +140,14 @@ class DrivingDecisionReminderService : Service() {
car.disconnect()
}
}
+
+ fun cancelNotification(context: Context) {
+ val notificationManager = context.getSystemService(NotificationManager::class.java)!!
+ notificationManager.cancel(
+ DrivingDecisionReminderService::class.java.simpleName,
+ Constants.PERMISSION_DECISION_REMINDER_NOTIFICATION_ID
+ )
+ }
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
diff --git a/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialog.java b/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialog.java
new file mode 100644
index 000000000..a9d0bf9f4
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialog.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.ecm;
+
+import android.app.Activity;
+import android.app.ecm.EnhancedConfirmationManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.permission.flags.Flags;
+import android.text.TextUtils;
+
+import androidx.annotation.Keep;
+
+import com.android.modules.utils.build.SdkLevel;
+
+@Keep
+public class EnhancedConfirmationDialog extends Activity implements
+ DialogInterface.OnDismissListener {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (!SdkLevel.isAtLeastV() || !Flags.enhancedConfirmationModeApisEnabled()) {
+ return;
+ }
+
+ final String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+ if (TextUtils.isEmpty(packageName)) {
+ throw new IllegalArgumentException("EXTRA_PACKAGE_NAME cannot be null or empty");
+ }
+
+ final int uid = getIntent().getIntExtra(Intent.EXTRA_UID, android.os.Process.INVALID_UID);
+ if (uid == android.os.Process.INVALID_UID) {
+ throw new IllegalArgumentException("EXTRA_UID cannot be null or invalid");
+ }
+ final UserHandle user = UserHandle.getUserHandleForUid(uid);
+
+ final String settingIdentifier = getIntent().getStringExtra(Intent.EXTRA_SUBJECT);
+ if (settingIdentifier == null) {
+ throw new IllegalArgumentException("EXTRA_SUBJECT cannot be null or invalid");
+ }
+
+ EnhancedConfirmationDialogHelper dialogHelper = new EnhancedConfirmationDialogHelper(this);
+ dialogHelper.show(settingIdentifier, this);
+
+ setClearRestrictionAllowed(packageName, user);
+ }
+
+ private void setClearRestrictionAllowed(String packageName, UserHandle user) {
+ Context userContext = createContextAsUser(user, 0);
+ EnhancedConfirmationManager ecm = userContext.getSystemService(
+ EnhancedConfirmationManager.class);
+ try {
+ ecm.setClearRestrictionAllowed(packageName);
+ } catch (PackageManager.NameNotFoundException e) {
+ throw new IllegalArgumentException("unknown package: " + packageName);
+ }
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ finish();
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialogHelper.java b/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialogHelper.java
new file mode 100644
index 000000000..1fa5d804c
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/ecm/EnhancedConfirmationDialogHelper.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.ecm;
+
+import android.app.Activity;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AlertDialog;
+
+import com.android.permissioncontroller.R;
+import com.android.permissioncontroller.permission.utils.KotlinUtils;
+import com.android.permissioncontroller.permission.utils.PermissionMapping;
+import com.android.settingslib.HelpUtils;
+
+import java.util.Objects;
+
+final class EnhancedConfirmationDialogHelper {
+
+ private final ViewGroup mDialogView;
+ private final Activity mActivity;
+
+ EnhancedConfirmationDialogHelper(Activity activity) {
+ mActivity = activity;
+ mDialogView = (ViewGroup) LayoutInflater.from(mActivity).inflate(
+ R.layout.enhanced_confirmation_dialog, null);
+ }
+
+ public void show(String settingIdentifier,
+ DialogInterface.OnDismissListener onDismissListener) {
+ final String helpUrl = mActivity.getString(
+ R.string.help_url_action_disabled_by_restricted_settings);
+ AlertDialog.Builder builder = new AlertDialog.Builder(mActivity,
+ com.android.settingslib.widget.theme.R.style.Theme_AlertDialog_SettingsLib)
+ .setView(mDialogView)
+ .setPositiveButton(R.string.enhanced_confirmation_dialog_ok, null)
+ .setNeutralButton(R.string.enhanced_confirmation_dialog_learn_more,
+ (DialogInterface.OnClickListener) (dialog, which) -> {
+ final Intent intent = HelpUtils.getHelpIntent(mActivity, helpUrl,
+ mActivity.getClass().getName());
+ if (intent != null) {
+ mActivity.startActivity(intent);
+ }
+ });
+ String permGroup = PermissionMapping.isPlatformPermissionGroup(settingIdentifier)
+ ? settingIdentifier
+ : PermissionMapping.getGroupOfPlatformPermission(settingIdentifier);
+ if (permGroup != null) {
+ CharSequence permGroupLabel = KotlinUtils.INSTANCE.getPermGroupLabel(mActivity,
+ permGroup);
+ setTitle(mActivity.getString(R.string.enhanced_confirmation_dialog_title_permission,
+ permGroupLabel));
+ setDesc(mActivity.getString(R.string.enhanced_confirmation_dialog_desc_permission,
+ permGroupLabel));
+ }
+
+ AlertDialog dialog = builder.setOnDismissListener(onDismissListener).create();
+ dialog.setOnShowListener(new AlertDialog.OnShowListener() {
+ @Override
+ public void onShow(DialogInterface dialog) {
+ ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setAllCaps(false);
+ ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_NEUTRAL).setAllCaps(false);
+ }
+ });
+ dialog.show();
+ }
+
+ void setTitle(String title) {
+ TextView textView = Objects.requireNonNull(
+ mDialogView.findViewById(R.id.enhanced_confirmation_dialog_title));
+ textView.setText(title);
+ }
+
+ void setDesc(String description) {
+ TextView textView = Objects.requireNonNull(
+ mDialogView.findViewById(R.id.enhanced_confirmation_dialog_desc));
+ textView.setText(description);
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt b/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
index 97dd3f43c..8e58d48d9 100644
--- a/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
@@ -33,6 +33,7 @@ import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.material.CircularProgressIndicator
import com.android.permissioncontroller.permission.ui.wear.elements.AlertDialog
import com.android.permissioncontroller.permission.ui.wear.elements.SingleButtonAlertDialog
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
@Composable
fun WearConfirmationScreen(viewModel: WearConfirmationActivityViewModel) {
@@ -77,5 +78,7 @@ fun WearConfirmationScreen(viewModel: WearConfirmationActivityViewModel) {
}
fun createView(activity: Activity, viewModel: WearConfirmationActivityViewModel): View {
- return ComposeView(activity).apply { setContent { WearConfirmationScreen(viewModel) } }
+ return ComposeView(activity).apply {
+ setContent { WearPermissionTheme { WearConfirmationScreen(viewModel) } }
+ }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
index cc5f156ce..0ebfcd3d7 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/PermGroupsPackagesUiInfoLiveData.kt
@@ -21,6 +21,7 @@ import android.app.role.RoleManager
import android.os.Handler
import android.os.Looper
import android.os.UserHandle
+import android.os.UserManager
import androidx.lifecycle.LiveData
import com.android.permissioncontroller.PermissionControllerApplication
import com.android.permissioncontroller.permission.model.livedatatypes.AppPermGroupUiInfo
@@ -62,6 +63,8 @@ class PermGroupsPackagesUiInfoLiveData(
private val allPackageData = mutableMapOf<String, PermGroupPackagesUiInfo?>()
private lateinit var groupNames: List<String>
+ private val userManager =
+ Utils.getSystemServiceSafe(app.applicationContext, UserManager::class.java)
init {
addSource(groupNamesLiveData) {
@@ -91,12 +94,22 @@ class PermGroupsPackagesUiInfoLiveData(
var grantedSystem = 0
var userInteractedSystem = 0
var firstGrantedSystemPackageName: String? = null
+ val showInSettingsByUsers = HashMap<UserHandle, Boolean>()
for ((packageUserPair, appPermGroup) in appPermGroups) {
if (!appPermGroup.shouldShow) {
continue
}
+ if (!showInSettingsByUsers.containsKey(packageUserPair.second)) {
+ showInSettingsByUsers[packageUserPair.second] =
+ Utils.shouldShowInSettings(packageUserPair.second, userManager)
+ }
+
+ if (showInSettingsByUsers[packageUserPair.second] == false) {
+ continue
+ }
+
if (appPermGroup.isSystem) {
if (isGranted(appPermGroup.permGrantState)) {
if (grantedSystem == 0) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt
index 8e1721219..33abe3e74 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/AutoRevokePermissions.kt
@@ -207,7 +207,8 @@ suspend fun revokeAppPermissions(
permName,
false,
SERVER_LOG_ID,
- /* permission_rationale_shown = */ false
+ /* permission_rationale_shown = */ false,
+ /* TODO: 324254847 use real ECM value */ false
)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java b/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java
index 3e7ebfec0..8181531c2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java
@@ -746,7 +746,8 @@ public final class PermissionControllerServiceImpl extends PermissionControllerL
PermissionControllerStatsLog.write(
PermissionControllerStatsLog.PERMISSION_GRANT_REQUEST_RESULT_REPORTED,
requestId, uid, packageName, permName, false, r,
- /* permission_rationale_shown = */ false);
+ /* permission_rationale_shown = */ false,
+ /* TODO: 324254847 use real ECM value */ false);
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
index cb7c4f6ee..4fd62dc05 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/GrantPermissionsActivity.java
@@ -20,6 +20,7 @@ import static android.Manifest.permission.ACCESS_COARSE_LOCATION;
import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.Manifest.permission_group.LOCATION;
import static android.Manifest.permission_group.READ_MEDIA_VISUAL;
+import static android.content.Intent.getIntent;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
@@ -34,12 +35,15 @@ import static com.android.permissioncontroller.permission.ui.GrantPermissionsVie
import static com.android.permissioncontroller.permission.ui.GrantPermissionsViewHandler.LINKED_TO_PERMISSION_RATIONALE;
import static com.android.permissioncontroller.permission.ui.GrantPermissionsViewHandler.LINKED_TO_SETTINGS;
import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.APP_PERMISSION_REQUEST_CODE;
+import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.ECM_REQUEST_CODE;
import static com.android.permissioncontroller.permission.ui.model.GrantPermissionsViewModel.PHOTO_PICKER_REQUEST_CODE;
import static com.android.permissioncontroller.permission.utils.Utils.getRequestMessage;
import android.Manifest;
import android.app.Activity;
import android.app.KeyguardManager;
+import android.app.ecm.EnhancedConfirmationManager;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageItemInfo;
@@ -49,6 +53,7 @@ import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Bundle;
import android.os.Process;
+import android.permission.flags.Flags;
import android.text.Annotation;
import android.text.SpannableString;
import android.text.Spanned;
@@ -56,7 +61,7 @@ import android.text.style.ClickableSpan;
import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
-import android.view.MotionEvent;
+import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.Window;
@@ -104,6 +109,13 @@ public class GrantPermissionsActivity extends SettingsActivity
private static final String KEY_SESSION_ID = GrantPermissionsActivity.class.getName()
+ "_REQUEST_ID";
+ public static final String KEY_RESTRICTED_REQUESTED_PERMISSIONS =
+ GrantPermissionsActivity.class.getName() + "_RESTRICTED_REQUESTED_PERMISSIONS";
+ public static final String KEY_UNRESTRICTED_REQUESTED_PERMISSIONS =
+ GrantPermissionsActivity.class.getName() + "_UNRESTRICTED_REQUESTED_PERMISSIONS";
+ public static final String KEY_ORIGINAL_REQUESTED_PERMISSIONS =
+ GrantPermissionsActivity.class.getName() + "_ORIGINAL_REQUESTED_PERMISSIONS";
+
public static final String ANNOTATION_ID = "link";
public static final int NEXT_BUTTON = 15;
@@ -158,6 +170,17 @@ public class GrantPermissionsActivity extends SettingsActivity
/** The current list of permissions requested, across all current requests for this app */
private List<String> mRequestedPermissions = new ArrayList<>();
+ /**
+ * If any requested permissions are considered restricted by ECM, they will be stored here.
+ */
+ private ArrayList<String> mRestrictedRequestedPermissionGroups = null;
+
+ /**
+ * If any requested permissions are considered restricted by ECM, the non-restricted
+ * permissions will be stored here.
+ */
+ private List<String> mUnrestrictedRequestedPermissions = null;
+
/** A list of permissions requested on an app's behalf by the system. Usually Implicitly
* requested, although this isn't necessarily always the case.
*/
@@ -297,6 +320,56 @@ public class GrantPermissionsActivity extends SettingsActivity
mOriginalRequestedPermissions = mRequestedPermissions.toArray(new String[0]);
+ if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) {
+ EnhancedConfirmationManager ecm = getEnhancedConfirmationManager();
+
+ // Retrieve ECM-related persisted permission lists
+ if (icicle != null) {
+ mOriginalRequestedPermissions = icicle.getStringArray(
+ KEY_ORIGINAL_REQUESTED_PERMISSIONS);
+ mRestrictedRequestedPermissionGroups = icicle.getStringArrayList(
+ KEY_RESTRICTED_REQUESTED_PERMISSIONS);
+ mUnrestrictedRequestedPermissions = icicle.getStringArrayList(
+ KEY_UNRESTRICTED_REQUESTED_PERMISSIONS);
+ }
+ // If these lists aren't persisted yet, it means we haven't yet divided
+ // mRequestedPermissions into restricted-vs-unrestricted, so do so.
+ if (mRestrictedRequestedPermissionGroups == null) {
+ String packageName = getCallingPackage();
+ ArraySet<String> restrictedPermGroups = new ArraySet<>();
+ ArrayList<String> unrestrictedPermissions = new ArrayList<>();
+
+ for (String requestedPermission : mRequestedPermissions) {
+ String requestedPermGroup =
+ PermissionMapping.getGroupOfPlatformPermission(requestedPermission);
+ if (restrictedPermGroups.contains(requestedPermGroup)
+ || isPermissionEcmRestricted(ecm, requestedPermission, packageName)) {
+ restrictedPermGroups.add(requestedPermGroup);
+ } else {
+ unrestrictedPermissions.add(requestedPermission);
+ }
+ }
+ mRestrictedRequestedPermissionGroups = new ArrayList<>(restrictedPermGroups);
+ mUnrestrictedRequestedPermissions = unrestrictedPermissions;
+ }
+ // If there are remaining restricted permission groups to process, show the ECM dialog
+ // for the next one, then recreate this activity.
+ if (!mRestrictedRequestedPermissionGroups.isEmpty()) {
+ String nextRestrictedPermissionGroup = mRestrictedRequestedPermissionGroups.remove(
+ 0);
+ try {
+ Intent intent = ecm.createRestrictedSettingDialogIntent(getPackageName(),
+ nextRestrictedPermissionGroup);
+ startActivityForResult(intent, ECM_REQUEST_CODE);
+ return;
+ } catch (PackageManager.NameNotFoundException e) {
+ mRequestedPermissions = mUnrestrictedRequestedPermissions;
+ }
+ } else {
+ mRequestedPermissions = mUnrestrictedRequestedPermissions;
+ }
+ }
+
synchronized (sCurrentGrantRequests) {
mKey = new Pair<>(mTargetPackage, getTaskId());
if (!sCurrentGrantRequests.containsKey(mKey)) {
@@ -390,6 +463,20 @@ public class GrantPermissionsActivity extends SettingsActivity
}
}
+ private EnhancedConfirmationManager getEnhancedConfirmationManager() {
+ Context userContext = Utils.getUserContext(this, Process.myUserHandle());
+ return Utils.getSystemServiceSafe(userContext, EnhancedConfirmationManager.class);
+ }
+
+ private boolean isPermissionEcmRestricted(EnhancedConfirmationManager ecm,
+ String requestedPermission, String packageName) {
+ try {
+ return ecm.isRestricted(packageName, requestedPermission);
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
+ }
+
/**
* A new GrantPermissionsActivity has opened for this same package. Merge its requested
* permissions with the original ones set in the intent, and recalculate the grant states.
@@ -685,30 +772,43 @@ public class GrantPermissionsActivity extends SettingsActivity
return buttonArray;
}
- // LINT.IfChange(dispatchTouchEvent)
@Override
- public boolean dispatchTouchEvent(MotionEvent ev) {
- View rootView = getWindow().getDecorView();
- if (rootView.getTop() != 0) {
- // We are animating the top view, need to compensate for that in motion events.
- ev.setLocation(ev.getX(), ev.getY() - rootView.getTop());
- }
- final int x = (int) ev.getX();
- final int y = (int) ev.getY();
- if ((x < 0) || (y < 0) || (x > (rootView.getWidth())) || (y > (rootView.getHeight()))) {
- if (MotionEvent.ACTION_DOWN == ev.getAction()) {
- mViewHandler.onCancelled();
- }
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_ESCAPE
+ && event.getRepeatCount() == 0
+ && event.hasNoModifiers()) {
+ event.startTracking();
+ mViewHandler.onCancelled();
finishAfterTransition();
+ return true;
}
- return super.dispatchTouchEvent(ev);
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_ESCAPE
+ && event.isTracking()
+ && !event.isCanceled()) {
+ // Mark it as handled since we did handle the down event
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
}
- // LINT.ThenChange(PermissionRationaleActivity.java:dispatchTouchEvent)
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
+ if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) {
+ outState.putStringArrayList(KEY_RESTRICTED_REQUESTED_PERMISSIONS, new ArrayList<>(
+ mRestrictedRequestedPermissionGroups));
+ outState.putStringArrayList(KEY_UNRESTRICTED_REQUESTED_PERMISSIONS, new ArrayList<>(
+ mUnrestrictedRequestedPermissions));
+ outState.putStringArray(KEY_ORIGINAL_REQUESTED_PERMISSIONS,
+ mOriginalRequestedPermissions);
+ }
+
if (mViewHandler == null || mViewModel == null) {
return;
}
@@ -734,6 +834,12 @@ public class GrantPermissionsActivity extends SettingsActivity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
+ if (SdkLevel.isAtLeastV() && Flags.enhancedConfirmationModeApisEnabled()) {
+ if (requestCode == ECM_REQUEST_CODE) {
+ recreate();
+ return;
+ }
+ }
if (requestCode != APP_PERMISSION_REQUEST_CODE
&& requestCode != PHOTO_PICKER_REQUEST_CODE) {
return;
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
index 99f5c85e4..2350a5d71 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoReviewPermissionDecisionsFragment.kt
@@ -35,6 +35,7 @@ import com.android.permissioncontroller.PermissionControllerStatsLog.RECENT_PERM
import com.android.permissioncontroller.PermissionControllerStatsLog.RECENT_PERMISSION_DECISIONS_INTERACTED__ACTION__VIEW_ALL_CLICKED
import com.android.permissioncontroller.R
import com.android.permissioncontroller.auto.AutoSettingsFrameFragment
+import com.android.permissioncontroller.auto.DrivingDecisionReminderService
import com.android.permissioncontroller.permission.data.v33.PermissionDecision
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
import com.android.permissioncontroller.permission.ui.model.v33.ReviewPermissionDecisionsViewModel
@@ -98,6 +99,7 @@ class AutoReviewPermissionDecisionsFragment : AutoSettingsFrameFragment() {
requireArguments().containsKey(EXTRA_SOURCE) &&
(requireArguments().getString(EXTRA_SOURCE) == EXTRA_SOURCE_NOTIFICATION)
) {
+ DrivingDecisionReminderService.cancelNotification(requireActivity())
logDecisionReminderNotificationClicked()
}
val factory =
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
index 4bc14ed24..24b6439b5 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionGroupsFragment.java
@@ -64,6 +64,7 @@ import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permission.flags.Flags;
import com.android.permissioncontroller.PermissionControllerStatsLog;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.model.livedatatypes.HibernationSettingState;
@@ -431,8 +432,10 @@ public final class AppPermissionGroupsFragment extends SettingsWithLargeHeader i
int switchTitleId;
if (isHibernationEnabled()) {
if (SdkLevel.isAtLeastT()) {
- switchTitleId = R.string.unused_apps_label_v2;
- autoRevokeSwitch.setSummary(R.string.unused_apps_summary);
+ switchTitleId = isArchivingEnabled() ? R.string.unused_apps_label_v3
+ : R.string.unused_apps_label_v2;
+ autoRevokeSwitch.setSummary(isArchivingEnabled() ? R.string.unused_apps_summary_v2
+ : R.string.unused_apps_summary);
} else {
switchTitleId = R.string.unused_apps_label;
}
@@ -456,6 +459,10 @@ public final class AppPermissionGroupsFragment extends SettingsWithLargeHeader i
autoRevokeCategory.addPreference(autoRevokeSummary);
}
+ private boolean isArchivingEnabled() {
+ return SdkLevel.isAtLeastV() && Flags.archivingReadOnly();
+ }
+
private void setAutoRevokeToggleState(HibernationSettingState state) {
if (state == null || !mViewModel.getPackagePermGroupsLiveData().isInitialized()
|| getPreferenceScreen() == null || getListView() == null || getView() == null) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
index 20dc50130..76e52ad94 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/PermissionAppsFragment.java
@@ -34,6 +34,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings;
import android.safetycenter.SafetyCenterManager;
import android.util.ArrayMap;
@@ -115,6 +116,7 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
private PermissionUsages mPermissionUsages;
private List<AppPermissionUsage> mAppPermissionUsages = new ArrayList<>();
private Boolean mSensorStatus;
+ private UserManager mUserManager;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -168,6 +170,8 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
mViewModel.getSensorStatusLiveData().observe(this, this::setSensorStatus);
}
}
+
+ mUserManager = Utils.getSystemServiceSafe(getContext(), UserManager.class);
}
@Override
@@ -436,6 +440,9 @@ public final class PermissionAppsFragment extends SettingsWithLargeHeader implem
}
for (Pair<String, UserHandle> packageUserLabel : packages) {
+ if (!Utils.shouldShowInSettings(packageUserLabel.getSecond(), mUserManager)) {
+ continue;
+ }
String packageName = packageUserLabel.getFirst();
UserHandle user = packageUserLabel.getSecond();
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
index 91b94da9a..7bea02800 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt
@@ -1021,7 +1021,8 @@ class GrantPermissionsViewModel(
permission,
isImplicit,
result,
- isPermissionRationaleShown
+ isPermissionRationaleShown,
+ /* TODO: 324254847 use real ECM value */ false
)
}
@@ -1371,6 +1372,7 @@ class GrantPermissionsViewModel(
companion object {
const val APP_PERMISSION_REQUEST_CODE = 1
const val PHOTO_PICKER_REQUEST_CODE = 2
+ const val ECM_REQUEST_CODE = 3
const val SAVED_REQUEST_CODE_KEY = "saved_request_code"
private const val STATE_UNKNOWN = 0
private const val STATE_GRANTED = 1
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
index 826e57ece..40ee75636 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt
@@ -32,6 +32,7 @@ import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.os.UserHandle
+import android.os.UserManager
import androidx.annotation.RequiresApi
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.SavedStateHandle
@@ -85,6 +86,8 @@ class PermissionUsageDetailsViewModel(
private val roleManager =
Utils.getSystemServiceSafe(application.applicationContext, RoleManager::class.java)
+ private val userManager =
+ Utils.getSystemServiceSafe(application.applicationContext, UserManager::class.java)
/** Updates whether system app permissions usage should be displayed in the UI. */
fun updateShowSystemAppsToggle(showSystem: Boolean) {
@@ -191,6 +194,7 @@ class PermissionUsageDetailsViewModel(
): List<AppPermissionAccessUiInfo> {
return allLightHistoricalPackageOpsLiveData
.getLightHistoricalPackageOps()
+ ?.filter { Utils.shouldShowInSettings(it.userHandle, userManager) }
?.flatMap { it.clusterAccesses(startTime, showSystem) }
?.sortedBy { -1 * it.discreteAccesses.first().accessTimeMs }
?.map { it.buildAppPermissionAccessUiInfo() }
@@ -488,7 +492,8 @@ class PermissionUsageDetailsViewModel(
?.let {
getPackageLabel(
it.proxy!!.packageName!!,
- UserHandle.getUserHandleForUid(it.proxy.uid))
+ UserHandle.getUserHandleForUid(it.proxy.uid)
+ )
}
/** Returns the attribution label for the permission access, if any. */
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
index fa5b1b685..fc8deab79 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt
@@ -22,6 +22,7 @@ import android.app.role.RoleManager
import android.os.Build
import android.os.Bundle
import android.os.UserHandle
+import android.os.UserManager
import androidx.annotation.RequiresApi
import androidx.lifecycle.AbstractSavedStateViewModelFactory
import androidx.lifecycle.AndroidViewModel
@@ -55,6 +56,8 @@ class PermissionUsageViewModel(
private val state: SavedStateHandle,
app: Application,
) : AndroidViewModel(app) {
+ private val userManager =
+ Utils.getSystemServiceSafe(app.applicationContext, UserManager::class.java)
private val roleManager =
Utils.getSystemServiceSafe(app.applicationContext, RoleManager::class.java)
private val exemptedPackages: Set<String> = Utils.getExemptedPackages(roleManager)
@@ -114,7 +117,10 @@ class PermissionUsageViewModel(
}
val eligibleLightPackageOpsList: List<LightPackageOps> =
- getAllLightPackageOps()?.filterOutExemptedApps() ?: listOf()
+ getAllLightPackageOps()?.filterOutExemptedApps()?.filter {
+ Utils.shouldShowInSettings(it.userHandle, userManager)
+ }
+ ?: listOf()
for (lightPackageOps: LightPackageOps in eligibleLightPackageOpsList) {
val permGroupsToLastAccess: List<Map.Entry<String, Long>> =
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/GrantPermissionsWearViewHandler.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/GrantPermissionsWearViewHandler.java
index cc32c5f02..c9e9a2eb1 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/GrantPermissionsWearViewHandler.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/GrantPermissionsWearViewHandler.java
@@ -168,7 +168,8 @@ public class GrantPermissionsWearViewHandler implements GrantPermissionsViewHand
private void updateScreen() {
mViewModel.getIconLiveData().setValue(
mGroupIcon == null ? null : mGroupIcon.loadDrawable(mActivity));
- mViewModel.getGroupMessageLiveData().setValue(mGroupMessage.toString());
+ mViewModel.getGroupMessageLiveData().setValue(
+ mGroupMessage == null ? "" : mGroupMessage.toString());
mViewModel.getDetailMessageLiveData().setValue(mDetailMessage);
int numButtons = BUTTON_RES_ID_TO_NUM.size();
List<Boolean> buttonVisibilityList = Arrays.asList(new Boolean[NEXT_BUTTON]);
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java
index fdeb2ed2a..5f23829b0 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java
@@ -179,7 +179,10 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat
} else {
preference.setEnabled(true);
}
-
+ if (preference.getParent() != null) {
+ // Remove first if already added.
+ preference.getParent().removePreference(preference);
+ }
if (group.isReviewRequired()) {
if (!isPackageUpdated) {
// An app just being installed, which means all groups requiring reviews.
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt
index c1ce14f03..3936e54d4 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt
@@ -56,6 +56,7 @@ import com.android.permissioncontroller.permission.ui.v33.AdvancedConfirmDialogA
import com.android.permissioncontroller.permission.ui.wear.model.AppPermissionConfirmDialogViewModel
import com.android.permissioncontroller.permission.ui.wear.model.AppPermissionConfirmDialogViewModelFactory
import com.android.permissioncontroller.permission.ui.wear.model.ConfirmDialogArgs
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
import com.android.settingslib.RestrictedLockUtils
@@ -150,6 +151,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ViewModelProvider(this, AppPermissionConfirmDialogViewModelFactory())
.get(AppPermissionConfirmDialogViewModel::class.java)
+ @Suppress("ktlint:standard:max-line-length")
val onLocationSwitchChanged: (Boolean) -> Unit = { checked ->
run {
val changeRequest =
@@ -233,18 +235,20 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
return ComposeView(activity).apply {
setContent {
- WearAppPermissionScreen(
- permGroupLabel,
- viewModel,
- confirmDialogViewModel,
- onLocationSwitchChanged,
- onGrantedStateChanged,
- onFooterClicked,
- onConfirmDialogOkButtonClick,
- onConfirmDialogCancelButtonClick,
- onAdvancedConfirmDialogOkButtonClick,
- onAdvancedConfirmDialogCancelButtonClick
- )
+ WearPermissionTheme {
+ WearAppPermissionScreen(
+ permGroupLabel,
+ viewModel,
+ confirmDialogViewModel,
+ onLocationSwitchChanged,
+ onGrantedStateChanged,
+ onFooterClicked,
+ onConfirmDialogOkButtonClick,
+ onConfirmDialogCancelButtonClick,
+ onAdvancedConfirmDialogOkButtonClick,
+ onAdvancedConfirmDialogCancelButtonClick
+ )
+ }
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt
index a0703b10c..9b960dfb5 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt
@@ -46,6 +46,7 @@ import com.android.permissioncontroller.permission.ui.wear.model.AppPermissionGr
import com.android.permissioncontroller.permission.ui.wear.model.AppPermissionGroupsRevokeDialogViewModelFactory
import com.android.permissioncontroller.permission.ui.wear.model.WearAppPermissionUsagesViewModel
import com.android.permissioncontroller.permission.ui.wear.model.WearAppPermissionUsagesViewModelFactory
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
import com.android.permissioncontroller.permission.utils.KotlinUtils.is7DayToggleEnabled
import java.time.Instant
import java.util.concurrent.TimeUnit
@@ -142,7 +143,9 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
revokeDialogViewModel = revokeDialogViewModel
)
- return ComposeView(activity).apply { setContent { WearAppPermissionGroupsScreen(helper) } }
+ return ComposeView(activity).apply {
+ setContent { WearPermissionTheme { WearAppPermissionGroupsScreen(helper) } }
+ }
}
override fun onPause() {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsHelper.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsHelper.kt
index 0ccde86be..9529ac83a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsHelper.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsHelper.kt
@@ -142,25 +142,27 @@ class WearAppPermissionGroupsHelper(
): String {
val grantSummary =
getGrantSummary(category, groupUiInfo)?.let { context.getString(it) } ?: ""
- if (!Flags.wearPrivacyDashboardEnabled()) {
- return grantSummary
- }
- val accessSummary =
- viewModel.getPreferenceSummary(groupUiInfo, context, lastAccessTime).let {
+ val summary = StringBuilder(grantSummary)
+ if (Flags.wearPrivacyDashboardEnabledReadOnly()) {
+ WearUtils.getPreferenceSummary(context, lastAccessTime).let {
if (it.isNotEmpty()) {
- System.lineSeparator() + it
- } else {
- it
+ summary.append(System.lineSeparator()).append(it)
}
}
- return grantSummary + accessSummary
+ }
+ return summary.toString()
}
private fun getGrantSummary(category: Category?, groupUiInfo: GroupUiInfo): Int? {
val subtitle = groupUiInfo.subtitle
if (category != null) {
when (category) {
- Category.ALLOWED -> return R.string.allowed_header
+ Category.ALLOWED ->
+ return if (subtitle == PermSubtitle.BACKGROUND) {
+ R.string.allowed_always_header
+ } else {
+ R.string.allowed_header
+ }
Category.ASK -> return R.string.ask_header
Category.DENIED -> return R.string.denied_header
else -> {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt
index bc840bac9..0883666fc 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt
@@ -35,7 +35,7 @@ import com.android.permissioncontroller.permission.ui.wear.model.RevokeDialogArg
@Composable
fun WearAppPermissionGroupsScreen(helper: WearAppPermissionGroupsHelper) {
- val packagePermGroups = helper.viewModel.packagePermGroupsLiveData.observeAsState(emptyMap())
+ val packagePermGroups = helper.viewModel.packagePermGroupsLiveData.observeAsState(null)
val autoRevoke = helper.viewModel.autoRevokeLiveData.observeAsState(null)
val appPermissionUsages = helper.wearViewModel.appPermissionUsages.observeAsState(emptyList())
val showRevokeDialog = helper.revokeDialogViewModel.showDialogLiveData.observeAsState(false)
@@ -53,7 +53,7 @@ fun WearAppPermissionGroupsScreen(helper: WearAppPermissionGroupsHelper) {
)
}
- if (isLoading && packagePermGroups.value.isNotEmpty()) {
+ if (isLoading && !packagePermGroups.value.isNullOrEmpty()) {
isLoading = false
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt
index bec633fe7..ccbd51f7d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt
@@ -52,7 +52,7 @@ fun WearAppPermissionScreen(
onAdvancedConfirmDialogOkButtonClick: (AdvancedConfirmDialogArgs) -> Unit,
onAdvancedConfirmDialogCancelButtonClick: () -> Unit
) {
- val buttonState = viewModel.buttonStateLiveData.observeAsState(emptyMap())
+ val buttonState = viewModel.buttonStateLiveData.observeAsState(null)
val detailResIds = viewModel.detailResIdLiveData.observeAsState(null)
val admin = viewModel.showAdminSupportLiveData.observeAsState(null)
var isLoading by remember { mutableStateOf(true) }
@@ -84,7 +84,7 @@ fun WearAppPermissionScreen(
onCancelButtonClick = onAdvancedConfirmDialogCancelButtonClick
)
}
- if (isLoading && buttonState.value.isNotEmpty()) {
+ if (isLoading && !buttonState.value.isNullOrEmpty()) {
isLoading = false
}
}
@@ -92,7 +92,7 @@ fun WearAppPermissionScreen(
@Composable
internal fun WearAppPermissionContent(
title: String,
- buttonState: Map<ButtonType, ButtonState>,
+ buttonState: Map<ButtonType, ButtonState>?,
detailResIds: Pair<Int, Int?>?,
admin: RestrictedLockUtils.EnforcedAdmin?,
isLoading: Boolean,
@@ -101,7 +101,7 @@ internal fun WearAppPermissionContent(
onFooterClicked: (RestrictedLockUtils.EnforcedAdmin) -> Unit
) {
ScrollableScreen(title = title, isLoading = isLoading) {
- buttonState[ButtonType.LOCATION_ACCURACY]?.let {
+ buttonState?.get(ButtonType.LOCATION_ACCURACY)?.let {
if (it.isShown) {
item {
ToggleChip(
@@ -116,7 +116,7 @@ internal fun WearAppPermissionContent(
}
}
for (buttonType in buttonTypeOrder) {
- buttonState[buttonType]?.let {
+ buttonState?.get(buttonType)?.let {
if (it.isShown) {
item {
ToggleChip(
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt
index 266159733..a9e83919f 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt
@@ -26,6 +26,7 @@ import androidx.lifecycle.ViewModelProvider
import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.permission.ui.handheld.PermissionAppsFragment
import com.android.permissioncontroller.permission.ui.model.ManageCustomPermissionsViewModel
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
class WearManageCustomPermissionsFragment : Fragment() {
override fun onCreateView(
@@ -52,7 +53,11 @@ class WearManageCustomPermissionsFragment : Fragment() {
}
return ComposeView(activity).apply {
- setContent { WearManageCustomPermissionScreen(viewModel, onPermGroupClick) }
+ setContent {
+ WearPermissionTheme {
+ WearManageCustomPermissionScreen(viewModel, onPermGroupClick)
+ }
+ }
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt
index a33c71975..16ed1f067 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt
@@ -27,6 +27,7 @@ import com.android.permissioncontroller.Constants
import com.android.permissioncontroller.permission.ui.handheld.ManageCustomPermissionsFragment
import com.android.permissioncontroller.permission.ui.handheld.PermissionAppsFragment
import com.android.permissioncontroller.permission.ui.model.ManageStandardPermissionsViewModel
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
class WearManageStandardPermissionsFragment : Fragment() {
override fun onCreateView(
@@ -63,12 +64,14 @@ class WearManageStandardPermissionsFragment : Fragment() {
return ComposeView(activity).apply {
setContent {
- WearManageStandardPermissionScreen(
- viewModel,
- onPermGroupClick,
- onCustomPermGroupClick,
- onAutoRevokeClick
- )
+ WearPermissionTheme {
+ WearManageStandardPermissionScreen(
+ viewModel,
+ onPermGroupClick,
+ onCustomPermGroupClick,
+ onAutoRevokeClick
+ )
+ }
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsHelper.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsHelper.kt
index 559160b38..d14cdb620 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsHelper.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsHelper.kt
@@ -28,7 +28,6 @@ import com.android.permissioncontroller.permission.ui.wear.model.WearAppPermissi
import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupDescription
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
-import com.android.permissioncontroller.permission.utils.Utils
import com.android.settingslib.utils.applications.AppUtils
import java.text.Collator
import java.util.Random
@@ -161,17 +160,8 @@ class WearPermissionAppsHelper(
)
}
val summary =
- if (Flags.wearPrivacyDashboardEnabled()) {
- lastAccessTime?.let {
- viewModel.getPreferenceSummary(
- application.resources,
- Utils.getPermissionLastAccessSummaryTimestamp(
- lastAccessTime,
- application,
- permGroupName
- )
- )
- }
+ if (Flags.wearPrivacyDashboardEnabledReadOnly()) {
+ lastAccessTime?.let { WearUtils.getPreferenceSummary(application, lastAccessTime) }
} else {
null
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt
index 93813de08..64acfdd96 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt
@@ -41,6 +41,7 @@ import com.android.permissioncontroller.permission.ui.model.UnusedAppsViewModel.
import com.android.permissioncontroller.permission.ui.model.UnusedAppsViewModelFactory
import com.android.permissioncontroller.permission.ui.wear.model.WearUnusedAppsViewModel
import com.android.permissioncontroller.permission.ui.wear.model.WearUnusedAppsViewModel.UnusedAppChip
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
import com.android.permissioncontroller.permission.utils.KotlinUtils
import com.android.settingslib.utils.applications.AppUtils
import java.text.Collator
@@ -131,7 +132,9 @@ class WearUnusedAppsFragment : Fragment() {
updateWearViewModel(false)
}
- return ComposeView(activity).apply { setContent { WearUnusedAppsScreen(wearViewModel) } }
+ return ComposeView(activity).apply {
+ setContent { WearPermissionTheme { WearUnusedAppsScreen(wearViewModel) } }
+ }
}
private fun initUnusedAppsMap(): MutableMap<UnusedPeriod, MutableMap<String, UnusedAppChip>> {
@@ -145,17 +148,18 @@ class WearUnusedAppsFragment : Fragment() {
private fun updatePackages(categorizedPackages: Map<UnusedPeriod, List<UnusedPackageInfo>>) {
// Remove stale unused app chips
for (period in allPeriods) {
- val it: MutableIterator<Map.Entry<String, UnusedAppChip>> =
- unusedAppsMap[period]!!.entries.iterator()
- while (it.hasNext()) {
- val contains =
- categorizedPackages[period]?.any { (pkgName, user, _) ->
- val key = createKey(pkgName, user)
- it.next().key == key
- }
- if (contains != true) {
- it.remove()
- }
+ val unUsedAppsInAPeriod = unusedAppsMap[period] ?: continue
+ val categorizedPackagesOfAPeriod = categorizedPackages[period]
+ if (categorizedPackagesOfAPeriod == null) {
+ unUsedAppsInAPeriod.clear()
+ continue
+ }
+ val categorizedPackageKeys =
+ categorizedPackagesOfAPeriod.map { createKey(it.packageName, it.user) }
+ // Do not remove apps that are still in the unused category
+ val keysToRemove = unUsedAppsInAPeriod.keys.filterNot { it in categorizedPackageKeys }
+ for (key in keysToRemove) {
+ unUsedAppsInAPeriod.remove(key)
}
}
@@ -300,6 +304,13 @@ class WearUnusedAppsFragment : Fragment() {
private fun updateWearViewModel(isLoading: Boolean) {
wearViewModel.loadingLiveData.value = isLoading
wearViewModel.unusedPeriodCategoryVisibilitiesLiveData.setValue(categoryVisibilities)
- wearViewModel.unusedAppChipsLiveData.setValue(unusedAppsMap)
+
+ // Need to copy to non mutable maps or compose will not update correctly
+ val map = mutableMapOf<UnusedPeriod, Map<String, UnusedAppChip>>()
+ for (period in allPeriods) {
+ map.put(period, unusedAppsMap[period]!!.toMap())
+ }
+
+ wearViewModel.unusedAppChipsLiveData.setValue(map.toMap())
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt
index 7c2487004..423fa7759 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt
@@ -37,7 +37,7 @@ fun WearUnusedAppsScreen(viewModel: WearUnusedAppsViewModel) {
viewModel.unusedPeriodCategoryVisibilitiesLiveData.observeAsState(emptyList())
val infoMsgCategoryVisibility =
viewModel.infoMsgCategoryVisibilityLiveData.observeAsState(false)
- val unusedAppChips = viewModel.unusedAppChipsLiveData.observeAsState(mutableMapOf())
+ val unusedAppChips = viewModel.unusedAppChipsLiveData.observeAsState(mapOf())
ScrollableScreen(
showTimeText = true,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt
new file mode 100644
index 000000000..53d41f7f0
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.permission.ui.wear
+
+import android.content.Context
+import android.text.format.DateFormat
+import androidx.annotation.IntDef
+import com.android.permissioncontroller.R
+import java.time.ZonedDateTime
+import java.time.temporal.ChronoUnit
+
+object WearUtils {
+ @Retention(AnnotationRetention.SOURCE)
+ @IntDef(value = [LAST_24H_TODAY, LAST_24H_YESTERDAY, LAST_7D, NOT_IN_LAST_7D])
+ annotation class AppPermsLastAccessType
+
+ const val LAST_24H_TODAY = 1
+ const val LAST_24H_YESTERDAY = 2
+ const val LAST_7D = 3
+ const val NOT_IN_LAST_7D = 4
+
+ /** Get the preference summary in app permission groups and permission apps screens for Wear. */
+ @JvmStatic
+ fun getPreferenceSummary(context: Context, lastAccessTime: Long?): String {
+ val summaryTimestamp = getPermissionLastAccessSummaryTimestamp(lastAccessTime, context)
+ val res = context.resources
+ return when (summaryTimestamp.second) {
+ LAST_24H_TODAY ->
+ res.getString(R.string.wear_app_perms_24h_access, summaryTimestamp.first)
+ LAST_24H_YESTERDAY ->
+ res.getString(R.string.wear_app_perms_24h_access_yest, summaryTimestamp.first)
+ LAST_7D ->
+ res.getString(
+ R.string.wear_app_perms_7d_access,
+ summaryTimestamp.third,
+ summaryTimestamp.first
+ )
+ else -> ""
+ }
+ }
+
+ @JvmStatic
+ private fun getPermissionLastAccessSummaryTimestamp(
+ lastAccessTime: Long?,
+ context: Context
+ ): Triple<String, Int, String> {
+ val midnightToday =
+ (ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L)
+ val midnightYesterday =
+ ZonedDateTime.now().minusDays(1).truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L
+ val isLastAccessToday = (lastAccessTime != null && midnightToday <= lastAccessTime)
+ val isLastAccessTodayOrYesterday =
+ (lastAccessTime != null && midnightYesterday <= lastAccessTime)
+ var lastAccessTimeFormatted = ""
+ var lastAccessDateFormatted = ""
+ @AppPermsLastAccessType var lastAccessType = NOT_IN_LAST_7D
+ if (lastAccessTime != null) {
+ lastAccessTimeFormatted = DateFormat.getTimeFormat(context).format(lastAccessTime)
+ lastAccessDateFormatted = DateFormat.getDateFormat(context).format(lastAccessTime)
+ lastAccessType =
+ if (isLastAccessToday) LAST_24H_TODAY
+ else if (isLastAccessTodayOrYesterday) LAST_24H_YESTERDAY else LAST_7D
+ }
+ return Triple(lastAccessTimeFormatted, lastAccessType, lastAccessDateFormatted)
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AlertDialog.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AlertDialog.kt
index 06d8acaba..d0bbe25f6 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AlertDialog.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AlertDialog.kt
@@ -16,16 +16,28 @@
package com.android.permissioncontroller.permission.ui.wear.elements
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.gestures.animateScrollBy
+import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.filled.Close
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.rotary.onRotaryScrollEvent
+import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.repeatOnLifecycle
import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.material.ButtonDefaults
import androidx.wear.compose.material.Icon
@@ -33,6 +45,7 @@ import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text
import androidx.wear.compose.material.dialog.Alert
import androidx.wear.compose.material.dialog.Dialog
+import kotlinx.coroutines.launch
/**
* This component is an alternative to [Alert], providing the following:
@@ -41,7 +54,7 @@ import androidx.wear.compose.material.dialog.Dialog
* - wrapped in a [Dialog];
*/
@Composable
-public fun AlertDialog(
+fun AlertDialog(
message: String,
iconRes: Int? = null,
onCancelButtonClick: () -> Unit,
@@ -117,7 +130,19 @@ internal fun Alert(
okButtonContentDescription: String,
cancelButtonContentDescription: String
) {
+ val focusRequester = remember { FocusRequester() }
+ val coroutineScope = rememberCoroutineScope()
Alert(
+ modifier =
+ Modifier.onRotaryScrollEvent {
+ coroutineScope.launch {
+ scrollState.scrollBy(it.verticalScrollPixels)
+ scrollState.animateScrollBy(0f)
+ }
+ true
+ }
+ .focusRequester(focusRequester)
+ .focusable(),
contentPadding = DefaultContentPadding(),
scrollState = scrollState,
title = { AlertTitleText(title) },
@@ -126,6 +151,17 @@ internal fun Alert(
negativeButton = { NegativeButton(onCancelButtonClick, cancelButtonContentDescription) },
positiveButton = { PositiveButton(onOKButtonClick, okButtonContentDescription) }
)
+ RequestFocusOnResume(focusRequester = focusRequester)
+}
+
+@Composable
+private fun RequestFocusOnResume(focusRequester: FocusRequester) {
+ val lifecycleOwner = LocalLifecycleOwner.current
+ LaunchedEffect(Unit) {
+ lifecycleOwner.repeatOnLifecycle(state = Lifecycle.State.RESUMED) {
+ focusRequester.requestFocus()
+ }
+ }
}
@Composable
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/Chip.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/Chip.kt
index abdbe4baf..bf9ebbadd 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/Chip.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/Chip.kt
@@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
@@ -232,7 +233,8 @@ public fun Chip(
icon = icon,
colors = colors,
enabled = enabled,
- contentPadding = contentPadding
+ contentPadding = contentPadding,
+ shape = RoundedCornerShape(26.dp)
)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ListHeader.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ListHeader.kt
index cd5f3eb8f..0afbb05fe 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ListHeader.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ListHeader.kt
@@ -67,7 +67,6 @@ fun ListHeader(
modifier =
modifier
.defaultMinSize(minHeight = ListHeaderDefaults.Height)
- .height(IntrinsicSize.Min)
.wrapContentSize()
.background(backgroundColor)
.padding(contentPadding)
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt
index 4228135f6..ed4e937d1 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt
@@ -21,8 +21,6 @@ import android.content.Context
import android.content.ContextWrapper
import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
-import androidx.compose.foundation.focusable
-import androidx.compose.foundation.gestures.scrollBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
@@ -33,22 +31,19 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.input.rotary.onRotaryScrollEvent
import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.semantics.testTagsAsResourceId
import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle
@@ -68,7 +63,8 @@ import androidx.wear.compose.material.TimeText
import androidx.wear.compose.material.Vignette
import androidx.wear.compose.material.VignettePosition
import androidx.wear.compose.material.scrollAway
-import kotlinx.coroutines.launch
+import com.android.permissioncontroller.permission.ui.wear.elements.rotaryinput.rotaryWithScroll
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
/**
* Screen that contains a list of items defined using the [content] parameter, adds the time text
@@ -142,30 +138,28 @@ internal fun Scaffold(
) {
val initialCenterIndex = 0
val scrollContentTopPadding = 32.dp
+ val centerHeightDp = Dp(LocalConfiguration.current.screenHeightDp / 2.0f)
+ val initialCenterItemScrollOffset = scrollContentTopPadding + 10.dp
+ val scrollAwayOffset = centerHeightDp - initialCenterItemScrollOffset
+
val focusRequester = remember { FocusRequester() }
val listState = remember { ScalingLazyListState(initialCenterItemIndex = initialCenterIndex) }
- val coroutineScope = rememberCoroutineScope()
- MaterialTheme {
+ WearPermissionTheme {
Scaffold(
+ // TODO: Use a rotary modifier from Wear Compose once Wear Compose 1.4 is landed.
+ // (b/325560444)
modifier =
- Modifier.onRotaryScrollEvent {
- coroutineScope.launch { listState.scrollBy(it.verticalScrollPixels) }
- true
- }
- .focusRequester(focusRequester)
- .focusable()
- .semantics { testTagsAsResourceId = true },
+ Modifier.rotaryWithScroll(
+ scrollableState = listState,
+ focusRequester = focusRequester
+ ),
timeText = {
if (showTimeText && !isLoading) {
TimeText(
modifier =
- Modifier.scrollAway(
- listState,
- initialCenterIndex,
- scrollContentTopPadding
- ),
- contentPadding = PaddingValues(15.dp)
+ Modifier.scrollAway(listState, initialCenterIndex, scrollAwayOffset),
+ contentPadding = PaddingValues(5.dp)
)
}
},
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Haptics.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Haptics.kt
new file mode 100644
index 000000000..817bf7efe
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Haptics.kt
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.permission.ui.wear.elements.rotaryinput
+
+import android.os.Build
+import android.view.View
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalView
+import kotlin.math.abs
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.conflate
+import kotlinx.coroutines.flow.flow
+import kotlinx.coroutines.flow.receiveAsFlow
+import kotlinx.coroutines.withContext
+
+// This file is a copy of Haptics.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+private const val DEBUG = false
+
+/** Debug logging that can be enabled. */
+private inline fun debugLog(generateMsg: () -> String) {
+ if (DEBUG) {
+ println("RotaryHaptics: ${generateMsg()}")
+ }
+}
+
+/**
+ * Throttling events within specified timeframe. Only first and last events will be received. For a
+ * flow emitting elements 1 to 30, with a 100ms delay between them:
+ * ```
+ * val flow = flow {
+ * for (i in 1..30) {
+ * delay(100)
+ * emit(i)
+ * }
+ * }
+ * ```
+ *
+ * With timeframe=1000 only those integers will be received: 1, 10, 20, 30 .
+ */
+internal fun <T> Flow<T>.throttleLatest(timeframe: Long): Flow<T> = flow {
+ conflate().collect {
+ emit(it)
+ delay(timeframe)
+ }
+}
+
+/** Handles haptics for rotary usage */
+interface RotaryHapticHandler {
+
+ /** Handles haptics when scroll is used */
+ fun handleScrollHaptic(scrollDelta: Float)
+
+ /** Handles haptics when scroll with snap is used */
+ fun handleSnapHaptic(scrollDelta: Float)
+}
+
+/**
+ * Default implementation of [RotaryHapticHandler]. It handles haptic feedback based on the
+ * [scrollableState], scrolled pixels and [hapticsThresholdPx]. Haptic is not fired in this class,
+ * instead it's sent to [hapticsChannel] where it'll performed later.
+ *
+ * @param scrollableState Haptic performed based on this state
+ * @param hapticsChannel Channel to which haptic events will be sent
+ * @param hapticsThresholdPx A scroll threshold after which haptic is produced.
+ */
+class DefaultRotaryHapticHandler(
+ private val scrollableState: ScrollableState,
+ private val hapticsChannel: Channel<RotaryHapticsType>,
+ private val hapticsThresholdPx: Long = 50,
+) : RotaryHapticHandler {
+
+ private var overscrollHapticTriggered = false
+ private var currScrollPosition = 0f
+ private var prevHapticsPosition = 0f
+
+ override fun handleScrollHaptic(scrollDelta: Float) {
+ if (
+ (scrollDelta > 0 && !scrollableState.canScrollForward) ||
+ (scrollDelta < 0 && !scrollableState.canScrollBackward)
+ ) {
+ if (!overscrollHapticTriggered) {
+ trySendHaptic(RotaryHapticsType.ScrollLimit)
+ overscrollHapticTriggered = true
+ }
+ } else {
+ overscrollHapticTriggered = false
+ currScrollPosition += scrollDelta
+ val diff = abs(currScrollPosition - prevHapticsPosition)
+
+ if (diff >= hapticsThresholdPx) {
+ trySendHaptic(RotaryHapticsType.ScrollTick)
+ prevHapticsPosition = currScrollPosition
+ }
+ }
+ }
+
+ override fun handleSnapHaptic(scrollDelta: Float) {
+ if (
+ (scrollDelta > 0 && !scrollableState.canScrollForward) ||
+ (scrollDelta < 0 && !scrollableState.canScrollBackward)
+ ) {
+ if (!overscrollHapticTriggered) {
+ trySendHaptic(RotaryHapticsType.ScrollLimit)
+ overscrollHapticTriggered = true
+ }
+ } else {
+ overscrollHapticTriggered = false
+ trySendHaptic(RotaryHapticsType.ScrollItemFocus)
+ }
+ }
+
+ private fun trySendHaptic(rotaryHapticsType: RotaryHapticsType) {
+ // Ok to ignore the ChannelResult because we default to capacity = 2 and DROP_OLDEST
+ @Suppress("UNUSED_VARIABLE") val unused = hapticsChannel.trySend(rotaryHapticsType)
+ }
+}
+
+/** Interface for Rotary haptic feedback */
+interface RotaryHapticFeedback {
+ fun performHapticFeedback(type: RotaryHapticsType)
+}
+
+/** Rotary haptic types */
+@JvmInline
+value class RotaryHapticsType(private val type: Int) {
+ companion object {
+ /**
+ * A scroll ticking haptic. Similar to texture haptic - performed each time when a
+ * scrollable content is scrolled by a certain distance
+ */
+ val ScrollTick: RotaryHapticsType = RotaryHapticsType(1)
+
+ /**
+ * An item focus (snap) haptic. Performed when a scrollable content is snapped to a specific
+ * item.
+ */
+ val ScrollItemFocus: RotaryHapticsType = RotaryHapticsType(2)
+
+ /**
+ * A limit(overscroll) haptic. Performed when a list reaches the limit (start or end) and
+ * can't scroll further
+ */
+ val ScrollLimit: RotaryHapticsType = RotaryHapticsType(3)
+ }
+}
+
+/** Remember disabled haptics handler */
+@Composable
+fun rememberDisabledHaptic(): RotaryHapticHandler = remember {
+ object : RotaryHapticHandler {
+
+ override fun handleScrollHaptic(scrollDelta: Float) {
+ // Do nothing
+ }
+
+ override fun handleSnapHaptic(scrollDelta: Float) {
+ // Do nothing
+ }
+ }
+}
+
+/**
+ * Remember rotary haptic handler.
+ *
+ * @param scrollableState A scrollableState, used to determine whether the end of the scrollable was
+ * reached or not.
+ * @param throttleThresholdMs Throttling events within specified timeframe. Only first and last
+ * events will be received. Check [throttleLatest] for more info.
+ * @param hapticsThresholdPx A scroll threshold after which haptic is produced.
+ * @param hapticsChannel Channel to which haptic events will be sent
+ * @param rotaryHaptics Interface for Rotary haptic feedback which performs haptics
+ */
+@Composable
+fun rememberRotaryHapticHandler(
+ scrollableState: ScrollableState,
+ throttleThresholdMs: Long = 30,
+ hapticsThresholdPx: Long = 50,
+ hapticsChannel: Channel<RotaryHapticsType> = rememberHapticChannel(),
+ rotaryHaptics: RotaryHapticFeedback = rememberDefaultRotaryHapticFeedback(),
+): RotaryHapticHandler {
+ return remember(scrollableState, hapticsChannel, rotaryHaptics) {
+ DefaultRotaryHapticHandler(scrollableState, hapticsChannel, hapticsThresholdPx)
+ }
+ .apply {
+ LaunchedEffect(hapticsChannel) {
+ hapticsChannel.receiveAsFlow().throttleLatest(throttleThresholdMs).collect {
+ hapticType ->
+ // 'withContext' launches performHapticFeedback in a separate thread,
+ // as otherwise it produces a visible lag (b/219776664)
+ val currentTime = System.currentTimeMillis()
+ debugLog { "Haptics started" }
+ withContext(Dispatchers.Default) {
+ debugLog {
+ "Performing haptics, delay: " +
+ "${System.currentTimeMillis() - currentTime}"
+ }
+ rotaryHaptics.performHapticFeedback(hapticType)
+ }
+ }
+ }
+ }
+}
+
+@Composable
+private fun rememberHapticChannel() = remember {
+ Channel<RotaryHapticsType>(
+ capacity = 2,
+ onBufferOverflow = BufferOverflow.DROP_OLDEST,
+ )
+}
+
+@Composable
+public fun rememberDefaultRotaryHapticFeedback(): RotaryHapticFeedback =
+ LocalView.current.let { view -> remember { findDeviceSpecificHapticFeedback(view) } }
+
+internal fun findDeviceSpecificHapticFeedback(view: View): RotaryHapticFeedback =
+ if (isSamsungWatch()) {
+ SamsungWatchHapticFeedback(view)
+ } else {
+ DefaultRotaryHapticFeedback(view)
+ }
+
+/** Default Rotary implementation for [RotaryHapticFeedback] */
+class DefaultRotaryHapticFeedback(private val view: View) : RotaryHapticFeedback {
+
+ override fun performHapticFeedback(
+ type: RotaryHapticsType,
+ ) {
+ when (type) {
+ RotaryHapticsType.ScrollItemFocus -> {
+ view.performHapticFeedback(SCROLL_ITEM_FOCUS)
+ }
+ RotaryHapticsType.ScrollTick -> {
+ view.performHapticFeedback(SCROLL_TICK)
+ }
+ RotaryHapticsType.ScrollLimit -> {
+ view.performHapticFeedback(SCROLL_LIMIT)
+ }
+ }
+ }
+
+ private companion object {
+ // Hidden constants from HapticFeedbackConstants
+ const val SCROLL_TICK: Int = 18
+ const val SCROLL_ITEM_FOCUS: Int = 19
+ const val SCROLL_LIMIT: Int = 20
+ }
+}
+
+/** Implementation of [RotaryHapticFeedback] for Samsung devices */
+private class SamsungWatchHapticFeedback(private val view: View) : RotaryHapticFeedback {
+ override fun performHapticFeedback(
+ type: RotaryHapticsType,
+ ) {
+ when (type) {
+ RotaryHapticsType.ScrollItemFocus -> {
+ view.performHapticFeedback(102)
+ }
+ RotaryHapticsType.ScrollTick -> {
+ view.performHapticFeedback(102)
+ }
+ RotaryHapticsType.ScrollLimit -> {
+ view.performHapticFeedback(50107)
+ }
+ }
+ }
+}
+
+private fun isSamsungWatch(): Boolean = Build.MANUFACTURER.contains("Samsung", ignoreCase = true)
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Rotary.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Rotary.kt
new file mode 100644
index 000000000..b96bb3f5b
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/Rotary.kt
@@ -0,0 +1,1187 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.permission.ui.wear.elements.rotaryinput
+
+import android.view.ViewConfiguration
+import androidx.compose.animation.core.AnimationState
+import androidx.compose.animation.core.CubicBezierEasing
+import androidx.compose.animation.core.Easing
+import androidx.compose.animation.core.FastOutSlowInEasing
+import androidx.compose.animation.core.SpringSpec
+import androidx.compose.animation.core.animateTo
+import androidx.compose.animation.core.copy
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.MutatePriority
+import androidx.compose.foundation.focusable
+import androidx.compose.foundation.gestures.FlingBehavior
+import androidx.compose.foundation.gestures.ScrollableDefaults
+import androidx.compose.foundation.gestures.ScrollableState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.input.rotary.onRotaryScrollEvent
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.util.lerp
+import androidx.wear.compose.foundation.ExperimentalWearFoundationApi
+import androidx.wear.compose.foundation.rememberActiveFocusRequester
+import kotlin.math.abs
+import kotlin.math.absoluteValue
+import kotlin.math.sign
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.collectLatest
+import kotlinx.coroutines.flow.receiveAsFlow
+import kotlinx.coroutines.flow.transformLatest
+
+// This file is a copy of Rotary.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+private const val DEBUG = false
+
+/** Debug logging that can be enabled. */
+private inline fun debugLog(generateMsg: () -> String) {
+ if (DEBUG) {
+ println("RotaryScroll: ${generateMsg()}")
+ }
+}
+
+/**
+ * A modifier which connects rotary events with scrollable. This modifier supports fling.
+ *
+ * Fling algorithm:
+ * - A scroll with RSB/ Bezel happens.
+ * - If this is a first rotary event after the threshold ( by default 200ms), a new scroll session
+ * starts by resetting all necessary parameters
+ * - A delta value is added into VelocityTracker and a new speed is calculated.
+ * - If the current speed is bigger than the previous one, this value is remembered as a latest
+ * fling speed with a timestamp
+ * - After each scroll event a fling countdown starts ( by default 70ms) which resets if new scroll
+ * event is received
+ * - If fling countdown is finished - it means that the finger was probably raised from RSB, there
+ * will be no other events and probably this is the last event during this session. After it a
+ * fling is triggered.
+ * - Fling is stopped when a new scroll event happens
+ *
+ * The screen containing the scrollable item should request the focus by calling [requestFocus]
+ * method
+ *
+ * ```
+ * LaunchedEffect(Unit) {
+ * focusRequester.requestFocus()
+ * }
+ * ```
+ *
+ * @param focusRequester Requests the focus for rotary input
+ * @param scrollableState Scrollable state which will be scrolled while receiving rotary events
+ * @param flingBehavior Logic describing fling behavior.
+ * @param rotaryHaptics Class which will handle haptic feedback
+ * @param reverseDirection Reverse the direction of scrolling. Should be aligned with Scrollable
+ * `reverseDirection` parameter
+ */
+@Suppress("ComposableModifierFactory")
+@Deprecated(
+ "Use rotaryWithScroll instead",
+ ReplaceWith(
+ "this.rotaryWithScroll(scrollableState, focusRequester, " +
+ "flingBehavior, rotaryHaptics, reverseDirection)",
+ ),
+)
+@Composable
+public fun Modifier.rotaryWithFling(
+ focusRequester: FocusRequester,
+ scrollableState: ScrollableState,
+ flingBehavior: FlingBehavior = ScrollableDefaults.flingBehavior(),
+ rotaryHaptics: RotaryHapticHandler = rememberRotaryHapticHandler(scrollableState),
+ reverseDirection: Boolean = false,
+): Modifier =
+ rotaryHandler(
+ rotaryScrollHandler =
+ RotaryDefaults.rememberFlingHandler(scrollableState, flingBehavior),
+ reverseDirection = reverseDirection,
+ rotaryHaptics = rotaryHaptics,
+ )
+ .focusRequester(focusRequester)
+ .focusable()
+
+/**
+ * A modifier which connects rotary events with scrollable. This modifier supports scroll with
+ * fling.
+ *
+ * @param scrollableState Scrollable state which will be scrolled while receiving rotary events
+ * @param focusRequester Requests the focus for rotary input. By default comes from
+ * [rememberActiveFocusRequester], which is used with [HierarchicalFocusCoordinator]
+ * @param flingBehavior Logic describing fling behavior. If null fling will not happen.
+ * @param rotaryHaptics Class which will handle haptic feedback
+ * @param reverseDirection Reverse the direction of scrolling. Should be aligned with Scrollable
+ * `reverseDirection` parameter
+ */
+@OptIn(ExperimentalWearFoundationApi::class)
+@Suppress("ComposableModifierFactory")
+@Composable
+public fun Modifier.rotaryWithScroll(
+ scrollableState: ScrollableState,
+ focusRequester: FocusRequester = rememberActiveFocusRequester(),
+ flingBehavior: FlingBehavior? = ScrollableDefaults.flingBehavior(),
+ rotaryHaptics: RotaryHapticHandler = rememberRotaryHapticHandler(scrollableState),
+ reverseDirection: Boolean = false,
+): Modifier =
+ rotaryHandler(
+ rotaryScrollHandler =
+ RotaryDefaults.rememberFlingHandler(scrollableState, flingBehavior),
+ reverseDirection = reverseDirection,
+ rotaryHaptics = rotaryHaptics,
+ )
+ .focusRequester(focusRequester)
+ .focusable()
+
+/**
+ * A modifier which connects rotary events with scrollable. This modifier supports snap.
+ *
+ * @param focusRequester Requests the focus for rotary input. By default comes from
+ * [rememberActiveFocusRequester], which is used with [HierarchicalFocusCoordinator]
+ * @param rotaryScrollAdapter A connection between scrollable objects and rotary events
+ * @param rotaryHaptics Class which will handle haptic feedback
+ * @param reverseDirection Reverse the direction of scrolling. Should be aligned with Scrollable
+ * `reverseDirection` parameter
+ */
+@OptIn(ExperimentalWearFoundationApi::class)
+@Suppress("ComposableModifierFactory")
+@Composable
+public fun Modifier.rotaryWithSnap(
+ rotaryScrollAdapter: RotaryScrollAdapter,
+ focusRequester: FocusRequester = rememberActiveFocusRequester(),
+ snapParameters: SnapParameters = RotaryDefaults.snapParametersDefault(),
+ rotaryHaptics: RotaryHapticHandler =
+ rememberRotaryHapticHandler(rotaryScrollAdapter.scrollableState),
+ reverseDirection: Boolean = false,
+): Modifier =
+ rotaryHandler(
+ rotaryScrollHandler =
+ RotaryDefaults.rememberSnapHandler(rotaryScrollAdapter, snapParameters),
+ reverseDirection = reverseDirection,
+ rotaryHaptics = rotaryHaptics,
+ )
+ .focusRequester(focusRequester)
+ .focusable()
+
+/** An adapter which connects scrollableState to Rotary */
+interface RotaryScrollAdapter {
+
+ /** A scrollable state. Used for performing scroll when Rotary events received */
+ val scrollableState: ScrollableState
+
+ /** Average size of an item. Used for estimating the scrollable distance */
+ fun averageItemSize(): Float
+
+ /** A current item index. Used for scrolling */
+ fun currentItemIndex(): Int
+
+ /** An offset from the centre or the border of the current item. */
+ fun currentItemOffset(): Float
+
+ /** The total count of items in [scrollableState] */
+ fun totalItemsCount(): Int
+}
+
+/** Defaults for rotary modifiers */
+object RotaryDefaults {
+
+ /**
+ * Handles scroll with fling.
+ *
+ * @param scrollableState Scrollable state which will be scrolled while receiving rotary events
+ * @param flingBehavior Logic describing Fling behavior. If null - fling will not happen
+ * @param isLowRes Whether the input is Low-res (a bezel) or high-res(a crown/rsb)
+ */
+ @Composable
+ fun rememberFlingHandler(
+ scrollableState: ScrollableState,
+ flingBehavior: FlingBehavior? = null,
+ isLowRes: Boolean = isLowResInput(),
+ ): RotaryScrollHandler {
+ val viewConfiguration = ViewConfiguration.get(LocalContext.current)
+
+ return remember(scrollableState, flingBehavior, isLowRes) {
+ debugLog { "isLowRes : $isLowRes" }
+ fun rotaryFlingBehavior() =
+ flingBehavior?.run {
+ DefaultRotaryFlingBehavior(
+ scrollableState,
+ flingBehavior,
+ viewConfiguration,
+ flingTimeframe =
+ if (isLowRes) lowResFlingTimeframe else highResFlingTimeframe,
+ )
+ }
+
+ fun scrollBehavior() = AnimationScrollBehavior(scrollableState)
+
+ if (isLowRes) {
+ LowResRotaryScrollHandler(
+ rotaryFlingBehaviorFactory = { rotaryFlingBehavior() },
+ scrollBehaviorFactory = { scrollBehavior() },
+ )
+ } else {
+ HighResRotaryScrollHandler(
+ rotaryFlingBehaviorFactory = { rotaryFlingBehavior() },
+ scrollBehaviorFactory = { scrollBehavior() },
+ )
+ }
+ }
+ }
+
+ /**
+ * Handles scroll with snap
+ *
+ * @param rotaryScrollAdapter A connection between scrollable objects and rotary events
+ * @param snapParameters Snap parameters
+ */
+ @Composable
+ fun rememberSnapHandler(
+ rotaryScrollAdapter: RotaryScrollAdapter,
+ snapParameters: SnapParameters = snapParametersDefault(),
+ isLowRes: Boolean = isLowResInput(),
+ ): RotaryScrollHandler {
+ return remember(rotaryScrollAdapter, snapParameters) {
+ if (isLowRes) {
+ LowResSnapHandler(
+ snapBehaviourFactory = {
+ DefaultSnapBehavior(rotaryScrollAdapter, snapParameters)
+ },
+ )
+ } else {
+ HighResSnapHandler(
+ resistanceFactor = snapParameters.resistanceFactor,
+ thresholdBehaviorFactory = {
+ ThresholdBehavior(
+ rotaryScrollAdapter,
+ snapParameters.thresholdDivider,
+ )
+ },
+ snapBehaviourFactory = {
+ DefaultSnapBehavior(rotaryScrollAdapter, snapParameters)
+ },
+ scrollBehaviourFactory = {
+ AnimationScrollBehavior(rotaryScrollAdapter.scrollableState)
+ },
+ )
+ }
+ }
+ }
+
+ /** Returns default [SnapParameters] */
+ fun snapParametersDefault(): SnapParameters =
+ SnapParameters(
+ snapOffset = 0,
+ thresholdDivider = 1.5f,
+ resistanceFactor = 3f,
+ )
+
+ /** Returns whether the input is Low-res (a bezel) or high-res(a crown/rsb). */
+ @Composable
+ fun isLowResInput(): Boolean =
+ LocalContext.current.packageManager.hasSystemFeature(
+ "android.hardware.rotaryencoder.lowres"
+ )
+
+ private val lowResFlingTimeframe: Long = 100L
+ private val highResFlingTimeframe: Long = 30L
+}
+
+/**
+ * Parameters used for snapping
+ *
+ * @param snapOffset an optional offset to be applied when snapping the item. After the snap the
+ * snapped items offset will be [snapOffset].
+ */
+class SnapParameters(
+ val snapOffset: Int,
+ val thresholdDivider: Float,
+ val resistanceFactor: Float,
+) {
+ /** Returns a snapping offset in [Dp] */
+ @Composable
+ fun snapOffsetDp(): Dp {
+ return with(LocalDensity.current) { snapOffset.toDp() }
+ }
+}
+
+/** An interface for handling scroll events */
+interface RotaryScrollHandler {
+ /**
+ * Handles scrolling events
+ *
+ * @param coroutineScope A scope for performing async actions
+ * @param event A scrollable event from rotary input, containing scrollable delta and timestamp
+ * @param rotaryHaptics
+ */
+ suspend fun handleScrollEvent(
+ coroutineScope: CoroutineScope,
+ event: TimestampedDelta,
+ rotaryHaptics: RotaryHapticHandler,
+ )
+}
+
+/** An interface for scrolling behavior */
+interface RotaryScrollBehavior {
+ /** Handles scroll event to [targetValue] */
+ suspend fun handleEvent(targetValue: Float)
+}
+
+/** Default implementation of [RotaryFlingBehavior] */
+class DefaultRotaryFlingBehavior(
+ private val scrollableState: ScrollableState,
+ private val flingBehavior: FlingBehavior,
+ viewConfiguration: ViewConfiguration,
+ private val flingTimeframe: Long,
+) : RotaryFlingBehavior {
+
+ // A time range during which the fling is valid.
+ // For simplicity it's twice as long as [flingTimeframe]
+ private val timeRangeToFling = flingTimeframe * 2
+
+ // A default fling factor for making fling slower
+ private val flingScaleFactor = 0.7f
+
+ private var previousVelocity = 0f
+
+ private val rotaryVelocityTracker = RotaryVelocityTracker()
+
+ private val minFlingSpeed = viewConfiguration.scaledMinimumFlingVelocity.toFloat()
+ private val maxFlingSpeed = viewConfiguration.scaledMaximumFlingVelocity.toFloat()
+ private var latestEventTimestamp: Long = 0
+
+ private var flingVelocity: Float = 0f
+ private var flingTimestamp: Long = 0
+
+ override fun startFlingTracking(timestamp: Long) {
+ rotaryVelocityTracker.start(timestamp)
+ latestEventTimestamp = timestamp
+ previousVelocity = 0f
+ }
+
+ override fun observeEvent(timestamp: Long, delta: Float) {
+ rotaryVelocityTracker.move(timestamp, delta)
+ latestEventTimestamp = timestamp
+ }
+
+ override suspend fun trackFling(beforeFling: () -> Unit) {
+ val currentVelocity = rotaryVelocityTracker.velocity
+ debugLog { "currentVelocity: $currentVelocity" }
+
+ if (abs(currentVelocity) >= abs(previousVelocity)) {
+ flingTimestamp = latestEventTimestamp
+ flingVelocity = currentVelocity * flingScaleFactor
+ }
+ previousVelocity = currentVelocity
+
+ // Waiting for a fixed amount of time before checking the fling
+ delay(flingTimeframe)
+
+ // For making a fling 2 criteria should be met:
+ // 1) no more than
+ // `rangeToFling` ms should pass between last fling detection
+ // and the time of last motion event
+ // 2) flingVelocity should exceed the minFlingSpeed
+ debugLog {
+ "Check fling: flingVelocity: $flingVelocity " +
+ "minFlingSpeed: $minFlingSpeed, maxFlingSpeed: $maxFlingSpeed"
+ }
+ if (
+ latestEventTimestamp - flingTimestamp < timeRangeToFling &&
+ abs(flingVelocity) > minFlingSpeed
+ ) {
+ // Stops scrollAnimationCoroutine because a fling will be performed
+ beforeFling()
+ val velocity = flingVelocity.coerceIn(-maxFlingSpeed, maxFlingSpeed)
+ scrollableState.scroll(MutatePriority.UserInput) {
+ with(flingBehavior) {
+ debugLog { "Flinging with velocity $velocity" }
+ performFling(velocity)
+ }
+ }
+ }
+ }
+}
+
+/** An interface for flinging with rotary */
+interface RotaryFlingBehavior {
+
+ /** Observing new event within a fling tracking session with new timestamp and delta */
+ fun observeEvent(timestamp: Long, delta: Float)
+
+ /** Performing fling if necessary and calling [beforeFling] lambda before it is triggered */
+ suspend fun trackFling(beforeFling: () -> Unit)
+
+ /** Starts a new fling tracking session with specified timestamp */
+ fun startFlingTracking(timestamp: Long)
+}
+
+/** An interface for snapping with rotary */
+interface RotarySnapBehavior {
+
+ /**
+ * Preparing snapping. This method should be called before [snapToTargetItem] is called.
+ *
+ * Snapping is done for current + [moveForElements] items.
+ *
+ * If [sequentialSnap] is true, items are summed up together. For example, if
+ * [prepareSnapForItems] is called with [moveForElements] = 2, 3, 5 -> then the snapping will
+ * happen to current + 10 items
+ *
+ * If [sequentialSnap] is false, then [moveForElements] are not summed up together.
+ */
+ fun prepareSnapForItems(moveForElements: Int, sequentialSnap: Boolean)
+
+ /** Performs snapping to the closest item. */
+ suspend fun snapToClosestItem()
+
+ /** Returns true if top edge was reached */
+ fun topEdgeReached(): Boolean
+
+ /** Returns true if bottom edge was reached */
+ fun bottomEdgeReached(): Boolean
+
+ /** Performs snapping to the specified in [prepareSnapForItems] element */
+ suspend fun snapToTargetItem()
+}
+
+/**
+ * A rotary event object which contains a [timestamp] of the rotary event and a scrolled [delta].
+ */
+data class TimestampedDelta(val timestamp: Long, val delta: Float)
+
+/**
+ * Animation implementation of [RotaryScrollBehavior]. This class does a smooth animation when the
+ * scroll by N pixels is done. This animation works well on Rsb(high-res) and Bezel(low-res)
+ * devices.
+ */
+class AnimationScrollBehavior(
+ private val scrollableState: ScrollableState,
+) : RotaryScrollBehavior {
+ private var sequentialAnimation = false
+ private var scrollAnimation = AnimationState(0f)
+ private var prevPosition = 0f
+
+ override suspend fun handleEvent(targetValue: Float) {
+ scrollableState.scroll(MutatePriority.UserInput) {
+ debugLog { "ScrollAnimation value before start: ${scrollAnimation.value}" }
+
+ scrollAnimation.animateTo(
+ targetValue,
+ animationSpec = spring(),
+ sequentialAnimation = sequentialAnimation,
+ ) {
+ val delta = value - prevPosition
+ debugLog { "Animated by $delta, value: $value" }
+ scrollBy(delta)
+ prevPosition = value
+ sequentialAnimation = value != this.targetValue
+ }
+ }
+ }
+}
+
+/**
+ * An animated implementation of [RotarySnapBehavior]. Uses animateScrollToItem method for snapping
+ * to the Nth item
+ */
+class DefaultSnapBehavior(
+ private val rotaryScrollAdapter: RotaryScrollAdapter,
+ private val snapParameters: SnapParameters,
+) : RotarySnapBehavior {
+ private var snapTarget: Int = rotaryScrollAdapter.currentItemIndex()
+ private var sequentialSnap: Boolean = false
+
+ private var anim = AnimationState(0f)
+ private var expectedDistance = 0f
+
+ private val defaultStiffness = 200f
+ private var snapTargetUpdated = true
+
+ override fun prepareSnapForItems(moveForElements: Int, sequentialSnap: Boolean) {
+ this.sequentialSnap = sequentialSnap
+ if (sequentialSnap) {
+ snapTarget += moveForElements
+ } else {
+ snapTarget = rotaryScrollAdapter.currentItemIndex() + moveForElements
+ }
+ snapTargetUpdated = true
+ snapTarget = snapTarget.coerceIn(0 until rotaryScrollAdapter.totalItemsCount())
+ }
+
+ override suspend fun snapToClosestItem() {
+ // Snapping to the closest item by using performFling method with 0 speed
+ rotaryScrollAdapter.scrollableState.scroll(MutatePriority.UserInput) {
+ debugLog { "snap to closest item" }
+ var prevPosition = 0f
+ AnimationState(0f).animateTo(
+ targetValue = -rotaryScrollAdapter.currentItemOffset(),
+ animationSpec = tween(durationMillis = 100, easing = FastOutSlowInEasing),
+ ) {
+ val animDelta = value - prevPosition
+ scrollBy(animDelta)
+ prevPosition = value
+ }
+ snapTarget = rotaryScrollAdapter.currentItemIndex()
+ }
+ }
+
+ override fun topEdgeReached(): Boolean = snapTarget <= 0
+
+ override fun bottomEdgeReached(): Boolean =
+ snapTarget >= rotaryScrollAdapter.totalItemsCount() - 1
+
+ override suspend fun snapToTargetItem() {
+ if (sequentialSnap) {
+ anim = anim.copy(0f)
+ } else {
+ anim = AnimationState(0f)
+ }
+ rotaryScrollAdapter.scrollableState.scroll(MutatePriority.UserInput) {
+ // If snapTargetUpdated is true - then the target was updated so we
+ // need to do snap again
+ while (snapTargetUpdated) {
+ snapTargetUpdated = false
+ var latestCenterItem: Int
+ var continueFirstScroll = true
+ debugLog { "snapTarget $snapTarget" }
+ while (continueFirstScroll) {
+ latestCenterItem = rotaryScrollAdapter.currentItemIndex()
+ anim = anim.copy(0f)
+ expectedDistance = expectedDistanceTo(snapTarget, snapParameters.snapOffset)
+ debugLog {
+ "expectedDistance = $expectedDistance, " +
+ "scrollableState.centerItemScrollOffset " +
+ "${rotaryScrollAdapter.currentItemOffset()}"
+ }
+ continueFirstScroll = false
+ var prevPosition = 0f
+
+ anim.animateTo(
+ expectedDistance,
+ animationSpec =
+ SpringSpec(
+ stiffness = defaultStiffness,
+ visibilityThreshold = 0.1f,
+ ),
+ sequentialAnimation = (anim.velocity != 0f),
+ ) {
+ val animDelta = value - prevPosition
+ debugLog {
+ "First animation, value:$value, velocity:$velocity, " +
+ "animDelta:$animDelta"
+ }
+
+ // Exit animation if snap target was updated
+ if (snapTargetUpdated) cancelAnimation()
+
+ scrollBy(animDelta)
+ prevPosition = value
+
+ if (latestCenterItem != rotaryScrollAdapter.currentItemIndex()) {
+ continueFirstScroll = true
+ cancelAnimation()
+ return@animateTo
+ }
+
+ debugLog { "centerItemIndex = ${rotaryScrollAdapter.currentItemIndex()}" }
+ if (rotaryScrollAdapter.currentItemIndex() == snapTarget) {
+ debugLog { "Target is visible. Cancelling first animation" }
+ debugLog {
+ "scrollableState.centerItemScrollOffset " +
+ "${rotaryScrollAdapter.currentItemOffset()}"
+ }
+ expectedDistance = -rotaryScrollAdapter.currentItemOffset()
+ continueFirstScroll = false
+ cancelAnimation()
+ return@animateTo
+ }
+ }
+ }
+ // Exit animation if snap target was updated
+ if (snapTargetUpdated) continue
+
+ anim = anim.copy(0f)
+ var prevPosition = 0f
+ anim.animateTo(
+ expectedDistance,
+ animationSpec =
+ SpringSpec(
+ stiffness = defaultStiffness,
+ visibilityThreshold = 0.1f,
+ ),
+ sequentialAnimation = (anim.velocity != 0f),
+ ) {
+ // Exit animation if snap target was updated
+ if (snapTargetUpdated) cancelAnimation()
+
+ val animDelta = value - prevPosition
+ debugLog { "Final animation. velocity:$velocity, animDelta:$animDelta" }
+ scrollBy(animDelta)
+ prevPosition = value
+ }
+ }
+ }
+ }
+
+ private fun expectedDistanceTo(index: Int, targetScrollOffset: Int): Float {
+ val averageSize = rotaryScrollAdapter.averageItemSize()
+ val indexesDiff = index - rotaryScrollAdapter.currentItemIndex()
+ debugLog { "Average size $averageSize" }
+ return (averageSize * indexesDiff) + targetScrollOffset -
+ rotaryScrollAdapter.currentItemOffset()
+ }
+}
+
+/**
+ * A modifier which handles rotary events. It accepts ScrollHandler as the input - a class where
+ * main logic about how scroll should be handled is lying
+ */
+@OptIn(ExperimentalComposeUiApi::class)
+fun Modifier.rotaryHandler(
+ rotaryScrollHandler: RotaryScrollHandler,
+ // TODO: batching causes additional delays. Return once it's clear that
+ // we will use it
+ /* batchTimeframe: Long = 0L,*/
+ reverseDirection: Boolean,
+ rotaryHaptics: RotaryHapticHandler,
+): Modifier = composed {
+ val channel = rememberTimestampChannel()
+ val eventsFlow = remember(channel) { channel.receiveAsFlow() }
+
+ composed {
+ LaunchedEffect(eventsFlow) {
+ eventsFlow
+ // TODO: batching causes additional delays. Return once it's clear that
+ // we will use it
+ // Do we really need to do this on this level?
+ // .batchRequestsWithinTimeframe(batchTimeframe)
+ .collectLatest {
+ debugLog {
+ "Scroll event received: " + "delta:${it.delta}, timestamp:${it.timestamp}"
+ }
+ rotaryScrollHandler.handleScrollEvent(this, it, rotaryHaptics)
+ }
+ }
+ this.onRotaryScrollEvent {
+ // Okay to ignore the ChannelResult returned from trySend because it is conflated
+ // (see rememberTimestampChannel()).
+ @Suppress("UNUSED_VARIABLE")
+ val unused =
+ channel.trySend(
+ TimestampedDelta(
+ it.uptimeMillis,
+ it.verticalScrollPixels * if (reverseDirection) -1f else 1f,
+ ),
+ )
+ true
+ }
+ }
+}
+
+/**
+ * Batching requests for scrolling events. This function combines all events together (except first)
+ * within specified timeframe. Should help with performance on high-res devices.
+ */
+@OptIn(ExperimentalCoroutinesApi::class)
+fun Flow<TimestampedDelta>.batchRequestsWithinTimeframe(timeframe: Long): Flow<TimestampedDelta> {
+ var delta = 0f
+ var lastTimestamp = -timeframe
+ return if (timeframe == 0L) {
+ this
+ } else {
+ this.transformLatest {
+ delta += it.delta
+ debugLog { "Batching requests. delta:$delta" }
+ if (lastTimestamp + timeframe <= it.timestamp) {
+ lastTimestamp = it.timestamp
+ debugLog { "No events before, delta= $delta" }
+ emit(TimestampedDelta(it.timestamp, delta))
+ } else {
+ delay(timeframe)
+ debugLog { "After delay, delta= $delta" }
+ if (delta > 0f) {
+ emit(TimestampedDelta(it.timestamp, delta))
+ }
+ }
+ delta = 0f
+ }
+ }
+}
+
+/**
+ * A scroll handler for RSB(high-res) without snapping and with or without fling A list is scrolled
+ * by the number of pixels received from the rotary device.
+ *
+ * This class is a little bit different from LowResScrollHandler class - it has a filtering for
+ * events which are coming with wrong sign ( this happens to rsb devices, especially at the end of
+ * the scroll)
+ *
+ * This scroll handler supports fling. It can be set with [RotaryFlingBehavior].
+ */
+internal class HighResRotaryScrollHandler(
+ private val rotaryFlingBehaviorFactory: () -> RotaryFlingBehavior?,
+ private val scrollBehaviorFactory: () -> RotaryScrollBehavior,
+ private val hapticsThreshold: Long = 50,
+) : RotaryScrollHandler {
+
+ // This constant is specific for high-res devices. Because that input values
+ // can sometimes come with different sign, we have to filter them in this threshold
+ private val gestureThresholdTime = 200L
+ private var scrollJob: Job = CompletableDeferred<Unit>()
+ private var flingJob: Job = CompletableDeferred<Unit>()
+
+ private var previousScrollEventTime = 0L
+ private var rotaryScrollDistance = 0f
+
+ private var rotaryFlingBehavior: RotaryFlingBehavior? = rotaryFlingBehaviorFactory()
+ private var scrollBehavior: RotaryScrollBehavior = scrollBehaviorFactory()
+
+ override suspend fun handleScrollEvent(
+ coroutineScope: CoroutineScope,
+ event: TimestampedDelta,
+ rotaryHaptics: RotaryHapticHandler,
+ ) {
+ val time = event.timestamp
+ val isOppositeScrollValue = isOppositeValueAfterScroll(event.delta)
+
+ if (isNewScrollEvent(time)) {
+ debugLog { "New scroll event" }
+ resetTracking(time)
+ rotaryScrollDistance = event.delta
+ } else {
+ // Due to the physics of Rotary side button, some events might come
+ // with an opposite axis value - either at the start or at the end of the motion.
+ // We don't want to use these values for fling calculations.
+ if (!isOppositeScrollValue) {
+ rotaryFlingBehavior?.observeEvent(event.timestamp, event.delta)
+ } else {
+ debugLog { "Opposite value after scroll :${event.delta}" }
+ }
+ rotaryScrollDistance += event.delta
+ }
+
+ scrollJob.cancel()
+
+ rotaryHaptics.handleScrollHaptic(event.delta)
+ debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+ previousScrollEventTime = time
+ scrollJob = coroutineScope.async { scrollBehavior.handleEvent(rotaryScrollDistance) }
+
+ if (rotaryFlingBehavior != null) {
+ flingJob.cancel()
+ flingJob =
+ coroutineScope.async {
+ rotaryFlingBehavior?.trackFling(
+ beforeFling = {
+ debugLog { "Calling before fling section" }
+ scrollJob.cancel()
+ scrollBehavior = scrollBehaviorFactory()
+ }
+ )
+ }
+ }
+ }
+
+ private fun isOppositeValueAfterScroll(delta: Float): Boolean =
+ sign(rotaryScrollDistance) * sign(delta) == -1f && (abs(delta) < abs(rotaryScrollDistance))
+
+ private fun isNewScrollEvent(timestamp: Long): Boolean {
+ val timeDelta = timestamp - previousScrollEventTime
+ return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+ }
+
+ private fun resetTracking(timestamp: Long) {
+ scrollBehavior = scrollBehaviorFactory()
+ rotaryFlingBehavior = rotaryFlingBehaviorFactory()
+ rotaryFlingBehavior?.startFlingTracking(timestamp)
+ }
+}
+
+/**
+ * A scroll handler for Bezel(low-res) without snapping. This scroll handler supports fling. It can
+ * be set with RotaryFlingBehavior.
+ */
+internal class LowResRotaryScrollHandler(
+ private val rotaryFlingBehaviorFactory: () -> RotaryFlingBehavior?,
+ private val scrollBehaviorFactory: () -> RotaryScrollBehavior,
+) : RotaryScrollHandler {
+
+ private val gestureThresholdTime = 200L
+ private var previousScrollEventTime = 0L
+ private var rotaryScrollDistance = 0f
+
+ private var scrollJob: Job = CompletableDeferred<Unit>()
+ private var flingJob: Job = CompletableDeferred<Unit>()
+
+ private var rotaryFlingBehavior: RotaryFlingBehavior? = rotaryFlingBehaviorFactory()
+ private var scrollBehavior: RotaryScrollBehavior = scrollBehaviorFactory()
+
+ override suspend fun handleScrollEvent(
+ coroutineScope: CoroutineScope,
+ event: TimestampedDelta,
+ rotaryHaptics: RotaryHapticHandler,
+ ) {
+ val time = event.timestamp
+
+ if (isNewScrollEvent(time)) {
+ resetTracking(time)
+ rotaryScrollDistance = event.delta
+ } else {
+ rotaryFlingBehavior?.observeEvent(event.timestamp, event.delta)
+ rotaryScrollDistance += event.delta
+ }
+
+ scrollJob.cancel()
+ flingJob.cancel()
+
+ rotaryHaptics.handleScrollHaptic(event.delta)
+ debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+ previousScrollEventTime = time
+ scrollJob = coroutineScope.async { scrollBehavior.handleEvent(rotaryScrollDistance) }
+
+ flingJob =
+ coroutineScope.async {
+ rotaryFlingBehavior?.trackFling(
+ beforeFling = {
+ debugLog { "Calling before fling section" }
+ scrollJob.cancel()
+ scrollBehavior = scrollBehaviorFactory()
+ },
+ )
+ }
+ }
+
+ private fun isNewScrollEvent(timestamp: Long): Boolean {
+ val timeDelta = timestamp - previousScrollEventTime
+ return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+ }
+
+ private fun resetTracking(timestamp: Long) {
+ scrollBehavior = scrollBehaviorFactory()
+ debugLog { "Velocity tracker reset" }
+ rotaryFlingBehavior = rotaryFlingBehaviorFactory()
+ rotaryFlingBehavior?.startFlingTracking(timestamp)
+ }
+}
+
+/**
+ * A scroll handler for RSB(high-res) with snapping and without fling Snapping happens after a
+ * threshold is reached ( set in [RotarySnapBehavior])
+ *
+ * This scroll handler doesn't support fling.
+ */
+internal class HighResSnapHandler(
+ private val resistanceFactor: Float,
+ private val thresholdBehaviorFactory: () -> ThresholdBehavior,
+ private val snapBehaviourFactory: () -> RotarySnapBehavior,
+ private val scrollBehaviourFactory: () -> RotaryScrollBehavior,
+) : RotaryScrollHandler {
+ private val gestureThresholdTime = 200L
+ private val snapDelay = 100L
+ private val maxSnapsPerEvent = 2
+
+ private var scrollJob: Job = CompletableDeferred<Unit>()
+ private var snapJob: Job = CompletableDeferred<Unit>()
+
+ private var previousScrollEventTime = 0L
+ private var snapAccumulator = 0f
+ private var rotaryScrollDistance = 0f
+ private var scrollInProgress = false
+
+ private var snapBehaviour = snapBehaviourFactory()
+ private var scrollBehaviour = scrollBehaviourFactory()
+ private var thresholdBehavior = thresholdBehaviorFactory()
+
+ private val scrollEasing: Easing = CubicBezierEasing(0.0f, 0.0f, 0.5f, 1.0f)
+
+ override suspend fun handleScrollEvent(
+ coroutineScope: CoroutineScope,
+ event: TimestampedDelta,
+ rotaryHaptics: RotaryHapticHandler,
+ ) {
+ val time = event.timestamp
+
+ if (isNewScrollEvent(time)) {
+ debugLog { "New scroll event" }
+ resetTracking()
+ snapJob.cancel()
+ snapBehaviour = snapBehaviourFactory()
+ scrollBehaviour = scrollBehaviourFactory()
+ thresholdBehavior = thresholdBehaviorFactory()
+ thresholdBehavior.startThresholdTracking(time)
+ snapAccumulator = 0f
+ rotaryScrollDistance = 0f
+ }
+
+ if (!isOppositeValueAfterScroll(event.delta)) {
+ thresholdBehavior.observeEvent(event.timestamp, event.delta)
+ } else {
+ debugLog { "Opposite value after scroll :${event.delta}" }
+ }
+
+ thresholdBehavior.applySmoothing()
+ val snapThreshold = thresholdBehavior.snapThreshold()
+
+ snapAccumulator += event.delta
+ if (!snapJob.isActive) {
+ val resistanceCoeff =
+ 1 - scrollEasing.transform(rotaryScrollDistance.absoluteValue / snapThreshold)
+ rotaryScrollDistance += event.delta * resistanceCoeff
+ }
+
+ debugLog { "Snap accumulator: $snapAccumulator" }
+ debugLog { "Rotary scroll distance: $rotaryScrollDistance" }
+
+ debugLog { "snapThreshold: $snapThreshold" }
+ previousScrollEventTime = time
+
+ if (abs(snapAccumulator) > snapThreshold) {
+ scrollInProgress = false
+ scrollBehaviour = scrollBehaviourFactory()
+ scrollJob.cancel()
+
+ val snapDistance =
+ (snapAccumulator / snapThreshold)
+ .toInt()
+ .coerceIn(-maxSnapsPerEvent..maxSnapsPerEvent)
+ snapAccumulator -= snapThreshold * snapDistance
+ val sequentialSnap = snapJob.isActive
+
+ debugLog {
+ "Snap threshold reached: snapDistance:$snapDistance, " +
+ "sequentialSnap: $sequentialSnap, " +
+ "snap accumulator remaining: $snapAccumulator"
+ }
+ if (
+ (!snapBehaviour.topEdgeReached() && snapDistance < 0) ||
+ (!snapBehaviour.bottomEdgeReached() && snapDistance > 0)
+ ) {
+ rotaryHaptics.handleSnapHaptic(event.delta)
+ }
+
+ snapBehaviour.prepareSnapForItems(snapDistance, sequentialSnap)
+ if (!snapJob.isActive) {
+ snapJob.cancel()
+ snapJob =
+ coroutineScope.async {
+ debugLog { "Snap started" }
+ try {
+ snapBehaviour.snapToTargetItem()
+ } finally {
+ debugLog { "Snap called finally" }
+ }
+ }
+ }
+ rotaryScrollDistance = 0f
+ } else {
+ if (!snapJob.isActive) {
+ scrollJob.cancel()
+ debugLog { "Scrolling for $rotaryScrollDistance/$resistanceFactor px" }
+ scrollJob =
+ coroutineScope.async {
+ scrollBehaviour.handleEvent(rotaryScrollDistance / resistanceFactor)
+ }
+ delay(snapDelay)
+ scrollInProgress = false
+ scrollBehaviour = scrollBehaviourFactory()
+ rotaryScrollDistance = 0f
+ snapAccumulator = 0f
+ snapBehaviour.prepareSnapForItems(0, false)
+
+ snapJob.cancel()
+ snapJob = coroutineScope.async { snapBehaviour.snapToClosestItem() }
+ }
+ }
+ }
+
+ private fun isOppositeValueAfterScroll(delta: Float): Boolean =
+ sign(rotaryScrollDistance) * sign(delta) == -1f && (abs(delta) < abs(rotaryScrollDistance))
+
+ private fun isNewScrollEvent(timestamp: Long): Boolean {
+ val timeDelta = timestamp - previousScrollEventTime
+ return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+ }
+
+ private fun resetTracking() {
+ scrollInProgress = true
+ }
+}
+
+/**
+ * A scroll handler for RSB(high-res) with snapping and without fling Snapping happens after a
+ * threshold is reached ( set in [RotarySnapBehavior])
+ *
+ * This scroll handler doesn't support fling.
+ */
+internal class LowResSnapHandler(
+ private val snapBehaviourFactory: () -> RotarySnapBehavior,
+) : RotaryScrollHandler {
+ private val gestureThresholdTime = 200L
+
+ private var snapJob: Job = CompletableDeferred<Unit>()
+
+ private var previousScrollEventTime = 0L
+ private var snapAccumulator = 0f
+ private var scrollInProgress = false
+
+ private var snapBehaviour = snapBehaviourFactory()
+
+ override suspend fun handleScrollEvent(
+ coroutineScope: CoroutineScope,
+ event: TimestampedDelta,
+ rotaryHaptics: RotaryHapticHandler,
+ ) {
+ val time = event.timestamp
+
+ if (isNewScrollEvent(time)) {
+ debugLog { "New scroll event" }
+ resetTracking()
+ snapJob.cancel()
+ snapBehaviour = snapBehaviourFactory()
+ snapAccumulator = 0f
+ }
+
+ snapAccumulator += event.delta
+
+ debugLog { "Snap accumulator: $snapAccumulator" }
+
+ previousScrollEventTime = time
+
+ if (abs(snapAccumulator) > 1f) {
+ scrollInProgress = false
+
+ val snapDistance = sign(snapAccumulator).toInt()
+ rotaryHaptics.handleSnapHaptic(event.delta)
+ val sequentialSnap = snapJob.isActive
+ debugLog {
+ "Snap threshold reached: snapDistance:$snapDistance, " +
+ "sequentialSnap: $sequentialSnap, " +
+ "snap accumulator: $snapAccumulator"
+ }
+
+ snapBehaviour.prepareSnapForItems(snapDistance, sequentialSnap)
+ if (!snapJob.isActive) {
+ snapJob.cancel()
+ snapJob =
+ coroutineScope.async {
+ debugLog { "Snap started" }
+ try {
+ snapBehaviour.snapToTargetItem()
+ } finally {
+ debugLog { "Snap called finally" }
+ }
+ }
+ }
+ snapAccumulator = 0f
+ }
+ }
+
+ private fun isNewScrollEvent(timestamp: Long): Boolean {
+ val timeDelta = timestamp - previousScrollEventTime
+ return previousScrollEventTime == 0L || timeDelta > gestureThresholdTime
+ }
+
+ private fun resetTracking() {
+ scrollInProgress = true
+ }
+}
+
+internal class ThresholdBehavior(
+ private val rotaryScrollAdapter: RotaryScrollAdapter,
+ private val thresholdDivider: Float,
+ private val minVelocity: Float = 300f,
+ private val maxVelocity: Float = 3000f,
+ private val smoothingConstant: Float = 0.4f,
+) {
+ private val thresholdDividerEasing: Easing = CubicBezierEasing(0.5f, 0.0f, 0.5f, 1.0f)
+
+ private val rotaryVelocityTracker = RotaryVelocityTracker()
+
+ private var smoothedVelocity = 0f
+ fun startThresholdTracking(time: Long) {
+ rotaryVelocityTracker.start(time)
+ smoothedVelocity = 0f
+ }
+
+ fun observeEvent(timestamp: Long, delta: Float) {
+ rotaryVelocityTracker.move(timestamp, delta)
+ }
+
+ fun applySmoothing() {
+ if (rotaryVelocityTracker.velocity != 0.0f) {
+ // smooth the velocity
+ smoothedVelocity =
+ exponentialSmoothing(
+ currentVelocity = rotaryVelocityTracker.velocity.absoluteValue,
+ prevVelocity = smoothedVelocity,
+ smoothingConstant = smoothingConstant,
+ )
+ }
+ debugLog { "rotaryVelocityTracker velocity: ${rotaryVelocityTracker.velocity}" }
+ debugLog { "SmoothedVelocity: $smoothedVelocity" }
+ }
+
+ fun snapThreshold(): Float {
+ val thresholdDividerFraction =
+ thresholdDividerEasing.transform(
+ inverseLerp(
+ minVelocity,
+ maxVelocity,
+ smoothedVelocity,
+ ),
+ )
+ return rotaryScrollAdapter.averageItemSize() /
+ lerp(
+ 1f,
+ thresholdDivider,
+ thresholdDividerFraction,
+ )
+ }
+
+ private fun exponentialSmoothing(
+ currentVelocity: Float,
+ prevVelocity: Float,
+ smoothingConstant: Float,
+ ): Float = smoothingConstant * currentVelocity + (1 - smoothingConstant) * prevVelocity
+}
+
+@Composable
+private fun rememberTimestampChannel() = remember {
+ Channel<TimestampedDelta>(capacity = Channel.CONFLATED)
+}
+
+private fun inverseLerp(start: Float, stop: Float, value: Float): Float {
+ return ((value - start) / (stop - start)).coerceIn(0f, 1f)
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/RotaryVelocityTracker.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/RotaryVelocityTracker.kt
new file mode 100644
index 000000000..1719ecef3
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/rotaryinput/RotaryVelocityTracker.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.permission.ui.wear.elements.rotaryinput
+
+import androidx.compose.ui.input.pointer.util.VelocityTracker1D
+
+// This file is a copy of RotaryVelocityTracker.kt from Horologist (go/horologist),
+// remove it once Wear Compose 1.4 is landed (b/325560444).
+
+/** A wrapper around VelocityTracker1D to provide support for rotary input. */
+class RotaryVelocityTracker {
+ private var velocityTracker: VelocityTracker1D = VelocityTracker1D(true)
+
+ /** Retrieve the last computed velocity. */
+ val velocity: Float
+ get() = velocityTracker.calculateVelocity()
+
+ /** Start tracking motion. */
+ fun start(currentTime: Long) {
+ velocityTracker.resetTracking()
+ velocityTracker.addDataPoint(currentTime, 0f)
+ }
+
+ /** Continue tracking motion as the input rotates. */
+ fun move(currentTime: Long, delta: Float) {
+ velocityTracker.addDataPoint(currentTime, delta)
+ }
+
+ /** Stop tracking motion. */
+ fun end() {
+ velocityTracker.resetTracking()
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/model/WearUnusedAppsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/model/WearUnusedAppsViewModel.kt
index 38810ddd6..a2d987e02 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/model/WearUnusedAppsViewModel.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/model/WearUnusedAppsViewModel.kt
@@ -34,7 +34,7 @@ class WearUnusedAppsViewModel : ViewModel() {
/** A livedata which stores a map of unused apps group by UnusedPeriod. */
val unusedAppChipsLiveData =
- MutableLiveData<MutableMap<UnusedPeriod, MutableMap<String, UnusedAppChip>>>()
+ MutableLiveData<Map<UnusedPeriod, Map<String, UnusedAppChip>>>()
data class UnusedAppChip(
val label: String,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt
new file mode 100644
index 000000000..e7947fd5c
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt
@@ -0,0 +1,55 @@
+package com.android.permissioncontroller.permission.ui.wear.theme
+
+import android.content.Context
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.wear.compose.material.Colors
+import androidx.wear.compose.material.MaterialTheme
+
+/** The Material 3 Theme Wrapper for Supporting RRO. */
+@Composable
+fun WearPermissionTheme(content: @Composable () -> Unit) {
+ val context = LocalContext.current
+ val colors =
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ overlayColors(context)
+ .copy(error = MaterialTheme.colors.error, onError = MaterialTheme.colors.onError)
+ } else {
+ MaterialTheme.colors
+ }
+ MaterialTheme(colors = colors, content = content)
+}
+
+/**
+ * Creates a dynamic color maps that can be overlaid. 100 - Lightest shade; 0 - Darkest Shade; In
+ * wear we only support dark theme for the time being. Thus the fill colors and variants are dark
+ * and anything on top is light. We will use this custom redirection until wear compose material
+ * supports color scheming.
+ *
+ * The mapping is best case match on wear material color tokens from
+ * /android/clockwork/common/wearable/wearmaterial/color/res/values/color-tokens.xml
+ *
+ * @param context The context required to get system resource data.
+ */
+@RequiresApi(Build.VERSION_CODES.S)
+@VisibleForTesting
+internal fun overlayColors(context: Context): Colors {
+ val tonalPalette = dynamicTonalPalette(context)
+ return Colors(
+ background = Color.Black,
+ onBackground = Color.White,
+ primary = tonalPalette.primary90,
+ primaryVariant = tonalPalette.primary80,
+ onPrimary = tonalPalette.primary10,
+ secondary = tonalPalette.tertiary90,
+ secondaryVariant = tonalPalette.tertiary60,
+ onSecondary = tonalPalette.tertiary10,
+ surface = tonalPalette.neutral20,
+ onSurface = tonalPalette.neutral95,
+ onSurfaceVariant = tonalPalette.neutralVariant80,
+ )
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt
new file mode 100644
index 000000000..a86af8b3d
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt
@@ -0,0 +1,191 @@
+@file:Suppress("unused")
+
+package com.android.permissioncontroller.permission.ui.wear.theme
+
+import android.R
+import android.content.Context
+import android.os.Build
+import androidx.annotation.ColorRes
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.compose.ui.graphics.Color
+
+/**
+ * Tonal Palette structure in Material.
+ *
+ * A tonal palette is comprised of 5 tonal ranges. Each tonal range includes the 13 stops, or tonal
+ * swatches.
+ *
+ * Tonal range names are:
+ * - Neutral (N)
+ * - Neutral variant (NV)
+ * - Primary (P)
+ * - Secondary (S)
+ * - Tertiary (T)
+ */
+internal class WearPermissionTonalPalette(
+ // The neutral tonal range.
+ val neutral100: Color,
+ val neutral99: Color,
+ val neutral95: Color,
+ val neutral90: Color,
+ val neutral80: Color,
+ val neutral70: Color,
+ val neutral60: Color,
+ val neutral50: Color,
+ val neutral40: Color,
+ val neutral30: Color,
+ val neutral20: Color,
+ val neutral10: Color,
+ val neutral0: Color,
+
+ // The neutral variant tonal range, sometimes called "neutral 2"
+ val neutralVariant100: Color,
+ val neutralVariant99: Color,
+ val neutralVariant95: Color,
+ val neutralVariant90: Color,
+ val neutralVariant80: Color,
+ val neutralVariant70: Color,
+ val neutralVariant60: Color,
+ val neutralVariant50: Color,
+ val neutralVariant40: Color,
+ val neutralVariant30: Color,
+ val neutralVariant20: Color,
+ val neutralVariant10: Color,
+ val neutralVariant0: Color,
+
+ // The primary tonal range, also known as accent 1
+ val primary100: Color,
+ val primary99: Color,
+ val primary95: Color,
+ val primary90: Color,
+ val primary80: Color,
+ val primary70: Color,
+ val primary60: Color,
+ val primary50: Color,
+ val primary40: Color,
+ val primary30: Color,
+ val primary20: Color,
+ val primary10: Color,
+ val primary0: Color,
+
+ // The Secondary tonal range, also know as accent 2
+ val secondary100: Color,
+ val secondary99: Color,
+ val secondary95: Color,
+ val secondary90: Color,
+ val secondary80: Color,
+ val secondary70: Color,
+ val secondary60: Color,
+ val secondary50: Color,
+ val secondary40: Color,
+ val secondary30: Color,
+ val secondary20: Color,
+ val secondary10: Color,
+ val secondary0: Color,
+
+ // The tertiary tonal range, also known as accent 3
+ val tertiary100: Color,
+ val tertiary99: Color,
+ val tertiary95: Color,
+ val tertiary90: Color,
+ val tertiary80: Color,
+ val tertiary70: Color,
+ val tertiary60: Color,
+ val tertiary50: Color,
+ val tertiary40: Color,
+ val tertiary30: Color,
+ val tertiary20: Color,
+ val tertiary10: Color,
+ val tertiary0: Color,
+)
+/** Dynamic colors for wear compose material to support resource overlay. */
+@RequiresApi(Build.VERSION_CODES.S)
+// TODO: once we have proper support for this on Wear 6+, we will do something similar to
+// https://source.corp.google.com/h/android/platform/superproject/+/androidx-main:frameworks/support/compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/DynamicTonalPalette.android.kt;l=307-362?q=dynamicTonalPalette&sq=repo:android%2Fplatform%2Fsuperproject%20b:androidx-main
+// Tracking Bug: b/270720571
+internal fun dynamicTonalPalette(context: Context) =
+ WearPermissionTonalPalette(
+ // The neutral tonal range from the generated dynamic color palette.
+ neutral100 = ColorResourceHelper.getColor(context, R.color.system_neutral1_0),
+ neutral99 = ColorResourceHelper.getColor(context, R.color.system_neutral1_10),
+ neutral95 = ColorResourceHelper.getColor(context, R.color.system_neutral1_50),
+ neutral90 = ColorResourceHelper.getColor(context, R.color.system_neutral1_100),
+ neutral80 = ColorResourceHelper.getColor(context, R.color.system_neutral1_200),
+ neutral70 = ColorResourceHelper.getColor(context, R.color.system_neutral1_300),
+ neutral60 = ColorResourceHelper.getColor(context, R.color.system_neutral1_400),
+ neutral50 = ColorResourceHelper.getColor(context, R.color.system_neutral1_500),
+ neutral40 = ColorResourceHelper.getColor(context, R.color.system_neutral1_600),
+ neutral30 = ColorResourceHelper.getColor(context, R.color.system_neutral1_700),
+ neutral20 = ColorResourceHelper.getColor(context, R.color.system_neutral1_800),
+ neutral10 = ColorResourceHelper.getColor(context, R.color.system_neutral1_900),
+ neutral0 = ColorResourceHelper.getColor(context, R.color.system_neutral1_1000),
+
+ // The neutral variant tonal range, sometimes called "neutral 2", from the
+ // generated dynamic color palette.
+ neutralVariant100 = ColorResourceHelper.getColor(context, R.color.system_neutral2_0),
+ neutralVariant99 = ColorResourceHelper.getColor(context, R.color.system_neutral2_10),
+ neutralVariant95 = ColorResourceHelper.getColor(context, R.color.system_neutral2_50),
+ neutralVariant90 = ColorResourceHelper.getColor(context, R.color.system_neutral2_100),
+ neutralVariant80 = ColorResourceHelper.getColor(context, R.color.system_neutral2_200),
+ neutralVariant70 = ColorResourceHelper.getColor(context, R.color.system_neutral2_300),
+ neutralVariant60 = ColorResourceHelper.getColor(context, R.color.system_neutral2_400),
+ neutralVariant50 = ColorResourceHelper.getColor(context, R.color.system_neutral2_500),
+ neutralVariant40 = ColorResourceHelper.getColor(context, R.color.system_neutral2_600),
+ neutralVariant30 = ColorResourceHelper.getColor(context, R.color.system_neutral2_700),
+ neutralVariant20 = ColorResourceHelper.getColor(context, R.color.system_neutral2_800),
+ neutralVariant10 = ColorResourceHelper.getColor(context, R.color.system_neutral2_900),
+ neutralVariant0 = ColorResourceHelper.getColor(context, R.color.system_neutral2_1000),
+
+ // The primary tonal range from the generated dynamic color palette.
+ primary100 = ColorResourceHelper.getColor(context, R.color.system_accent1_0),
+ primary99 = ColorResourceHelper.getColor(context, R.color.system_accent1_10),
+ primary95 = ColorResourceHelper.getColor(context, R.color.system_accent1_50),
+ primary90 = ColorResourceHelper.getColor(context, R.color.system_accent1_100),
+ primary80 = ColorResourceHelper.getColor(context, R.color.system_accent1_200),
+ primary70 = ColorResourceHelper.getColor(context, R.color.system_accent1_300),
+ primary60 = ColorResourceHelper.getColor(context, R.color.system_accent1_400),
+ primary50 = ColorResourceHelper.getColor(context, R.color.system_accent1_500),
+ primary40 = ColorResourceHelper.getColor(context, R.color.system_accent1_600),
+ primary30 = ColorResourceHelper.getColor(context, R.color.system_accent1_700),
+ primary20 = ColorResourceHelper.getColor(context, R.color.system_accent1_800),
+ primary10 = ColorResourceHelper.getColor(context, R.color.system_accent1_900),
+ primary0 = ColorResourceHelper.getColor(context, R.color.system_accent1_1000),
+
+ // The secondary tonal range from the generated dynamic color palette.
+ secondary100 = ColorResourceHelper.getColor(context, R.color.system_accent2_0),
+ secondary99 = ColorResourceHelper.getColor(context, R.color.system_accent2_10),
+ secondary95 = ColorResourceHelper.getColor(context, R.color.system_accent2_50),
+ secondary90 = ColorResourceHelper.getColor(context, R.color.system_accent2_100),
+ secondary80 = ColorResourceHelper.getColor(context, R.color.system_accent2_200),
+ secondary70 = ColorResourceHelper.getColor(context, R.color.system_accent2_300),
+ secondary60 = ColorResourceHelper.getColor(context, R.color.system_accent2_400),
+ secondary50 = ColorResourceHelper.getColor(context, R.color.system_accent2_500),
+ secondary40 = ColorResourceHelper.getColor(context, R.color.system_accent2_600),
+ secondary30 = ColorResourceHelper.getColor(context, R.color.system_accent2_700),
+ secondary20 = ColorResourceHelper.getColor(context, R.color.system_accent2_800),
+ secondary10 = ColorResourceHelper.getColor(context, R.color.system_accent2_900),
+ secondary0 = ColorResourceHelper.getColor(context, R.color.system_accent2_1000),
+
+ // The tertiary tonal range from the generated dynamic color palette.
+ tertiary100 = ColorResourceHelper.getColor(context, R.color.system_accent3_0),
+ tertiary99 = ColorResourceHelper.getColor(context, R.color.system_accent3_10),
+ tertiary95 = ColorResourceHelper.getColor(context, R.color.system_accent3_50),
+ tertiary90 = ColorResourceHelper.getColor(context, R.color.system_accent3_100),
+ tertiary80 = ColorResourceHelper.getColor(context, R.color.system_accent3_200),
+ tertiary70 = ColorResourceHelper.getColor(context, R.color.system_accent3_300),
+ tertiary60 = ColorResourceHelper.getColor(context, R.color.system_accent3_400),
+ tertiary50 = ColorResourceHelper.getColor(context, R.color.system_accent3_500),
+ tertiary40 = ColorResourceHelper.getColor(context, R.color.system_accent3_600),
+ tertiary30 = ColorResourceHelper.getColor(context, R.color.system_accent3_700),
+ tertiary20 = ColorResourceHelper.getColor(context, R.color.system_accent3_800),
+ tertiary10 = ColorResourceHelper.getColor(context, R.color.system_accent3_900),
+ tertiary0 = ColorResourceHelper.getColor(context, R.color.system_accent3_1000),
+ )
+
+private object ColorResourceHelper {
+ @DoNotInline
+ fun getColor(context: Context, @ColorRes id: Int): Color {
+ return Color(context.resources.getColor(id, context.theme))
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt
index 2719b9766..ba5ba1c23 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/MultiDeviceUtils.kt
@@ -27,7 +27,7 @@ object MultiDeviceUtils {
@JvmStatic
@ChecksSdkIntAtLeast(Build.VERSION_CODES.VANILLA_ICE_CREAM)
fun isDeviceAwareGrantFlowEnabled(): Boolean {
- return SdkLevel.isAtLeastV() && Flags.deviceAwarePermissionGrant()
+ return SdkLevel.isAtLeastV() && Flags.deviceAwarePermissionGrantEnabled()
}
@JvmStatic
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
index ad384cca7..dffc49aa2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
@@ -68,6 +68,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.content.pm.ResolveInfo;
+import android.content.pm.UserProperties;
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.graphics.Bitmap;
@@ -392,6 +393,8 @@ public final class Utils {
/* do nothing - hide constructor */
}
+ private static Object sLock = new Object();
+
private static ArrayMap<UserHandle, Context> sUserContexts = new ArrayMap<>();
/**
@@ -406,11 +409,13 @@ public final class Utils {
* @throws RuntimeException If the app has no package name attached, which should never happen
*/
public static @NonNull Context getUserContext(Context context, UserHandle user) {
- if (!sUserContexts.containsKey(user)) {
- sUserContexts.put(user, context.getApplicationContext()
- .createContextAsUser(user, 0));
+ synchronized (sLock) {
+ if (!sUserContexts.containsKey(user)) {
+ sUserContexts.put(user, context.getApplicationContext()
+ .createContextAsUser(user, 0));
+ }
+ return Preconditions.checkNotNull(sUserContexts.get(user));
}
- return Preconditions.checkNotNull(sUserContexts.get(user));
}
/**
@@ -1587,4 +1592,30 @@ public final class Utils {
@NonNull ApplicationInfo applicationInfo) {
return context.getPackageManager().getApplicationLabel(applicationInfo).toString();
}
+
+ /**
+ * Returns whether the given user should be shown in the Settings UI in SdkLevel V+. This method
+ * will always return true for SdkLevels below V.
+ *
+ * @param userHandle The user for which to check whether it should be shown or not.
+ * @return true if it should be shown, false otherwise.
+ */
+ public static boolean shouldShowInSettings(UserHandle userHandle, UserManager userManager) {
+ return !SdkLevel.isAtLeastV() || shouldShowInSettingsInternal(userHandle, userManager);
+ }
+
+ /**
+ * Returns whether the given user should be shown in the Settings UI.
+ *
+ * @param userHandle The user for which to check whether it should be shown or not.
+ * @return true if it should be shown, false otherwise.
+ */
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ private static boolean shouldShowInSettingsInternal(
+ UserHandle userHandle, UserManager userManager) {
+ var userProperties = userManager.getUserProperties(userHandle);
+ return !userManager.isQuietModeEnabled(userHandle)
+ || userProperties.getShowInQuietMode() != UserProperties.SHOW_IN_QUIET_MODE_HIDDEN;
+ }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
index da20727c5..c633c013a 100644
--- a/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
+++ b/PermissionController/src/com/android/permissioncontroller/privacysources/AccessibilitySourceService.kt
@@ -76,8 +76,6 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
-@VisibleForTesting
-const val PROPERTY_SC_ACCESSIBILITY_SOURCE_ENABLED = "sc_accessibility_source_enabled"
const val PROPERTY_SC_ACCESSIBILITY_LISTENER_ENABLED = "sc_accessibility_listener_enabled"
const val SC_ACCESSIBILITY_SOURCE_ID = "AndroidAccessibility"
const val SC_ACCESSIBILITY_REMOVE_ACCESS_ACTION_ID = "revoke_accessibility_app_access"
@@ -88,14 +86,6 @@ private fun isAccessibilitySourceSupported(): Boolean {
return SdkLevel.isAtLeastT()
}
-fun isAccessibilitySourceEnabled(): Boolean {
- return DeviceConfig.getBoolean(
- DeviceConfig.NAMESPACE_PRIVACY,
- PROPERTY_SC_ACCESSIBILITY_SOURCE_ENABLED,
- true
- )
-}
-
/** cts test needs to disable the listener. */
fun isAccessibilityListenerEnabled(): Boolean {
return DeviceConfig.getBoolean(
@@ -907,11 +897,8 @@ class AccessibilityJobService : JobService() {
Log.i(LOG_TAG, "Accessibility privacy source job already running")
return false
}
- if (
- !isAccessibilitySourceEnabled() ||
- !isSafetyCenterEnabled(this@AccessibilityJobService)
- ) {
- Log.i(LOG_TAG, "either privacy source or safety center is not enabled")
+ if (!isSafetyCenterEnabled(this@AccessibilityJobService)) {
+ Log.i(LOG_TAG, "safety center is not enabled")
jobFinished(params, false)
mCurrentJob = null
return false
@@ -964,9 +951,7 @@ class SafetyCenterAccessibilityListener(val context: Context) :
return
}
- if (
- !isAccessibilitySourceEnabled() || !isSafetyCenterEnabled(context) || isProfile(context)
- ) {
+ if (!isSafetyCenterEnabled(context) || isProfile(context)) {
Log.i(LOG_TAG, "accessibility event occurred, safety center feature not enabled.")
return
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/Role.md b/PermissionController/src/com/android/permissioncontroller/role/Role.md
index bde9f86f0..acdfffb50 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/Role.md
+++ b/PermissionController/src/com/android/permissioncontroller/role/Role.md
@@ -65,6 +65,10 @@ title. This attribute is required if the role is `visible`.
Android S. This attribute is optional and defaults to `Build.VERSION_CODES.CUR_DEVELOPMENT`.
- `minSdkVersion`: The minimum SDK version for the role to be available (inclusive), e.g. `31` for
Android S. This attribute is optional and defaults to `Build.VERSION_CODES.BASE`.
+- `onlyGrantWhenAdded`: Whether the role should only grant privileges when a role holder is actively
+added. This attribute is optional and defaults to `false`.
+- `overrideUserWhenGranting`: Whether the role should override user's choice about privileges when
+granting. This attribute is optional and defaults to `false`.
- `requestDescription`: The string resource for the description in the request role dialog, e.g.
`@string/role_sms_request_description`, which says "Gets access to contacts, SMS, phone". This
description should describe to the user the privileges that are going to be granted, and should not
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/ChangeDefaultCardEmulationActivity.java b/PermissionController/src/com/android/permissioncontroller/role/ui/ChangeDefaultCardEmulationActivity.java
new file mode 100644
index 000000000..882d01c56
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/ChangeDefaultCardEmulationActivity.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.role.ui;
+
+import android.app.Activity;
+import android.app.role.RoleManager;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
+import android.os.Process;
+import android.permission.flags.Flags;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.modules.utils.build.SdkLevel;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Activity to handle {@link android.nfc.cardemulation.CardEmulation#ACTION_CHANGE_DEFAULT}.
+ */
+public class ChangeDefaultCardEmulationActivity extends Activity {
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Intent intent;
+ if (SdkLevel.isAtLeastV() && Flags.walletRoleEnabled()) {
+ intent = DefaultAppActivity.createIntent(RoleManager.ROLE_WALLET,
+ Process.myUserHandle(), this);
+ } else {
+ intent = getIntent();
+ setDefaultPaymentChangeHandlerDialogComponent(intent);
+ }
+ intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+ startActivity(intent);
+ finish();
+ }
+
+ // The only other handler of this intent is in the NFC stack.
+ private void setDefaultPaymentChangeHandlerDialogComponent(@NonNull Intent intent) {
+ Intent queryIntent = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT);
+ PackageManager packageManager = getPackageManager();
+ List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(queryIntent,
+ PackageManager.MATCH_SYSTEM_ONLY);
+ int resolveInfosSize = resolveInfos.size();
+ for (int i = 0; i < resolveInfosSize; i++) {
+ ResolveInfo resolveInfo = resolveInfos.get(i);
+ String packageName = resolveInfo.activityInfo.packageName;
+ if (!Objects.equals(packageName, getPackageName())) {
+ intent.setClassName(packageName,
+ resolveInfo.activityInfo.name);
+ return;
+ }
+ }
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/CheckableLinearLayout.java b/PermissionController/src/com/android/permissioncontroller/role/ui/CheckableLinearLayout.java
index b396c3b7b..32a0bb20b 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/CheckableLinearLayout.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/CheckableLinearLayout.java
@@ -100,12 +100,10 @@ public class CheckableLinearLayout extends LinearLayout implements Checkable {
int count = viewGroup.getChildCount();
for (int i = 0; i < count; i++) {
View child = viewGroup.getChildAt(i);
- if (child.isDuplicateParentStateEnabled()) {
- if (child instanceof Checkable) {
- ((Checkable) child).setChecked(checked);
- } else if (child instanceof ViewGroup) {
- updateChildrenChecked((ViewGroup) child, checked);
- }
+ if (child instanceof Checkable) {
+ ((Checkable) child).setChecked(checked);
+ } else if (child instanceof ViewGroup) {
+ updateChildrenChecked((ViewGroup) child, checked);
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
index a8b16c521..145031b63 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
@@ -214,6 +214,8 @@ public class DefaultAppChildFragment<PF extends PreferenceFragmentCompat
preference.setChecked(checked);
if (applicationInfo != null) {
+ roleApplicationPreference.setRestrictionIntent(
+ mRole.getApplicationRestrictionIntentAsUser(applicationInfo, mUser, context));
RoleUiBehaviorUtils.prepareApplicationPreferenceAsUser(mRole, roleApplicationPreference,
applicationInfo, mUser, context);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
index f9a0193bd..a1c4d84a5 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
@@ -182,6 +182,7 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
preference = rolePreference.asPreference();
}
+ rolePreference.setRestrictionIntent(role.getRestrictionIntentAsUser(user, context));
List<ApplicationInfo> holderApplicationInfos = roleItem.getHolderApplicationInfos();
if (holderApplicationInfos.isEmpty()) {
preference.setIcon(null);
@@ -191,7 +192,8 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
preference.setIcon(Utils.getBadgedIcon(context, holderApplicationInfo));
preference.setSummary(Utils.getAppLabel(holderApplicationInfo, context));
}
- RoleUiBehaviorUtils.preparePreferenceAsUser(role, rolePreference, user, context);
+ RoleUiBehaviorUtils.preparePreferenceAsUser(role, holderApplicationInfos,
+ rolePreference, user, context);
preferenceGroup.addPreference(preference);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
index 80834a3e2..fb3a46d6a 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
@@ -35,7 +35,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
-import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
@@ -54,6 +53,8 @@ import com.android.permissioncontroller.permission.utils.PackageRemovalMonitor;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.permissioncontroller.role.model.UserDeniedManager;
import com.android.permissioncontroller.role.utils.PackageUtils;
+import com.android.permissioncontroller.role.utils.RoleUiBehaviorUtils;
+import com.android.permissioncontroller.role.utils.UiUtils;
import com.android.role.controller.model.Role;
import com.android.role.controller.model.Roles;
@@ -154,7 +155,6 @@ public class RequestRoleFragment extends DialogFragment {
View viewLayout = inflater.inflate(R.layout.request_role_view, null);
mListView = viewLayout.requireViewById(R.id.list);
- mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
mListView.setOnItemClickListener((parent, view, position, id) -> onItemClicked(position));
mAdapter = new Adapter(mListView, mRole);
if (savedInstanceState != null) {
@@ -414,9 +414,9 @@ public class RequestRoleFragment extends DialogFragment {
// Skip the "None" item.
continue;
}
- ApplicationInfo qualifyingApplicationInfo = qualifyingApplication.first;
- if (Objects.equals(qualifyingApplicationInfo.packageName, packageName)) {
- return qualifyingApplicationInfo.uid;
+ ApplicationInfo applicationInfo = qualifyingApplication.first;
+ if (Objects.equals(applicationInfo.packageName, packageName)) {
+ return applicationInfo.uid;
}
}
return -1;
@@ -439,19 +439,7 @@ public class RequestRoleFragment extends DialogFragment {
if (mAdapter == null) {
return null;
}
- int count = mAdapter.getCount();
- for (int i = 0; i < count; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = mAdapter.getItem(i);
- if (qualifyingApplication == null) {
- // Skip the "None" item.
- continue;
- }
- boolean isHolderApplication = qualifyingApplication.second;
- if (isHolderApplication) {
- return qualifyingApplication.first.packageName;
- }
- }
- return null;
+ return mAdapter.mHolderPackageName;
}
static void reportRequestResult(int requestingUid, String requestingPackageName,
@@ -477,8 +465,8 @@ public class RequestRoleFragment extends DialogFragment {
private static final String STATE_USER_CHECKED = Adapter.class.getName()
+ ".state.USER_CHECKED";
- private static final String STATE_USER_CHECKED_PACKAGE_NAME = Adapter.class.getName()
- + ".state.USER_CHECKED_PACKAGE_NAME";
+ private static final String STATE_CHECKED_PACKAGE_NAME = Adapter.class.getName()
+ + ".state.CHECKED_PACKAGE_NAME";
private static final int LAYOUT_TRANSITION_DURATION_MILLIS = 150;
@@ -493,7 +481,8 @@ public class RequestRoleFragment extends DialogFragment {
private final List<Pair<ApplicationInfo, Boolean>> mQualifyingApplications =
new ArrayList<>();
- private boolean mHasHolderApplication;
+ @Nullable
+ private String mHolderPackageName;
private boolean mDontAskAgain;
@@ -501,10 +490,8 @@ public class RequestRoleFragment extends DialogFragment {
// the current holder as checked.
private boolean mUserChecked;
- private boolean mPendingUserChecked;
- // We may use a null to represent the "None" item.
@Nullable
- private String mPendingUserCheckedPackageName;
+ private String mCheckedPackageName;
Adapter(@NonNull ListView listView, @NonNull Role role) {
mListView = listView;
@@ -514,15 +501,14 @@ public class RequestRoleFragment extends DialogFragment {
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putBoolean(STATE_USER_CHECKED, mUserChecked);
if (mUserChecked) {
- outState.putString(STATE_USER_CHECKED_PACKAGE_NAME, getCheckedPackageName());
+ outState.putString(STATE_CHECKED_PACKAGE_NAME, mCheckedPackageName);
}
}
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
- mPendingUserChecked = savedInstanceState.getBoolean(STATE_USER_CHECKED);
- if (mPendingUserChecked) {
- mPendingUserCheckedPackageName = savedInstanceState.getString(
- STATE_USER_CHECKED_PACKAGE_NAME);
+ mUserChecked = savedInstanceState.getBoolean(STATE_USER_CHECKED);
+ if (mUserChecked) {
+ mCheckedPackageName = savedInstanceState.getString(STATE_CHECKED_PACKAGE_NAME);
}
}
@@ -533,14 +519,28 @@ public class RequestRoleFragment extends DialogFragment {
mDontAskAgain = dontAskAgain;
if (mDontAskAgain) {
mUserChecked = false;
- updateItemChecked();
+ mCheckedPackageName = mHolderPackageName;
}
notifyDataSetChanged();
}
public void onItemClicked(int position) {
- mUserChecked = true;
- // We may need to change description based on checked state.
+ Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
+ if (qualifyingApplication == null) {
+ mUserChecked = true;
+ mCheckedPackageName = null;
+ } else {
+ ApplicationInfo applicationInfo = qualifyingApplication.first;
+ Intent restrictionIntent = mRole.getApplicationRestrictionIntentAsUser(
+ applicationInfo, Process.myUserHandle(), mListView.getContext());
+ if (restrictionIntent != null) {
+ mListView.getContext().startActivity(restrictionIntent);
+ return;
+ } else {
+ mUserChecked = true;
+ mCheckedPackageName = applicationInfo.packageName;
+ }
+ }
notifyDataSetChanged();
}
@@ -550,42 +550,10 @@ public class RequestRoleFragment extends DialogFragment {
mQualifyingApplications.add(0, null);
}
mQualifyingApplications.addAll(qualifyingApplications);
- mHasHolderApplication = hasHolderApplication(qualifyingApplications);
- notifyDataSetChanged();
+ mHolderPackageName = getHolderPackageName(qualifyingApplications);
- if (mPendingUserChecked) {
- restoreItemChecked();
- mPendingUserChecked = false;
- mPendingUserCheckedPackageName = null;
- }
-
- if (!mUserChecked) {
- updateItemChecked();
- }
- }
-
- private static boolean hasHolderApplication(
- @NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
- int qualifyingApplicationsSize = qualifyingApplications.size();
- for (int i = 0; i < qualifyingApplicationsSize; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = qualifyingApplications.get(
- i);
- boolean isHolderApplication = qualifyingApplication.second;
-
- if (isHolderApplication) {
- return true;
- }
- }
- return false;
- }
-
- private void restoreItemChecked() {
- if (mPendingUserCheckedPackageName == null) {
- if (mRole.shouldShowNone()) {
- mUserChecked = true;
- mListView.setItemChecked(0, true);
- }
- } else {
+ if (mUserChecked && mCheckedPackageName != null) {
+ boolean isCheckedPackageNameFound = false;
int count = getCount();
for (int i = 0; i < count; i++) {
Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(i);
@@ -594,55 +562,52 @@ public class RequestRoleFragment extends DialogFragment {
}
String packageName = qualifyingApplication.first.packageName;
- if (Objects.equals(packageName, mPendingUserCheckedPackageName)) {
+ if (Objects.equals(packageName, mCheckedPackageName)) {
mUserChecked = true;
- mListView.setItemChecked(i, true);
+ isCheckedPackageNameFound = true;
break;
}
}
+ if (!isCheckedPackageNameFound) {
+ mUserChecked = false;
+ mCheckedPackageName = null;
+ }
+ }
+
+ if (!mUserChecked) {
+ mCheckedPackageName = mHolderPackageName;
}
+
+ notifyDataSetChanged();
}
- private void updateItemChecked() {
- if (!mHasHolderApplication) {
- if (mRole.shouldShowNone()) {
- mListView.setItemChecked(0, true);
- } else {
- mListView.clearChoices();
+ @Nullable
+ private static String getHolderPackageName(
+ @NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
+ int qualifyingApplicationSize = qualifyingApplications.size();
+ for (int i = 0; i < qualifyingApplicationSize; i++) {
+ Pair<ApplicationInfo, Boolean> qualifyingApplication = qualifyingApplications.get(
+ i);
+ if (qualifyingApplication == null) {
+ continue;
}
- } else {
- int count = getCount();
- for (int i = 0; i < count; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(i);
- if (qualifyingApplication == null) {
- continue;
- }
- boolean isHolderApplication = qualifyingApplication.second;
+ ApplicationInfo applicationInfo = qualifyingApplication.first;
+ boolean isHolderApplication = qualifyingApplication.second;
- if (isHolderApplication) {
- mListView.setItemChecked(i, true);
- break;
- }
+ if (isHolderApplication) {
+ return applicationInfo.packageName;
}
}
- }
-
- @Nullable
- public Pair<ApplicationInfo, Boolean> getCheckedItem() {
- int position = mListView.getCheckedItemPosition();
- return position != AdapterView.INVALID_POSITION ? getItem(position) : null;
+ return null;
}
@Nullable
public String getCheckedPackageName() {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getCheckedItem();
- return qualifyingApplication == null ? null : qualifyingApplication.first.packageName;
+ return mCheckedPackageName;
}
public boolean isHolderApplicationChecked() {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getCheckedItem();
- return qualifyingApplication == null ? !mHasHolderApplication
- : qualifyingApplication.second;
+ return Objects.equals(mCheckedPackageName, mHolderPackageName);
}
@Override
@@ -684,7 +649,7 @@ public class RequestRoleFragment extends DialogFragment {
}
Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
if (qualifyingApplication == null) {
- return !mHasHolderApplication;
+ return mHolderPackageName == null;
} else {
boolean isHolderApplication = qualifyingApplication.second;
return isHolderApplication;
@@ -695,13 +660,13 @@ public class RequestRoleFragment extends DialogFragment {
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Context context = parent.getContext();
- View view = convertView;
+ CheckableLinearLayout view = (CheckableLinearLayout) convertView;
ViewHolder holder;
if (view != null) {
holder = (ViewHolder) view.getTag();
} else {
- view = LayoutInflater.from(context).inflate(R.layout.request_role_item, parent,
- false);
+ view = (CheckableLinearLayout) LayoutInflater.from(context).inflate(
+ R.layout.request_role_item, parent, false);
holder = new ViewHolder(view);
view.setTag(holder);
@@ -709,38 +674,50 @@ public class RequestRoleFragment extends DialogFragment {
LAYOUT_TRANSITION_DURATION_MILLIS);
}
- view.setEnabled(isEnabled(position));
-
Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
+ ApplicationInfo applicationInfo;
+ boolean restricted;
+ boolean checked;
Drawable icon;
String title;
String subtitle;
if (qualifyingApplication == null) {
+ applicationInfo = null;
+ restricted = false;
+ checked = mCheckedPackageName == null;
icon = AppCompatResources.getDrawable(context, R.drawable.ic_remove_circle);
title = context.getString(R.string.default_app_none);
- subtitle = !mHasHolderApplication ? context.getString(
+ subtitle = mHolderPackageName != null ? context.getString(
R.string.request_role_current_default) : null;
} else {
- ApplicationInfo qualifyingApplicationInfo = qualifyingApplication.first;
- icon = Utils.getBadgedIcon(context, qualifyingApplicationInfo);
- title = Utils.getAppLabel(qualifyingApplicationInfo, context);
+ applicationInfo = qualifyingApplication.first;
+ restricted = mRole.getApplicationRestrictionIntentAsUser(applicationInfo,
+ Process.myUserHandle(), context) != null;
+ checked = Objects.equals(applicationInfo.packageName, mCheckedPackageName);
+ icon = Utils.getBadgedIcon(context, applicationInfo);
+ title = Utils.getAppLabel(applicationInfo, context);
boolean isHolderApplication = qualifyingApplication.second;
subtitle = isHolderApplication
? context.getString(R.string.request_role_current_default)
- : mListView.isItemChecked(position)
- ? context.getString(mRole.getRequestDescriptionResource()) : null;
+ : checked ? context.getString(mRole.getRequestDescriptionResource()) : null;
}
+ boolean enabled = isEnabled(position);
+ UiUtils.setViewTreeEnabled(view, enabled && !restricted);
+ view.setEnabled(enabled);
+ view.setChecked(checked);
holder.iconImage.setImageDrawable(icon);
holder.titleText.setText(title);
holder.subtitleText.setVisibility(!TextUtils.isEmpty(subtitle) ? View.VISIBLE
: View.GONE);
holder.subtitleText.setText(subtitle);
+ RoleUiBehaviorUtils.prepareRequestRoleItemViewAsUser(mRole, holder, applicationInfo,
+ Process.myUserHandle(), context);
return view;
}
- private static class ViewHolder {
+ private static class ViewHolder implements RequestRoleItemView {
@NonNull
public final ImageView iconImage;
@@ -757,6 +734,21 @@ public class RequestRoleFragment extends DialogFragment {
titleText = view.requireViewById(R.id.title);
subtitleText = view.requireViewById(R.id.subtitle);
}
+
+ @Override
+ public ImageView getIconImageView() {
+ return iconImage;
+ }
+
+ @Override
+ public TextView getTitleTextView() {
+ return titleText;
+ }
+
+ @Override
+ public TextView getSubtitleTextView() {
+ return subtitleText;
+ }
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleItemView.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleItemView.java
new file mode 100644
index 000000000..25dea89ad
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleItemView.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.role.ui;
+
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Item view for qualifying applications in role requests.
+ */
+public interface RequestRoleItemView {
+
+ /**
+ * Get the {@link ImageView} for item icon.
+ */
+ @NonNull
+ ImageView getIconImageView();
+
+ /**
+ * Get the {@link TextView} for item title.
+ */
+ @NonNull
+ TextView getTitleTextView();
+
+ /**
+ * Get the {@link TextView} for item subtitle.
+ */
+ @NonNull
+ TextView getSubtitleTextView();
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreference.java
index e6bc9bab6..f68253161 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreference.java
@@ -16,15 +16,17 @@
package com.android.permissioncontroller.role.ui;
+import android.content.Intent;
+
import androidx.annotation.Nullable;
/**
- * Preference that is aware of user restrictions that can block them.
+ * Preference that is aware of restrictions that can block them.
*/
-public interface UserRestrictionAwarePreference {
+public interface RestrictionAwarePreference {
/**
- * Specifies user restriction that blocks this preference.
+ * Set the restriction intent that blocks this preference.
*/
- void setUserRestriction(@Nullable String userRestriction);
+ void setRestrictionIntent(@Nullable Intent restrictionIntent);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreferenceMixin.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreferenceMixin.java
index 033507991..8d757324f 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/UserRestrictionAwarePreferenceMixin.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RestrictionAwarePreferenceMixin.java
@@ -16,9 +16,7 @@
package com.android.permissioncontroller.role.ui;
-import android.app.admin.DevicePolicyManager;
import android.content.Intent;
-import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -26,32 +24,35 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
/**
- * Mixin for implementing {@link UserRestrictionAwarePreference}.
+ * Mixin for implementing {@link RestrictionAwarePreference}.
*/
-public class UserRestrictionAwarePreferenceMixin {
+public class RestrictionAwarePreferenceMixin {
+
+ private static final String LOG_TAG = RestrictionAwarePreferenceMixin.class.getSimpleName();
@NonNull
private final Preference mPreference;
+
@Nullable
- private String mUserRestriction = null;
+ private Intent mRestrictionIntent;
- public UserRestrictionAwarePreferenceMixin(@NonNull Preference preference) {
+ public RestrictionAwarePreferenceMixin(@NonNull Preference preference) {
mPreference = preference;
}
/**
- * Implementation for {@link UserRestrictionAwarePreference#setUserRestriction}.
+ * Implementation for {@link RestrictionAwarePreference#setRestrictionIntent}.
*/
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestriction = userRestriction;
- mPreference.setEnabled(mUserRestriction == null);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionIntent = restrictionIntent;
+ mPreference.setEnabled(mRestrictionIntent == null);
}
/**
* Call after {@link Preference#onBindViewHolder} to apply blocking effects.
*/
public void onAfterBindViewHolder(@NonNull PreferenceViewHolder holder) {
- if (mUserRestriction != null) {
+ if (mRestrictionIntent != null) {
// We set the item view to enabled to make the preference row clickable.
// Normal disabled preferences have the whole view hierarchy disabled, so by making only
// the top-level itemView enabled, we don't change the fact that the whole preference
@@ -60,10 +61,8 @@ public class UserRestrictionAwarePreferenceMixin {
// we don't need to unset the listener here (we wouldn't know the correct one anyway).
// This approach is used already by com.android.settingslib.RestrictedPreferenceHelper.
holder.itemView.setEnabled(true);
- Intent intent = new Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS)
- .putExtra(DevicePolicyManager.EXTRA_RESTRICTION, mUserRestriction);
holder.itemView.setOnClickListener(
- (view) -> holder.itemView.getContext().startActivity(intent));
+ view -> view.getContext().startActivity(mRestrictionIntent));
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java
index 1b5b27971..1d3e32c9c 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationPreference.java
@@ -22,7 +22,7 @@ import androidx.preference.TwoStatePreference;
/**
* Preference for application being a candidate or holding a role.
*/
-public interface RoleApplicationPreference extends UserRestrictionAwarePreference {
+public interface RoleApplicationPreference extends RestrictionAwarePreference {
/**
* Get instance of {@code this} as {@link TwoStatePreference}.
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java
index 442963ce6..bbc123cfe 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RolePreference.java
@@ -16,14 +16,16 @@
package com.android.permissioncontroller.role.ui;
+import androidx.annotation.NonNull;
import androidx.preference.Preference;
/**
* Preference used by the default apps list UI.
*/
-public interface RolePreference extends TwoTargetPreference, UserRestrictionAwarePreference {
+public interface RolePreference extends TwoTargetPreference, RestrictionAwarePreference {
/**
* Return this preference as {@link Preference}.
*/
+ @NonNull
Preference asPreference();
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/TwoTargetPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/TwoTargetPreference.java
index 3a8cd55d3..ab2387686 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/TwoTargetPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/TwoTargetPreference.java
@@ -41,6 +41,7 @@ public interface TwoTargetPreference {
/**
* Return this preference as {@link Preference}.
*/
+ @NonNull
Preference asPreference();
/**
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java
index 83c146ebc..764c07497 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRadioPreference.java
@@ -17,25 +17,27 @@
package com.android.permissioncontroller.role.ui.auto;
import android.content.Context;
+import android.content.Intent;
import android.widget.RadioButton;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.PreferenceViewHolder;
import androidx.preference.TwoStatePreference;
import com.android.permissioncontroller.R;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
/** Preference used to represent apps that can be picked as a default app. */
public class AutoRadioPreference extends TwoStatePreference implements
RoleApplicationPreference {
- private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private final RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
- public AutoRadioPreference(Context context) {
+ public AutoRadioPreference(@NonNull Context context) {
super(context, null,
TypedArrayUtils.getAttr(context, androidx.preference.R.attr.preferenceStyle,
android.R.attr.preferenceStyle));
@@ -48,20 +50,21 @@ public class AutoRadioPreference extends TwoStatePreference implements
}
@Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
RadioButton radioButton = (RadioButton) holder.findViewById(R.id.radio_button);
radioButton.setChecked(isChecked());
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
@Override
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
+ @NonNull
@Override
public AutoRadioPreference asTwoStatePreference() {
return this;
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java
index d2f1b6cde..15fd117d1 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoRolePreference.java
@@ -17,16 +17,19 @@
package com.android.permissioncontroller.role.ui.auto;
import android.content.Context;
+import android.content.Intent;
import android.util.AttributeSet;
+import androidx.annotation.AttrRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.StyleRes;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RolePreference;
import com.android.permissioncontroller.role.ui.TwoTargetPreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
/**
* Preference for use in auto lists. Extends {@link TwoTargetPreference} in order to make sure of
@@ -34,16 +37,16 @@ import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMi
*/
public class AutoRolePreference extends Preference implements RolePreference {
- private UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
public AutoRolePreference(@NonNull Context context,
- @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ @Nullable AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public AutoRolePreference(@NonNull Context context, @Nullable AttributeSet attrs,
- int defStyleAttr) {
+ @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@@ -56,21 +59,21 @@ public class AutoRolePreference extends Preference implements RolePreference {
}
@Override
- public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) {
- }
+ public void setOnSecondTargetClickListener(@Nullable OnSecondTargetClickListener listener) {}
@Override
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
@Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
+ @NonNull
@Override
public AutoRolePreference asPreference() {
return this;
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java
index 900e58551..bfb2b5d1d 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/auto/AutoSwitchPreference.java
@@ -17,6 +17,7 @@
package com.android.permissioncontroller.role.ui.auto;
import android.content.Context;
+import android.content.Intent;
import android.util.AttributeSet;
import androidx.annotation.AttrRes;
@@ -26,8 +27,8 @@ import androidx.annotation.StyleRes;
import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreference;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
/**
* Role application preference represented as a switch.
@@ -35,8 +36,8 @@ import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMi
public class AutoSwitchPreference extends SwitchPreference
implements RoleApplicationPreference {
- private UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
public AutoSwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
@AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
@@ -57,15 +58,15 @@ public class AutoSwitchPreference extends SwitchPreference
}
@Override
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
@Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
@NonNull
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/HomeRoleUiBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/HomeRoleUiBehavior.java
index 323325d0b..0142e1c40 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/HomeRoleUiBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/HomeRoleUiBehavior.java
@@ -38,6 +38,8 @@ import com.android.permissioncontroller.role.ui.TwoTargetPreference;
import com.android.permissioncontroller.role.utils.UserUtils;
import com.android.role.controller.model.Role;
+import java.util.List;
+
/***
* Class for UI behavior of Home role
*/
@@ -47,7 +49,8 @@ public class HomeRoleUiBehavior implements RoleUiBehavior {
@Override
public void preparePreferenceAsUser(@NonNull Role role, @NonNull TwoTargetPreference preference,
- @NonNull UserHandle user, @NonNull Context context) {
+ @NonNull List<ApplicationInfo> applicationInfos, @NonNull UserHandle user,
+ @NonNull Context context) {
TwoTargetPreference.OnSecondTargetClickListener listener = null;
RoleManager roleManager = context.getSystemService(RoleManager.class);
String packageName = CollectionUtils.firstOrNull(roleManager.getRoleHoldersAsUser(
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java
index 29dc5d2fc..ae5c03676 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java
@@ -25,15 +25,31 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
+import com.android.permissioncontroller.role.ui.RequestRoleItemView;
import com.android.permissioncontroller.role.ui.TwoTargetPreference;
import com.android.role.controller.model.Role;
+import java.util.List;
+
/***
* Interface for UI behavior for roles
*/
public interface RoleUiBehavior {
/**
+ * Prepare a {@link RequestRoleItemView} for this role and an application.
+ *
+ * @param role the role to prepare the preference for
+ * @param itemView the {@link RequestRoleItemView} for the application
+ * @param applicationInfo the {@link ApplicationInfo} for the application
+ * @param user the user for this role
+ * @param context the {@code Context} to retrieve system services
+ */
+ default void prepareRequestRoleItemViewAsUser(@NonNull Role role,
+ @NonNull RequestRoleItemView itemView, @NonNull ApplicationInfo applicationInfo,
+ @NonNull UserHandle user, @NonNull Context context) {}
+
+ /**
* Get the {@link Intent} to manage this role, or {@code null} to use the default UI.
*
* @param role the role to get the intent for
@@ -53,19 +69,21 @@ public interface RoleUiBehavior {
*
* @param role the role to prepare the preference for
* @param preference the {@link Preference} for this role
+ * @param applicationInfos a list {@link ApplicationInfo} for the current role holders
* @param user the user for this role
* @param context the {@code Context} to retrieve system services
*/
default void preparePreferenceAsUser(@NonNull Role role,
@NonNull TwoTargetPreference preference,
- @NonNull UserHandle user,
- @NonNull Context context) {}
+ @NonNull List<ApplicationInfo> applicationInfos,
+ @NonNull UserHandle user, @NonNull Context context) {}
/**
- * Prepare a {@link Preference} for this role.
+ * Prepare a {@link Preference} for this role and an application.
*
* @param role the role to prepare the preference for
- * @param preference the {@link Preference} for this role
+ * @param preference the {@link Preference} for the application
+ * @param applicationInfo the {@link ApplicationInfo} for the application
* @param user the user for this role
* @param context the {@code Context} to retrieve system services
*/
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/WalletRoleUiBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/WalletRoleUiBehavior.java
new file mode 100644
index 000000000..5c0618724
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/WalletRoleUiBehavior.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.permissioncontroller.role.ui.behavior;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.Drawable;
+import android.nfc.cardemulation.ApduServiceInfo;
+import android.nfc.cardemulation.CardEmulation;
+import android.nfc.cardemulation.HostApduService;
+import android.nfc.cardemulation.OffHostApduService;
+import android.os.Build;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.util.Pair;
+import androidx.preference.Preference;
+
+import com.android.permissioncontroller.role.ui.TwoTargetPreference;
+import com.android.role.controller.model.Role;
+import com.android.role.controller.util.UserUtils;
+
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/***
+ * Class for UI behavior of Wallet role
+ */
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class WalletRoleUiBehavior implements RoleUiBehavior {
+
+ private static final String LOG_TAG = WalletRoleUiBehavior.class.getSimpleName();
+
+ @Override
+ public void preparePreferenceAsUser(@NonNull Role role, @NonNull TwoTargetPreference preference,
+ @NonNull List<ApplicationInfo> applicationInfos, @NonNull UserHandle user,
+ @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ if (!applicationInfos.isEmpty()) {
+ preparePreferenceInternal(preference.asPreference(), applicationInfos.get(0),
+ false, user, userContext);
+ }
+ }
+
+ @Override
+ public void prepareApplicationPreferenceAsUser(@NonNull Role role,
+ @NonNull Preference preference, @NonNull ApplicationInfo applicationInfo,
+ @NonNull UserHandle user, @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ preparePreferenceInternal(preference, applicationInfo, true, user, userContext);
+ }
+
+ private void preparePreferenceInternal(@NonNull Preference preference,
+ @NonNull ApplicationInfo applicationInfo, boolean setTitle, @NonNull UserHandle user,
+ @NonNull Context context) {
+ if (isSystemApplication(applicationInfo)) {
+ List<ApduServiceInfo> serviceInfos = getNfcServicesForPackage(
+ applicationInfo.packageName, user, context);
+
+ Pair<Drawable, CharSequence> bannerAndLabel =
+ getNonPaymentServiceBannerAndLabelIfExists(serviceInfos, user, context);
+ if (bannerAndLabel != null) {
+ preference.setIcon(bannerAndLabel.first);
+ if (setTitle) {
+ preference.setTitle(bannerAndLabel.second);
+ } else {
+ preference.setSummary(bannerAndLabel.second);
+ }
+ }
+ }
+ }
+
+ @NonNull
+ private static List<ApduServiceInfo> getNfcServicesForPackage(@NonNull String packageName,
+ @NonNull UserHandle user, @NonNull Context context) {
+ PackageManager packageManager = context.getPackageManager();
+ Intent hostApduIntent = new Intent(HostApduService.SERVICE_INTERFACE);
+ Intent offHostApduIntent = new Intent(OffHostApduService.SERVICE_INTERFACE);
+ hostApduIntent.setPackage(packageName);
+ offHostApduIntent.setPackage(packageName);
+ List<ResolveInfo> hostApduServices = packageManager.queryIntentServicesAsUser(
+ hostApduIntent,
+ PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA
+ | PackageManager.MATCH_DISABLED_COMPONENTS), user);
+ List<ResolveInfo> offHostApduServices = packageManager.queryIntentServicesAsUser(
+ offHostApduIntent,
+ PackageManager.ResolveInfoFlags.of(PackageManager.GET_META_DATA
+ | PackageManager.MATCH_DISABLED_COMPONENTS), user);
+ List<ApduServiceInfo> nfcServices = new ArrayList<>();
+ int apduServiceInfoSize = hostApduServices.size();
+ for (int i = 0; i < apduServiceInfoSize; i++) {
+ ResolveInfo resolveInfo = hostApduServices.get(i);
+ ApduServiceInfo apduServiceInfo;
+ try {
+ apduServiceInfo = new ApduServiceInfo(packageManager, resolveInfo, true);
+ } catch (XmlPullParserException | IOException e) {
+ Log.e(LOG_TAG, "Error creating the apduserviceinfo.", e);
+ continue;
+ }
+ nfcServices.add(apduServiceInfo);
+ }
+ int offHostApduServiceInfoSize = offHostApduServices.size();
+ for (int i = 0; i < offHostApduServiceInfoSize; i++) {
+ ResolveInfo resolveInfo = offHostApduServices.get(i);
+ ApduServiceInfo apduServiceInfo;
+ try {
+ apduServiceInfo = new ApduServiceInfo(packageManager, resolveInfo, false);
+ } catch (XmlPullParserException | IOException e) {
+ Log.e(LOG_TAG, "Error creating the apduserviceinfo.", e);
+ continue;
+ }
+ nfcServices.add(apduServiceInfo);
+ }
+ return nfcServices;
+ }
+
+ @Nullable
+ private Pair<Drawable, CharSequence> getNonPaymentServiceBannerAndLabelIfExists(
+ @NonNull List<ApduServiceInfo> apduServiceInfos, @NonNull UserHandle user,
+ @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
+ Pair<Drawable, CharSequence> bannerAndLabel;
+ int apduServiceInfoSize = apduServiceInfos.size();
+ for (int i = 0; i < apduServiceInfoSize; i++) {
+ ApduServiceInfo serviceInfo = apduServiceInfos.get(i);
+ if (serviceInfo.getAids().isEmpty()) {
+ bannerAndLabel = loadBannerAndLabel(serviceInfo, userPackageManager);
+ if (bannerAndLabel != null) {
+ return bannerAndLabel;
+ }
+ } else {
+ List<String> aids = serviceInfo.getAids();
+ int aidsSize = aids.size();
+ for (int j = 0; j < aidsSize; j++) {
+ String aid = aids.get(j);
+ String category = serviceInfo.getCategoryForAid(aid);
+ if (!CardEmulation.CATEGORY_PAYMENT.equals(category)) {
+ bannerAndLabel = loadBannerAndLabel(serviceInfo, userPackageManager);
+ if (bannerAndLabel != null) {
+ return bannerAndLabel;
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ @Nullable
+ private Pair<Drawable, CharSequence> loadBannerAndLabel(@NonNull ApduServiceInfo info,
+ @NonNull PackageManager userPackageManager) {
+ Drawable drawable = info.loadBanner(userPackageManager);
+ CharSequence label = info.loadLabel(userPackageManager);
+ if (drawable != null && !TextUtils.isEmpty(label)) {
+ return new Pair<>(drawable, label);
+ } else {
+ return null;
+ }
+ }
+
+ private static boolean isSystemApplication(@NonNull ApplicationInfo applicationInfo) {
+ return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java
index d9ef047d6..67f04051c 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRadioPreference.java
@@ -17,14 +17,15 @@
package com.android.permissioncontroller.role.ui.handheld;
import android.content.Context;
+import android.content.Intent;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceViewHolder;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
import com.android.settingslib.widget.SelectorWithWidgetPreference;
/**
@@ -33,8 +34,8 @@ import com.android.settingslib.widget.SelectorWithWidgetPreference;
public class HandheldRadioPreference extends SelectorWithWidgetPreference implements
RoleApplicationPreference {
- private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private final RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
public HandheldRadioPreference(@NonNull Context context,
@Nullable AttributeSet attrs, int defStyle) {
@@ -55,16 +56,15 @@ public class HandheldRadioPreference extends SelectorWithWidgetPreference implem
}
@Override
- public void setUserRestriction(
- @Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
@Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
@NonNull
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java
index 978fe7d5a..3d09f0b46 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/handheld/HandheldRolePreference.java
@@ -17,6 +17,7 @@
package com.android.permissioncontroller.role.ui.handheld;
import android.content.Context;
+import android.content.Intent;
import android.util.AttributeSet;
import android.view.View;
@@ -28,8 +29,8 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.permissioncontroller.R;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RolePreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
import com.android.settingslib.widget.TwoTargetPreference;
/**
@@ -40,8 +41,8 @@ import com.android.settingslib.widget.TwoTargetPreference;
// Made public for com.android.permissioncontroller.role.ui.specialappaccess.handheld
public class HandheldRolePreference extends TwoTargetPreference implements RolePreference {
- private final UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private final RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
@Nullable
private OnSecondTargetClickListener mOnSecondTargetClickListener;
@@ -93,8 +94,8 @@ public class HandheldRolePreference extends TwoTargetPreference implements RoleP
}
@Override
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
@Override
@@ -113,9 +114,10 @@ public class HandheldRolePreference extends TwoTargetPreference implements RoleP
// Make the settings button enabled even if the preference itself is disabled.
settingsButton.setEnabled(true);
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
+ @NonNull
@Override
public HandheldRolePreference asPreference() {
return this;
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java
index b95440bbd..4b397343c 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java
@@ -164,6 +164,9 @@ public class SpecialAppAccessChildFragment<PF extends PreferenceFragmentCompat
preference.setChecked(isHolderPackage);
UserHandle user = UserHandle.getUserHandleForUid(qualifyingApplicationInfo.uid);
+ roleApplicationPreference.setRestrictionIntent(
+ mRole.getApplicationRestrictionIntentAsUser(qualifyingApplicationInfo, user,
+ context));
RoleUiBehaviorUtils.prepareApplicationPreferenceAsUser(mRole, roleApplicationPreference,
qualifyingApplicationInfo, user, context);
preferenceScreen.addPreference(preference);
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessListChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessListChildFragment.java
index 4b256cef0..cacb4377f 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessListChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessListChildFragment.java
@@ -115,9 +115,11 @@ public class SpecialAppAccessListChildFragment<PF extends PreferenceFragmentComp
} else {
preference = rolePreference.asPreference();
}
- RoleUiBehaviorUtils.preparePreferenceAsUser(role, rolePreference,
- Process.myUserHandle(),
- context);
+
+ rolePreference.setRestrictionIntent(role.getRestrictionIntentAsUser(
+ Process.myUserHandle(), context));
+ RoleUiBehaviorUtils.preparePreferenceAsUser(role, roleItem.getHolderApplicationInfos(),
+ rolePreference, Process.myUserHandle(), context);
preferenceScreen.addPreference(preference);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java
index 1b4dd78a4..ded6d5cb5 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/handheld/HandheldSwitchPreference.java
@@ -17,6 +17,7 @@
package com.android.permissioncontroller.role.ui.specialappaccess.handheld;
import android.content.Context;
+import android.content.Intent;
import android.util.AttributeSet;
import androidx.annotation.AttrRes;
@@ -25,16 +26,16 @@ import androidx.annotation.Nullable;
import androidx.annotation.StyleRes;
import androidx.preference.PreferenceViewHolder;
+import com.android.permissioncontroller.role.ui.RestrictionAwarePreferenceMixin;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreferenceMixin;
import com.android.settingslib.widget.AppSwitchPreference;
/** {@link AppSwitchPreference} that is a role application preference. */
public class HandheldSwitchPreference extends AppSwitchPreference
implements RoleApplicationPreference {
- private UserRestrictionAwarePreferenceMixin mUserRestrictionAwarePreferenceMixin =
- new UserRestrictionAwarePreferenceMixin(this);
+ private RestrictionAwarePreferenceMixin mRestrictionAwarePreferenceMixin =
+ new RestrictionAwarePreferenceMixin(this);
public HandheldSwitchPreference(@NonNull Context context, @Nullable AttributeSet attrs,
@AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
@@ -55,15 +56,15 @@ public class HandheldSwitchPreference extends AppSwitchPreference
}
@Override
- public void setUserRestriction(@Nullable String userRestriction) {
- mUserRestrictionAwarePreferenceMixin.setUserRestriction(userRestriction);
+ public void setRestrictionIntent(@Nullable Intent restrictionIntent) {
+ mRestrictionAwarePreferenceMixin.setRestrictionIntent(restrictionIntent);
}
@Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
+ public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- mUserRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
+ mRestrictionAwarePreferenceMixin.onAfterBindViewHolder(holder);
}
@NonNull
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt
index 51eb7d40d..156656e33 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt
@@ -27,7 +27,7 @@ import androidx.compose.ui.platform.ComposeView
import androidx.core.os.BundleCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
-import com.android.permissioncontroller.permission.ui.wear.setContent
+import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
import com.android.permissioncontroller.role.ui.DefaultAppViewModel
import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData
import com.android.permissioncontroller.role.ui.wear.model.DefaultAppConfirmDialogViewModel
@@ -75,9 +75,17 @@ class WearDefaultAppFragment : Fragment() {
return ComposeView(activity).apply {
setContent {
- WearDefaultAppScreen(
- WearDefaultAppHelper(activity, user, role, viewModel, confirmDialogViewModel)
- )
+ WearPermissionTheme {
+ WearDefaultAppScreen(
+ WearDefaultAppHelper(
+ activity,
+ user,
+ role,
+ viewModel,
+ confirmDialogViewModel
+ )
+ )
+ }
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListHelper.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListHelper.kt
index 5e8a2f9ad..bbcedea53 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListHelper.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListHelper.kt
@@ -61,6 +61,7 @@ class WearDefaultAppListHelper(val context: Context, val user: UserHandle) {
.let {
RoleUiBehaviorUtils.preparePreferenceAsUser(
roleItem.role,
+ roleItem.holderApplicationInfos,
it,
user,
context
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRoleApplicationPreference.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRoleApplicationPreference.kt
index 29f90ddc3..abaa33a56 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRoleApplicationPreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRoleApplicationPreference.kt
@@ -16,10 +16,8 @@
package com.android.permissioncontroller.role.ui.wear
-import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.Intent
-import android.provider.Settings
import androidx.preference.TwoStatePreference
import com.android.permissioncontroller.role.ui.RoleApplicationPreference
@@ -32,25 +30,15 @@ class WearRoleApplicationPreference(
val label: String,
val checked: Boolean,
val onDefaultCheckChanged: (Boolean) -> Unit = {},
- private var restriction: String? = null
+ private var restrictionIntent: Intent? = null
) : TwoStatePreference(context), RoleApplicationPreference {
fun getOnCheckChanged(): (Boolean) -> Unit =
- restriction?.let {
- return { _ ->
- context.startActivity(
- Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS)
- .putExtra(DevicePolicyManager.EXTRA_RESTRICTION, restriction)
- )
- }
- }
- ?: onDefaultCheckChanged
+ restrictionIntent?.let { { _ -> context.startActivity(it) } } ?: onDefaultCheckChanged
- override fun setUserRestriction(userRestriction: String?) {
- restriction = userRestriction
- setEnabled(restriction == null)
+ override fun setRestrictionIntent(restrictionIntent: Intent?) {
+ this.restrictionIntent = restrictionIntent
+ setEnabled(restrictionIntent == null)
}
- override fun asTwoStatePreference(): TwoStatePreference {
- return this
- }
+ override fun asTwoStatePreference(): TwoStatePreference = this
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRolePreference.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRolePreference.kt
index 16d35ed76..43acf4293 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRolePreference.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRolePreference.kt
@@ -16,10 +16,8 @@
package com.android.permissioncontroller.role.ui.wear
-import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.Intent
-import android.provider.Settings
import androidx.preference.Preference
import com.android.permissioncontroller.role.ui.RolePreference
import com.android.permissioncontroller.role.ui.TwoTargetPreference.OnSecondTargetClickListener
@@ -30,30 +28,20 @@ class WearRolePreference(
context: Context,
val label: String,
val onDefaultClicked: () -> Unit = {},
- private var restriction: String? = null
+ private var restrictionIntent: Intent? = null
) : TwoTargetPreference(context), RolePreference {
override fun setOnSecondTargetClickListener(listener: OnSecondTargetClickListener?) {
// no-op
}
- override fun setUserRestriction(userRestriction: String?) {
- restriction = userRestriction
- setEnabled(restriction == null)
+ override fun setRestrictionIntent(restrictionIntent: Intent?) {
+ this.restrictionIntent = restrictionIntent
+ setEnabled(restrictionIntent == null)
}
- override fun asPreference(): Preference {
- return this
- }
+ override fun asPreference(): Preference = this
fun getOnClicked(): () -> Unit =
- restriction?.let {
- return {
- context.startActivity(
- Intent(Settings.ACTION_SHOW_ADMIN_SUPPORT_DETAILS)
- .putExtra(DevicePolicyManager.EXTRA_RESTRICTION, restriction)
- )
- }
- }
- ?: onDefaultClicked
+ restrictionIntent?.let { { context.startActivity(it) } } ?: onDefaultClicked
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
index 7ebc1ebd1..c11a74259 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
@@ -20,19 +20,19 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.os.UserHandle;
-import android.os.UserManager;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import com.android.modules.utils.build.SdkLevel;
+import com.android.permissioncontroller.role.ui.RequestRoleItemView;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
import com.android.permissioncontroller.role.ui.RolePreference;
-import com.android.permissioncontroller.role.ui.UserRestrictionAwarePreference;
import com.android.permissioncontroller.role.ui.behavior.RoleUiBehavior;
import com.android.role.controller.model.Role;
+import java.util.List;
+
/**
* Utility methods for Role UI behavior
*/
@@ -62,6 +62,19 @@ public final class RoleUiBehaviorUtils {
}
/**
+ * @see RoleUiBehavior#prepareRequestRoleItemViewAsUser
+ */
+ public static void prepareRequestRoleItemViewAsUser(@NonNull Role role,
+ @NonNull RequestRoleItemView itemView, @NonNull ApplicationInfo applicationInfo,
+ @NonNull UserHandle user, @NonNull Context context) {
+ RoleUiBehavior uiBehavior = getUiBehavior(role);
+ if (uiBehavior == null) {
+ return;
+ }
+ uiBehavior.prepareRequestRoleItemViewAsUser(role, itemView, applicationInfo, user, context);
+ }
+
+ /**
* @see RoleUiBehavior#getManageIntentAsUser
*/
@Nullable
@@ -78,15 +91,13 @@ public final class RoleUiBehaviorUtils {
* @see RoleUiBehavior#preparePreferenceAsUser
*/
public static void preparePreferenceAsUser(@NonNull Role role,
- @NonNull RolePreference preference, @NonNull UserHandle user,
- @NonNull Context context) {
- prepareUserRestrictionAwarePreferenceAsUser(role, preference, user, context);
-
+ @NonNull List<ApplicationInfo> applicationInfos, @NonNull RolePreference preference,
+ @NonNull UserHandle user, @NonNull Context context) {
RoleUiBehavior uiBehavior = getUiBehavior(role);
if (uiBehavior == null) {
return;
}
- uiBehavior.preparePreferenceAsUser(role, preference, user, context);
+ uiBehavior.preparePreferenceAsUser(role, preference, applicationInfos, user, context);
}
/**
@@ -96,8 +107,6 @@ public final class RoleUiBehaviorUtils {
@NonNull RoleApplicationPreference preference,
@NonNull ApplicationInfo applicationInfo, @NonNull UserHandle user,
@NonNull Context context) {
- prepareUserRestrictionAwarePreferenceAsUser(role, preference, user, context);
-
RoleUiBehavior uiBehavior = getUiBehavior(role);
if (uiBehavior == null) {
return;
@@ -107,18 +116,6 @@ public final class RoleUiBehaviorUtils {
context);
}
- private static void prepareUserRestrictionAwarePreferenceAsUser(@NonNull Role role,
- @NonNull UserRestrictionAwarePreference preference, @NonNull UserHandle user,
- @NonNull Context context) {
- if (SdkLevel.isAtLeastU() && role.isExclusive()) {
- UserManager userManager = context.getSystemService(UserManager.class);
- boolean hasDisallowConfigDefaultApps = userManager.hasUserRestrictionForUser(
- UserManager.DISALLOW_CONFIG_DEFAULT_APPS, user);
- preference.setUserRestriction(hasDisallowConfigDefaultApps
- ? UserManager.DISALLOW_CONFIG_DEFAULT_APPS : null);
- }
- }
-
/**
* @see RoleUiBehavior#getConfirmationMessage
*/
diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/UiUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/UiUtils.java
index e13e55c51..4d3320667 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/utils/UiUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/utils/UiUtils.java
@@ -18,16 +18,12 @@ package com.android.permissioncontroller.role.utils;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
-import android.content.Context;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
import android.view.View;
+import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import androidx.annotation.Dimension;
import androidx.annotation.NonNull;
-import androidx.annotation.Px;
/**
* Utility methods about UI.
@@ -37,6 +33,26 @@ public class UiUtils {
private UiUtils() {}
/**
+ * Set enabled state on a view and its children recursively.
+ *
+ * @see androidx.preference.Preference#setEnabledStateOnViews
+ *
+ * @param view the view to be set to enabled or not
+ * @param enabled whether the view should be enabled
+ */
+ public static void setViewTreeEnabled(@NonNull View view, boolean enabled) {
+ view.setEnabled(enabled);
+ if (view instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) view;
+ int childCount = viewGroup.getChildCount();
+ for (int i = 0; i < childCount; ++i) {
+ View childView = viewGroup.getChildAt(i);
+ setViewTreeEnabled(childView, enabled);
+ }
+ }
+ }
+
+ /**
* Set whether a view is shown.
*
* @param view the view to be set to shown or not
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
index 6f146e48c..9feecf5d4 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/SafetyCenterFragment.kt
@@ -92,7 +92,7 @@ abstract class SafetyCenterFragment : PreferenceFragmentCompat() {
}
val safetyCenterIntent: ParsedSafetyCenterIntent =
- requireActivity().getIntent().toSafetyCenterIntent()
+ requireActivity().intent.toSafetyCenterIntent()
val isQsFragment =
getArguments()?.getBoolean(QUICK_SETTINGS_SAFETY_CENTER_FRAGMENT, false) ?: false
collapsableIssuesCardHelper =
@@ -120,7 +120,7 @@ abstract class SafetyCenterFragment : PreferenceFragmentCompat() {
override fun onStart() {
super.onStart()
configureInteractionLogger()
- safetyCenterViewModel.interactionLogger.record(Action.SAFETY_CENTER_VIEWED)
+ logSafetyCenterViewedEvent()
}
override fun onResume() {
@@ -162,6 +162,26 @@ abstract class SafetyCenterFragment : PreferenceFragmentCompat() {
abstract fun configureInteractionLogger()
+ private fun logSafetyCenterViewedEvent() {
+ // If Safety Center was opened due to an associated notification click (i.e. intent has an
+ // associated issue), record that issue's metadata on the SAFETY_CENTER_VIEWED event
+ val maybeIssueKey = requireActivity().intent.toSafetyCenterIntent().safetyCenterIssueKey
+ val maybeIssue =
+ maybeIssueKey?.let {
+ safetyCenterViewModel.getCurrentSafetyCenterDataAsUiData().getMatchingIssue(it)
+ }
+
+ if (maybeIssue == null) {
+ safetyCenterViewModel.interactionLogger.record(Action.SAFETY_CENTER_VIEWED)
+ } else {
+ safetyCenterViewModel.interactionLogger.recordForIssue(
+ Action.SAFETY_CENTER_VIEWED,
+ maybeIssue,
+ isDismissed = false
+ )
+ }
+ }
+
private fun displayErrorDetails(errorDetails: SafetyCenterErrorDetails?) {
if (errorDetails == null) return
Toast.makeText(requireContext(), errorDetails.errorMessage, Toast.LENGTH_LONG).show()
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterUiData.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterUiData.kt
index 239f9a377..69a315f08 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterUiData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/SafetyCenterUiData.kt
@@ -16,6 +16,7 @@
package com.android.permissioncontroller.safetycenter.ui.model
+import android.os.Build.VERSION_CODES.TIRAMISU
import android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE
import android.safetycenter.SafetyCenterData
import android.safetycenter.SafetyCenterEntryGroup
@@ -24,12 +25,21 @@ import android.safetycenter.SafetyCenterIssue
import android.safetycenter.SafetyCenterIssue.ISSUE_SEVERITY_LEVEL_OK
import androidx.annotation.RequiresApi
import com.android.safetycenter.internaldata.SafetyCenterBundles.ISSUES_TO_GROUPS_BUNDLE_KEY
+import com.android.safetycenter.internaldata.SafetyCenterIds
+import com.android.safetycenter.internaldata.SafetyCenterIssueKey
/** UI model representation of Safety Center Data */
data class SafetyCenterUiData(
val safetyCenterData: SafetyCenterData,
val resolvedIssues: Map<IssueId, ActionId> = emptyMap()
) {
+ @RequiresApi(TIRAMISU)
+ fun getMatchingIssue(issueKey: SafetyCenterIssueKey): SafetyCenterIssue? {
+ return safetyCenterData.issues.find {
+ SafetyCenterIds.issueIdFromString(it.id).safetyCenterIssueKey == issueKey
+ }
+ }
+
/** Returns the [SafetyCenterEntryGroup] corresponding to the provided ID */
@RequiresApi(UPSIDE_DOWN_CAKE)
fun getMatchingGroup(groupId: String): SafetyCenterEntryGroup? {
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/view/MoreIssuesHeaderView.kt b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/view/MoreIssuesHeaderView.kt
index 7b95c3609..ebfbef714 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/view/MoreIssuesHeaderView.kt
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/view/MoreIssuesHeaderView.kt
@@ -45,13 +45,9 @@ constructor(
private val moreIssuesCardAnimator = MoreIssuesCardAnimator()
private val statusIconView: ImageView by lazyView(R.id.status_icon)
private val titleView: TextView by lazyView(R.id.title)
- private val expandCollapseLayout: View by lazyView(android.R.id.widget_frame)
- private val counterView: TextView by lazyView {
- expandCollapseLayout.requireViewById(R.id.widget_title)
- }
- private val expandCollapseIcon: ImageView by lazyView {
- expandCollapseLayout.requireViewById(R.id.widget_icon)
- }
+ private val expandCollapseLayout: View by lazyView(R.id.widget_frame)
+ private val counterView: TextView by lazyView(R.id.widget_title)
+ private val expandCollapseIcon: ImageView by lazyView(R.id.widget_icon)
private var cornerAnimator: ValueAnimator? = null
fun showExpandableHeader(
diff --git a/PermissionController/tests/mocking/Android.bp b/PermissionController/tests/mocking/Android.bp
index 837b055a8..cff4c5177 100644
--- a/PermissionController/tests/mocking/Android.bp
+++ b/PermissionController/tests/mocking/Android.bp
@@ -117,7 +117,7 @@ android_test {
"safety-label",
"role-controller",
"lottie",
- "permissions-flags-lib",
+ "permissions-aconfig-flags-lib",
"android.permission.flags-aconfig-java",
"androidx.test.rules",
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
index 30f0880e1..cc3b096a8 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/privacysources/NotificationListenerPrivacySourceTest.kt
@@ -122,14 +122,14 @@ class NotificationListenerPrivacySourceTest {
whenever(
Utils.getApplicationLabel(
any(ContextWrapper::class.java),
- eq(packageInfo1.applicationInfo)
+ eq(packageInfo1.applicationInfo!!)
)
)
.thenReturn(testComponent1.className)
whenever(
Utils.getApplicationLabel(
any(ContextWrapper::class.java),
- eq(packageInfo2.applicationInfo)
+ eq(packageInfo2.applicationInfo!!)
)
)
.thenReturn(testComponent2.className)
diff --git a/SafetyCenter/Config/Android.bp b/SafetyCenter/Config/Android.bp
index d6423288a..48c8eab46 100644
--- a/SafetyCenter/Config/Android.bp
+++ b/SafetyCenter/Config/Android.bp
@@ -40,6 +40,7 @@ java_library {
],
static_libs: [
"modules-utils-build",
+ "permissions-aconfig-flags-lib",
],
apex_available: [
"com.android.permission",
diff --git a/SafetyCenter/Config/java/com/android/safetycenter/config/SafetyCenterConfigParser.java b/SafetyCenter/Config/java/com/android/safetycenter/config/SafetyCenterConfigParser.java
index b6730f36f..38eee9e51 100644
--- a/SafetyCenter/Config/java/com/android/safetycenter/config/SafetyCenterConfigParser.java
+++ b/SafetyCenter/Config/java/com/android/safetycenter/config/SafetyCenterConfigParser.java
@@ -33,10 +33,12 @@ import android.content.res.Resources;
import android.safetycenter.config.SafetyCenterConfig;
import android.safetycenter.config.SafetySource;
import android.safetycenter.config.SafetySourcesGroup;
+import android.util.Log;
import androidx.annotation.RequiresApi;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permission.flags.Flags;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -49,6 +51,7 @@ import java.io.InputStream;
@RequiresApi(TIRAMISU)
public final class SafetyCenterConfigParser {
+ private static final String TAG = "SafetyCenterConfigParser";
private static final String TAG_SAFETY_CENTER_CONFIG = "safety-center-config";
private static final String TAG_SAFETY_SOURCES_CONFIG = "safety-sources-config";
private static final String TAG_SAFETY_SOURCES_GROUP = "safety-sources-group";
@@ -64,6 +67,8 @@ public final class SafetyCenterConfigParser {
private static final String ATTR_SAFETY_SOURCE_PACKAGE_NAME = "packageName";
private static final String ATTR_SAFETY_SOURCE_TITLE = "title";
private static final String ATTR_SAFETY_SOURCE_TITLE_FOR_WORK = "titleForWork";
+ private static final String ATTR_SAFETY_SOURCE_TITLE_FOR_PRIVATE_PROFILE =
+ "titleForPrivateProfile";
private static final String ATTR_SAFETY_SOURCE_SUMMARY = "summary";
private static final String ATTR_SAFETY_SOURCE_INTENT_ACTION = "intentAction";
private static final String ATTR_SAFETY_SOURCE_PROFILE = "profile";
@@ -270,6 +275,26 @@ public final class SafetyCenterConfigParser {
parser.getAttributeName(i),
resources));
break;
+ case ATTR_SAFETY_SOURCE_TITLE_FOR_PRIVATE_PROFILE:
+ if (SdkLevel.isAtLeastV()) {
+ if (Flags.privateProfileTitleApi()) {
+ builder.setTitleForPrivateProfileResId(
+ parseStringResourceName(
+ parser.getAttributeValue(i),
+ name,
+ parser.getAttributeName(i),
+ resources));
+ } else {
+ Log.i(
+ TAG,
+ String.format(
+ "Ignoring attribute %s.%s",
+ name, ATTR_SAFETY_SOURCE_TITLE_FOR_PRIVATE_PROFILE));
+ }
+ break;
+ } else {
+ throw attributeUnexpected(name, parser.getAttributeName(i));
+ }
case ATTR_SAFETY_SOURCE_SUMMARY:
builder.setSummaryResId(
parseStringResourceName(
diff --git a/SafetyCenter/Config/tests/Android.bp b/SafetyCenter/Config/tests/Android.bp
index 3adedfc25..20a536237 100644
--- a/SafetyCenter/Config/tests/Android.bp
+++ b/SafetyCenter/Config/tests/Android.bp
@@ -33,6 +33,7 @@ android_test {
"compatibility-device-util-axt",
"safety-center-config",
"safety-center-test-util-lib",
+ "permissions-aconfig-flags-lib",
],
test_suites: [
"general-tests",
diff --git a/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigInvalidTest.kt b/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigInvalidTest.kt
index 64775d7fe..e0e16fd71 100644
--- a/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigInvalidTest.kt
+++ b/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigInvalidTest.kt
@@ -19,6 +19,7 @@ package com.android.safetycenter.config
import android.content.Context
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import com.android.modules.utils.build.SdkLevel
+import com.android.permission.flags.Flags
import com.android.safetycenter.config.tests.R
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertThrows
@@ -63,18 +64,39 @@ class ParserConfigInvalidTest {
fun parameters() =
arrayOf(
Params(
+ "ConfigDynamicSafetySourceAllDisabledNoPrivate",
+ R.raw.config_dynamic_safety_source_all_disabled_no_private,
+ "Element dynamic-safety-source invalid",
+ "Required attribute titleForPrivateProfile missing",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigDynamicSafetySourceAllDisabledNoWork",
R.raw.config_dynamic_safety_source_all_disabled_no_work,
"Element dynamic-safety-source invalid",
"Required attribute titleForWork missing"
),
Params(
+ "ConfigDynamicSafetySourceAllHiddenWithSearchNoPrivate",
+ R.raw.config_dynamic_safety_source_all_hidden_with_search_no_private,
+ "Element dynamic-safety-source invalid",
+ "Required attribute titleForPrivateProfile missing",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigDynamicSafetySourceAllHiddenWithSearchNoWork",
R.raw.config_dynamic_safety_source_all_hidden_with_search_no_work,
"Element dynamic-safety-source invalid",
"Required attribute titleForWork missing"
),
Params(
+ "ConfigDynamicSafetySourceAllNoPrivate",
+ R.raw.config_dynamic_safety_source_all_no_private,
+ "Element dynamic-safety-source invalid",
+ "Required attribute titleForPrivateProfile missing",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigDynamicSafetySourceAllNoWork",
R.raw.config_dynamic_safety_source_all_no_work,
"Element dynamic-safety-source invalid",
@@ -160,12 +182,26 @@ class ParserConfigInvalidTest {
"Required attribute title missing"
),
Params(
+ "ConfigDynamicSafetySourcePrimaryHiddenWithPrivate",
+ R.raw.config_dynamic_safety_source_primary_hidden_with_private,
+ "Element dynamic-safety-source invalid",
+ "Prohibited attribute titleForPrivateProfile present",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigDynamicSafetySourcePrimaryHiddenWithWork",
R.raw.config_dynamic_safety_source_primary_hidden_with_work,
"Element dynamic-safety-source invalid",
"Prohibited attribute titleForWork present"
),
Params(
+ "ConfigDynamicSafetySourcePrimaryWithPrivate",
+ R.raw.config_dynamic_safety_source_primary_with_private,
+ "Element dynamic-safety-source invalid",
+ "Prohibited attribute titleForPrivateProfile present",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigDynamicSafetySourcePrimaryWithWork",
R.raw.config_dynamic_safety_source_primary_with_work,
"Element dynamic-safety-source invalid",
@@ -226,6 +262,13 @@ class ParserConfigInvalidTest {
"Prohibited attribute intentAction present"
),
Params(
+ "ConfigIssueOnlySafetySourceWithPrivate",
+ R.raw.config_issue_only_safety_source_with_private,
+ "Element issue-only-safety-source invalid",
+ "Prohibited attribute titleForPrivateProfile present",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigIssueOnlySafetySourceWithSearch",
R.raw.config_issue_only_safety_source_with_search,
"Element issue-only-safety-source invalid",
@@ -425,12 +468,26 @@ class ParserConfigInvalidTest {
SdkLevel.isAtLeastU()
),
Params(
+ "ConfigStaticSafetySourceWithPrimaryAndPrivate",
+ R.raw.config_static_safety_source_with_primary_and_private,
+ "Element static-safety-source invalid",
+ "Prohibited attribute titleForPrivateProfile present",
+ SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()
+ ),
+ Params(
"ConfigStaticSafetySourceWithPrimaryAndWork",
R.raw.config_static_safety_source_with_primary_and_work,
"Element static-safety-source invalid",
"Prohibited attribute titleForWork present"
),
Params(
+ "ConfigStaticSafetySourceWithPrivatePreV",
+ R.raw.config_static_safety_source_with_private_profile,
+ "Unexpected attribute static-safety-source.titleForPrivateProfile",
+ null,
+ !SdkLevel.isAtLeastV()
+ ),
+ Params(
"ConfigStaticSafetySourceWithRefresh",
R.raw.config_static_safety_source_with_refresh,
"Element static-safety-source invalid",
diff --git a/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigValidTest.kt b/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigValidTest.kt
index b63ccead7..133f4ce73 100644
--- a/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigValidTest.kt
+++ b/SafetyCenter/Config/tests/java/com/android/safetycenter/config/ParserConfigValidTest.kt
@@ -23,6 +23,7 @@ import android.safetycenter.config.SafetySourcesGroup
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.modules.utils.build.SdkLevel
+import com.android.permission.flags.Flags
import com.android.safetycenter.config.tests.R
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -77,6 +78,9 @@ class ParserConfigValidTest {
addPackageCertificateHash("feed1")
addPackageCertificateHash("feed2")
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(R.string.reference)
+ }
}
.build()
)
@@ -101,6 +105,9 @@ class ParserConfigValidTest {
addPackageCertificateHash("feed1")
addPackageCertificateHash("feed2")
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(R.string.reference)
+ }
}
.build()
)
@@ -133,6 +140,11 @@ class ParserConfigValidTest {
.setProfile(SafetySource.PROFILE_ALL)
.setInitialDisplayState(SafetySource.INITIAL_DISPLAY_STATE_HIDDEN)
.setSearchTermsResId(R.string.reference)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(R.string.reference)
+ }
+ }
.build()
)
.build()
@@ -159,6 +171,11 @@ class ParserConfigValidTest {
.setIntentAction("intent")
.setProfile(SafetySource.PROFILE_ALL)
.setSearchTermsResId(R.string.reference)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(R.string.reference)
+ }
+ }
.build()
)
.build()
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_disabled_no_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_disabled_no_private.xml
new file mode 100644
index 000000000..dae6ca754
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_disabled_no_private.xml
@@ -0,0 +1,18 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="id"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"
+ initialDisplayState="disabled"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_hidden_with_search_no_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_hidden_with_search_no_private.xml
new file mode 100644
index 000000000..e1852b6ec
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_hidden_with_search_no_private.xml
@@ -0,0 +1,17 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="id"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ profile="all_profiles"
+ initialDisplayState="hidden"
+ searchTerms="@com.android.safetycenter.config.tests:string/reference"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_no_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_no_private.xml
new file mode 100644
index 000000000..8446b71cc
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_all_no_private.xml
@@ -0,0 +1,17 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="id"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_hidden_with_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_hidden_with_private.xml
new file mode 100644
index 000000000..3d5840b03
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_hidden_with_private.xml
@@ -0,0 +1,15 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="id"
+ packageName="package"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ profile="primary_profile_only"
+ initialDisplayState="hidden"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_with_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_with_private.xml
new file mode 100644
index 000000000..b95a3ed6e
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_dynamic_safety_source_primary_with_private.xml
@@ -0,0 +1,17 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="id"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_issue_only_safety_source_with_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_issue_only_safety_source_with_private.xml
new file mode 100644
index 000000000..7b2484a41
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_issue_only_safety_source_with_private.xml
@@ -0,0 +1,12 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id">
+ <issue-only-safety-source
+ id="id"
+ packageName="package"
+ profile="all_profiles"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_static_safety_source_with_primary_and_private.xml b/SafetyCenter/Config/tests/res/raw-v35/config_static_safety_source_with_primary_and_private.xml
new file mode 100644
index 000000000..0ab3d885b
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_static_safety_source_with_primary_and_private.xml
@@ -0,0 +1,16 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <static-safety-source
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw-v35/config_valid.xml b/SafetyCenter/Config/tests/res/raw-v35/config_valid.xml
new file mode 100644
index 000000000..e49a6cdc4
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw-v35/config_valid.xml
@@ -0,0 +1,197 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="dynamic"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ statelessIconType="privacy">
+ <dynamic-safety-source
+ id="dynamic_barebone"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ <dynamic-safety-source
+ id="dynamic_all_optional"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"
+ initialDisplayState="disabled"
+ maxSeverityLevel="300"
+ searchTerms="@com.android.safetycenter.config.tests:string/reference"
+ loggingAllowed="false"
+ refreshOnPageOpenAllowed="true"
+ notificationsAllowed="true"
+ deduplicationGroup="group"
+ packageCertificateHashes="feed1,feed2"/>
+ <dynamic-safety-source
+ id="@com.android.safetycenter.config.tests:string/dynamic_all_references_id"
+ packageName="@com.android.safetycenter.config.tests:string/dynamic_all_references_package_name"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="@com.android.safetycenter.config.tests:string/dynamic_all_references_intent_action"
+ profile="@com.android.safetycenter.config.tests:string/dynamic_all_references_profile"
+ initialDisplayState="@com.android.safetycenter.config.tests:string/dynamic_all_references_initial_display_state"
+ maxSeverityLevel="@com.android.safetycenter.config.tests:string/dynamic_all_references_max_severity_level"
+ searchTerms="@com.android.safetycenter.config.tests:string/reference"
+ loggingAllowed="@com.android.safetycenter.config.tests:string/dynamic_all_references_logging_allowed"
+ refreshOnPageOpenAllowed="@com.android.safetycenter.config.tests:string/dynamic_all_references_refresh_on_page_open_allowed"
+ notificationsAllowed="@com.android.safetycenter.config.tests:string/dynamic_all_references_notifications_allowed"
+ deduplicationGroup="@com.android.safetycenter.config.tests:string/dynamic_all_references_deduplication_group"
+ packageCertificateHashes="@com.android.safetycenter.config.tests:string/dynamic_all_references_package_cert_hashes"/>
+ <dynamic-safety-source
+ id="dynamic_disabled"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ profile="primary_profile_only"
+ initialDisplayState="disabled"/>
+ <dynamic-safety-source
+ id="dynamic_hidden"
+ packageName="package"
+ profile="all_profiles"
+ initialDisplayState="hidden"/>
+ <dynamic-safety-source
+ id="dynamic_hidden_with_search"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"
+ initialDisplayState="hidden"
+ searchTerms="@com.android.safetycenter.config.tests:string/reference"/>
+ </safety-sources-group>
+ <safety-sources-group
+ id="static"
+ title="@com.android.safetycenter.config.tests:string/reference">
+ <static-safety-source
+ id="static_barebone"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ <static-safety-source
+ id="static_all_optional"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"
+ searchTerms="@com.android.safetycenter.config.tests:string/reference"/>
+ </safety-sources-group>
+ <safety-sources-group
+ id="issue_only">
+ <issue-only-safety-source
+ id="issue_only_barebone"
+ packageName="package"
+ profile="primary_profile_only"/>
+ <issue-only-safety-source
+ id="issue_only_all_optional"
+ packageName="package"
+ profile="all_profiles"
+ maxSeverityLevel="300"
+ loggingAllowed="false"
+ refreshOnPageOpenAllowed="true"
+ notificationsAllowed="true"
+ deduplicationGroup="group"
+ packageCertificateHashes="feed1,feed2"/>
+ <issue-only-safety-source
+ id="id_test_abcxyz_ABCXYZ_012789"
+ packageName="package"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ id="mixed"
+ title="@com.android.safetycenter.config.tests:string/reference">
+ <dynamic-safety-source
+ id="mixed_dynamic_barebone"
+ packageName="package"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ <issue-only-safety-source
+ id="mixed_issue_only_barebone"
+ packageName="package"
+ profile="primary_profile_only"/>
+ <static-safety-source
+ id="mixed_static_barebone"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="stateful"
+ id="stateful_barebone"
+ title="@com.android.safetycenter.config.tests:string/reference">
+ <static-safety-source
+ id="stateful_barebone_source"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="stateful"
+ id="stateful_all_optional"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ statelessIconType="privacy">
+ <static-safety-source
+ id="stateful_all_optional_source"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="stateless"
+ id="stateless_barebone"
+ title="@com.android.safetycenter.config.tests:string/reference">
+ <static-safety-source
+ id="stateless_barebone_source"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="stateless"
+ id="stateless_all_optional"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ statelessIconType="privacy">
+ <static-safety-source
+ id="stateless_all_optional_source"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="hidden"
+ id="hidden_barebone">
+ <issue-only-safety-source
+ id="hidden_barebone_source"
+ packageName="package"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ <safety-sources-group
+ type="hidden"
+ id="hidden_all_optional"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ statelessIconType="privacy">
+ <issue-only-safety-source
+ id="hidden_all_optional_source"
+ packageName="package"
+ profile="primary_profile_only"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/Config/tests/res/raw/config_static_safety_source_with_private_profile.xml b/SafetyCenter/Config/tests/res/raw/config_static_safety_source_with_private_profile.xml
new file mode 100644
index 000000000..f790baec9
--- /dev/null
+++ b/SafetyCenter/Config/tests/res/raw/config_static_safety_source_with_private_profile.xml
@@ -0,0 +1,17 @@
+<safety-center-config>
+ <safety-sources-config>
+ <safety-sources-group
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference">
+ <static-safety-source
+ id="id"
+ title="@com.android.safetycenter.config.tests:string/reference"
+ titleForWork="@com.android.safetycenter.config.tests:string/reference"
+ titleForPrivateProfile="@com.android.safetycenter.config.tests:string/reference"
+ summary="@com.android.safetycenter.config.tests:string/reference"
+ intentAction="intent"
+ profile="all_profiles"/>
+ </safety-sources-group>
+ </safety-sources-config>
+</safety-center-config>
diff --git a/SafetyCenter/ConfigLintChecker/Android.bp b/SafetyCenter/ConfigLintChecker/Android.bp
index fad0165df..7c615d2f4 100644
--- a/SafetyCenter/ConfigLintChecker/Android.bp
+++ b/SafetyCenter/ConfigLintChecker/Android.bp
@@ -12,64 +12,65 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package {
- default_team: "trendy_team_android_permissions",
- default_applicable_licenses: ["Android-Apache-2.0"],
-}
+// TODO(b/322944911): Reconsider enabling linter checker
+//package {
+// default_team: "trendy_team_android_permissions",
+// default_applicable_licenses: ["Android-Apache-2.0"],
+//}
-java_library_host {
- name: "ConfigLintChecker",
- srcs: [
- "java/**/*.java",
- "java/**/*.kt",
- ":safetycenter-annotations-sources",
- ":safetycenter-config-api-sources",
- ":safetycenter-config-parser-sources",
- ],
- plugins: ["auto_service_plugin"],
- libs: [
- "androidx.annotation_annotation", // For androidx.annotation.RequiresApi
- "auto_service_annotations",
- "core-xml-for-host", // For org.xmlpull.v1.*
- "framework-annotations-lib", // For com.android.annotation.*
- "layoutlib_api-prebuilt", // For com.android.resources.ResourceFolderType
- "lint_api",
- ],
- java_resources: [":safetycenter-config-schemas"],
- jarjar_rules: "jarjar-rules.txt",
- kotlincflags: ["-Xjvm-default=all"],
- visibility: [
- "//packages/modules/Permission:__subpackages__",
- "//vendor:__subpackages__",
- ],
-}
+//java_library_host {
+// name: "ConfigLintChecker",
+// srcs: [
+// "java/**/*.java",
+// "java/**/*.kt",
+// ":safetycenter-annotations-sources",
+// ":safetycenter-config-api-sources",
+// ":safetycenter-config-parser-sources",
+// ],
+// plugins: ["auto_service_plugin"],
+// libs: [
+// "androidx.annotation_annotation", // For androidx.annotation.RequiresApi
+// "auto_service_annotations",
+// "core-xml-for-host", // For org.xmlpull.v1.*
+// "framework-annotations-lib", // For com.android.annotation.*
+// "layoutlib_api-prebuilt", // For com.android.resources.ResourceFolderType
+// "lint_api",
+// ],
+// java_resources: [":safetycenter-config-schemas"],
+// jarjar_rules: "jarjar-rules.txt",
+// kotlincflags: ["-Xjvm-default=all"],
+// visibility: [
+// "//packages/modules/Permission:__subpackages__",
+// "//vendor:__subpackages__",
+// ],
+//}
-java_test_host {
- name: "ConfigLintCheckerTest",
- srcs: [
- "tests/java/**/*.kt",
- ],
- static_libs: [
- "ConfigLintChecker",
- "junit",
- "lint",
- "lint_tests",
- ],
- test_options: {
- unit_test: true,
- tradefed_options: [
- {
- // lint bundles in some classes that were built with older versions
- // of libraries, and no longer load. Since tradefed tries to load
- // all classes in the jar to look for tests, it crashes loading them.
- // Exclude these classes from tradefed's search.
- name: "exclude-paths",
- value: "org/apache",
- },
- {
- name: "exclude-paths",
- value: "META-INF",
- },
- ],
- },
-}
+//java_test_host {
+// name: "ConfigLintCheckerTest",
+// srcs: [
+// "tests/java/**/*.kt",
+// ],
+// static_libs: [
+// "ConfigLintChecker",
+// "junit",
+// "lint",
+// "lint_tests",
+// ],
+// test_options: {
+// unit_test: true,
+// tradefed_options: [
+// {
+// // lint bundles in some classes that were built with older versions
+// // of libraries, and no longer load. Since tradefed tries to load
+// // all classes in the jar to look for tests, it crashes loading them.
+// // Exclude these classes from tradefed's search.
+// name: "exclude-paths",
+// value: "org/apache",
+// },
+// {
+// name: "exclude-paths",
+// value: "META-INF",
+// },
+// ],
+// },
+//}
diff --git a/SafetyCenter/Resources/Android.bp b/SafetyCenter/Resources/Android.bp
index 6f635c885..a10ea7f1a 100644
--- a/SafetyCenter/Resources/Android.bp
+++ b/SafetyCenter/Resources/Android.bp
@@ -42,9 +42,10 @@ android_app {
min_sdk_version: "30",
apex_available: ["com.android.permission"],
certificate: ":com.android.safetycenter.resources.certificate",
- lint: {
- extra_check_modules: ["ConfigLintChecker"],
- },
+ // TODO(b/322944911): Reconsider enabling linter checker
+ //lint: {
+ // extra_check_modules: ["ConfigLintChecker"],
+ //},
static_libs: [
"SafetyCenterResourcesShared",
],
diff --git a/SafetyCenter/Resources/res/raw-v35/safety_center_config.xml b/SafetyCenter/Resources/res/raw-v35/safety_center_config.xml
index 83369f920..cb49e9d36 100644
--- a/SafetyCenter/Resources/res/raw-v35/safety_center_config.xml
+++ b/SafetyCenter/Resources/res/raw-v35/safety_center_config.xml
@@ -35,10 +35,22 @@
profile="all_profiles"
title="@com.android.safetycenter.resources:string/biometrics_title"
titleForWork="@com.android.safetycenter.resources:string/biometrics_title_for_work"
+ titleForPrivateProfile="@com.android.safetycenter.resources:string/biometrics_title_for_private_profile"
searchTerms="@com.android.safetycenter.resources:string/biometrics_search_terms"
initialDisplayState="hidden"/>
</safety-sources-group>
<safety-sources-group
+ id="AndroidCellularNetworkSecuritySources"
+ title="@com.android.safetycenter.resources:string/cellular_network_security_title"
+ summary="@com.android.safetycenter.resources:string/cellular_network_security_summary">
+ <dynamic-safety-source
+ id="AndroidCellularNetworkSecurity"
+ packageName="com.android.phone"
+ profile="primary_profile_only"
+ notificationsAllowed="true"
+ initialDisplayState="hidden"/>
+ </safety-sources-group>
+ <safety-sources-group
id="AndroidPrivacySources"
title="@com.android.safetycenter.resources:string/privacy_sources_title"
summary="@com.android.safetycenter.resources:string/privacy_sources_summary"
diff --git a/SafetyCenter/Resources/res/values-af-v35/strings.xml b/SafetyCenter/Resources/res/values-af-v35/strings.xml
index 2990bde0d..ab7ce0129 100644
--- a/SafetyCenter/Resources/res/values-af-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-af-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Selnetwerksekuriteit"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Netwerktipe, enkripsie, kennisgewingkontroles"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privaat ruimte"</string>
<string name="private_space_summary" msgid="529869826714610294">"Stel privaat ruimte op, en meer"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privaat ruimte"</string>
diff --git a/SafetyCenter/Resources/res/values-am-v35/strings.xml b/SafetyCenter/Resources/res/values-am-v35/strings.xml
index 290a8816c..96f9ade78 100644
--- a/SafetyCenter/Resources/res/values-am-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-am-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"የተንቀሳቃሽ ስልክ አውታረ መረብ ደህንነት"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"የአውታረ መረብ ዓይነት፣ ምስጠራ፣ የማሳወቂያ መቆጣጠሪያዎች"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"የግል ቦታ"</string>
<string name="private_space_summary" msgid="529869826714610294">"የግል ቦታን እና ሌሎችን ያዋቅሩ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"የግል ቦታ"</string>
diff --git a/SafetyCenter/Resources/res/values-ar-v35/strings.xml b/SafetyCenter/Resources/res/values-ar-v35/strings.xml
index 29fc7583d..4cf1c9a07 100644
--- a/SafetyCenter/Resources/res/values-ar-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ar-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"أمان شبكة الجوّال"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"عناصر التحكم في نوع الشبكة والتشفير والإشعارات"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"مساحة خاصة"</string>
<string name="private_space_summary" msgid="529869826714610294">"ضبط إعدادات مساحة خاصة وغير ذلك"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"مساحة خاصة"</string>
diff --git a/SafetyCenter/Resources/res/values-as-v35/strings.xml b/SafetyCenter/Resources/res/values-as-v35/strings.xml
index 71918ea36..3d658276a 100644
--- a/SafetyCenter/Resources/res/values-as-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-as-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"চেলুলাৰ নেটৱৰ্কৰ সুৰক্ষা"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"নেটৱৰ্কৰ প্ৰকাৰ, এনক্ৰিপশ্বন, জাননীৰ নিয়ন্ত্ৰণসমূহ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ব্যক্তিগত স্পে’চ"</string>
<string name="private_space_summary" msgid="529869826714610294">"ব্যক্তিগত স্পে’চ আৰু আন বহুতো ছেটআপ কৰক"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ব্যক্তিগত স্পে’চ"</string>
diff --git a/SafetyCenter/Resources/res/values-az-v35/strings.xml b/SafetyCenter/Resources/res/values-az-v35/strings.xml
index e1fd4c181..33b8aa0da 100644
--- a/SafetyCenter/Resources/res/values-az-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-az-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobil şəbəkə təhlükəsizliyi"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Şəbəkə növü, şifrələmə, bildiriş nizamlayıcıları"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Şəxsi yer"</string>
<string name="private_space_summary" msgid="529869826714610294">"Şəxsi yer və s. ayarlayın"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Şəxsi yer"</string>
diff --git a/SafetyCenter/Resources/res/values-b+sr+Latn-v35/strings.xml b/SafetyCenter/Resources/res/values-b+sr+Latn-v35/strings.xml
index 6a52a1a8d..6584b80b5 100644
--- a/SafetyCenter/Resources/res/values-b+sr+Latn-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-b+sr+Latn-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Bezbednost mobilne mreže"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tip mreže, šifrovanje, kontrole obaveštenja"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privatni prostor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Podesite privatni prostor i drugo"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privatni prostor"</string>
diff --git a/SafetyCenter/Resources/res/values-be-v35/strings.xml b/SafetyCenter/Resources/res/values-be-v35/strings.xml
index c8db4cb50..61d96987a 100644
--- a/SafetyCenter/Resources/res/values-be-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-be-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Бяспека сотавай сеткі"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тып сеткі, шыфраванне, налады апавяшчэнняў"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Прыватная вобласць"</string>
<string name="private_space_summary" msgid="529869826714610294">"Наладжванне прыватнай вобласці і не толькі"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Прыватная вобласць"</string>
diff --git a/SafetyCenter/Resources/res/values-bg-v35/strings.xml b/SafetyCenter/Resources/res/values-bg-v35/strings.xml
index bb78de8a5..09060c431 100644
--- a/SafetyCenter/Resources/res/values-bg-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-bg-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Сигурност на мобилната мрежа"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тип мрежа, шифроване, контроли за известията"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Лично пространство"</string>
<string name="private_space_summary" msgid="529869826714610294">"Настройване на лично пространство и др."</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Лично пространство"</string>
diff --git a/SafetyCenter/Resources/res/values-bn-v35/strings.xml b/SafetyCenter/Resources/res/values-bn-v35/strings.xml
index 5b05d3b7e..27ec98325 100644
--- a/SafetyCenter/Resources/res/values-bn-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-bn-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"মোবাইল নেটওয়ার্কের সুরক্ষা"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"নেটওয়ার্কের ধরন, এনক্রিপশন, বিজ্ঞপ্তির নিয়ন্ত্রণ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ব্যক্তিগত স্পেস"</string>
<string name="private_space_summary" msgid="529869826714610294">"\'ব্যক্তিগত স্পেস\' সেট-আপ ও আরও অনেক কিছু করুন"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ব্যক্তিগত স্পেস"</string>
diff --git a/SafetyCenter/Resources/res/values-bs-v35/strings.xml b/SafetyCenter/Resources/res/values-bs-v35/strings.xml
index ab9d9d6ba..e962785aa 100644
--- a/SafetyCenter/Resources/res/values-bs-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-bs-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sigurnost mobilne mreže"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Vrsta mreže, šifriranje i kontrole obavještenja"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privatni prostor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Postavite privatni prostor i drugo"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privatni prostor"</string>
diff --git a/SafetyCenter/Resources/res/values-ca-v35/strings.xml b/SafetyCenter/Resources/res/values-ca-v35/strings.xml
index ba0cc5dd2..7517723a5 100644
--- a/SafetyCenter/Resources/res/values-ca-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ca-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Seguretat de la xarxa mòbil"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipus de xarxa, encriptació, controls de notificació"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espai privat"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configura l\'espai privat i més"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espai privat"</string>
diff --git a/SafetyCenter/Resources/res/values-cs-v35/strings.xml b/SafetyCenter/Resources/res/values-cs-v35/strings.xml
index 532449ee1..443d815e2 100644
--- a/SafetyCenter/Resources/res/values-cs-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-cs-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Zabezpečení mobilní sítě"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Nastavení typu sítě, šifrování a oznámení"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Soukromý prostor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Nastavte si Soukromý prostor atd."</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Soukromý prostor"</string>
diff --git a/SafetyCenter/Resources/res/values-da-v35/strings.xml b/SafetyCenter/Resources/res/values-da-v35/strings.xml
index 9401dbbe7..25c638325 100644
--- a/SafetyCenter/Resources/res/values-da-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-da-v35/strings.xml
@@ -17,7 +17,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="private_space_title" msgid="6158245041481535879">"Privat rum"</string>
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sikkerhed for mobilnetværk"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Netværkstype, kryptering, notifikationsstyring"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
+ <string name="private_space_title" msgid="6158245041481535879">"Privat område"</string>
<string name="private_space_summary" msgid="529869826714610294">"Konfigurer et privat rum m.m."</string>
- <string name="private_space_search_terms" msgid="4820808478299116258">"Privat rum"</string>
+ <string name="private_space_search_terms" msgid="4820808478299116258">"Privat område"</string>
</resources>
diff --git a/SafetyCenter/Resources/res/values-de-v35/strings.xml b/SafetyCenter/Resources/res/values-de-v35/strings.xml
index 22f254518..5c3818eaa 100644
--- a/SafetyCenter/Resources/res/values-de-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-de-v35/strings.xml
@@ -17,7 +17,10 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="private_space_title" msgid="6158245041481535879">"Privater Bereich"</string>
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sicherheit von Mobilfunknetzen"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Netzwerktyp, Verschlüsselung, Benachrichtigungseinstellungen"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
+ <string name="private_space_title" msgid="6158245041481535879">"Privates Profil"</string>
<string name="private_space_summary" msgid="529869826714610294">"Privaten Bereich einrichten und mehr"</string>
- <string name="private_space_search_terms" msgid="4820808478299116258">"Privater Bereich"</string>
+ <string name="private_space_search_terms" msgid="4820808478299116258">"Privates Profil"</string>
</resources>
diff --git a/SafetyCenter/Resources/res/values-el-v35/strings.xml b/SafetyCenter/Resources/res/values-el-v35/strings.xml
index 5cea492f7..3b1c02a6d 100644
--- a/SafetyCenter/Resources/res/values-el-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-el-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Ασφάλεια δικτύου κινητής τηλεφωνίας"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Τύπος δικτύου, κρυπτογράφηση, στοιχεία ελέγχου ειδοποιήσεων"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Ιδιωτικός χώρος"</string>
<string name="private_space_summary" msgid="529869826714610294">"Ρύθμιση Ιδιωτικού χώρου κ.ά."</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Ιδιωτικός χώρος"</string>
diff --git a/SafetyCenter/Resources/res/values-en-rAU-v35/strings.xml b/SafetyCenter/Resources/res/values-en-rAU-v35/strings.xml
index 311c5ca42..42d1921e2 100644
--- a/SafetyCenter/Resources/res/values-en-rAU-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-en-rAU-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobile network security"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Network type, encryption, notification controls"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Private Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"Set up Private Space, and more"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Private Space"</string>
diff --git a/SafetyCenter/Resources/res/values-en-rCA-v35/strings.xml b/SafetyCenter/Resources/res/values-en-rCA-v35/strings.xml
index e0c36a7a0..c8dea5d1f 100644
--- a/SafetyCenter/Resources/res/values-en-rCA-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-en-rCA-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Cellular network security"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Network type, encryption, notification controls"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Private Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"Setup Private Space, and more"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Private Space"</string>
diff --git a/SafetyCenter/Resources/res/values-en-rGB-v35/strings.xml b/SafetyCenter/Resources/res/values-en-rGB-v35/strings.xml
index 311c5ca42..42d1921e2 100644
--- a/SafetyCenter/Resources/res/values-en-rGB-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-en-rGB-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobile network security"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Network type, encryption, notification controls"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Private Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"Set up Private Space, and more"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Private Space"</string>
diff --git a/SafetyCenter/Resources/res/values-en-rIN-v35/strings.xml b/SafetyCenter/Resources/res/values-en-rIN-v35/strings.xml
index 311c5ca42..42d1921e2 100644
--- a/SafetyCenter/Resources/res/values-en-rIN-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-en-rIN-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobile network security"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Network type, encryption, notification controls"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Private Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"Set up Private Space, and more"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Private Space"</string>
diff --git a/SafetyCenter/Resources/res/values-en-rXC-v35/strings.xml b/SafetyCenter/Resources/res/values-en-rXC-v35/strings.xml
index ad86de92f..998df375a 100644
--- a/SafetyCenter/Resources/res/values-en-rXC-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-en-rXC-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‎‏‏‎‏‏‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‏‏‏‎‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎Cellular network security‎‏‎‎‏‎"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‏‏‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‎‏‎‎‏‏‎‎‎‏‎‎‎‎‏‏‎‏‏‏‎‏‏‎‏‏‏‏‏‎‏‏‏‎‏‎‎‎Network type, encryption, notification controls‎‏‎‎‏‎"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‏‎‏‏‎‎‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‎‎‎‏‎‏‎‏‎‎‎‏‏‎‎‎‎‏‏‏‎Private Space‎‏‎‎‏‎"</string>
<string name="private_space_summary" msgid="529869826714610294">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‏‏‎‎‏‏‏‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‏‎‎Setup Private Space, and more‎‏‎‎‏‎"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‎‏‎‎‏‏‏‎‏‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‎‏‏‏‎‎‎‏‎‎Private Space‎‏‎‎‏‎"</string>
diff --git a/SafetyCenter/Resources/res/values-es-rUS-v35/strings.xml b/SafetyCenter/Resources/res/values-es-rUS-v35/strings.xml
index 323af67b1..7b63e6630 100644
--- a/SafetyCenter/Resources/res/values-es-rUS-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-es-rUS-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Seguridad de red móvil"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de red, encriptación, controles de notificaciones"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espacio privado"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configura el Espacio privado y mucho más"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espacio privado"</string>
diff --git a/SafetyCenter/Resources/res/values-es-v35/strings.xml b/SafetyCenter/Resources/res/values-es-v35/strings.xml
index 9901be878..775de899b 100644
--- a/SafetyCenter/Resources/res/values-es-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-es-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Seguridad de la red móvil"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de red, cifrado, controles de notificaciones"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espacio privado"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configura el espacio privado y más"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espacio privado"</string>
diff --git a/SafetyCenter/Resources/res/values-et-v35/strings.xml b/SafetyCenter/Resources/res/values-et-v35/strings.xml
index e2f169a10..0fdaadbe2 100644
--- a/SafetyCenter/Resources/res/values-et-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-et-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobiilsidevõrgu turvalisus"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Võrgu tüüp, krüpteerimine, märguannete juhtnupud"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privaatne ruum"</string>
<string name="private_space_summary" msgid="529869826714610294">"Privaatse ruumi seadistamine ja muu"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privaatne ruum"</string>
diff --git a/SafetyCenter/Resources/res/values-eu-v35/strings.xml b/SafetyCenter/Resources/res/values-eu-v35/strings.xml
index c22f585ab..d61be7014 100644
--- a/SafetyCenter/Resources/res/values-eu-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-eu-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sare mugikorraren segurtasuna"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Sare mota, enkriptatzea, jakinarazpenak kontrolatzeko aukerak"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Eremu pribatua"</string>
<string name="private_space_summary" msgid="529869826714610294">"Konfiguratu eremu pribatua eta abar"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Eremu pribatua"</string>
diff --git a/SafetyCenter/Resources/res/values-fa-v34/strings.xml b/SafetyCenter/Resources/res/values-fa-v34/strings.xml
index d8bf2b762..92a2168de 100644
--- a/SafetyCenter/Resources/res/values-fa-v34/strings.xml
+++ b/SafetyCenter/Resources/res/values-fa-v34/strings.xml
@@ -18,7 +18,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="lock_screen_sources_title" msgid="5493678510117489865">"باز کردن قفل دستگاه"</string>
- <string name="biometrics_title_for_work" msgid="1842284049407771568">"گزینه‌های زیست‌سنجشی ویژه کار"</string>
+ <string name="biometrics_title_for_work" msgid="1842284049407771568">"داده‌های زیست‌سنجشی برای کار"</string>
<string name="privacy_sources_summary" msgid="4083646673569677049">"اجازه‌ها، داشبورد، کنترل‌ها"</string>
<string name="health_connect_title" msgid="8318152190040327804">"Health Connect"</string>
<string name="health_connect_search_terms" msgid="4998970586245680829">"‏سلامت، Health Connect"</string>
diff --git a/SafetyCenter/Resources/res/values-fa-v35/strings.xml b/SafetyCenter/Resources/res/values-fa-v35/strings.xml
index a3eb194ee..ee5e56422 100644
--- a/SafetyCenter/Resources/res/values-fa-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-fa-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"امنیت شبکه تلفن همراه"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"نوع شبکه، رمزگذاری، کنترل‌های اعلان"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"فضای خصوصی"</string>
<string name="private_space_summary" msgid="529869826714610294">"راه‌اندازی «فضای خصوصی»، و موارد دیگر"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"فضای خصوصی"</string>
diff --git a/SafetyCenter/Resources/res/values-fa/strings.xml b/SafetyCenter/Resources/res/values-fa/strings.xml
index 41a3121ea..bdf2063f1 100644
--- a/SafetyCenter/Resources/res/values-fa/strings.xml
+++ b/SafetyCenter/Resources/res/values-fa/strings.xml
@@ -23,7 +23,7 @@
<string name="lock_screen_title" msgid="4069104894527169877">"قفل صفحه"</string>
<string name="lock_screen_summary_disabled" msgid="354071230916616692">"هنوز اطلاعاتی دردسترس نیست"</string>
<string name="lock_screen_search_terms" msgid="2678486357779794826">"قفل دستگاه، قفل صفحه، صفحه قفل، صفحه‌قفل، گذرواژه، پین، الگو"</string>
- <string name="biometrics_title" msgid="5859504610285212938">"زیست‌سنجشی"</string>
+ <string name="biometrics_title" msgid="5859504610285212938">"داده‌های زیست‌سنجشی"</string>
<string name="biometrics_search_terms" msgid="6040319118762671981">"اثر انگشت، انگشت، افزودن اثر انگشت، قفل‌گشایی با چهره، چهره"</string>
<string name="privacy_sources_title" msgid="4061110826457365957">"حریم خصوصی"</string>
<string name="privacy_sources_summary" msgid="4089719981155120864">"داشبورد، اجازه‌ها، کنترل‌ها"</string>
@@ -37,7 +37,7 @@
<string name="privacy_controls_summary" msgid="2402066941190435424">"کنترل دسترسی دستگاه به میکروفون، دوربین، و غیره"</string>
<string name="privacy_controls_search_terms" msgid="3774472175934304165">"حریم خصوصی، تنظیمات حریم خصوصی"</string>
<string name="advanced_title" msgid="8745436380690561172">"تنظیمات بیشتر"</string>
- <string name="advanced_security_title" msgid="1126833338772188155">"تنظیمات امنیتی بیشتر"</string>
+ <string name="advanced_security_title" msgid="1126833338772188155">"تنظیمات ایمنی بیشتر"</string>
<string name="advanced_security_summary" msgid="6172253327022425123">"رمزگذاری، اطلاعات اعتباری، و غیره"</string>
<string name="advanced_security_search_terms" msgid="3350609555814362075"></string>
<string name="advanced_privacy_title" msgid="1117725225706176643">"تنظیمات حریم خصوصی بیشتر"</string>
diff --git a/SafetyCenter/Resources/res/values-fi-v35/strings.xml b/SafetyCenter/Resources/res/values-fi-v35/strings.xml
index c80c17207..52594a08c 100644
--- a/SafetyCenter/Resources/res/values-fi-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-fi-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobiiliverkon tietoturva"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Verkon tyyppi, salaus, ilmoitusvalinnat"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Yksityinen tila"</string>
<string name="private_space_summary" msgid="529869826714610294">"Ota esimerkiksi yksityinen tila käyttöön"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Yksityinen tila"</string>
diff --git a/SafetyCenter/Resources/res/values-fi/strings.xml b/SafetyCenter/Resources/res/values-fi/strings.xml
index de46fb233..091180237 100644
--- a/SafetyCenter/Resources/res/values-fi/strings.xml
+++ b/SafetyCenter/Resources/res/values-fi/strings.xml
@@ -41,6 +41,6 @@
<string name="advanced_security_summary" msgid="6172253327022425123">"Salaus, kirjautumistiedot ja muuta"</string>
<string name="advanced_security_search_terms" msgid="3350609555814362075"></string>
<string name="advanced_privacy_title" msgid="1117725225706176643">"Lisää yksityisyysasetuksia"</string>
- <string name="advanced_privacy_summary" msgid="2281203390575069543">"Automaattinen täyttö, toimintojen hallinta ja muuta"</string>
+ <string name="advanced_privacy_summary" msgid="2281203390575069543">"Automaattinen täyttö, toiminnan hallinta ja muuta"</string>
<string name="advanced_privacy_search_terms" msgid="5044404599789175222"></string>
</resources>
diff --git a/SafetyCenter/Resources/res/values-fr-rCA-v35/strings.xml b/SafetyCenter/Resources/res/values-fr-rCA-v35/strings.xml
index 06d909df8..d762c9db0 100644
--- a/SafetyCenter/Resources/res/values-fr-rCA-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-fr-rCA-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sécurité du réseau cellulaire"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Contrôles du type de réseau, du chiffrement et des notifications"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espace privé"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configuration de l\'espace privé, et plus"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espace privé"</string>
diff --git a/SafetyCenter/Resources/res/values-fr-v35/strings.xml b/SafetyCenter/Resources/res/values-fr-v35/strings.xml
index a1ba13767..1371aa9f2 100644
--- a/SafetyCenter/Resources/res/values-fr-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-fr-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sécurité des réseaux mobiles"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Type de réseau, chiffrement, paramètres de notifications"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espace privé"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configurez votre espace privé et bien plus"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espace privé"</string>
diff --git a/SafetyCenter/Resources/res/values-gl-v35/strings.xml b/SafetyCenter/Resources/res/values-gl-v35/strings.xml
index 52586da18..4275d9484 100644
--- a/SafetyCenter/Resources/res/values-gl-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-gl-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Seguranza da rede de telefonía móbil"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de rede, encriptación, controis de notificacións"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espazo privado"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configura o espazo privado e moito máis"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espazo privado"</string>
diff --git a/SafetyCenter/Resources/res/values-gu-v35/strings.xml b/SafetyCenter/Resources/res/values-gu-v35/strings.xml
index 23dfe440a..a4a781e12 100644
--- a/SafetyCenter/Resources/res/values-gu-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-gu-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"સેલ્યુલર નેટવર્ક સંબંધી સુરક્ષા"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"નેટવર્કનો પ્રકાર, એન્ક્રિપ્શન, નોટિફિકેશનના નિયંત્રણો"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ખાનગી સ્પેસ"</string>
<string name="private_space_summary" msgid="529869826714610294">"ખાનગી સ્પેસનું સેટઅપ કરો અને બીજું ઘણું કરો"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ખાનગી સ્પેસ"</string>
diff --git a/SafetyCenter/Resources/res/values-hi-v35/strings.xml b/SafetyCenter/Resources/res/values-hi-v35/strings.xml
index ca4b78965..c0a084f7b 100644
--- a/SafetyCenter/Resources/res/values-hi-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-hi-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"मोबाइल नेटवर्क की सुरक्षा"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"नेटवर्क टाइप, एन्क्रिप्ट करने का तरीका, सूचनाएं कंट्रोल करने की सेटिंग"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"प्राइवेट स्पेस"</string>
<string name="private_space_summary" msgid="529869826714610294">"प्राइवेट स्पेस सेटअप करें और अन्य काम करें"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"प्राइवेट स्पेस"</string>
diff --git a/SafetyCenter/Resources/res/values-hr-v35/strings.xml b/SafetyCenter/Resources/res/values-hr-v35/strings.xml
index 024be31b1..f9ce54f32 100644
--- a/SafetyCenter/Resources/res/values-hr-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-hr-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sigurnost mobilne mreže"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Vrsta mreže, šifriranje, kontrole obavijesti"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privatni prostor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Postavljanje privatnog prostora i drugo"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privatni prostor"</string>
diff --git a/SafetyCenter/Resources/res/values-hu-v35/strings.xml b/SafetyCenter/Resources/res/values-hu-v35/strings.xml
index 0fe083899..0c77b2181 100644
--- a/SafetyCenter/Resources/res/values-hu-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-hu-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobilhálózat biztonsága"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Hálózattípus, titkosítás, értesítésvezérlők"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privát terület"</string>
<string name="private_space_summary" msgid="529869826714610294">"Privát terület beállítása és egyebek"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privát terület"</string>
diff --git a/SafetyCenter/Resources/res/values-hy-v35/strings.xml b/SafetyCenter/Resources/res/values-hy-v35/strings.xml
index 54487ffa8..1b9c3ffdc 100644
--- a/SafetyCenter/Resources/res/values-hy-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-hy-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Բջջային ցանցի անվտանգություն"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Ցանցի տեսակը, գաղտնագրում, ծանուցումների կառավարում"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Անձնական տարածք"</string>
<string name="private_space_summary" msgid="529869826714610294">"Կարգավորեք անձնական տարածքը և ավելին"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Անձնական տարածք"</string>
diff --git a/SafetyCenter/Resources/res/values-in-v35/strings.xml b/SafetyCenter/Resources/res/values-in-v35/strings.xml
index 2e2554992..6e91010d7 100644
--- a/SafetyCenter/Resources/res/values-in-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-in-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Keamanan jaringan seluler"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Jenis jaringan, enkripsi, kontrol notifikasi"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Ruang Pribadi"</string>
<string name="private_space_summary" msgid="529869826714610294">"Menyiapkan Ruang Pribadi, dan lainnya"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Ruang Pribadi"</string>
diff --git a/SafetyCenter/Resources/res/values-is-v35/strings.xml b/SafetyCenter/Resources/res/values-is-v35/strings.xml
index d74f29e63..94951412b 100644
--- a/SafetyCenter/Resources/res/values-is-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-is-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Öryggi farsímakerfis"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tegund netkerfis, dulkóðun, tilkynningastýringar"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Einkarými"</string>
<string name="private_space_summary" msgid="529869826714610294">"Setja upp einkarými og fleira"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Einkarými"</string>
diff --git a/SafetyCenter/Resources/res/values-it-v35/strings.xml b/SafetyCenter/Resources/res/values-it-v35/strings.xml
index 26df4d265..5f98b4d0b 100644
--- a/SafetyCenter/Resources/res/values-it-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-it-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sicurezza rete mobile"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo di rete, crittografia, controlli di notifica"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Spazio privato"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configura lo Spazio privato e altro ancora"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Spazio privato"</string>
diff --git a/SafetyCenter/Resources/res/values-iw-v35/strings.xml b/SafetyCenter/Resources/res/values-iw-v35/strings.xml
index edb3e2862..577721d76 100644
--- a/SafetyCenter/Resources/res/values-iw-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-iw-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"אבטחת הרשת הסלולרית"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"סוג הרשת, הצפנה, אמצעי בקרה של התראות"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"מרחב פרטי"</string>
<string name="private_space_summary" msgid="529869826714610294">"הגדרת מרחב פרטי ועוד"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"מרחב פרטי"</string>
diff --git a/SafetyCenter/Resources/res/values-ja-v35/strings.xml b/SafetyCenter/Resources/res/values-ja-v35/strings.xml
index 4bd389ee3..8b5244ea5 100644
--- a/SafetyCenter/Resources/res/values-ja-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ja-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"モバイル ネットワークのセキュリティ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ネットワークの種類、暗号化、通知の管理"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"プライベート スペース"</string>
<string name="private_space_summary" msgid="529869826714610294">"プライベート スペースの設定、その他"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"プライベート スペース"</string>
diff --git a/SafetyCenter/Resources/res/values-ja/strings.xml b/SafetyCenter/Resources/res/values-ja/strings.xml
index 6e67998f4..b31b1690a 100644
--- a/SafetyCenter/Resources/res/values-ja/strings.xml
+++ b/SafetyCenter/Resources/res/values-ja/strings.xml
@@ -30,9 +30,9 @@
<string name="permission_usage_title" msgid="3633779688945350407">"プライバシー ダッシュボード"</string>
<string name="permission_usage_summary" msgid="5323079206029964468">"権限を最近使用したアプリが表示されます"</string>
<string name="permission_usage_search_terms" msgid="3852343592870257104">"プライバシー, プライバシー ダッシュボード"</string>
- <string name="permission_manager_title" msgid="5277347862821255015">"権限マネージャー"</string>
+ <string name="permission_manager_title" msgid="5277347862821255015">"権限マネージャ"</string>
<string name="permission_manager_summary" msgid="8099852107340970790">"アプリのデータアクセスを管理します"</string>
- <string name="permission_manager_search_terms" msgid="2895147613099694722">"権限, 権限マネージャー"</string>
+ <string name="permission_manager_search_terms" msgid="2895147613099694722">"権限, 権限マネージャ"</string>
<string name="privacy_controls_title" msgid="5322875777945432395">"プライバシー管理"</string>
<string name="privacy_controls_summary" msgid="2402066941190435424">"マイク、カメラなどへのデバイス アクセスを管理します"</string>
<string name="privacy_controls_search_terms" msgid="3774472175934304165">"プライバシー, プライバシー管理"</string>
diff --git a/SafetyCenter/Resources/res/values-ka-v35/strings.xml b/SafetyCenter/Resources/res/values-ka-v35/strings.xml
index 480f7e83c..479aa5f30 100644
--- a/SafetyCenter/Resources/res/values-ka-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ka-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ფიჭური ქსელის უსაფრთხოება"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ქსელის ტიპი, დაშიფვრა, შეტყობინებების მართვის საშუალებები"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"პირადი სივრცე"</string>
<string name="private_space_summary" msgid="529869826714610294">"დააყენეთ პირადი სივრცე და ა.შ."</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"პირადი სივრცე"</string>
diff --git a/SafetyCenter/Resources/res/values-kk-v35/strings.xml b/SafetyCenter/Resources/res/values-kk-v35/strings.xml
index f01ade9b8..cd667373c 100644
--- a/SafetyCenter/Resources/res/values-kk-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-kk-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Ұялы желі қауіпсіздігі"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Желі түрі, шифрлауды, хабарландыруды басқару элементтері"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Жеке бөлме"</string>
<string name="private_space_summary" msgid="529869826714610294">"Жеке бөлмені реттеу және т.б."</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Жеке бөлме"</string>
diff --git a/SafetyCenter/Resources/res/values-km-v35/strings.xml b/SafetyCenter/Resources/res/values-km-v35/strings.xml
index 094bcb095..28324bd25 100644
--- a/SafetyCenter/Resources/res/values-km-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-km-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"សុវត្ថិភាពបណ្ដាញចល័ត"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ប្រភេទបណ្ដាញ ការអ៊ីនគ្រីប ការគ្រប់គ្រងការជូនដំណឹង"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"បន្ទប់​ឯកជន"</string>
<string name="private_space_summary" msgid="529869826714610294">"រៀបចំបន្ទប់ឯកជន និងធ្វើអ្វីៗជាច្រើនទៀត"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"បន្ទប់​ឯកជន"</string>
diff --git a/SafetyCenter/Resources/res/values-kn-v35/strings.xml b/SafetyCenter/Resources/res/values-kn-v35/strings.xml
index 5260029a7..d86c54b2a 100644
--- a/SafetyCenter/Resources/res/values-kn-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-kn-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ಸೆಲ್ಯುಲಾರ್ ನೆಟ್‌ವರ್ಕ್ ಭದ್ರತೆ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ನೆಟ್‌ವರ್ಕ್ ಪ್ರಕಾರ, ಎನ್‌ಕ್ರಿಪ್ಶನ್, ನೋಟಿಫಿಕೇಶನ್ ಕಂಟ್ರೋಲ್‌ಗಳು"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ಖಾಸಗಿ ಸ್ಪೇಸ್"</string>
<string name="private_space_summary" msgid="529869826714610294">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಸೆಟಪ್ ಮಾಡಿ ಹಾಗೂ ಇನ್ನಷ್ಟನ್ನು ಮಾಡಿ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ಖಾಸಗಿ ಸ್ಪೇಸ್"</string>
diff --git a/SafetyCenter/Resources/res/values-ko-v35/strings.xml b/SafetyCenter/Resources/res/values-ko-v35/strings.xml
index 56fedb178..19900d3ad 100644
--- a/SafetyCenter/Resources/res/values-ko-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ko-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"셀룰러 네트워크 보안"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"네트워크 유형, 암호화, 알림 설정"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"비공개 스페이스"</string>
<string name="private_space_summary" msgid="529869826714610294">"비공개 스페이스 설정 등"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"비공개 스페이스"</string>
diff --git a/SafetyCenter/Resources/res/values-ky-v35/strings.xml b/SafetyCenter/Resources/res/values-ky-v35/strings.xml
index 307c3a532..540d1b351 100644
--- a/SafetyCenter/Resources/res/values-ky-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ky-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Мобилдик тармактын коопсуздугу"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тармактын түрү, шифрлөө, билдирмелерди башкаруу элементтери"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Жеке чөйрө"</string>
<string name="private_space_summary" msgid="529869826714610294">"Жеке чөйрөнү тууралоо жана башка нерселер"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Жеке чөйрө"</string>
diff --git a/SafetyCenter/Resources/res/values-lo-v35/strings.xml b/SafetyCenter/Resources/res/values-lo-v35/strings.xml
index 381410da3..6de5852c2 100644
--- a/SafetyCenter/Resources/res/values-lo-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-lo-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ຄວາມປອດໄພຂອງເຄືອຂ່າຍມືຖື"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ປະເພດເຄືອຂ່າຍ, ການເຂົ້າລະຫັດ, ການຄວບຄຸມການແຈ້ງເຕືອນ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="private_space_summary" msgid="529869826714610294">"ຕັ້ງຄ່າພື້ນທີ່ສ່ວນຕົວ ແລະ ອື່ນໆ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ພື້ນທີ່ສ່ວນຕົວ"</string>
diff --git a/SafetyCenter/Resources/res/values-lt-v35/strings.xml b/SafetyCenter/Resources/res/values-lt-v35/strings.xml
index b18eda435..6e28e6cea 100644
--- a/SafetyCenter/Resources/res/values-lt-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-lt-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobiliojo ryšio tinklo sauga"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tinklo tipas, šifruotė, pranešimų valdikliai"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privati erdvė"</string>
<string name="private_space_summary" msgid="529869826714610294">"Nustatykite privačią erdvę ir atlikite kitų veiksmų"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privati erdvė"</string>
diff --git a/SafetyCenter/Resources/res/values-lv-v35/strings.xml b/SafetyCenter/Resources/res/values-lv-v35/strings.xml
index ffb1a7f4b..e39d2ea02 100644
--- a/SafetyCenter/Resources/res/values-lv-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-lv-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobilā tīkla drošība"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tīkla veids, šifrējums, paziņojumu vadīklas"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privātā mape"</string>
<string name="private_space_summary" msgid="529869826714610294">"Privātās mapes iestatīšana un citas iespējas"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privātā mape"</string>
diff --git a/SafetyCenter/Resources/res/values-mk-v35/strings.xml b/SafetyCenter/Resources/res/values-mk-v35/strings.xml
index 879a67555..5ecb3db51 100644
--- a/SafetyCenter/Resources/res/values-mk-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-mk-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Безбедност на мобилната мрежа"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Контроли за известувања на тип мрежа, шифрирање"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Приватен простор"</string>
<string name="private_space_summary" msgid="529869826714610294">"Поставување „Приватен простор“ и друго"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Приватен простор"</string>
diff --git a/SafetyCenter/Resources/res/values-ml-v35/strings.xml b/SafetyCenter/Resources/res/values-ml-v35/strings.xml
index c6e728c4f..2923b81c7 100644
--- a/SafetyCenter/Resources/res/values-ml-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ml-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"സെല്ലുലാർ നെറ്റ്‌വർക്ക് സുരക്ഷ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"നെറ്റ്‌വർക്ക് തരം, എൻ‍ക്രിപ്ഷൻ, അറിയിപ്പ് നിയന്ത്രണങ്ങൾ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"സ്വകാര്യ Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"സ്വകാര്യ Space സജ്ജീകരിക്കുകയും മറ്റും ചെയ്യൂ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"സ്വകാര്യ Space"</string>
diff --git a/SafetyCenter/Resources/res/values-mn-v35/strings.xml b/SafetyCenter/Resources/res/values-mn-v35/strings.xml
index 290462d37..1ec4acfc4 100644
--- a/SafetyCenter/Resources/res/values-mn-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-mn-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Үүрэн холбооны сүлжээний аюулгүй байдал"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Сүлжээний төрөл, шифрлэлт, мэдэгдлийн тохиргоо"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Хувийн орон зай"</string>
<string name="private_space_summary" msgid="529869826714610294">"Хувийн орон зай тохируулах болон илүү ихийг хийх"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Хувийн орон зай"</string>
diff --git a/SafetyCenter/Resources/res/values-mr-v35/strings.xml b/SafetyCenter/Resources/res/values-mr-v35/strings.xml
index 0ec596e1c..768af9303 100644
--- a/SafetyCenter/Resources/res/values-mr-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-mr-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"मोबाइल नेटवर्कची सुरक्षा"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"नेटवर्क प्रकार, एन्क्रिप्शन, सूचना नियंत्रणे"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"खाजगी स्पेस"</string>
<string name="private_space_summary" msgid="529869826714610294">"खाजगी स्पेस आणि आणखी बरेच काही सेट करा"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"खाजगी स्पेस"</string>
diff --git a/SafetyCenter/Resources/res/values-ms-v35/strings.xml b/SafetyCenter/Resources/res/values-ms-v35/strings.xml
index b0694a876..a15f04b43 100644
--- a/SafetyCenter/Resources/res/values-ms-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ms-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Keselamatan rangkaian selular"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Jenis rangkaian, penyulitan, kawalan pemberitahuan"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Ruang Peribadi"</string>
<string name="private_space_summary" msgid="529869826714610294">"Sediakan Ruang Peribadi dan pelbagai lagi"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Ruang Peribadi"</string>
diff --git a/SafetyCenter/Resources/res/values-my-v35/strings.xml b/SafetyCenter/Resources/res/values-my-v35/strings.xml
index 4141dd6ac..dd6a9cdda 100644
--- a/SafetyCenter/Resources/res/values-my-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-my-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ဆယ်လူလာကွန်ရက် လုံခြုံရေး"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ကွန်ရက်အမျိုးအစား၊ အသွင်ဝှက်ခြင်း၊ အကြောင်းကြားချက် သတ်မှတ်ချက်များ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"သီးသန့်ချတ်ခန်း"</string>
<string name="private_space_summary" msgid="529869826714610294">"သီးသန့်ချတ်ခန်း စသည်တို့ကို စနစ်ထည့်သွင်းသည်"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"သီးသန့်ချတ်ခန်း"</string>
diff --git a/SafetyCenter/Resources/res/values-nb-v35/strings.xml b/SafetyCenter/Resources/res/values-nb-v35/strings.xml
index 5575b4d1f..ab403952c 100644
--- a/SafetyCenter/Resources/res/values-nb-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-nb-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Sikkerhet for mobilnettverk"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Nettverkstype, kryptering, varselskontroller"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Private Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"Konfigurer Private Space med mer"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Private Space"</string>
diff --git a/SafetyCenter/Resources/res/values-ne-v35/strings.xml b/SafetyCenter/Resources/res/values-ne-v35/strings.xml
index 1d96a0c82..4c79b5b10 100644
--- a/SafetyCenter/Resources/res/values-ne-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ne-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"मोबाइल नेटवर्कको सुरक्षा"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"नेटवर्कको प्रकार, इन्क्रिप्सन, सूचनाका सेटिङ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"निजी स्पेस"</string>
<string name="private_space_summary" msgid="529869826714610294">"निजी स्पेस सेटअप गर्नुहोस् र अन्य कार्यहरू गर्नुहोस्"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"निजी स्पेस"</string>
diff --git a/SafetyCenter/Resources/res/values-nl-v35/strings.xml b/SafetyCenter/Resources/res/values-nl-v35/strings.xml
index dc927ade3..ac2beee11 100644
--- a/SafetyCenter/Resources/res/values-nl-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-nl-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Beveiliging van mobiele netwerken"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Netwerktype, versleuteling, beheeropties voor meldingen"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privéruimte"</string>
<string name="private_space_summary" msgid="529869826714610294">"Privéruimte instellen en meer"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privéruimte"</string>
diff --git a/SafetyCenter/Resources/res/values-or-v35/strings.xml b/SafetyCenter/Resources/res/values-or-v35/strings.xml
index 85c4fa73c..5e546c5db 100644
--- a/SafetyCenter/Resources/res/values-or-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-or-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ସେଲୁଲାର ନେଟୱାର୍କ ସୁରକ୍ଷା"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ନେଟୱାର୍କ ପ୍ରକାର, ଏନକ୍ରିପସନ, ବିଜ୍ଞପ୍ତି ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ପ୍ରାଇଭେଟ ସ୍ପେସ"</string>
<string name="private_space_summary" msgid="529869826714610294">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଏବଂ ଆହୁରି ଅନେକ କିଛି ସେଟଅପ କରନ୍ତୁ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ପ୍ରାଇଭେଟ ସ୍ପେସ"</string>
diff --git a/SafetyCenter/Resources/res/values-pa-v35/strings.xml b/SafetyCenter/Resources/res/values-pa-v35/strings.xml
index f1e2dd714..985f3b144 100644
--- a/SafetyCenter/Resources/res/values-pa-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-pa-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"ਸੈਲਿਊਲਰ ਨੈੱਟਵਰਕ ਸੁਰੱਖਿਆ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ, ਇਨਕ੍ਰਿਪਸ਼ਨ, ਸੂਚਨਾ ਕੰਟਰੋਲ"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ਨਿੱਜੀ ਸਪੇਸ"</string>
<string name="private_space_summary" msgid="529869826714610294">"ਨਿੱਜੀ ਸਪੇਸ ਦਾ ਸੈੱਟਅੱਪ ਅਤੇ ਹੋਰ ਕੰਮ ਕਰੋ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ਨਿੱਜੀ ਸਪੇਸ"</string>
diff --git a/SafetyCenter/Resources/res/values-pl-v35/strings.xml b/SafetyCenter/Resources/res/values-pl-v35/strings.xml
index 56c410a05..0d6747501 100644
--- a/SafetyCenter/Resources/res/values-pl-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-pl-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Zabezpieczenia sieci komórkowej"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Typ sieci, szyfrowanie, ustawienia powiadomień"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Obszar prywatny"</string>
<string name="private_space_summary" msgid="529869826714610294">"Skonfiguruj obszar prywatny i inne ustawienia"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Obszar prywatny"</string>
diff --git a/SafetyCenter/Resources/res/values-pt-rBR-v35/strings.xml b/SafetyCenter/Resources/res/values-pt-rBR-v35/strings.xml
index ef0c3c738..10178f3a2 100644
--- a/SafetyCenter/Resources/res/values-pt-rBR-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-pt-rBR-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Segurança da rede celular"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de rede, criptografia, controles de notificação"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espaço particular"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configurar Espaço particular e mais"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espaço particular"</string>
diff --git a/SafetyCenter/Resources/res/values-pt-rPT-v35/strings.xml b/SafetyCenter/Resources/res/values-pt-rPT-v35/strings.xml
index 6e397ccf0..9456eb00c 100644
--- a/SafetyCenter/Resources/res/values-pt-rPT-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-pt-rPT-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Segurança da rede móvel"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de rede, encriptação, controlos de notificação"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espaço privado"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configure o espaço privado e muito mais"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espaço privado"</string>
diff --git a/SafetyCenter/Resources/res/values-pt-v35/strings.xml b/SafetyCenter/Resources/res/values-pt-v35/strings.xml
index ef0c3c738..10178f3a2 100644
--- a/SafetyCenter/Resources/res/values-pt-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-pt-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Segurança da rede celular"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipo de rede, criptografia, controles de notificação"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Espaço particular"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configurar Espaço particular e mais"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Espaço particular"</string>
diff --git a/SafetyCenter/Resources/res/values-ro-v35/strings.xml b/SafetyCenter/Resources/res/values-ro-v35/strings.xml
index 5884075bf..96a80f9d3 100644
--- a/SafetyCenter/Resources/res/values-ro-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ro-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Securitatea rețelei de date mobile"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tipul de rețea, criptarea, comenzile pentru notificări"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Spațiu privat"</string>
<string name="private_space_summary" msgid="529869826714610294">"Configurează Spațiul privat și altele"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Spațiu privat"</string>
diff --git a/SafetyCenter/Resources/res/values-ru-v35/strings.xml b/SafetyCenter/Resources/res/values-ru-v35/strings.xml
index 29a17d7a9..89e6939a5 100644
--- a/SafetyCenter/Resources/res/values-ru-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ru-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Безопасность мобильной сети"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тип сети, шифрование, управление уведомлениями"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Личное пространство"</string>
<string name="private_space_summary" msgid="529869826714610294">"Настройка личного пространства и не только"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Личное пространство"</string>
diff --git a/SafetyCenter/Resources/res/values-si-v35/strings.xml b/SafetyCenter/Resources/res/values-si-v35/strings.xml
index c3605e2a1..8e8b48460 100644
--- a/SafetyCenter/Resources/res/values-si-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-si-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"සෙලියුලර් ජාල ආරක්ෂාව"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ජාල වර්ගය, සංකේතනය, දැනුම්දීම් පාලන"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"පෞද්ගලික ඉඩ"</string>
<string name="private_space_summary" msgid="529869826714610294">"පෞද්ගලික ඉඩ, සහ තවත් දේ පිහිටුවන්න"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"පෞද්ගලික ඉඩ"</string>
diff --git a/SafetyCenter/Resources/res/values-sk-v35/strings.xml b/SafetyCenter/Resources/res/values-sk-v35/strings.xml
index bed329c6b..fbd935881 100644
--- a/SafetyCenter/Resources/res/values-sk-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sk-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Zabezpečenie mobilnej siete"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Ovládanie typu siete, šifrovania a upozornení"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Súkromný priestor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Nastavte súkromný priestor a ďalšie možnosti"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Súkromný priestor"</string>
diff --git a/SafetyCenter/Resources/res/values-sl-v35/strings.xml b/SafetyCenter/Resources/res/values-sl-v35/strings.xml
index aa7a10258..317b8eb36 100644
--- a/SafetyCenter/Resources/res/values-sl-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sl-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Varnost mobilnega omrežja"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Vrsta omrežja, šifriranje, kontrolniki obvestil"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Zasebni prostor"</string>
<string name="private_space_summary" msgid="529869826714610294">"Nastavitev zasebnega prostora in drugo"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Zasebni prostor"</string>
diff --git a/SafetyCenter/Resources/res/values-sq-v35/strings.xml b/SafetyCenter/Resources/res/values-sq-v35/strings.xml
index 63c642f89..067302507 100644
--- a/SafetyCenter/Resources/res/values-sq-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sq-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Siguria e rrjetit celular"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Lloji i rrjetit, enkriptimi, kontrollet e njoftimeve"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Hapësira private"</string>
<string name="private_space_summary" msgid="529869826714610294">"Konfiguro \"Hapësirën private\" dhe të tjera"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Hapësira private"</string>
diff --git a/SafetyCenter/Resources/res/values-sr-v35/strings.xml b/SafetyCenter/Resources/res/values-sr-v35/strings.xml
index b2349b10a..66ee14e01 100644
--- a/SafetyCenter/Resources/res/values-sr-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sr-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Безбедност мобилне мреже"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тип мреже, шифровање, контроле обавештења"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Приватни простор"</string>
<string name="private_space_summary" msgid="529869826714610294">"Подесите приватни простор и друго"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Приватни простор"</string>
diff --git a/SafetyCenter/Resources/res/values-sv-v35/strings.xml b/SafetyCenter/Resources/res/values-sv-v35/strings.xml
index 85e0e6a7d..1fa3ff62a 100644
--- a/SafetyCenter/Resources/res/values-sv-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sv-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Säkerhet för mobilnätverk"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Nätverkstyp, kryptering, aviseringsinställningar"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Privat rum"</string>
<string name="private_space_summary" msgid="529869826714610294">"Ställ in privat rum med mera"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Privat rum"</string>
diff --git a/SafetyCenter/Resources/res/values-sw-v35/strings.xml b/SafetyCenter/Resources/res/values-sw-v35/strings.xml
index 9ef8839b5..3ddbf11cd 100644
--- a/SafetyCenter/Resources/res/values-sw-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-sw-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Usalama wa mtandao wa simu"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Aina ya mtandao, usimbaji fiche, vidhibiti vya arifa"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Nafasi ya Faragha"</string>
<string name="private_space_summary" msgid="529869826714610294">"Weka mipangilio ya Nafasi ya Faragha na zaidi"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Nafasi ya Faragha"</string>
diff --git a/SafetyCenter/Resources/res/values-ta-v35/strings.xml b/SafetyCenter/Resources/res/values-ta-v35/strings.xml
index 73591d1b0..ca7ac1f84 100644
--- a/SafetyCenter/Resources/res/values-ta-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ta-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"மொபைல் நெட்வொர்க் பாதுகாப்பு"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"நெட்வொர்க் வகை, என்க்ரிப்ஷன், அறிவிப்புக் கட்டுப்பாடுகள்"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"தனிப்பட்ட சேமிப்பிடம்"</string>
<string name="private_space_summary" msgid="529869826714610294">"தனிப்பட்ட சேமிப்பிடத்தை அமைக்கலாம் மற்றும் பலவற்றைச் செய்யலாம்"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"தனிப்பட்ட சேமிப்பிடம்"</string>
diff --git a/SafetyCenter/Resources/res/values-te-v35/strings.xml b/SafetyCenter/Resources/res/values-te-v35/strings.xml
index ffccea816..08691b56a 100644
--- a/SafetyCenter/Resources/res/values-te-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-te-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"సెల్యులర్ నెట్‌వర్క్ సెక్యూరిటీ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"నెట్‌వర్క్ రకం, ఎన్‌క్రిప్షన్, నోటిఫికేషన్ కంట్రోల్స్"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"ప్రైవేట్ స్పేస్"</string>
<string name="private_space_summary" msgid="529869826714610294">"ప్రైవేట్ స్పేస్‌ను సెటప్ చేయండి, మరెన్నింటినో చేయండి"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"ప్రైవేట్ స్పేస్"</string>
diff --git a/SafetyCenter/Resources/res/values-th-v35/strings.xml b/SafetyCenter/Resources/res/values-th-v35/strings.xml
index f16443413..dd9796b66 100644
--- a/SafetyCenter/Resources/res/values-th-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-th-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"การรักษาความปลอดภัยของเครือข่ายมือถือ"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"ประเภทเครือข่าย การเข้ารหัส ส่วนควบคุมการแจ้งเตือน"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"พื้นที่ส่วนตัว"</string>
<string name="private_space_summary" msgid="529869826714610294">"ตั้งค่าพื้นที่ส่วนตัวและอื่นๆ"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"พื้นที่ส่วนตัว"</string>
diff --git a/SafetyCenter/Resources/res/values-tl-v35/strings.xml b/SafetyCenter/Resources/res/values-tl-v35/strings.xml
index f28f2ba45..855fbee18 100644
--- a/SafetyCenter/Resources/res/values-tl-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-tl-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Seguridad ng cellular network"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Network type, pag-encrypt, mga kontrol sa notification"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Pribadong Space"</string>
<string name="private_space_summary" msgid="529869826714610294">"I-set up ang Pribadong Space, at higit pa"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Pribadong Space"</string>
diff --git a/SafetyCenter/Resources/res/values-tr-v35/strings.xml b/SafetyCenter/Resources/res/values-tr-v35/strings.xml
index 26977f3d3..670836e65 100644
--- a/SafetyCenter/Resources/res/values-tr-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-tr-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Hücresel ağ güvenliği"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Ağ türü, şifreleme, bildirim kontrolleri"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Gizli Alan"</string>
<string name="private_space_summary" msgid="529869826714610294">"Gizli alan yapılandırma ve daha fazlası"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Gizli Alan"</string>
diff --git a/SafetyCenter/Resources/res/values-uk-v35/strings.xml b/SafetyCenter/Resources/res/values-uk-v35/strings.xml
index 4478750ab..70ac6516a 100644
--- a/SafetyCenter/Resources/res/values-uk-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-uk-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Безпека мобільної мережі"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Тип мережі, шифрування, налаштування сповіщень"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Приватний простір"</string>
<string name="private_space_summary" msgid="529869826714610294">"Налаштуйте приватний простір тощо"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Приватний простір"</string>
diff --git a/SafetyCenter/Resources/res/values-ur-v35/strings.xml b/SafetyCenter/Resources/res/values-ur-v35/strings.xml
index c506baa97..d9b81b1ce 100644
--- a/SafetyCenter/Resources/res/values-ur-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-ur-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"سیلولر نیٹ ورک سیکیورٹی"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"نیٹ ورک کی قسم، مرموز کاری، نوٹیفکیشن کنٹرولز"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"نجی اسپیس"</string>
<string name="private_space_summary" msgid="529869826714610294">"نجی اسپیس اور بھی بہت کچھ سیٹ اپ کریں"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"نجی اسپیس"</string>
diff --git a/SafetyCenter/Resources/res/values-uz-v35/strings.xml b/SafetyCenter/Resources/res/values-uz-v35/strings.xml
index d8813cc82..bd6adac69 100644
--- a/SafetyCenter/Resources/res/values-uz-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-uz-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Mobil tarmoq xavfsizligi"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Tarmoq turi, shifrlash, bildirishnomalar boshqaruvi"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Maxfiy joy"</string>
<string name="private_space_summary" msgid="529869826714610294">"Maxfiy joyni sozlash"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Maxfiy joy"</string>
diff --git a/SafetyCenter/Resources/res/values-v35/strings.xml b/SafetyCenter/Resources/res/values-v35/strings.xml
index 620dc8d60..bdbc4b648 100644
--- a/SafetyCenter/Resources/res/values-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-v35/strings.xml
@@ -16,6 +16,13 @@
-->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Cellular Network Security -->
+ <string name="cellular_network_security_title" description="The title of the group of safety settings relating to cellular network security">Cellular network security</string>
+ <string name="cellular_network_security_summary" description="The summary of the group of safety settings relating to cellular network security, which describes the group contents">Network type, encryption, notification controls</string>
+
+ <!-- Device unlock -->
+ <string name="biometrics_title_for_private_profile" description="The default title of the setting for managing biometric options on the device for private space"><!-- Empty placeholder--></string>
+
<!-- More settings -->
<string name="private_space_title" description="The title of the entry for Private Space">Private Space</string>
<string name="private_space_summary" description="The summary of the entry for Private Space settings, which describes the page contents">Setup Private Space, and more</string>
diff --git a/SafetyCenter/Resources/res/values-vi-v35/strings.xml b/SafetyCenter/Resources/res/values-vi-v35/strings.xml
index b37e81085..e067e7585 100644
--- a/SafetyCenter/Resources/res/values-vi-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-vi-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Chế độ bảo mật mạng di động"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Loại mạng, quy trình mã hoá, quyền kiểm soát thông báo"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Không gian riêng tư"</string>
<string name="private_space_summary" msgid="529869826714610294">"Thiết lập Không gian riêng tư và các tính năng khác"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Không gian riêng tư"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rCN-v34/strings.xml b/SafetyCenter/Resources/res/values-zh-rCN-v34/strings.xml
index 5b8a8fe8d..ff50335d8 100644
--- a/SafetyCenter/Resources/res/values-zh-rCN-v34/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rCN-v34/strings.xml
@@ -20,8 +20,8 @@
<string name="lock_screen_sources_title" msgid="5493678510117489865">"设备解锁"</string>
<string name="biometrics_title_for_work" msgid="1842284049407771568">"适用于工作应用的生物识别"</string>
<string name="privacy_sources_summary" msgid="4083646673569677049">"权限、信息中心和控件"</string>
- <string name="health_connect_title" msgid="8318152190040327804">"Health Connect"</string>
- <string name="health_connect_search_terms" msgid="4998970586245680829">"健康, Health, Health Connect"</string>
+ <string name="health_connect_title" msgid="8318152190040327804">"健康数据共享"</string>
+ <string name="health_connect_search_terms" msgid="4998970586245680829">"健康, 健康数据共享, Health, Health Connect"</string>
<string name="app_data_sharing_updates_title" msgid="7428862330643262588">"位置数据分享方面的更新"</string>
<string name="app_data_sharing_updates_search_terms" msgid="8414777373734245398">"数据, 数据分享, 数据分享方面的更新, 位置数据分享方面的更新, 分享, Data, Data sharing, Data sharing updates, Data sharing updates for location, sharing"</string>
<string name="advanced_title" msgid="6259362998269627310">"其他设置"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rCN-v35/strings.xml b/SafetyCenter/Resources/res/values-zh-rCN-v35/strings.xml
index e13cffd8a..a613a9e13 100644
--- a/SafetyCenter/Resources/res/values-zh-rCN-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rCN-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"移动网络安全性"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"网络类型、加密、通知控件"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"私密空间"</string>
<string name="private_space_summary" msgid="529869826714610294">"设置私密空间等"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"私密空间"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rHK-v34/strings.xml b/SafetyCenter/Resources/res/values-zh-rHK-v34/strings.xml
index a11abbde1..c850335ad 100644
--- a/SafetyCenter/Resources/res/values-zh-rHK-v34/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rHK-v34/strings.xml
@@ -21,7 +21,7 @@
<string name="biometrics_title_for_work" msgid="1842284049407771568">"用於工作應用程式的生物識別選項"</string>
<string name="privacy_sources_summary" msgid="4083646673569677049">"權限、資訊主頁、控制項"</string>
<string name="health_connect_title" msgid="8318152190040327804">"Health Connect"</string>
- <string name="health_connect_search_terms" msgid="4998970586245680829">"健康, Health Connect"</string>
+ <string name="health_connect_search_terms" msgid="4998970586245680829">"健康, 健康資料同步"</string>
<string name="app_data_sharing_updates_title" msgid="7428862330643262588">"位置資料分享更新"</string>
<string name="app_data_sharing_updates_search_terms" msgid="8414777373734245398">"資料, 資料分享, 資料分享更新, 位置資料分享更新, 分享"</string>
<string name="advanced_title" msgid="6259362998269627310">"其他設定"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rHK-v35/strings.xml b/SafetyCenter/Resources/res/values-zh-rHK-v35/strings.xml
index 996efe5f3..f46f3b083 100644
--- a/SafetyCenter/Resources/res/values-zh-rHK-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rHK-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"流動網絡安全性"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"網絡類型、加密、通知控制項"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"私人空間"</string>
<string name="private_space_summary" msgid="529869826714610294">"設定「私人空間」等項目"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"私人空間"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rTW-v34/strings.xml b/SafetyCenter/Resources/res/values-zh-rTW-v34/strings.xml
index 288a0566c..09f8e9d5d 100644
--- a/SafetyCenter/Resources/res/values-zh-rTW-v34/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rTW-v34/strings.xml
@@ -20,8 +20,8 @@
<string name="lock_screen_sources_title" msgid="5493678510117489865">"裝置解鎖"</string>
<string name="biometrics_title_for_work" msgid="1842284049407771568">"工作應用程式的生物特徵辨識選項"</string>
<string name="privacy_sources_summary" msgid="4083646673569677049">"權限、資訊主頁、控制選項"</string>
- <string name="health_connect_title" msgid="8318152190040327804">"Health Connect"</string>
- <string name="health_connect_search_terms" msgid="4998970586245680829">"健康、Health Connect"</string>
+ <string name="health_connect_title" msgid="8318152190040327804">"健康資料同步"</string>
+ <string name="health_connect_search_terms" msgid="4998970586245680829">"健康, 健康資料同步"</string>
<string name="app_data_sharing_updates_title" msgid="7428862330643262588">"位置資料分享更新"</string>
<string name="app_data_sharing_updates_search_terms" msgid="8414777373734245398">"資料, 資料分享, 資料分享更新, 位置資料分享更新, 分享"</string>
<string name="advanced_title" msgid="6259362998269627310">"其他設定"</string>
diff --git a/SafetyCenter/Resources/res/values-zh-rTW-v35/strings.xml b/SafetyCenter/Resources/res/values-zh-rTW-v35/strings.xml
index 36f68819d..d9b6a4ff6 100644
--- a/SafetyCenter/Resources/res/values-zh-rTW-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-zh-rTW-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"行動網路安全性"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"網路類型、加密、通知控制選項"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"私人空間"</string>
<string name="private_space_summary" msgid="529869826714610294">"設定私人空間等項目"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"私人空間"</string>
diff --git a/SafetyCenter/Resources/res/values-zu-v35/strings.xml b/SafetyCenter/Resources/res/values-zu-v35/strings.xml
index 659e1b58d..237b2974f 100644
--- a/SafetyCenter/Resources/res/values-zu-v35/strings.xml
+++ b/SafetyCenter/Resources/res/values-zu-v35/strings.xml
@@ -17,6 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="cellular_network_security_title" msgid="2986431282931510973">"Ukuphepha kwenethiwekhi yeselula"</string>
+ <string name="cellular_network_security_summary" msgid="7319307247487475572">"Uhlobo lwenethiwekhi, ukubethela, izilawuli zezaziso"</string>
+ <string name="biometrics_title_for_private_profile" msgid="542819107383037820"></string>
<string name="private_space_title" msgid="6158245041481535879">"Isikhala Esiyimfihlo"</string>
<string name="private_space_summary" msgid="529869826714610294">"Setha Isikhala Esiyimfihlo, nokunye"</string>
<string name="private_space_search_terms" msgid="4820808478299116258">"Isikhala Esiyimfihlo"</string>
diff --git a/SafetyCenter/Resources/shared_res/values-pa/strings.xml b/SafetyCenter/Resources/shared_res/values-pa/strings.xml
index 54aad5cbb..8b17156df 100644
--- a/SafetyCenter/Resources/shared_res/values-pa/strings.xml
+++ b/SafetyCenter/Resources/shared_res/values-pa/strings.xml
@@ -39,7 +39,7 @@
<string name="overall_severity_level_critical_account_warning_title" msgid="1913235490583842004">"ਖਾਤਾ ਜੋਖਮ ਵਿੱਚ ਹੈ"</string>
<string name="overall_severity_n_alerts_summary" msgid="3262010942295408403">"{count,plural, =1{ਅਲਰਟ ਦੇਖੋ}one{ਅਲਰਟ ਦੇਖੋ}other{ਅਲਰਟ ਦੇਖੋ}}"</string>
<string name="redirecting_error" msgid="8146983632878233202">"ਪੰਨਾ ਖੋਲ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ"</string>
- <string name="resolving_action_error" msgid="371968886143262375">"ਸੁਚੇਤਨਾ ਦਾ ਹੱਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
+ <string name="resolving_action_error" msgid="371968886143262375">"ਅਲਰਟ ਦਾ ਹੱਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="refresh_error" msgid="656062128422446177">"{count,plural, =1{ਸੈਟਿੰਗ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕੇ}one{ਸੈਟਿੰਗ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕੇ}other{ਸੈਟਿੰਗਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕੇ}}"</string>
<string name="work_profile_paused" msgid="7037400224040869079">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਰੋਕਿਆ ਗਿਆ ਹੈ"</string>
<string name="group_unknown_summary" msgid="6951386960814105641">"ਅਜੇ ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ"</string>
diff --git a/flags/Android.bp b/flags/Android.bp
index 4f0241f91..bd711fb16 100644
--- a/flags/Android.bp
+++ b/flags/Android.bp
@@ -21,45 +21,22 @@ package {
aconfig_declarations {
name: "permissions-aconfig-flags",
package: "com.android.permission.flags",
+ container: "com.android.permission",
srcs: ["flags.aconfig"],
}
java_aconfig_library {
name: "permissions-aconfig-flags-lib",
aconfig_declarations: "permissions-aconfig-flags",
- sdk_version: "system_current",
+ sdk_version: "module_current",
min_sdk_version: "30",
apex_available: [
"com.android.permission",
"test_com.android.permission",
],
installable: false,
+ libs: ["framework-configinfrastructure"],
visibility: [
"//packages/modules/Permission:__subpackages__",
],
}
-
-java_library {
- name: "permissions-flags-lib",
- sdk_version: "system_current",
- min_sdk_version: "30",
- target_sdk_version: "34",
- srcs: [
- "java/**/*.java",
- ],
- static_libs: [
- "permissions-aconfig-flags-lib",
- ],
- libs: [
- "androidx.annotation_annotation",
- "framework-annotations-lib",
- ],
- apex_available: [
- "com.android.permission",
- "test_com.android.permission",
- ],
- installable: false,
- visibility: [
- "//packages/modules/Permission:__subpackages__",
- ],
-} \ No newline at end of file
diff --git a/flags/flags.aconfig b/flags/flags.aconfig
index 37aca2a56..3077dd290 100644
--- a/flags/flags.aconfig
+++ b/flags/flags.aconfig
@@ -1,22 +1,42 @@
package: "com.android.permission.flags"
+container: "com.android.permission"
flag {
- name: "voice_activation_op_enabled"
+ name: "device_aware_permission_grant_enabled"
+ is_fixed_read_only: true
namespace: "permissions"
- description: "This flag is used to support hotword activation events in privacy dashboard"
- bug: "287264308"
+ description: "Enables device aware grant permission flow"
+ bug: "292252664"
}
flag {
- name: "device_aware_permission_grant"
+ name: "private_profile_supported"
namespace: "permissions"
- description: "Enables device aware grant permission flow"
- bug: "292252664"
+ description: "This flag is used to support private profile in safety center"
+ bug: "286539356"
+ is_fixed_read_only: true
+}
+
+flag {
+ name: "private_profile_title_api"
+ namespace: "permissions"
+ description: "This flag is used to guard the private profile title api in safety center"
+ bug: "286539356"
+ is_fixed_read_only: true
}
flag {
- name: "wear_privacy_dashboard_enabled"
+ name: "wear_privacy_dashboard_enabled_read_only"
namespace: "wear_security"
description: "This flag is used to support Privacy dashboard for Wear"
bug: "309721061"
+ is_fixed_read_only: true
+}
+
+flag {
+ name: "archiving_read_only"
+ namespace: "permissions"
+ description: "Feature flag to enable the archiving feature."
+ bug: "278553670"
+ is_fixed_read_only: true
} \ No newline at end of file
diff --git a/framework-s/Android.bp b/framework-s/Android.bp
index 5ee0aac78..7ba674b24 100644
--- a/framework-s/Android.bp
+++ b/framework-s/Android.bp
@@ -45,6 +45,7 @@ java_library {
name: "framework-permission-s-shared",
srcs: [":framework-permission-s-shared-srcs"],
libs: [
+ "error_prone_annotations",
"framework-annotations-lib",
"unsupportedappusage",
],
@@ -80,6 +81,7 @@ java_sdk_library {
"framework-permission-s-shared",
"modules-utils-build",
"android.permission.flags-aconfig-java",
+ "permissions-aconfig-flags-lib",
],
apex_available: [
"com.android.permission",
@@ -93,14 +95,11 @@ java_sdk_library {
],
installable: true,
jarjar_rules: "jarjar-rules.txt",
- lint: {
- strict_updatability_linting: true,
- baseline_filename: "lint-baseline.xml",
- },
min_sdk_version: "31",
permitted_packages: [
"android.permission",
"android.app.role",
+ "android.app.ecm",
"android.safetycenter",
"android.safetylabel",
],
diff --git a/framework-s/api/current.txt b/framework-s/api/current.txt
index d54af92f5..d943a03a1 100644
--- a/framework-s/api/current.txt
+++ b/framework-s/api/current.txt
@@ -14,6 +14,7 @@ package android.app.role {
field public static final String ROLE_HOME = "android.app.role.HOME";
field public static final String ROLE_NOTES = "android.app.role.NOTES";
field public static final String ROLE_SMS = "android.app.role.SMS";
+ field @FlaggedApi("android.permission.flags.wallet_role_enabled") public static final String ROLE_WALLET = "android.app.role.WALLET";
}
}
diff --git a/framework-s/api/module-lib-current.txt b/framework-s/api/module-lib-current.txt
index 80f1cde45..97a8623b3 100644
--- a/framework-s/api/module-lib-current.txt
+++ b/framework-s/api/module-lib-current.txt
@@ -1,4 +1,12 @@
// Signature format: 2.0
+package android.app.ecm {
+
+ @FlaggedApi("android.permission.flags.enhanced_confirmation_mode_apis_enabled") public class EnhancedConfirmationFrameworkInitializer {
+ method public static void registerServiceWrappers();
+ }
+
+}
+
package android.app.role {
public class RoleFrameworkInitializer {
@@ -7,6 +15,7 @@ package android.app.role {
public final class RoleManager {
method @Nullable public String getBrowserRoleHolder(int);
+ method @FlaggedApi("android.permission.flags.get_emergency_role_holder_api_enabled") @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getEmergencyRoleHolder(int);
method @Nullable public String getSmsRoleHolder(int);
method @Nullable @RequiresPermission(android.Manifest.permission.SET_PREFERRED_APPLICATIONS) public boolean setBrowserRoleHolder(@Nullable String, int);
}
diff --git a/framework-s/api/system-current.txt b/framework-s/api/system-current.txt
index b5c379937..e15887576 100644
--- a/framework-s/api/system-current.txt
+++ b/framework-s/api/system-current.txt
@@ -1,4 +1,17 @@
// Signature format: 2.0
+package android.app.ecm {
+
+ @FlaggedApi("android.permission.flags.enhanced_confirmation_mode_apis_enabled") public final class EnhancedConfirmationManager {
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public void clearRestriction(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @NonNull public android.content.Intent createRestrictedSettingDialogIntent(@NonNull String, @NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isRestricted(@NonNull String, @NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public void setClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException;
+ field public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG";
+ }
+
+}
+
package android.app.role {
public interface OnRoleHoldersChangedListener {
@@ -558,6 +571,7 @@ package android.safetycenter.config {
method public int getProfile();
method @StringRes public int getSearchTermsResId();
method @StringRes public int getSummaryResId();
+ method @FlaggedApi("com.android.permission.flags.private_profile_title_api") @StringRes public int getTitleForPrivateProfileResId();
method @StringRes public int getTitleForWorkResId();
method @StringRes public int getTitleResId();
method public int getType();
@@ -593,6 +607,7 @@ package android.safetycenter.config {
method @NonNull public android.safetycenter.config.SafetySource.Builder setRefreshOnPageOpenAllowed(boolean);
method @NonNull public android.safetycenter.config.SafetySource.Builder setSearchTermsResId(@StringRes int);
method @NonNull public android.safetycenter.config.SafetySource.Builder setSummaryResId(@StringRes int);
+ method @FlaggedApi("com.android.permission.flags.private_profile_title_api") @NonNull public android.safetycenter.config.SafetySource.Builder setTitleForPrivateProfileResId(@StringRes int);
method @NonNull public android.safetycenter.config.SafetySource.Builder setTitleForWorkResId(@StringRes int);
method @NonNull public android.safetycenter.config.SafetySource.Builder setTitleResId(@StringRes int);
}
diff --git a/framework-s/jarjar-rules.txt b/framework-s/jarjar-rules.txt
index 39f2ad3b7..da8f5a5f1 100644
--- a/framework-s/jarjar-rules.txt
+++ b/framework-s/jarjar-rules.txt
@@ -1,5 +1,8 @@
rule android.os.HandlerExecutor android.permission.jarjar.@0
-rule android.permission.flags.** android.permission.jarjar.@0
+rule android.permission.flags.*Flags* android.permission.jarjar.@0
+rule android.permission.flags.Flags android.permission.jarjar.@0
rule android.util.IndentingPrintWriter android.permission.jarjar.@0
rule com.android.internal.** android.permission.jarjar.@0
rule com.android.modules.** android.permission.jarjar.@0
+rule com.android.permission.flags.*Flags* android.permission.jarjar.@0
+rule com.android.permission.flags.Flags android.permission.jarjar.@0
diff --git a/framework-s/java/android/app/ecm/EnhancedConfirmationFrameworkInitializer.java b/framework-s/java/android/app/ecm/EnhancedConfirmationFrameworkInitializer.java
new file mode 100644
index 000000000..1a42f7ee2
--- /dev/null
+++ b/framework-s/java/android/app/ecm/EnhancedConfirmationFrameworkInitializer.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.ecm;
+
+import android.annotation.FlaggedApi;
+import android.annotation.SystemApi;
+import android.annotation.TargetApi;
+import android.app.SystemServiceRegistry;
+import android.content.Context;
+import android.os.Build;
+import android.permission.flags.Flags;
+
+/**
+ * Class holding initialization code for enhanced confirmation code in the permission module.
+ *
+ * @hide
+ */
+@FlaggedApi(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+public class EnhancedConfirmationFrameworkInitializer {
+ private EnhancedConfirmationFrameworkInitializer() {}
+
+ /**
+ * Called by {@link SystemServiceRegistry}'s static initializer and registers
+ * {@link EnhancedConfirmationManager} to {@link Context}, so that
+ * {@link Context#getSystemService} can return it.
+ *
+ * <p>If this is called from other places, it throws a {@link IllegalStateException}.
+ */
+ public static void registerServiceWrappers() {
+ SystemServiceRegistry.registerContextAwareService(Context.ECM_ENHANCED_CONFIRMATION_SERVICE,
+ EnhancedConfirmationManager.class,
+ (context, serviceBinder) -> new EnhancedConfirmationManager(context,
+ IEnhancedConfirmationManager.Stub.asInterface(serviceBinder)));
+ }
+}
diff --git a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java
new file mode 100644
index 000000000..74062165e
--- /dev/null
+++ b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java
@@ -0,0 +1,356 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.app.ecm;
+
+import static android.annotation.SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION;
+
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
+import android.annotation.SystemApi;
+import android.annotation.SystemService;
+import android.annotation.TargetApi;
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Build;
+import android.os.RemoteException;
+import android.permission.flags.Flags;
+import android.util.ArraySet;
+
+import androidx.annotation.NonNull;
+
+import java.lang.annotation.Retention;
+
+/**
+ * This class provides the core API for ECM (Enhanced Confirmation Mode). ECM is a feature that
+ * restricts access to protected **settings** (i.e., sensitive resources) by restricted **apps**
+ * (apps from from dangerous sources, such as sideloaded packages or packages downloaded from a web
+ * browser).
+ *
+ * <p>Specifically, this class provides the ability to:
+ *
+ * <ol>
+ * <li>Check whether a setting is restricted from an app ({@link #isRestricted})
+ * <li>Get an intent that will open the "Restricted setting" dialog ({@link
+ * #createRestrictedSettingDialogIntent}) (a dialog that informs the user that the operation
+ * they've attempted to perform is restricted)
+ * <li>Check whether an app is eligible to have its restriction status cleared ({@link
+ * #isClearRestrictionAllowed})
+ * <li>Clear an app's restriction status (i.e., un-restrict it). ({@link #clearRestriction})
+ * </ol>
+ *
+ * <p>Methods of this class will generally accept an app (identified by a packageName and a user)
+ * and a "setting" (a string representing the "sensitive resource") as arguments. ECM's exact
+ * behavior will generally depend on what restriction state ECM considers each setting and app. For
+ * example:
+ *
+ * <ol>
+ * <li>A setting may be considered by ECM to be either **protected** or **not protected**. In
+ * general, this should be considered hardcoded into ECM's implementation: nothing can
+ * "protect" or "unprotect" a setting.
+ * <li>An app may be considered as being **not restricted** or **restricted**. A restricted app
+ * will be restricted from accessing all protected settings. Whether ECM considers any
+ * particular app restricted is an implementation detail of ECM. However, the user is able to
+ * clear any restricted app's restriction status (i.e, un-restrict it), after which ECM will
+ * consider the app **not restricted**.
+ * </ol>
+ *
+ * Why is ECM needed? Consider the following (pre-ECM) scenario:
+ *
+ * <ol>
+ * <li>The user downloads and installs an apk file from a browser.
+ * <li>The user opens Settings -> Accessibility
+ * <li>The user tries to register the app as an accessibility service.
+ * <li>The user is shown a permission prompt "Allow _ to have full control of your device?"
+ * <li>The user clicks "Allow"
+ * <li>The downloaded app now has full control of the device.
+ * </ol>
+ *
+ * The purpose of ECM is to add more friction to this scenario.
+ *
+ * <p>With ECM, this scenario becomes:
+ *
+ * <ol>
+ * <li>The user downloads and installs an apk file from a browser.
+ * <li>The user goes into Settings -> Accessibility.
+ * <li>The user tries to register the app as an accessibility service.
+ * <li>The user is presented with a "Restricted setting" dialog explaining that the attempted
+ * action has been restricted. (No "allow" button is shown, but a link is given to a screen
+ * with intentionally-obscure instructions on how to proceed.)
+ * <li>The user must now navigate to Settings -> Apps -> [app]
+ * <li>The user then must click on "..." (top-right corner hamburger menu), then click "Allow
+ * restricted settings"
+ * <li>The user goes (again) into Settings -> Accessibility and (again) tries to register the app
+ * as an accessibility service.
+ * <li>The user is shown a permission prompt "Allow _ to have full control of your device?"
+ * <li>The user clicks "Allow"
+ * <li>The downloaded app now has full control of the device.
+ * </ol>
+ *
+ * And, expanding on the above scenario, the role that this class plays is as follows:
+ *
+ * <ol>
+ * <li>The user downloads and installs an apk file from a browser.
+ * <li>The user goes into Settings -> Accessibility.
+ * <p>**This screen then calls {@link #isRestricted}, which checks whether each app listed
+ * on-screen is restricted from the accessibility service setting. It uses this to visually
+ * "gray out" restricted apps.**
+ * <li>The user tries to register the app as an accessibility service.
+ * <p>**This screen then calls {@link #createRestrictedSettingDialogIntent} and starts the
+ * intent. This opens the "Restricted setting" dialog.**
+ * <li>The user is presented with a "Restricted setting" dialog explaining that the attempted
+ * action is restricted. (No "allow" button is shown, but a link is given to a screen with
+ * intentionally-obscure instructions on how to proceed.)
+ * <p>**Upon opening, this dialog marks the app as eligible to have its restriction status
+ * cleared.**
+ * <li>The user must now navigate to Settings -> Apps -> [app].
+ * <p>**This screen calls {@link #isClearRestrictionAllowed} to check whether the app is
+ * eligible to have its restriction status cleared. If this returns {@code true}, this screen
+ * should then show a "Allow restricted setting" button inside the top-right hamburger menu.**
+ * <li>The user then must click on "..." (top-right corner hamburger menu), then click "Allow
+ * restricted settings".
+ * <p>**In response, this screen should now call {@link #clearRestriction}.**
+ * <li>The user goes (again) into Settings -> Accessibility and (again) tries to register the app
+ * as an accessibility service.
+ * <li>The user is shown a permission prompt "Allow _ to have full control of your device?"
+ * <li>The user clicks "Allow"
+ * <li>The downloaded app now has full control of the device.
+ * </ol>
+ *
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+@TargetApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+@SystemService(Context.ECM_ENHANCED_CONFIRMATION_SERVICE)
+public final class EnhancedConfirmationManager {
+ /*
+ * At the API level, we use the following terminology:
+ *
+ * - The capability of an app to access a setting may be considered (by ECM) to be *restricted*
+ * or *not restricted*.
+ * - A setting may be considered (by ECM) to be *protected* or *not protected*.
+ * - The state of an app may be considered (by ECM) to be *restricted* or *not restricted*
+ *
+ * In this implementation, however, the state of an app is considered either **guarded** or
+ * **not guarded**; these terms can generally be considered synonymous with **restricted** and
+ * **not restricted**. (Keeping in mind that, the capability of any app to access any
+ * non-protected setting will always be considered "not restricted", even if the state of the
+ * app is considered "restricted".). An app can also be in a third state: **guarded and
+ * acknowledged**, which corresponds with an app that is restricted and is eligible to have its
+ * restriction status cleared.
+ *
+ * Currently, the ECM state of any given app is stored in the OP_ACCESS_RESTRICTED_SETTINGS
+ * appop (though this may change in the future):
+ *
+ * - MODE_ALLOWED means the app is explicitly **not guarded**. (U- default)
+ * - MODE_ERRORED means the app is explicitly **guarded**. (Only settable in U-.)
+ * - MODE_IGNORED means the app is explicitly **guarded and acknowledged**. (An app enters this
+ * state as soon as the "Restricted setting" dialog has been shown to the user. If an app is
+ * in this state, Settings is now allowed to provide the user with the option to clear the
+ * restriction.)
+ * - MODE_DEFAULT means the app's ECM state should be decided lazily. (V+ default) (That is,
+ * each time a caller checks whether or not an app is considered guarded by ECM, we'll run an
+ * heuristic to determine this.)
+ *
+ * Some notes on compatibility:
+ *
+ * - On U-, MODE_ALLOWED is the default mode of OP_ACCESS_RESTRICTED_SETTINGS. On both U- and
+ * V+, this is also the mode after the app's restriction has been cleared.
+ * - In U-, the mode needed to be explicitly set (for example, by a browser that allows a
+ * dangerous app to be installed) to MODE_ERRORED to indicate that an app is guarded. In V+,
+ * we no longer allow an app to be placed into MODE_ERRORED, but for compatibility, we still
+ * recognize MODE_ERRORED to indicate that an app is explicitly guarded.
+ * - In V+, the default mode is MODE_DEFAULT. Unlike U-, this potentially affects *all* apps,
+ * not just the ones which have been explicitly marked as **guarded**.
+ *
+ * Regarding ECM "setting"s: a setting may be any abstract resource identified by a string. ECM
+ * may consider any particular setting **protected** or **not protected**. For now, the set of
+ * protected settings is hardcoded, but this may evolve in the future.
+ *
+ * TODO(b/320512579): These methods currently enforce UPDATE_APP_OPS_STATS,
+ * UPDATE_APP_OPS_STATS, and, for setter methods, MANAGE_APP_OPS_MODES. We should add
+ * RequiresPermission annotations, but we can't, because some of these permissions are hidden
+ * API. Either upgrade these to SystemApi or enforce a different permission, then add the
+ * appropriate RequiresPermission annotation.
+ */
+
+ /**
+ * Shows the "Restricted setting" dialog. Opened when a setting is blocked.
+ */
+ @SdkConstant(BROADCAST_INTENT_ACTION)
+ public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG =
+ "android.app.ecm.action.SHOW_ECM_RESTRICTED_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,
+ EcmState.ECM_STATE_GUARDED, EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED,
+ EcmState.ECM_STATE_IMPLICIT})
+ private @interface EcmState {
+ int ECM_STATE_NOT_GUARDED = AppOpsManager.MODE_ALLOWED;
+ int ECM_STATE_GUARDED = AppOpsManager.MODE_ERRORED;
+ int ECM_STATE_GUARDED_AND_ACKNOWLEDGED = AppOpsManager.MODE_IGNORED;
+ int ECM_STATE_IMPLICIT = AppOpsManager.MODE_DEFAULT;
+ }
+
+ private static final String LOG_TAG = EnhancedConfirmationManager.class.getSimpleName();
+
+ private static final ArraySet<String> PROTECTED_SETTINGS = new ArraySet<>();
+
+ static {
+ PROTECTED_SETTINGS.add(AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
+ // TODO(b/310654015): Add other explicitly protected settings
+ }
+
+ private final @NonNull Context mContext;
+ private final PackageManager mPackageManager;
+
+ private final @NonNull IEnhancedConfirmationManager mService;
+
+ /**
+ * @hide
+ */
+ public EnhancedConfirmationManager(@NonNull Context context,
+ @NonNull IEnhancedConfirmationManager service) {
+ mContext = context;
+ mPackageManager = context.getPackageManager();
+ mService = service;
+ }
+
+ /**
+ * Check whether a setting is restricted from an app.
+ *
+ * <p>This is {@code true} when the setting is a protected setting (i.e., a sensitive resource),
+ * and the app is restricted (i.e., considered dangerous), and the user has not yet cleared the
+ * app's restriction status (i.e., by clicking "Allow restricted settings" for this app).
+ *
+ * @param packageName package name of the application to check for
+ * @param settingIdentifier identifier of the resource to check to check for
+ * @return {@code true} if the setting is restricted from the app
+ * @throws NameNotFoundException if the provided package was not found
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES)
+ public boolean isRestricted(@NonNull String packageName, @NonNull String settingIdentifier)
+ throws NameNotFoundException {
+ try {
+ return mService.isRestricted(packageName, settingIdentifier,
+ mContext.getUser().getIdentifier());
+ } catch (IllegalArgumentException e) {
+ throw new NameNotFoundException(packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Clear an app's restriction status (i.e., un-restrict it).
+ *
+ * <p>After this is called, the app will no longer be restricted from accessing any protected
+ * setting by ECM. This method should be called when the user clicks "Allow restricted settings"
+ * for the app.
+ *
+ * @param packageName package name of the application to remove protection from
+ * @throws NameNotFoundException if the provided package was not found
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES)
+ public void clearRestriction(@NonNull String packageName) throws NameNotFoundException {
+ try {
+ mService.clearRestriction(packageName, mContext.getUser().getIdentifier());
+ } catch (IllegalArgumentException e) {
+ throw new NameNotFoundException(packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Check whether the provided app is eligible to have its restriction status cleared (i.e., the
+ * app is restricted, and the "Restricted setting" dialog has been presented to the user).
+ *
+ * <p>The Settings UI should use method this to check whether to present the user with the
+ * "Allow restricted settings" button.
+ *
+ * @param packageName package name of the application to check for
+ * @return {@code true} if the settings UI should present the user with the ability to clear
+ * restrictions from the provided app
+ * @throws NameNotFoundException if the provided package was not found
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES)
+ public boolean isClearRestrictionAllowed(@NonNull String packageName)
+ throws NameNotFoundException {
+ try {
+ return mService.isClearRestrictionAllowed(packageName,
+ mContext.getUser().getIdentifier());
+ } catch (IllegalArgumentException e) {
+ throw new NameNotFoundException(packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Mark the app as eligible to have its restriction status cleared.
+ *
+ * <p>This should be called from the "Restricted setting" dialog (which {@link
+ * #createRestrictedSettingDialogIntent} directs to) upon being presented to the user.
+ *
+ * @param packageName package name of the application which should be considered acknowledged
+ * @throws NameNotFoundException if the provided package was not found
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES)
+ public void setClearRestrictionAllowed(@NonNull String packageName)
+ throws NameNotFoundException {
+ try {
+ mService.setClearRestrictionAllowed(packageName, mContext.getUser().getIdentifier());
+ } catch (IllegalArgumentException e) {
+ throw new NameNotFoundException(packageName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Gets an intent that will open the "Restricted setting" dialog for the specified package
+ * and setting.
+ *
+ * <p>The "Restricted setting" dialog is a dialog that informs the user that the operation
+ * they've attempted to perform is restricted, and provides them with a link explaining how to
+ * proceed.
+ *
+ * @param packageName package name of the restricted application
+ * @param settingIdentifier identifier of the restricted setting
+ * @throws NameNotFoundException if the provided package was not found
+ */
+ public @NonNull Intent createRestrictedSettingDialogIntent(@NonNull String packageName,
+ @NonNull String settingIdentifier) throws NameNotFoundException {
+ Intent intent = new Intent(ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG);
+ intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName);
+ intent.putExtra(Intent.EXTRA_UID, getPackageUid(packageName));
+ intent.putExtra(Intent.EXTRA_SUBJECT, settingIdentifier);
+ return intent;
+ }
+
+ private int getPackageUid(String packageName) throws NameNotFoundException {
+ return mPackageManager.getApplicationInfoAsUser(packageName, /* flags */ 0,
+ mContext.getUser()).uid;
+ }
+}
diff --git a/flags/java/com/android/permission/flags/PermissionsFlags.java b/framework-s/java/android/app/ecm/IEnhancedConfirmationManager.aidl
index afab3fae5..5149daa49 100644
--- a/flags/java/com/android/permission/flags/PermissionsFlags.java
+++ b/framework-s/java/android/app/ecm/IEnhancedConfirmationManager.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,20 @@
* limitations under the License.
*/
-package com.android.permission.flags;
+package android.app.ecm;
-/** Class used for flags that do not work with aconfig tooling */
-public final class PermissionsFlags {}
+import android.os.RemoteCallback;
+
+/**
+ * @hide
+ */
+interface IEnhancedConfirmationManager {
+
+ boolean isRestricted(in String packageName, in String settingIdentifier, int userId);
+
+ void clearRestriction(in String packageName, int userId);
+
+ boolean isClearRestrictionAllowed(in String packageName, int userId);
+
+ void setClearRestrictionAllowed(in String packageName, int userId);
+}
diff --git a/framework-s/java/android/app/role/IRoleManager.aidl b/framework-s/java/android/app/role/IRoleManager.aidl
index 0aef871e6..522967630 100644
--- a/framework-s/java/android/app/role/IRoleManager.aidl
+++ b/framework-s/java/android/app/role/IRoleManager.aidl
@@ -74,6 +74,8 @@ interface IRoleManager {
String getSmsRoleHolder(int userId);
+ String getEmergencyRoleHolder(int userId);
+
boolean isRoleVisibleAsUser(in String roleName, int userId);
boolean isApplicationVisibleForRoleAsUser(in String roleName, in String packageName,
diff --git a/framework-s/java/android/app/role/RoleManager.java b/framework-s/java/android/app/role/RoleManager.java
index 3cf1e94ba..4b8c9b388 100644
--- a/framework-s/java/android/app/role/RoleManager.java
+++ b/framework-s/java/android/app/role/RoleManager.java
@@ -146,6 +146,15 @@ public final class RoleManager {
public static final String ROLE_NOTES = "android.app.role.NOTES";
/**
+ * The name of the Wallet role.
+ *
+ * @see android.nfc.cardemulation.CardEmulation
+ */
+ @FlaggedApi(Flags.FLAG_WALLET_ROLE_ENABLED)
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ public static final String ROLE_WALLET = "android.app.role.WALLET";
+
+ /**
* The name of the system wellbeing role.
*
* @hide
@@ -966,6 +975,28 @@ public final class RoleManager {
}
/**
+ * Allows getting the role holder for {@link #ROLE_EMERGENCY} without requiring
+ * {@link Manifest.permission#OBSERVE_ROLE_HOLDERS}.
+ *
+ * @param userId the user ID to get the default emergency package for
+ * @return the package name of the default emergency app, or {@code null} if none
+ *
+ * @hide
+ */
+ @FlaggedApi(Flags.FLAG_GET_EMERGENCY_ROLE_HOLDER_API_ENABLED)
+ @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @Nullable
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public String getEmergencyRoleHolder(@UserIdInt int userId) {
+ try {
+ return mService.getEmergencyRoleHolder(userId);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Check whether a role should be visible to user.
*
* @param roleName name of the role to check for
diff --git a/framework-s/java/android/safetycenter/config/SafetySource.java b/framework-s/java/android/safetycenter/config/SafetySource.java
index 8aa897850..ff0c66e24 100644
--- a/framework-s/java/android/safetycenter/config/SafetySource.java
+++ b/framework-s/java/android/safetycenter/config/SafetySource.java
@@ -18,9 +18,11 @@ package android.safetycenter.config;
import static android.os.Build.VERSION_CODES.TIRAMISU;
import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
+import static android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM;
import static java.util.Objects.requireNonNull;
+import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -34,6 +36,7 @@ import android.util.ArraySet;
import androidx.annotation.RequiresApi;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permission.flags.Flags;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -182,6 +185,9 @@ public final class SafetySource implements Parcelable {
builder.addPackageCertificateHash(certs.get(i));
}
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ builder.setTitleForPrivateProfileResId(in.readInt());
+ }
return builder.build();
}
@@ -207,6 +213,7 @@ public final class SafetySource implements Parcelable {
private final boolean mNotificationsAllowed;
@Nullable final String mDeduplicationGroup;
@NonNull private final Set<String> mPackageCertificateHashes;
+ @StringRes private final int mTitleForPrivateProfileResId;
private SafetySource(
@SafetySourceType int type,
@@ -224,7 +231,8 @@ public final class SafetySource implements Parcelable {
boolean refreshOnPageOpenAllowed,
boolean notificationsAllowed,
@Nullable String deduplicationGroup,
- @NonNull Set<String> packageCertificateHashes) {
+ @NonNull Set<String> packageCertificateHashes,
+ @StringRes int titleForPrivateProfileResId) {
mType = type;
mId = id;
mPackageName = packageName;
@@ -241,6 +249,7 @@ public final class SafetySource implements Parcelable {
mNotificationsAllowed = notificationsAllowed;
mDeduplicationGroup = deduplicationGroup;
mPackageCertificateHashes = Set.copyOf(packageCertificateHashes);
+ mTitleForPrivateProfileResId = titleForPrivateProfileResId;
}
/** Returns the type of this safety source. */
@@ -347,6 +356,37 @@ public final class SafetySource implements Parcelable {
}
/**
+ * Returns the resource id of the title for private profile of this safety source.
+ *
+ * <p>The id refers to a string resource that is either accessible from any resource context or
+ * that is accessible from the same resource context that was used to load the Safety Center
+ * configuration. The id is {@link Resources#ID_NULL} when a title for private profile is not
+ * provided.
+ *
+ * @throws UnsupportedOperationException if the source is of type {@link
+ * SafetySource#SAFETY_SOURCE_TYPE_ISSUE_ONLY} or if the profile property of the source is
+ * set to {@link SafetySource#PROFILE_PRIMARY}
+ */
+ @FlaggedApi(Flags.FLAG_PRIVATE_PROFILE_TITLE_API)
+ @RequiresApi(VANILLA_ICE_CREAM)
+ @StringRes
+ public int getTitleForPrivateProfileResId() {
+ if (!SdkLevel.isAtLeastV()) {
+ throw new UnsupportedOperationException(
+ "getTitleForPrivateProfileResId unsupported for SDKs lower than V");
+ }
+ if (mType == SAFETY_SOURCE_TYPE_ISSUE_ONLY) {
+ throw new UnsupportedOperationException(
+ "getTitleForPrivateProfileResId unsupported for issue-only safety source");
+ }
+ if (mProfile == PROFILE_PRIMARY) {
+ throw new UnsupportedOperationException(
+ "getTitleForPrivateProfileResId unsupported for primary profile safety source");
+ }
+ return mTitleForPrivateProfileResId;
+ }
+
+ /**
* Returns the resource id of the summary of this safety source.
*
* <p>The id refers to a string resource that is either accessible from any resource context or
@@ -554,7 +594,8 @@ public final class SafetySource implements Parcelable {
&& mRefreshOnPageOpenAllowed == that.mRefreshOnPageOpenAllowed
&& mNotificationsAllowed == that.mNotificationsAllowed
&& Objects.equals(mDeduplicationGroup, that.mDeduplicationGroup)
- && Objects.equals(mPackageCertificateHashes, that.mPackageCertificateHashes);
+ && Objects.equals(mPackageCertificateHashes, that.mPackageCertificateHashes)
+ && mTitleForPrivateProfileResId == that.mTitleForPrivateProfileResId;
}
@Override
@@ -575,7 +616,8 @@ public final class SafetySource implements Parcelable {
mRefreshOnPageOpenAllowed,
mNotificationsAllowed,
mDeduplicationGroup,
- mPackageCertificateHashes);
+ mPackageCertificateHashes,
+ mTitleForPrivateProfileResId);
}
@Override
@@ -613,6 +655,8 @@ public final class SafetySource implements Parcelable {
+ mDeduplicationGroup
+ ", mPackageCertificateHashes="
+ mPackageCertificateHashes
+ + ", mTitleForPrivateProfileResId="
+ + mTitleForPrivateProfileResId
+ '}';
}
@@ -641,6 +685,9 @@ public final class SafetySource implements Parcelable {
dest.writeString(mDeduplicationGroup);
dest.writeStringList(List.copyOf(mPackageCertificateHashes));
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ dest.writeInt(mTitleForPrivateProfileResId);
+ }
}
/** Builder class for {@link SafetySource}. */
@@ -662,6 +709,7 @@ public final class SafetySource implements Parcelable {
@Nullable private Boolean mNotificationsAllowed;
@Nullable private String mDeduplicationGroup;
@NonNull private final ArraySet<String> mPackageCertificateHashes = new ArraySet<>();
+ @Nullable @StringRes private Integer mTitleForPrivateProfileResId;
/** Creates a {@link Builder} for a {@link SafetySource}. */
public Builder(@SafetySourceType int type) {
@@ -692,6 +740,7 @@ public final class SafetySource implements Parcelable {
mNotificationsAllowed = safetySource.mNotificationsAllowed;
mDeduplicationGroup = safetySource.mDeduplicationGroup;
mPackageCertificateHashes.addAll(safetySource.mPackageCertificateHashes);
+ mTitleForPrivateProfileResId = safetySource.mTitleForPrivateProfileResId;
}
/**
@@ -759,6 +808,32 @@ public final class SafetySource implements Parcelable {
}
/**
+ * Sets the resource id of the title for private profile of this safety source.
+ *
+ * <p>The id must refer to a string resource that is either accessible from any resource
+ * context or that is accessible from the same resource context that was used to load the
+ * Safety Center configuration. The id defaults to {@link Resources#ID_NULL} when a title
+ * for private profile is not provided.
+ *
+ * <p>The title for private profile is required if the profile property of the source is set
+ * to {@link SafetySource#PROFILE_ALL} and either the source is of type static or the source
+ * is a source of type dynamic that is not hidden and that does not provide search terms.
+ * The title for private profile is prohibited for sources of type issue-only and if the
+ * profile property of the source is not set to {@link SafetySource#PROFILE_ALL}.
+ */
+ @FlaggedApi(Flags.FLAG_PRIVATE_PROFILE_TITLE_API)
+ @RequiresApi(VANILLA_ICE_CREAM)
+ @NonNull
+ public Builder setTitleForPrivateProfileResId(@StringRes int titleForPrivateProfileResId) {
+ if (!SdkLevel.isAtLeastV()) {
+ throw new UnsupportedOperationException(
+ "setTitleForPrivateProfileResId unsupported for SDKs lower than V");
+ }
+ mTitleForPrivateProfileResId = titleForPrivateProfileResId;
+ return this;
+ }
+
+ /**
* Sets the resource id of the summary of this safety source.
*
* <p>The id must refer to a string resource that is either accessible from any resource
@@ -984,7 +1059,7 @@ public final class SafetySource implements Parcelable {
PROFILE_NONE,
PROFILE_PRIMARY,
PROFILE_ALL);
- boolean hasWork = profile == PROFILE_ALL;
+ boolean hasAllProfiles = profile == PROFILE_ALL;
int searchTermsResId =
BuilderUtils.validateResId(
@@ -1000,8 +1075,8 @@ public final class SafetySource implements Parcelable {
BuilderUtils.validateResId(
mTitleForWorkResId,
"titleForWork",
- hasWork && titleRequired,
- !hasWork || isIssueOnly);
+ hasAllProfiles && titleRequired,
+ !hasAllProfiles || isIssueOnly);
int summaryResId =
BuilderUtils.validateResId(
@@ -1052,6 +1127,16 @@ public final class SafetySource implements Parcelable {
packageCertificateHashes, "packageCertificateHashes", false, isStatic);
}
+ int titleForPrivateProfileResId = Resources.ID_NULL;
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ titleForPrivateProfileResId =
+ BuilderUtils.validateResId(
+ mTitleForPrivateProfileResId,
+ "titleForPrivateProfile",
+ hasAllProfiles && titleRequired,
+ !hasAllProfiles || isIssueOnly);
+ }
+
return new SafetySource(
type,
id,
@@ -1068,7 +1153,8 @@ public final class SafetySource implements Parcelable {
refreshOnPageOpenAllowed,
notificationsAllowed,
deduplicationGroup,
- packageCertificateHashes);
+ packageCertificateHashes,
+ titleForPrivateProfileResId);
}
}
}
diff --git a/framework-s/java/android/safetycenter/config/safety_center_config-v35.xsd b/framework-s/java/android/safetycenter/config/safety_center_config-v35.xsd
new file mode 100644
index 000000000..20b1e7655
--- /dev/null
+++ b/framework-s/java/android/safetycenter/config/safety_center_config-v35.xsd
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- This file contains comments that define constraints that cannot be covered by the XSD language -->
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ version="1.0">
+
+ <xsd:element name="safety-center-config" type="safety-center-config"/>
+
+ <xsd:complexType name="safety-center-config">
+ <xsd:sequence>
+ <xsd:element name="safety-sources-config" type="safety-sources-config"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="safety-sources-config">
+ <xsd:sequence>
+ <xsd:element
+ name="safety-sources-group" type="safety-sources-group"
+ minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="safety-sources-group">
+ <xsd:choice minOccurs="1" maxOccurs="unbounded">
+ <xsd:element name="dynamic-safety-source" type="dynamic-safety-source"/>
+ <xsd:element name="static-safety-source" type="static-safety-source"/>
+ <xsd:element name="issue-only-safety-source" type="issue-only-safety-source"/>
+ </xsd:choice>
+ <!-- id must be unique among safety sources groups -->
+ <xsd:attribute name="id" type="idOrStringResourceName" use="required"/>
+ <!-- title is required unless the group contains issue only and/or internal sources -->
+ <xsd:attribute name="title" type="runtimeStringResourceName"/>
+ <xsd:attribute name="summary" type="runtimeStringResourceName"/>
+ <xsd:attribute name="statelessIconType" type="statelessIconTypeOrStringResourceName"
+ default="none"/>
+ <!-- type is inferred from other attributes and the group content if omitted -->
+ <xsd:attribute name="type" type="groupTypeOrStringResourceName"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="dynamic-safety-source">
+ <!-- id must be unique among safety sources -->
+ <xsd:attribute name="id" type="idOrStringResourceName" use="required"/>
+ <xsd:attribute name="packageName" type="stringOrStringResourceName" use="required"/>
+ <!-- optional comma-separated set of certificate hashes, if provided will be used for validation. -->
+ <xsd:attribute name="packageCertificateHashes" type="stringOrStringResourceName"/>
+ <!-- title is required if initialDisplayState is not set to hidden or if searchTerms are provided -->
+ <xsd:attribute name="title" type="runtimeStringResourceName"/>
+ <!-- titleForWork is required if profile is set to all_profiles, and initialDisplayState is not set to hidden or if searchTerms are provided -->
+ <!-- titleForWork is prohibited if profile is set to primary_profile_only -->
+ <xsd:attribute name="titleForWork" type="runtimeStringResourceName"/>
+ <!-- titleForPrivateProfile is required if profile is set to all_profiles, and initialDisplayState is not set to hidden or if searchTerms are provided -->
+ <!-- titleForPrivateProfile is prohibited if profile is set to primary_profile_only -->
+ <xsd:attribute name="titleForPrivateProfile" type="runtimeStringResourceName"/>
+ <!-- summary is required if initialDisplayState is not set to hidden -->
+ <xsd:attribute name="summary" type="runtimeStringResourceName"/>
+ <!-- intentAction is required if initialDisplayState is set to enabled -->
+ <xsd:attribute name="intentAction" type="stringOrStringResourceName"/>
+ <xsd:attribute name="profile" type="profile" use="required"/>
+ <xsd:attribute name="initialDisplayState" type="initialDisplayStateOrStringResourceName"
+ default="enabled"/>
+ <xsd:attribute name="maxSeverityLevel" type="intOrStringResourceName" default="2147483647"/>
+ <xsd:attribute name="searchTerms" type="runtimeStringResourceName"/>
+ <xsd:attribute name="loggingAllowed" type="booleanOrStringResourceName" default="true"/>
+ <xsd:attribute name="refreshOnPageOpenAllowed" type="booleanOrStringResourceName"
+ default="false"/>
+ <xsd:attribute name="notificationsAllowed" type="booleanOrStringResourceName"
+ default="false"/>
+ <xsd:attribute name="deduplicationGroup" type="stringOrStringResourceName"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="issue-only-safety-source">
+ <!-- id must be unique among safety sources -->
+ <xsd:attribute name="id" type="idOrStringResourceName" use="required"/>
+ <xsd:attribute name="packageName" type="stringOrStringResourceName" use="required"/>
+ <!-- optional comma-separated set of certificate hashes, if provided will be used for validation. -->
+ <xsd:attribute name="packageCertificateHashes" type="stringOrStringResourceName"/>
+ <xsd:attribute name="profile" type="profileOrStringResourceName" use="required"/>
+ <xsd:attribute name="maxSeverityLevel" type="intOrStringResourceName" default="2147483647"/>
+ <xsd:attribute name="loggingAllowed" type="booleanOrStringResourceName" default="true"/>
+ <xsd:attribute name="refreshOnPageOpenAllowed" type="booleanOrStringResourceName"
+ default="false"/>
+ <xsd:attribute name="notificationsAllowed" type="booleanOrStringResourceName"
+ default="false"/>
+ <xsd:attribute name="deduplicationGroup" type="stringOrStringResourceName"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="static-safety-source">
+ <!-- id must be unique among safety sources -->
+ <xsd:attribute name="id" type="idOrStringResourceName" use="required"/>
+ <xsd:attribute name="packageName" type="stringOrStringResourceName"/>
+ <xsd:attribute name="title" type="runtimeStringResourceName" use="required"/>
+ <!-- titleForWork is required if profile is set to all_profiles -->
+ <!-- titleForWork is prohibited if profile is set to primary_profile_only -->
+ <xsd:attribute name="titleForWork" type="runtimeStringResourceName"/>
+ <!-- titleForPrivateProfile is required if profile is set to all_profiles -->
+ <!-- titleForPrivateProfile is prohibited if profile is set to primary_profile_only -->
+ <xsd:attribute name="titleForPrivateProfile" type="runtimeStringResourceName"/>
+ <xsd:attribute name="summary" type="runtimeStringResourceName"/>
+ <xsd:attribute name="intentAction" type="stringOrStringResourceName" use="required"/>
+ <xsd:attribute name="profile" type="profileOrStringResourceName" use="required"/>
+ <xsd:attribute name="searchTerms" type="runtimeStringResourceName"/>
+ </xsd:complexType>
+
+ <xsd:simpleType name="intOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type xsd:int. -->
+ <xsd:union memberTypes="stringResourceName xsd:int"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="booleanOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type xsd:boolean. -->
+ <xsd:union memberTypes="stringResourceName xsd:boolean"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="stringOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type xsd:string. -->
+ <xsd:union memberTypes="stringResourceName xsd:string"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="idOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type xsd:string. -->
+ <xsd:union memberTypes="stringResourceName id"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="id">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9a-zA-Z_-]+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="statelessIconTypeOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type statelessIconType. -->
+ <xsd:union memberTypes="stringResourceName statelessIconType"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="statelessIconType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="none"/>
+ <xsd:enumeration value="privacy"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="profileOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type profile. -->
+ <xsd:union memberTypes="stringResourceName profile"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="profile">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="primary_profile_only"/>
+ <xsd:enumeration value="all_profiles"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="initialDisplayStateOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type initialDisplayState. -->
+ <xsd:union memberTypes="stringResourceName initialDisplayState"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="initialDisplayState">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="enabled"/>
+ <xsd:enumeration value="disabled"/>
+ <xsd:enumeration value="hidden"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="groupTypeOrStringResourceName">
+ <!-- String resource names will be resolved only once at parse time. -->
+ <!-- Locale changes and device config changes will be ignored. -->
+ <!-- The value of the string resource must be of type groupType. -->
+ <xsd:union memberTypes="stringResourceName groupType"/>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="groupType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="stateless"/>
+ <xsd:enumeration value="stateful"/>
+ <xsd:enumeration value="hidden"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="runtimeStringResourceName">
+ <!-- String resource names will be resolved at runtime whenever the string value is used. -->
+ <xsd:union memberTypes="stringResourceName"/>
+ </xsd:simpleType>
+
+ <!-- String resource names will be ignored for any attribute not directly or indirectly marked as stringResourceName. -->
+ <!-- A stringResourceName is a fully qualified resource name of the form "@package:string/entry". Package is required. -->
+ <xsd:simpleType name="stringResourceName">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="@([a-z]+\.)*[a-z]+:string/.+"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema>
diff --git a/framework-s/lint-baseline.xml b/framework-s/lint-baseline.xml
index b91b959e4..eb4ed1796 100644
--- a/framework-s/lint-baseline.xml
+++ b/framework-s/lint-baseline.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.content.Context#getUser`"
- errorLine1=" .append(String.valueOf(mContext.getUser().getIdentifier())).println();"
- errorLine2=" ~~~~~~~">
+ message="Call requires API level 33 (current min is 30): `android.util.Slog#e`"
+ errorLine1=' Slog.e(LOG_TAG, "Failed to unbind: " + e);'
+ errorLine2=" ~">
<location
file="frameworks/base/core/java/com/android/internal/infra/ServiceConnector.java"
- line="707"
- column="53"/>
+ line="576"
+ column="26"/>
</issue>
<issue
@@ -25,13 +25,13 @@
<issue
id="NewApi"
- message="Call requires API level 33 (current min is 30): `android.util.Slog#e`"
- errorLine1=' Slog.e(LOG_TAG, "Failed to unbind: " + e);'
- errorLine2=" ~">
+ message="Call requires API level 31 (current min is 30): `android.content.Context#getUser`"
+ errorLine1=" .append(String.valueOf(mContext.getUser().getIdentifier())).println();"
+ errorLine2=" ~~~~~~~">
<location
file="frameworks/base/core/java/com/android/internal/infra/ServiceConnector.java"
- line="576"
- column="26"/>
+ line="707"
+ column="53"/>
</issue>
</issues> \ No newline at end of file
diff --git a/framework/java/android/permission/PermissionState.java b/framework/java/android/permission/PermissionStateUnused.java
index e810db8ec..21b21cc27 100644
--- a/framework/java/android/permission/PermissionState.java
+++ b/framework/java/android/permission/PermissionStateUnused.java
@@ -19,4 +19,4 @@ package android.permission;
/**
* @hide
*/
-public class PermissionState {}
+public class PermissionStateUnused {}
diff --git a/service/Android.bp b/service/Android.bp
index 64f0dd5e2..f9342deb9 100644
--- a/service/Android.bp
+++ b/service/Android.bp
@@ -45,9 +45,6 @@ java_library {
"com.android.permission",
"test_com.android.permission",
],
- lint: {
- baseline_filename: "lint-baseline.xml",
- },
}
java_library {
@@ -66,9 +63,6 @@ java_library {
installable: false,
min_sdk_version: "30",
sdk_version: "system_server_current",
- lint: {
- baseline_filename: "lint-baseline.xml",
- },
}
java_sdk_library {
@@ -117,6 +111,7 @@ java_sdk_library {
"service-permission-statsd",
"service-permission-proto-stream",
"android.permission.flags-aconfig-java",
+ "permissions-aconfig-flags-lib",
],
errorprone: {
javacflags: ["-Xep:GuardedBy:ERROR"],
@@ -131,7 +126,6 @@ java_sdk_library {
"-Xno-receiver-assertions",
],
lint: {
- strict_updatability_linting: true,
baseline_filename: "lint-baseline.xml",
},
min_sdk_version: "30",
@@ -143,6 +137,7 @@ java_sdk_library {
installable: true,
permitted_packages: [
"com.android.access",
+ "com.android.ecm",
"com.android.permission",
"com.android.role",
"com.android.safetycenter",
@@ -176,7 +171,4 @@ java_library {
],
min_sdk_version: "30",
sdk_version: "system_server_current",
- lint: {
- baseline_filename: "lint-baseline.xml",
- },
}
diff --git a/service/jarjar-rules.txt b/service/jarjar-rules.txt
index a3fd75930..299cc4529 100644
--- a/service/jarjar-rules.txt
+++ b/service/jarjar-rules.txt
@@ -1,8 +1,11 @@
rule android.os.HandlerExecutor com.android.permission.jarjar.@0
-rule android.permission.flags.** com.android.permission.jarjar.@0
+rule android.permission.flags.*Flags* com.android.permission.jarjar.@0
+rule android.permission.flags.Flags com.android.permission.jarjar.@0
rule android.util.IndentingPrintWriter com.android.permission.jarjar.@0
rule com.android.internal.** com.android.permission.jarjar.@0
rule com.android.modules.** com.android.permission.jarjar.@0
+rule com.android.permission.flags.*Flags* com.android.permission.jarjar.@0
+rule com.android.permission.flags.Flags com.android.permission.jarjar.@0
rule com.android.role.*Proto com.android.permission.jarjar.@0
# TODO(b/236200992): Revisit addition of rule com.android.safetycenter.annotations,
# com.android.safetycenter.internaldata, com.android.safetycenter.pendingintents and
diff --git a/service/java/com/android/ecm/EnhancedConfirmationService.java b/service/java/com/android/ecm/EnhancedConfirmationService.java
new file mode 100644
index 000000000..c5700f3ed
--- /dev/null
+++ b/service/java/com/android/ecm/EnhancedConfirmationService.java
@@ -0,0 +1,374 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.ecm;
+
+import android.Manifest;
+import android.annotation.FlaggedApi;
+import android.annotation.IntDef;
+import android.annotation.UserIdInt;
+import android.app.AppOpsManager;
+import android.app.ecm.EnhancedConfirmationManager;
+import android.app.ecm.IEnhancedConfirmationManager;
+import android.app.role.RoleManager;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.PackageInstaller;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.SignedPackage;
+import android.os.Binder;
+import android.os.Build;
+import android.os.SystemConfigManager;
+import android.os.UserHandle;
+import android.permission.flags.Flags;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import com.android.internal.util.Preconditions;
+import com.android.permission.util.UserUtils;
+import com.android.server.SystemService;
+
+import java.lang.annotation.Retention;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+/**
+ * Service for ECM (Enhanced Confirmation Mode).
+ *
+ * @see EnhancedConfirmationManager
+ *
+ * @hide
+ */
+@Keep
+@FlaggedApi(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
+public class EnhancedConfirmationService extends SystemService {
+ private static final String LOG_TAG = EnhancedConfirmationService.class.getSimpleName();
+
+ private Map<String, List<byte[]>> mTrustedPackageCertDigests;
+ private Map<String, List<byte[]>> mTrustedInstallerCertDigests;
+
+ public EnhancedConfirmationService(@NonNull Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
+ Context context = getContext();
+ SystemConfigManager systemConfigManager = context.getSystemService(
+ SystemConfigManager.class);
+ mTrustedPackageCertDigests = toTrustedPackageMap(
+ systemConfigManager.getEnhancedConfirmationTrustedPackages());
+ mTrustedInstallerCertDigests = toTrustedPackageMap(
+ systemConfigManager.getEnhancedConfirmationTrustedInstallers());
+
+ publishBinderService(Context.ECM_ENHANCED_CONFIRMATION_SERVICE, new Stub());
+ }
+
+ private Map<String, List<byte[]>> toTrustedPackageMap(Set<SignedPackage> signedPackages) {
+ ArrayMap<String, List<byte[]>> trustedPackageMap = new ArrayMap<>();
+ for (SignedPackage signedPackage : signedPackages) {
+ ArrayList<byte[]> certDigests = (ArrayList<byte[]>) trustedPackageMap.computeIfAbsent(
+ signedPackage.getPackageName(), packageName -> new ArrayList<>(1));
+ certDigests.add(signedPackage.getCertificateDigest());
+ }
+ return trustedPackageMap;
+ }
+
+ private class Stub extends IEnhancedConfirmationManager.Stub {
+
+ /** 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,
+ EcmState.ECM_STATE_GUARDED, EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED,
+ EcmState.ECM_STATE_IMPLICIT})
+ private @interface EcmState {
+ int ECM_STATE_NOT_GUARDED = AppOpsManager.MODE_ALLOWED;
+ int ECM_STATE_GUARDED = AppOpsManager.MODE_ERRORED;
+ int ECM_STATE_GUARDED_AND_ACKNOWLEDGED = AppOpsManager.MODE_IGNORED;
+ int ECM_STATE_IMPLICIT = AppOpsManager.MODE_DEFAULT;
+ }
+
+ private static final ArraySet<String> PROTECTED_SETTINGS = new ArraySet<>();
+
+ static {
+ // Runtime permissions
+ // TODO(b/310654818): Construct this list by permission group instead of by permission
+ PROTECTED_SETTINGS.add(Manifest.permission.READ_PHONE_STATE);
+ PROTECTED_SETTINGS.add(Manifest.permission.READ_PHONE_NUMBERS);
+ PROTECTED_SETTINGS.add(Manifest.permission.CALL_PHONE);
+ PROTECTED_SETTINGS.add(Manifest.permission.ADD_VOICEMAIL);
+ PROTECTED_SETTINGS.add(Manifest.permission.USE_SIP);
+ PROTECTED_SETTINGS.add(Manifest.permission.ANSWER_PHONE_CALLS);
+ PROTECTED_SETTINGS.add(Manifest.permission.ACCEPT_HANDOVER);
+
+ PROTECTED_SETTINGS.add(Manifest.permission.SEND_SMS);
+ PROTECTED_SETTINGS.add(Manifest.permission.RECEIVE_SMS);
+ PROTECTED_SETTINGS.add(Manifest.permission.READ_SMS);
+ PROTECTED_SETTINGS.add(Manifest.permission.RECEIVE_MMS);
+ PROTECTED_SETTINGS.add(Manifest.permission.RECEIVE_WAP_PUSH);
+ PROTECTED_SETTINGS.add(Manifest.permission.READ_CELL_BROADCASTS);
+ // TODO(b/310654818): Add other explicitly protected runtime permissions
+ // App ops
+ PROTECTED_SETTINGS.add(AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
+ PROTECTED_SETTINGS.add(AppOpsManager.OPSTR_ACCESS_NOTIFICATIONS);
+ // Default application roles.
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_ASSISTANT);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_BROWSER);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_CALL_REDIRECTION);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_CALL_SCREENING);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_DIALER);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_HOME);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_SMS);
+ PROTECTED_SETTINGS.add(RoleManager.ROLE_WALLET);
+ // Other settings
+ PROTECTED_SETTINGS.add(AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE);
+ // TODO(b/310654015): Add other explicitly protected settings
+ }
+
+ private final @NonNull Context mContext;
+ private final String mAttributionTag;
+ private final AppOpsManager mAppOpsManager;
+ private final PackageManager mPackageManager;
+
+ Stub() {
+ Context context = getContext();
+ mContext = context;
+ mAttributionTag = context.getAttributionTag();
+ mAppOpsManager = context.getSystemService(AppOpsManager.class);
+ mPackageManager = context.getPackageManager();
+ }
+
+ public boolean isRestricted(@NonNull String packageName, @NonNull String settingIdentifier,
+ @UserIdInt int userId) {
+ enforcePermissions("isRestricted", userId);
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ Log.e(LOG_TAG, "user " + userId + " does not exist");
+ return false;
+ }
+
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+ Preconditions.checkStringNotEmpty(settingIdentifier,
+ "settingIdentifier cannot be null or empty");
+
+ try {
+ return isSettingEcmProtected(settingIdentifier) && isPackageEcmGuarded(packageName,
+ userId);
+ } catch (NameNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public void clearRestriction(@NonNull String packageName, @UserIdInt int userId) {
+ enforcePermissions("clearRestriction", userId);
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ return;
+ }
+
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+
+ try {
+ int state = getAppEcmState(packageName, userId);
+ boolean isAllowed = state == EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED;
+ if (!isAllowed) {
+ throw new IllegalStateException("Clear restriction attempted but not allowed");
+ }
+ setAppEcmState(packageName, EcmState.ECM_STATE_NOT_GUARDED, userId);
+ } catch (NameNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public boolean isClearRestrictionAllowed(@NonNull String packageName,
+ @UserIdInt int userId) {
+ enforcePermissions("isClearRestrictionAllowed", userId);
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ return false;
+ }
+
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+
+ try {
+ int state = getAppEcmState(packageName, userId);
+ return state == EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED;
+ } catch (NameNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public void setClearRestrictionAllowed(@NonNull String packageName, @UserIdInt int userId) {
+ enforcePermissions("setClearRestrictionAllowed", userId);
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ return;
+ }
+
+ Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty");
+
+ try {
+ if (isPackageEcmGuarded(packageName, userId)) {
+ setAppEcmState(packageName, EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED,
+ userId);
+ }
+ } catch (NameNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ private void enforcePermissions(@NonNull String methodName, @UserIdInt int userId) {
+ UserUtils.enforceCrossUserPermission(userId, false, methodName, mContext);
+ mContext.enforceCallingOrSelfPermission(
+ android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES, methodName);
+ }
+
+ private boolean isPackageEcmGuarded(@NonNull String packageName, @UserIdInt int userId)
+ throws NameNotFoundException {
+ // Always trust allow-listed and pre-installed packages
+ if (isAllowlistedPackage(packageName) || isAllowlistedInstaller(packageName)
+ || isPackagePreinstalled(packageName, userId)) {
+ return false;
+ }
+
+ // If the package already has an explicitly-set state, use that
+ @EcmState int ecmState = getAppEcmState(packageName, userId);
+ if (ecmState == EcmState.ECM_STATE_GUARDED
+ || ecmState == EcmState.ECM_STATE_GUARDED_AND_ACKNOWLEDGED) {
+ return true;
+ }
+ if (ecmState == EcmState.ECM_STATE_NOT_GUARDED) {
+ return false;
+ }
+
+ // Otherwise, lazily decide whether the app is considered guarded.
+ InstallSourceInfo installSource;
+ try {
+ installSource = mPackageManager.getInstallSourceInfo(packageName);
+ } catch (NameNotFoundException e) {
+ Log.w(LOG_TAG, "Package not found: " + packageName);
+ return false;
+ }
+
+ // These install sources are always considered dangerous.
+ // PackageInstallers that are trusted can use these as a signal that the
+ // packages they've installed aren't as trusted as themselves.
+ int packageSource = installSource.getPackageSource();
+ if (packageSource == PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE
+ || packageSource == PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE) {
+ return true;
+ }
+
+ // If applicable, trust packages installed via non-allowlisted installers
+ if (trustPackagesInstalledViaNonAllowlistedInstallers()) return false;
+
+ // ECM doesn't consider a transitive chain of trust for install sources.
+ // If this package hasn't been explicitly handled by this point
+ // then it is exempt from ECM if the immediate parent is a trusted installer
+ return !isAllowlistedInstaller(installSource.getInstallingPackageName());
+ }
+
+ private boolean isAllowlistedPackage(String packageName) {
+ return isPackageSignedWithAnyOf(packageName,
+ mTrustedPackageCertDigests.get(packageName));
+ }
+
+ private boolean isAllowlistedInstaller(String packageName) {
+ return isPackageSignedWithAnyOf(packageName,
+ mTrustedInstallerCertDigests.get(packageName));
+ }
+
+ private boolean isPackageSignedWithAnyOf(String packageName, List<byte[]> certDigests) {
+ if (packageName != null && certDigests != null) {
+ for (int i = 0, count = certDigests.size(); i < count; i++) {
+ byte[] trustedCertDigest = certDigests.get(i);
+ if (mPackageManager.hasSigningCertificate(packageName, trustedCertDigest,
+ PackageManager.CERT_INPUT_SHA256)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private boolean trustPackagesInstalledViaNonAllowlistedInstallers() {
+ return true; // TODO(b/327469700): Make this configurable
+ }
+
+ private boolean isPackagePreinstalled(@NonNull String packageName, @UserIdInt int userId) {
+ ApplicationInfo applicationInfo;
+ try {
+ applicationInfo = mPackageManager.getApplicationInfoAsUser(packageName, 0,
+ UserHandle.of(userId));
+ } catch (NameNotFoundException e) {
+ Log.w(LOG_TAG, "Package not found: " + packageName);
+ return false;
+ }
+ return (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
+ }
+
+ private void setAppEcmState(@NonNull String packageName, @EcmState int ecmState,
+ @UserIdInt int userId) throws NameNotFoundException {
+ int packageUid = getPackageUid(packageName, userId);
+ final long identityToken = Binder.clearCallingIdentity();
+ try {
+ mAppOpsManager.setMode(AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS, packageUid,
+ packageName, ecmState);
+ } finally {
+ Binder.restoreCallingIdentity(identityToken);
+ }
+ }
+
+ private @EcmState int getAppEcmState(@NonNull String packageName, @UserIdInt int userId)
+ throws NameNotFoundException {
+ int packageUid = getPackageUid(packageName, userId);
+ final long identityToken = Binder.clearCallingIdentity();
+ try {
+ return mAppOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS,
+ packageUid, packageName, mAttributionTag, /* message */ null);
+ } finally {
+ Binder.restoreCallingIdentity(identityToken);
+ }
+ }
+
+ private boolean isSettingEcmProtected(@NonNull String settingIdentifier) {
+ if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)
+ || mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)
+ || mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
+ return false;
+ }
+
+ if (PROTECTED_SETTINGS.contains(settingIdentifier)) {
+ return true;
+ }
+ // TODO(b/310218979): Add role selections as protected settings
+ return false;
+ }
+
+ private int getPackageUid(@NonNull String packageName, @UserIdInt int userId)
+ throws NameNotFoundException {
+ return mPackageManager.getApplicationInfoAsUser(packageName, /* flags */ 0,
+ UserHandle.of(userId)).uid;
+ }
+ }
+}
diff --git a/service/java/com/android/permission/util/UserUtils.java b/service/java/com/android/permission/util/UserUtils.java
index 8205be239..33389a88f 100644
--- a/service/java/com/android/permission/util/UserUtils.java
+++ b/service/java/com/android/permission/util/UserUtils.java
@@ -25,7 +25,9 @@ import android.os.UserHandle;
import android.os.UserManager;
import com.android.internal.util.Preconditions;
+import com.android.modules.utils.build.SdkLevel;
import com.android.permission.compat.UserHandleCompat;
+import com.android.permission.flags.Flags;
import java.util.List;
@@ -92,6 +94,39 @@ public final class UserUtils {
}
/**
+ * Returns whether the given {@code userId} is a private profile. Note that private profiles are
+ * allowed from Android V+ only, so this method will return false on Sdk levels below that.
+ */
+ public static boolean isPrivateProfile(@UserIdInt int userId, @NonNull Context context) {
+ if (!isPrivateProfileSupported()) {
+ return false;
+ }
+ // It's needed to clear the calling identity because we are going to query the UserManager
+ // for isPrivateProfile() and Context for createContextAsUser, which requires one of the
+ // following permissions:
+ // MANAGE_USERS, QUERY_USERS, or INTERACT_ACROSS_USERS.
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Context userContext = context
+ .createContextAsUser(UserHandle.of(userId), /* flags= */ 0);
+ UserManager userManager = userContext.getSystemService(UserManager.class);
+ return userManager != null && userManager.isPrivateProfile();
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+
+ /**
+ * Returns whether private profile's allowed to exist. This can be true iff the SdkLevel is at
+ * least V AND the permission module's private profile feature flag is enabled.
+ */
+ public static boolean isPrivateProfileSupported() {
+ //TODO(b/286539356) add the os feature flag protection when available.
+ return SdkLevel.isAtLeastV() && Flags.privateProfileSupported();
+ }
+
+ /**
* Returns whether a given {@code userId} corresponds to a running managed profile, i.e. the
* user is running and the quiet mode is not enabled.
*/
diff --git a/service/java/com/android/role/RoleService.java b/service/java/com/android/role/RoleService.java
index 2524627eb..8348d4064 100644
--- a/service/java/com/android/role/RoleService.java
+++ b/service/java/com/android/role/RoleService.java
@@ -100,15 +100,22 @@ public class RoleService extends SystemService implements RoleUserState.Callback
private static final long GRANT_DEFAULT_ROLES_INTERVAL_MILLIS = 1000;
- private static final String[] DEFAULT_APPLICATION_ROLES = {
- RoleManager.ROLE_ASSISTANT,
- RoleManager.ROLE_BROWSER,
- RoleManager.ROLE_CALL_REDIRECTION,
- RoleManager.ROLE_CALL_SCREENING,
- RoleManager.ROLE_DIALER,
- RoleManager.ROLE_HOME,
- RoleManager.ROLE_SMS,
- };
+ private static final String[] DEFAULT_APPLICATION_ROLES;
+
+ static {
+ List<String> defaultApplicationRoles = new ArrayList<>();
+ defaultApplicationRoles.add(RoleManager.ROLE_ASSISTANT);
+ defaultApplicationRoles.add(RoleManager.ROLE_BROWSER);
+ defaultApplicationRoles.add(RoleManager.ROLE_CALL_REDIRECTION);
+ defaultApplicationRoles.add(RoleManager.ROLE_CALL_SCREENING);
+ defaultApplicationRoles.add(RoleManager.ROLE_DIALER);
+ defaultApplicationRoles.add(RoleManager.ROLE_HOME);
+ defaultApplicationRoles.add(RoleManager.ROLE_SMS);
+ if (SdkLevel.isAtLeastV()) {
+ defaultApplicationRoles.add(RoleManager.ROLE_WALLET);
+ }
+ DEFAULT_APPLICATION_ROLES = defaultApplicationRoles.toArray(new String[0]);
+ }
@NonNull
private final AppOpsManager mAppOpsManager;
@@ -313,6 +320,11 @@ public class RoleService extends SystemService implements RoleUserState.Callback
@AnyThread
@NonNull
private AndroidFuture<Void> maybeGrantDefaultRolesInternal(@UserIdInt int userId) {
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ Log.w(LOG_TAG, "User " + userId + " does not exist");
+ return AndroidFuture.completedFuture(null);
+ }
+
RoleUserState userState = getOrCreateUserState(userId);
String oldPackagesHash = userState.getPackagesHash();
String newPackagesHash = mPlatformHelper.computePackageStateHash(userId);
@@ -923,6 +935,33 @@ public class RoleService extends SystemService implements RoleUserState.Callback
}
@Override
+ public String getEmergencyRoleHolder(int userId) {
+ final Context context = getContext();
+ UserUtils.enforceCrossUserPermission(userId, false, "getEmergencyRoleHolder", context);
+ if (!UserUtils.isUserExistent(userId, getContext())) {
+ Log.e(LOG_TAG, "user " + userId + " does not exist");
+ return null;
+ }
+
+ getContext().enforceCallingOrSelfPermission(
+ Manifest.permission.READ_PRIVILEGED_PHONE_STATE, "getEmergencyRoleHolder");
+
+ final String packageName;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ packageName = CollectionUtils.firstOrNull(getRoleHoldersAsUser(
+ RoleManager.ROLE_EMERGENCY, userId));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ if (packageName != null && !PackageUtils.canCallingOrSelfPackageQuery(packageName,
+ userId, context)) {
+ return null;
+ }
+ return packageName;
+ }
+
+ @Override
public boolean isRoleVisibleAsUser(@NonNull String roleName, @UserIdInt int userId) {
UserUtils.enforceCrossUserPermission(userId, false, "isRoleVisibleAsUser",
getContext());
diff --git a/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java b/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java
index a36beb2d3..5c9dfa664 100644
--- a/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java
+++ b/service/java/com/android/safetycenter/SafetyCenterBroadcastDispatcher.java
@@ -49,6 +49,7 @@ import androidx.annotation.Nullable;
import com.android.permission.util.PackageUtils;
import com.android.safetycenter.SafetyCenterConfigReader.Broadcast;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.data.SafetyCenterDataManager;
import java.time.Duration;
@@ -334,37 +335,35 @@ final class SafetyCenterBroadcastDispatcher {
* lists of source IDs.
*
* <p>The set of user IDs (keys) is the profile parent user ID of {@code userProfileGroup} plus
- * the (possibly empty) set of running managed profile user IDs in that group.
- *
+ * all the other types of running profiles:
+ * <ol>
+ * <li>The (possibly empty) set of running managed profile user IDs in that group.
+ * <li>The (possibly empty) set of running private profile user ID in that group.
+ * </ol>
* <p>Every value present is a non-empty list, but the overall result may be empty.
*/
private SparseArray<List<String>> getUserIdsToSourceIds(
Broadcast broadcast,
UserProfileGroup userProfileGroup,
@RefreshReason int refreshReason) {
- int[] managedProfileIds = userProfileGroup.getManagedRunningProfilesUserIds();
- SparseArray<List<String>> result = new SparseArray<>(managedProfileIds.length + 1);
- List<String> profileParentSources =
- getSourceIdsForRefreshReason(
- refreshReason,
- broadcast.getSourceIdsForProfileParent(),
- broadcast.getSourceIdsForProfileParentOnPageOpen(),
- userProfileGroup.getProfileParentUserId());
-
- if (!profileParentSources.isEmpty()) {
- result.put(userProfileGroup.getProfileParentUserId(), profileParentSources);
- }
-
- for (int i = 0; i < managedProfileIds.length; i++) {
- List<String> managedProfileSources =
- getSourceIdsForRefreshReason(
- refreshReason,
- broadcast.getSourceIdsForManagedProfiles(),
- broadcast.getSourceIdsForManagedProfilesOnPageOpen(),
- managedProfileIds[i]);
-
- if (!managedProfileSources.isEmpty()) {
- result.put(managedProfileIds[i], managedProfileSources);
+ SparseArray<List<String>> result =
+ new SparseArray<>(userProfileGroup.getNumRunningProfiles());
+ for (int profilTypeIdx = 0;
+ profilTypeIdx < ProfileType.ALL_PROFILE_TYPES.length;
+ ++profilTypeIdx) {
+ @ProfileType int profileType = ProfileType.ALL_PROFILE_TYPES[profilTypeIdx];
+ int[] runningProfiles = userProfileGroup.getRunningProfilesOfType(profileType);
+ for (int profileIdx = 0; profileIdx < runningProfiles.length; ++profileIdx) {
+ List<String> profileSources =
+ getSourceIdsForRefreshReason(
+ refreshReason,
+ broadcast.getSourceIdsForProfileType(profileType),
+ broadcast.getSourceIdsOnPageOpenForProfileType(profileType),
+ runningProfiles[profileIdx]);
+
+ if (!profileSources.isEmpty()) {
+ result.put(runningProfiles[profileIdx], profileSources);
+ }
}
}
diff --git a/service/java/com/android/safetycenter/SafetyCenterConfigReader.java b/service/java/com/android/safetycenter/SafetyCenterConfigReader.java
index c473ad916..641c242f1 100644
--- a/service/java/com/android/safetycenter/SafetyCenterConfigReader.java
+++ b/service/java/com/android/safetycenter/SafetyCenterConfigReader.java
@@ -16,6 +16,11 @@
package com.android.safetycenter;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_MANAGED;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIMARY;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIVATE;
+
+import static java.util.Collections.emptyList;
import static java.util.Collections.unmodifiableList;
import static java.util.Objects.requireNonNull;
@@ -28,6 +33,7 @@ import android.util.Log;
import androidx.annotation.Nullable;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.config.ParseException;
import com.android.safetycenter.config.SafetyCenterConfigParser;
import com.android.safetycenter.resources.SafetyCenterResourcesApk;
@@ -410,7 +416,7 @@ public final class SafetyCenterConfigReader {
broadcast.mSourceIdsForProfileParentOnPageOpen.add(safetySource.getId());
}
boolean needsManagedProfilesBroadcast =
- SafetySources.supportsManagedProfiles(safetySource);
+ SafetySources.supportsProfileType(safetySource, PROFILE_TYPE_MANAGED);
if (needsManagedProfilesBroadcast) {
broadcast.mSourceIdsForManagedProfiles.add(safetySource.getId());
if (safetySource.isRefreshOnPageOpenAllowed()) {
@@ -418,6 +424,19 @@ public final class SafetyCenterConfigReader {
safetySource.getId());
}
}
+
+ // TODO(b/317378205): think about generalising these fields in Broadcast so that
+ // we are not duplicating the code - it can be a source of confusion and errors
+ // in future.
+ boolean needsPrivateProfileBroadcast =
+ SafetySources.supportsProfileType(safetySource, PROFILE_TYPE_PRIVATE);
+ if (needsPrivateProfileBroadcast) {
+ broadcast.mSourceIdsForPrivateProfile.add(safetySource.getId());
+ if (safetySource.isRefreshOnPageOpenAllowed()) {
+ broadcast.mSourceIdsForPrivateProfileOnPageOpen.add(
+ safetySource.getId());
+ }
+ }
}
}
@@ -486,6 +505,8 @@ public final class SafetyCenterConfigReader {
private final List<String> mSourceIdsForProfileParentOnPageOpen = new ArrayList<>();
private final List<String> mSourceIdsForManagedProfiles = new ArrayList<>();
private final List<String> mSourceIdsForManagedProfilesOnPageOpen = new ArrayList<>();
+ private final List<String> mSourceIdsForPrivateProfile = new ArrayList<>();
+ private final List<String> mSourceIdsForPrivateProfileOnPageOpen = new ArrayList<>();
private Broadcast(String packageName) {
mPackageName = packageName;
@@ -497,41 +518,42 @@ public final class SafetyCenterConfigReader {
}
/**
- * Returns the safety source ids associated with this broadcast in the profile owner.
- *
- * <p>If this list is empty, there are no sources to dispatch to in the profile owner.
- */
- List<String> getSourceIdsForProfileParent() {
- return unmodifiableList(mSourceIdsForProfileParent);
- }
-
- /**
- * Returns the safety source ids associated with this broadcast in the profile owner that
- * have refreshOnPageOpenAllowed set to true in the XML config.
+ * Returns the safety source ids associated with this broadcast in the given profile type.
*
- * <p>If this list is empty, there are no sources to dispatch to in the profile owner.
+ * <p>If this list is empty, there are no sources to dispatch to in the given profile type.
*/
- List<String> getSourceIdsForProfileParentOnPageOpen() {
- return unmodifiableList(mSourceIdsForProfileParentOnPageOpen);
- }
-
- /**
- * Returns the safety source ids associated with this broadcast in the managed profile(s).
- *
- * <p>If this list is empty, there are no sources to dispatch to in the managed profile(s).
- */
- List<String> getSourceIdsForManagedProfiles() {
- return unmodifiableList(mSourceIdsForManagedProfiles);
+ List<String> getSourceIdsForProfileType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return unmodifiableList(mSourceIdsForProfileParent);
+ case PROFILE_TYPE_MANAGED:
+ return unmodifiableList(mSourceIdsForManagedProfiles);
+ case PROFILE_TYPE_PRIVATE:
+ return unmodifiableList(mSourceIdsForPrivateProfile);
+ default:
+ Log.w(TAG, "source ids asked for unexpected profile " + profileType);
+ return emptyList();
+ }
}
/**
- * Returns the safety source ids associated with this broadcast in the managed profile(s)
+ * Returns the safety source ids associated with this broadcast in the given profile type
* that have refreshOnPageOpenAllowed set to true in the XML config.
*
- * <p>If this list is empty, there are no sources to dispatch to in the managed profile(s).
+ * <p>If this list is empty, there are no sources to dispatch to in the given profile type.
*/
- List<String> getSourceIdsForManagedProfilesOnPageOpen() {
- return unmodifiableList(mSourceIdsForManagedProfilesOnPageOpen);
+ List<String> getSourceIdsOnPageOpenForProfileType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return unmodifiableList(mSourceIdsForProfileParentOnPageOpen);
+ case PROFILE_TYPE_MANAGED:
+ return unmodifiableList(mSourceIdsForManagedProfilesOnPageOpen);
+ case PROFILE_TYPE_PRIVATE:
+ return unmodifiableList(mSourceIdsForPrivateProfileOnPageOpen);
+ default:
+ Log.w(TAG, "source ids asked for unexpected profile " + profileType);
+ return emptyList();
+ }
}
@Override
@@ -545,7 +567,10 @@ public final class SafetyCenterConfigReader {
that.mSourceIdsForProfileParentOnPageOpen)
&& mSourceIdsForManagedProfiles.equals(that.mSourceIdsForManagedProfiles)
&& mSourceIdsForManagedProfilesOnPageOpen.equals(
- that.mSourceIdsForManagedProfilesOnPageOpen);
+ that.mSourceIdsForManagedProfilesOnPageOpen)
+ && mSourceIdsForPrivateProfile.equals(that.mSourceIdsForPrivateProfile)
+ && mSourceIdsForPrivateProfileOnPageOpen.equals(
+ that.mSourceIdsForPrivateProfileOnPageOpen);
}
@Override
@@ -555,7 +580,9 @@ public final class SafetyCenterConfigReader {
mSourceIdsForProfileParent,
mSourceIdsForProfileParentOnPageOpen,
mSourceIdsForManagedProfiles,
- mSourceIdsForManagedProfilesOnPageOpen);
+ mSourceIdsForManagedProfilesOnPageOpen,
+ mSourceIdsForPrivateProfile,
+ mSourceIdsForPrivateProfileOnPageOpen);
}
@Override
@@ -571,6 +598,10 @@ public final class SafetyCenterConfigReader {
+ mSourceIdsForManagedProfiles
+ ", mSourceIdsForManagedProfilesOnPageOpen="
+ mSourceIdsForManagedProfilesOnPageOpen
+ + ", mSourceIdsForPrivateProfile="
+ + mSourceIdsForPrivateProfile
+ + ", mSourceIdsForPrivateProfileOnPageOpen="
+ + mSourceIdsForPrivateProfileOnPageOpen
+ '}';
}
}
diff --git a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java
index d74d160f4..7c7ade3f1 100644
--- a/service/java/com/android/safetycenter/SafetyCenterDataFactory.java
+++ b/service/java/com/android/safetycenter/SafetyCenterDataFactory.java
@@ -17,7 +17,11 @@
package com.android.safetycenter;
import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
+import static android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_MANAGED;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIMARY;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIVATE;
import static com.android.safetycenter.internaldata.SafetyCenterBundles.ISSUES_TO_GROUPS_BUNDLE_KEY;
import static com.android.safetycenter.internaldata.SafetyCenterBundles.STATIC_ENTRIES_TO_IDS_BUNDLE_KEY;
@@ -53,7 +57,8 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.android.modules.utils.build.SdkLevel;
-import com.android.permission.util.UserUtils;
+import com.android.permission.flags.Flags;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.data.SafetyCenterDataManager;
import com.android.safetycenter.internaldata.SafetyCenterBundles;
import com.android.safetycenter.internaldata.SafetyCenterEntryId;
@@ -387,42 +392,36 @@ public final class SafetyCenterDataFactory {
List<SafetySource> safetySources = safetySourcesGroup.getSafetySources();
List<SafetyCenterEntry> entries = new ArrayList<>(safetySources.size());
- for (int i = 0; i < safetySources.size(); i++) {
- SafetySource safetySource = safetySources.get(i);
-
- groupSafetyCenterEntryLevel =
- mergeSafetyCenterEntrySeverityLevels(
- groupSafetyCenterEntryLevel,
- addSafetyCenterEntry(
- safetyCenterOverallState,
- entries,
- safetySource,
- defaultPackageName,
- userProfileGroup.getProfileParentUserId(),
- /* isUserManaged= */ false,
- /* isManagedUserRunning= */ false));
-
- if (!SafetySources.supportsManagedProfiles(safetySource)) {
- continue;
- }
-
- int[] managedProfilesUserIds = userProfileGroup.getManagedProfilesUserIds();
- for (int j = 0; j < managedProfilesUserIds.length; j++) {
- int managedProfileUserId = managedProfilesUserIds[j];
- boolean isManagedUserRunning =
- userProfileGroup.isManagedUserRunning(managedProfileUserId);
+ for (int safetySourceIdx = 0; safetySourceIdx < safetySources.size(); ++safetySourceIdx) {
+ SafetySource safetySource = safetySources.get(safetySourceIdx);
+ for (int profileTypeIdx = 0;
+ profileTypeIdx < ProfileType.ALL_PROFILE_TYPES.length;
+ ++profileTypeIdx) {
+ @ProfileType int profileType = ProfileType.ALL_PROFILE_TYPES[profileTypeIdx];
+ if (!SafetySources.supportsProfileType(safetySource, profileType)) {
+ continue;
+ }
- groupSafetyCenterEntryLevel =
- mergeSafetyCenterEntrySeverityLevels(
- groupSafetyCenterEntryLevel,
- addSafetyCenterEntry(
- safetyCenterOverallState,
- entries,
- safetySource,
- defaultPackageName,
- managedProfileUserId,
- /* isUserManaged= */ true,
- isManagedUserRunning));
+ int[] profileIds = userProfileGroup.getProfilesOfType(profileType);
+ for (int profileIdx = 0; profileIdx < profileIds.length; profileIdx++) {
+ int profileId = profileIds[profileIdx];
+ boolean isUserRunning =
+ userProfileGroup.containsRunningUserId(profileId, profileType);
+ if (profileType == PROFILE_TYPE_PRIVATE && !isUserRunning) {
+ continue;
+ }
+ groupSafetyCenterEntryLevel =
+ mergeSafetyCenterEntrySeverityLevels(
+ groupSafetyCenterEntryLevel,
+ addSafetyCenterEntry(
+ safetyCenterOverallState,
+ entries,
+ safetySource,
+ defaultPackageName,
+ profileId,
+ profileType,
+ isUserRunning));
+ }
}
}
@@ -534,7 +533,8 @@ public final class SafetyCenterDataFactory {
SafetyCenterEntry entry = entries.get(i);
SafetyCenterEntryId entryId = SafetyCenterIds.entryIdFromString(entry.getId());
- if (UserUtils.isManagedProfile(entryId.getUserId(), mContext)) {
+ if (UserProfileGroup.getProfileTypeOfUser(entryId.getUserId(), mContext)
+ != PROFILE_TYPE_PRIMARY) {
continue;
}
@@ -558,15 +558,15 @@ public final class SafetyCenterDataFactory {
SafetySource safetySource,
String defaultPackageName,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
SafetyCenterEntry safetyCenterEntry =
toSafetyCenterEntry(
safetySource,
defaultPackageName,
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
if (safetyCenterEntry == null) {
return SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED;
}
@@ -584,8 +584,8 @@ public final class SafetyCenterDataFactory {
SafetySource safetySource,
String defaultPackageName,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
switch (safetySource.getType()) {
case SafetySource.SAFETY_SOURCE_TYPE_ISSUE_ONLY:
return null;
@@ -594,7 +594,7 @@ public final class SafetyCenterDataFactory {
SafetySourceStatus safetySourceStatus =
getSafetySourceStatus(
mSafetyCenterDataManager.getSafetySourceDataInternal(key));
- boolean inQuietMode = isUserManaged && !isManagedUserRunning;
+ boolean inQuietMode = (PROFILE_TYPE_MANAGED == profileType) && !isUserRunning;
if (safetySourceStatus == null) {
int severityLevel =
inQuietMode
@@ -606,8 +606,8 @@ public final class SafetyCenterDataFactory {
severityLevel,
SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION,
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
}
PendingIntent sourceProvidedPendingIntent =
inQuietMode ? null : safetySourceStatus.getPendingIntent();
@@ -665,8 +665,8 @@ public final class SafetyCenterDataFactory {
SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_UNSPECIFIED,
SafetyCenterEntry.SEVERITY_UNSPECIFIED_ICON_TYPE_NO_ICON,
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
}
Log.w(
TAG,
@@ -681,8 +681,8 @@ public final class SafetyCenterDataFactory {
@SafetyCenterEntry.EntrySeverityLevel int entrySeverityLevel,
@SafetyCenterEntry.SeverityUnspecifiedIconType int severityUnspecifiedIconType,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
if (SafetySources.isDefaultEntryHidden(safetySource)) {
return null;
}
@@ -692,7 +692,7 @@ public final class SafetyCenterDataFactory {
.setSafetySourceId(safetySource.getId())
.setUserId(userId)
.build();
- boolean isQuietModeEnabled = isUserManaged && !isManagedUserRunning;
+ boolean isQuietModeEnabled = (PROFILE_TYPE_MANAGED == profileType) && !isUserRunning;
PendingIntent pendingIntent =
mPendingIntentFactory.getPendingIntent(
safetySource.getId(),
@@ -702,13 +702,7 @@ public final class SafetyCenterDataFactory {
isQuietModeEnabled);
boolean enabled =
pendingIntent != null && !SafetySources.isDefaultEntryDisabled(safetySource);
- CharSequence title =
- isUserManaged
- ? DevicePolicyResources.getSafetySourceWorkString(
- mSafetyCenterResourcesApk,
- safetySource.getId(),
- safetySource.getTitleForWorkResId())
- : mSafetyCenterResourcesApk.getString(safetySource.getTitleResId());
+ CharSequence title = getTitleForProfileType(profileType, safetySource);
CharSequence summary =
mSafetyCenterDataManager.sourceHasError(
SafetySourceKey.of(safetySource.getId(), userId))
@@ -738,38 +732,33 @@ public final class SafetyCenterDataFactory {
UserProfileGroup userProfileGroup) {
List<SafetySource> safetySources = safetySourcesGroup.getSafetySources();
List<SafetyCenterStaticEntry> staticEntries = new ArrayList<>(safetySources.size());
- for (int i = 0; i < safetySources.size(); i++) {
- SafetySource safetySource = safetySources.get(i);
-
- addSafetyCenterStaticEntry(
- staticEntriesToIds,
- safetyCenterOverallState,
- staticEntries,
- safetySource,
- defaultPackageName,
- userProfileGroup.getProfileParentUserId(),
- /* isUserManaged= */ false,
- /* isManagedUserRunning= */ false);
-
- if (!SafetySources.supportsManagedProfiles(safetySource)) {
- continue;
- }
-
- int[] managedProfilesUserIds = userProfileGroup.getManagedProfilesUserIds();
- for (int j = 0; j < managedProfilesUserIds.length; j++) {
- int managedProfileUserId = managedProfilesUserIds[j];
- boolean isManagedUserRunning =
- userProfileGroup.isManagedUserRunning(managedProfileUserId);
-
- addSafetyCenterStaticEntry(
- staticEntriesToIds,
- safetyCenterOverallState,
- staticEntries,
- safetySource,
- defaultPackageName,
- managedProfileUserId,
- /* isUserManaged= */ true,
- isManagedUserRunning);
+ for (int safetySourceIdx = 0; safetySourceIdx < safetySources.size(); safetySourceIdx++) {
+ SafetySource safetySource = safetySources.get(safetySourceIdx);
+ for (int profileTypeIdx = 0;
+ profileTypeIdx < ProfileType.ALL_PROFILE_TYPES.length;
+ ++profileTypeIdx) {
+ @ProfileType int profileType = ProfileType.ALL_PROFILE_TYPES[profileTypeIdx];
+ if (!SafetySources.supportsProfileType(safetySource, profileType)) {
+ continue;
+ }
+ int[] profileIds = userProfileGroup.getProfilesOfType(profileType);
+ for (int profileIdx = 0; profileIdx < profileIds.length; ++profileIdx) {
+ int profileId = profileIds[profileIdx];
+ boolean isUserRunning =
+ userProfileGroup.containsRunningUserId(profileId, profileType);
+ if (profileType == PROFILE_TYPE_PRIVATE && !isUserRunning) {
+ continue;
+ }
+ addSafetyCenterStaticEntry(
+ staticEntriesToIds,
+ safetyCenterOverallState,
+ staticEntries,
+ safetySource,
+ defaultPackageName,
+ profileId,
+ profileType,
+ isUserRunning);
+ }
}
}
@@ -790,15 +779,15 @@ public final class SafetyCenterDataFactory {
SafetySource safetySource,
String defaultPackageName,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
SafetyCenterStaticEntry staticEntry =
toSafetyCenterStaticEntry(
safetySource,
defaultPackageName,
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
if (staticEntry == null) {
return;
}
@@ -826,8 +815,8 @@ public final class SafetyCenterDataFactory {
SafetySource safetySource,
String defaultPackageName,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
switch (safetySource.getType()) {
case SafetySource.SAFETY_SOURCE_TYPE_ISSUE_ONLY:
return null;
@@ -836,7 +825,7 @@ public final class SafetyCenterDataFactory {
SafetySourceStatus safetySourceStatus =
getSafetySourceStatus(
mSafetyCenterDataManager.getSafetySourceDataInternal(key));
- boolean inQuietMode = isUserManaged && !isManagedUserRunning;
+ boolean inQuietMode = (profileType == PROFILE_TYPE_MANAGED) && !isUserRunning;
if (safetySourceStatus != null) {
PendingIntent sourceProvidedPendingIntent =
inQuietMode ? null : safetySourceStatus.getPendingIntent();
@@ -867,15 +856,15 @@ public final class SafetyCenterDataFactory {
safetySource,
safetySource.getPackageName(),
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
case SafetySource.SAFETY_SOURCE_TYPE_STATIC:
return toDefaultSafetyCenterStaticEntry(
safetySource,
getStaticSourcePackageNameOrDefault(safetySource, defaultPackageName),
userId,
- isUserManaged,
- isManagedUserRunning);
+ profileType,
+ isUserRunning);
}
Log.w(TAG, "Unknown safety source type found in rigid group: " + safetySource.getType());
return null;
@@ -886,12 +875,12 @@ public final class SafetyCenterDataFactory {
SafetySource safetySource,
String packageName,
@UserIdInt int userId,
- boolean isUserManaged,
- boolean isManagedUserRunning) {
+ @ProfileType int profileType,
+ boolean isUserRunning) {
if (SafetySources.isDefaultEntryHidden(safetySource)) {
return null;
}
- boolean isQuietModeEnabled = isUserManaged && !isManagedUserRunning;
+ boolean isQuietModeEnabled = (profileType == PROFILE_TYPE_MANAGED) && !isUserRunning;
PendingIntent pendingIntent =
mPendingIntentFactory.getPendingIntent(
safetySource.getId(),
@@ -905,13 +894,7 @@ public final class SafetyCenterDataFactory {
return null;
}
- CharSequence title =
- isUserManaged
- ? DevicePolicyResources.getSafetySourceWorkString(
- mSafetyCenterResourcesApk,
- safetySource.getId(),
- safetySource.getTitleForWorkResId())
- : mSafetyCenterResourcesApk.getString(safetySource.getTitleResId());
+ CharSequence title = getTitleForProfileType(profileType, safetySource);
CharSequence summary =
mSafetyCenterDataManager.sourceHasError(
SafetySourceKey.of(safetySource.getId(), userId))
@@ -1242,6 +1225,29 @@ public final class SafetyCenterDataFactory {
return null;
}
+ private CharSequence getTitleForProfileType(
+ @ProfileType int profileType, SafetySource safetySource) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return mSafetyCenterResourcesApk.getString(safetySource.getTitleResId());
+ case PROFILE_TYPE_MANAGED:
+ return DevicePolicyResources.getSafetySourceWorkString(
+ mSafetyCenterResourcesApk,
+ safetySource.getId(),
+ safetySource.getTitleForWorkResId());
+ case PROFILE_TYPE_PRIVATE:
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ return mSafetyCenterResourcesApk.getString(
+ safetySource.getTitleForPrivateProfileResId());
+ }
+ Log.w(TAG, "unsupported private profile type encountered");
+ return mSafetyCenterResourcesApk.getString(safetySource.getTitleResId());
+ default:
+ Log.w(TAG, "unexpected value for the profile type " + profileType);
+ return mSafetyCenterResourcesApk.getString(safetySource.getTitleResId());
+ }
+ }
+
private static SafetySourceKey toSafetySourceKey(String safetyCenterEntryIdString) {
SafetyCenterEntryId id = SafetyCenterIds.entryIdFromString(safetyCenterEntryIdString);
return SafetySourceKey.of(id.getSafetySourceId(), id.getUserId());
diff --git a/service/java/com/android/safetycenter/SafetyCenterFlags.java b/service/java/com/android/safetycenter/SafetyCenterFlags.java
index 67c4d25d6..e51d3a1cf 100644
--- a/service/java/com/android/safetycenter/SafetyCenterFlags.java
+++ b/service/java/com/android/safetycenter/SafetyCenterFlags.java
@@ -123,6 +123,9 @@ public final class SafetyCenterFlags {
private static final String RESURFACE_ISSUE_DELAYS_DEFAULT = "";
private static final Duration RESURFACE_ISSUE_DELAYS_DEFAULT_DURATION = Duration.ofDays(180);
+ private static final ArraySet<String> sAllowedNotificationSourcesUPlus =
+ new ArraySet<>(new String[] {"GoogleBackupAndRestore"});
+
private static volatile String sUntrackedSourcesDefault =
"AndroidAccessibility,AndroidBackgroundLocation,"
+ "AndroidNotificationListener,AndroidPermissionAutoRevoke";
@@ -175,7 +178,10 @@ public final class SafetyCenterFlags {
fout.println("FLAGS");
printFlag(fout, PROPERTY_SAFETY_CENTER_ENABLED, getSafetyCenterEnabled());
printFlag(fout, PROPERTY_NOTIFICATIONS_ENABLED, getNotificationsEnabled());
- printFlag(fout, PROPERTY_NOTIFICATIONS_ALLOWED_SOURCES, getNotificationsAllowedSourceIds());
+ printFlag(
+ fout,
+ PROPERTY_NOTIFICATIONS_ALLOWED_SOURCES,
+ getNotificationsAllowedSourceIdsFlag());
printFlag(fout, PROPERTY_NOTIFICATIONS_MIN_DELAY, getNotificationsMinDelay());
printFlag(
fout,
@@ -244,6 +250,20 @@ public final class SafetyCenterFlags {
* and therefore this is the only way to enable notifications for sources on Android T.
*/
public static ArraySet<String> getNotificationsAllowedSourceIds() {
+ ArraySet<String> sources = getNotificationsAllowedSourceIdsFlag();
+ if (SdkLevel.isAtLeastU()) {
+ // This is a hack to update the flag value via mainline update. Reasons why we can't do
+ // this via:
+ // remote flag update - these are generally avoided and considered risky
+ // XML config - it would break GTS tests for OEMs that have a separate config copy
+ // default flag value - it would also require a remote flag update
+ sources.addAll(sAllowedNotificationSourcesUPlus);
+ }
+
+ return sources;
+ }
+
+ private static ArraySet<String> getNotificationsAllowedSourceIdsFlag() {
return getCommaSeparatedStrings(PROPERTY_NOTIFICATIONS_ALLOWED_SOURCES);
}
diff --git a/service/java/com/android/safetycenter/SafetyCenterListeners.java b/service/java/com/android/safetycenter/SafetyCenterListeners.java
index 5f89f46ff..091daa0a6 100644
--- a/service/java/com/android/safetycenter/SafetyCenterListeners.java
+++ b/service/java/com/android/safetycenter/SafetyCenterListeners.java
@@ -87,7 +87,7 @@ final class SafetyCenterListeners {
*/
void deliverDataForUserProfileGroup(UserProfileGroup userProfileGroup) {
ArrayMap<String, SafetyCenterData> safetyCenterDataCache = new ArrayMap<>();
- int[] relevantUserIds = userProfileGroup.getProfileParentAndManagedRunningProfilesUserIds();
+ int[] relevantUserIds = userProfileGroup.getAllRunningProfilesUserIds();
for (int i = 0; i < relevantUserIds.length; i++) {
deliverUpdateForUser(
relevantUserIds[i],
@@ -105,7 +105,7 @@ final class SafetyCenterListeners {
void deliverErrorForUserProfileGroup(
UserProfileGroup userProfileGroup, SafetyCenterErrorDetails safetyCenterErrorDetails) {
ArrayMap<String, SafetyCenterData> safetyCenterDataCache = new ArrayMap<>();
- int[] relevantUserIds = userProfileGroup.getProfileParentAndManagedRunningProfilesUserIds();
+ int[] relevantUserIds = userProfileGroup.getAllRunningProfilesUserIds();
for (int i = 0; i < relevantUserIds.length; i++) {
deliverUpdateForUser(
relevantUserIds[i],
diff --git a/service/java/com/android/safetycenter/SafetyCenterRefreshTracker.java b/service/java/com/android/safetycenter/SafetyCenterRefreshTracker.java
index d98127300..cc23b4e02 100644
--- a/service/java/com/android/safetycenter/SafetyCenterRefreshTracker.java
+++ b/service/java/com/android/safetycenter/SafetyCenterRefreshTracker.java
@@ -34,7 +34,6 @@ import android.util.Log;
import androidx.annotation.Nullable;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.logging.SafetyCenterStatsdLogger;
import java.io.PrintWriter;
@@ -175,7 +174,7 @@ public final class SafetyCenterRefreshTracker {
SafetyCenterStatsdLogger.writeSourceRefreshSystemEvent(
requestType,
safetySourceKey.getSourceId(),
- UserUtils.isManagedProfile(safetySourceKey.getUserId(), mContext),
+ UserProfileGroup.getProfileTypeOfUser(safetySourceKey.getUserId(), mContext),
duration,
sourceResult,
refreshReason,
@@ -284,7 +283,7 @@ public final class SafetyCenterRefreshTracker {
SafetyCenterStatsdLogger.writeSourceRefreshSystemEvent(
requestType,
sourceKey.getSourceId(),
- UserUtils.isManagedProfile(sourceKey.getUserId(), mContext),
+ UserProfileGroup.getProfileTypeOfUser(sourceKey.getUserId(), mContext),
duration,
SAFETY_CENTER_SYSTEM_EVENT_REPORTED__RESULT__TIMEOUT,
refreshReason,
diff --git a/service/java/com/android/safetycenter/SafetyCenterService.java b/service/java/com/android/safetycenter/SafetyCenterService.java
index 62d0a0d78..c9a5e1c03 100644
--- a/service/java/com/android/safetycenter/SafetyCenterService.java
+++ b/service/java/com/android/safetycenter/SafetyCenterService.java
@@ -74,6 +74,7 @@ import androidx.annotation.RequiresApi;
import com.android.internal.annotations.GuardedBy;
import com.android.modules.utils.BackgroundThread;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permission.flags.Flags;
import com.android.permission.util.ForegroundThread;
import com.android.permission.util.UserUtils;
import com.android.safetycenter.data.SafetyCenterDataManager;
@@ -1076,10 +1077,21 @@ public final class SafetyCenterService extends SystemService {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_USER_SWITCHED);
filter.addAction(Intent.ACTION_USER_REMOVED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
- filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileSupported()) {
+ // These intents are available on V+ only, and are called for managed and other
+ // profile(s).
+ filter.addAction(Intent.ACTION_PROFILE_ADDED);
+ filter.addAction(Intent.ACTION_PROFILE_REMOVED);
+ filter.addAction(Intent.ACTION_PROFILE_AVAILABLE);
+ filter.addAction(Intent.ACTION_PROFILE_UNAVAILABLE);
+ } else {
+ // Only these intents are available in T and U, but that's okay because only managed
+ // profiles are supported by Safety Center on these SDK versions.
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
+ filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
+ }
context.registerReceiverForAllUsers(
/* receiver= */ this,
filter,
@@ -1108,50 +1120,86 @@ public final class SafetyCenterService extends SystemService {
int userId = userHandle.getIdentifier();
Log.d(TAG, "Received action: " + action + ", for user id: " + userId);
- if (!UserProfileGroup.isSupported(userId, context)) {
- Log.i(
- TAG,
- "Received broadcast for user id: "
- + userId
- + ", which is an unsupported user");
+
+ if (!isUserIdValidForAction(action, userId, context)) {
return;
}
- switch (action) {
- case Intent.ACTION_USER_REMOVED:
- case Intent.ACTION_MANAGED_PROFILE_REMOVED:
- removeUserAndData(userId);
- break;
- case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE:
- removeUser(userId);
- break;
- case Intent.ACTION_USER_SWITCHED:
- if (userId != ActivityManager.getCurrentUser()) {
- Log.w(
- TAG,
- "Received broadcast for user id: "
- + userId
- + ", which is not the current user");
- return;
- }
- // Fall through
- case Intent.ACTION_MANAGED_PROFILE_ADDED:
- case Intent.ACTION_MANAGED_PROFILE_AVAILABLE:
- if (!UserUtils.isUserExistent(userId, getContext())) {
- Log.w(
- TAG,
- "Received broadcast for user id: "
- + userId
- + ", which does not exist");
- return;
- }
- synchronized (mApiLock) {
- startRefreshingSafetySourcesLocked(REFRESH_REASON_OTHER, userId);
- mNotificationChannels.createAllChannelsForUser(getContext(), userHandle);
- }
- break;
+ if (isUserOrProfileRemoved(action)) {
+ removeUserAndData(userId);
+ return;
+ }
+
+ if (isProfileUnavailable(action)) {
+ removeUser(userId);
+ return;
+ }
+
+ if (Intent.ACTION_USER_SWITCHED.equals(action) || isProfileAddedOrAvailable(action)) {
+ synchronized (mApiLock) {
+ startRefreshingSafetySourcesLocked(REFRESH_REASON_OTHER, userId);
+ mNotificationChannels.createAllChannelsForUser(getContext(), userHandle);
+ }
+ return;
}
+ Log.w(TAG, "Received unexpected broadcast with action: " + action);
+ }
+ }
+
+ private static boolean isUserIdValidForAction(
+ String action, @UserIdInt int userId, Context context) {
+ if (!UserProfileGroup.isSupported(userId, context)) {
+ Log.i(
+ TAG,
+ "Received broadcast for user id: "
+ + userId
+ + ", which is an unsupported user");
+ return false;
+ }
+ if (Intent.ACTION_USER_SWITCHED.equals(action)
+ && userId != ActivityManager.getCurrentUser()) {
+ Log.w(
+ TAG,
+ "Received broadcast for user id: "
+ + userId
+ + ", which is not the current user");
+ return false;
+ }
+ if (isProfileAddedOrAvailable(action) && !UserUtils.isUserExistent(userId, context)) {
+ Log.w(
+ TAG,
+ "Received broadcast for user id: "
+ + userId
+ + ", which does not exist");
+ return false;
+ }
+ return true;
+ }
+
+ private static boolean isUserOrProfileRemoved(String action) {
+ if (Intent.ACTION_USER_REMOVED.equals(action)) {
+ return true;
+ }
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileSupported()) {
+ return Intent.ACTION_PROFILE_REMOVED.equals(action);
+ }
+ return Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action);
+ }
+
+ private static boolean isProfileUnavailable(String action) {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileSupported()) {
+ return Intent.ACTION_PROFILE_UNAVAILABLE.equals(action);
+ }
+ return Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action);
+ }
+
+ private static boolean isProfileAddedOrAvailable(String action) {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileSupported()) {
+ return Intent.ACTION_PROFILE_AVAILABLE.equals(action)
+ || Intent.ACTION_PROFILE_ADDED.equals(action);
}
+ return Intent.ACTION_MANAGED_PROFILE_ADDED.equals(action)
+ || Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action);
}
private void removeUserAndData(@UserIdInt int userId) {
diff --git a/service/java/com/android/safetycenter/SafetySources.java b/service/java/com/android/safetycenter/SafetySources.java
index 02d83d27b..7be0ef00e 100644
--- a/service/java/com/android/safetycenter/SafetySources.java
+++ b/service/java/com/android/safetycenter/SafetySources.java
@@ -20,6 +20,8 @@ import android.safetycenter.SafetySourceData;
import android.safetycenter.config.SafetySource;
import android.util.Log;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
+
/**
* A helper class to facilitate working with {@link SafetySource} objects.
*
@@ -48,6 +50,23 @@ public final class SafetySources {
/** Returns whether a {@link SafetySource} supports managed profiles. */
public static boolean supportsManagedProfiles(SafetySource safetySource) {
+ return supportsAllProfiles(safetySource);
+ }
+
+ /**
+ * Returns whether a {@link SafetySource} supports the profile of the given type
+ * {@code profileType}.
+ */
+ public static boolean supportsProfileType(
+ SafetySource safetySource, @ProfileType int profileType) {
+ if (UserProfileGroup.PROFILE_TYPE_PRIMARY == profileType) {
+ return true;
+ }
+ return supportsAllProfiles(safetySource);
+ }
+
+ /** Returns whether a {@link SafetySource} supports all profiles. */
+ private static boolean supportsAllProfiles(SafetySource safetySource) {
int safetySourceProfile = safetySource.getProfile();
switch (safetySourceProfile) {
case SafetySource.PROFILE_PRIMARY:
diff --git a/service/java/com/android/safetycenter/UserProfileGroup.java b/service/java/com/android/safetycenter/UserProfileGroup.java
index 74b9b136f..46a440bf7 100644
--- a/service/java/com/android/safetycenter/UserProfileGroup.java
+++ b/service/java/com/android/safetycenter/UserProfileGroup.java
@@ -18,6 +18,7 @@ package com.android.safetycenter;
import static java.util.Objects.requireNonNull;
+import android.annotation.IntDef;
import android.annotation.UserIdInt;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -31,6 +32,8 @@ import androidx.annotation.Nullable;
import com.android.permission.util.UserUtils;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -42,21 +45,47 @@ import java.util.Objects;
*
* @hide
*/
+//TODO(b/286539356) Do not expose the private profile when it's not running.
public final class UserProfileGroup {
private static final String TAG = "UserProfileGroup";
+ // UserHandle#USER_NULL is a @TestApi so it cannot be accessed from the mainline module.
+ public static final @UserIdInt int USER_NULL = -10000;
@UserIdInt private final int mProfileParentUserId;
private final int[] mManagedProfilesUserIds;
private final int[] mManagedRunningProfilesUserIds;
+ @UserIdInt private final int mPrivateProfileUserId;
+ private final boolean mPrivateProfileRunning;
+
+ /** Respresents the profile type of the primary user. */
+ public static final int PROFILE_TYPE_PRIMARY = 0;
+ /** Respresents the profile type of the managed profile. */
+ public static final int PROFILE_TYPE_MANAGED = 1;
+ /** Respresents the profile type of the private profile. */
+ public static final int PROFILE_TYPE_PRIVATE = 2;
+
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {PROFILE_TYPE_PRIMARY, PROFILE_TYPE_MANAGED, PROFILE_TYPE_PRIVATE})
+ public @interface ProfileType {
+ // This array needs to cover all profile types. So whenever a new entry is added above then
+ // please remember to include it in this array as well.
+ int[] ALL_PROFILE_TYPES =
+ {PROFILE_TYPE_PRIMARY, PROFILE_TYPE_MANAGED, PROFILE_TYPE_PRIVATE};
+ }
+
private UserProfileGroup(
@UserIdInt int profileParentUserId,
int[] managedProfilesUserIds,
- int[] managedRunningProfilesUserIds) {
+ int[] managedRunningProfilesUserIds,
+ @UserIdInt int privateProfileUserId,
+ boolean privateProfileRunning) {
mProfileParentUserId = profileParentUserId;
mManagedProfilesUserIds = managedProfilesUserIds;
mManagedRunningProfilesUserIds = managedRunningProfilesUserIds;
+ mPrivateProfileUserId = privateProfileUserId;
+ mPrivateProfileRunning = privateProfileRunning;
}
/** Returns all the alive {@link UserProfileGroup}s. */
@@ -117,6 +146,10 @@ public final class UserProfileGroup {
int[] managedRunningProfilesUserIds = new int[userProfiles.size()];
int managedProfilesUserIdsLen = 0;
int managedRunningProfilesUserIdsLen = 0;
+
+ int privateProfileUserId = USER_NULL;
+ boolean privateProfileRunning = false;
+
for (int i = 0; i < userProfiles.size(); i++) {
UserHandle userProfileHandle = userProfiles.get(i);
int userProfileId = userProfileHandle.getIdentifier();
@@ -127,15 +160,19 @@ public final class UserProfileGroup {
managedRunningProfilesUserIds[managedRunningProfilesUserIdsLen++] =
userProfileId;
}
+ } else if (UserUtils.isPrivateProfile(userProfileId, context)) {
+ privateProfileUserId = userProfileId;
+ privateProfileRunning = UserUtils.isProfileRunning(userProfileId, context);
}
}
- UserProfileGroup userProfileGroup =
- new UserProfileGroup(
- profileParentUserId,
- Arrays.copyOf(managedProfilesUserIds, managedProfilesUserIdsLen),
- Arrays.copyOf(
- managedRunningProfilesUserIds, managedRunningProfilesUserIdsLen));
+ UserProfileGroup userProfileGroup = new UserProfileGroup(
+ profileParentUserId,
+ Arrays.copyOf(managedProfilesUserIds, managedProfilesUserIdsLen),
+ Arrays.copyOf(managedRunningProfilesUserIds, managedRunningProfilesUserIdsLen),
+ privateProfileUserId,
+ privateProfileRunning
+ );
if (!userProfileGroup.contains(userId)) {
Log.i(
TAG,
@@ -150,7 +187,8 @@ public final class UserProfileGroup {
if (!isProfile(userId, context)) {
return true;
}
- return UserUtils.isManagedProfile(userId, context);
+ return UserUtils.isManagedProfile(userId, context)
+ || UserUtils.isPrivateProfile(userId, context);
}
private static UserManager getUserManagerForUser(@UserIdInt int userId, Context context) {
@@ -208,32 +246,141 @@ public final class UserProfileGroup {
return mProfileParentUserId;
}
- /** Returns the managed profile user ids of the {@link UserProfileGroup}. */
- public int[] getManagedProfilesUserIds() {
- return mManagedProfilesUserIds;
- }
+ /**
+ * A convenience method to get all the profile ids of all the users of all profile types. So, in
+ * essence, this is equivalent to iterating through all the profile types using
+ * {@link ProfileType#ALL_PROFILE_TYPES} and getting all the users for each of the profile type
+ * using {@link #getProfilesOfType(int profileType)}
+ */
+ public int[] getAllProfilesUserIds() {
+ int[] allProfileIds = new int[getNumProfiles()];
+ allProfileIds[0] = mProfileParentUserId;
+ System.arraycopy(
+ mManagedProfilesUserIds,
+ /* srcPos= */ 0,
+ allProfileIds,
+ /* destPos= */ 1,
+ mManagedProfilesUserIds.length);
- /** Returns the running managed profile user ids of the {@link UserProfileGroup}. */
- public int[] getManagedRunningProfilesUserIds() {
- return mManagedRunningProfilesUserIds;
+ if (mPrivateProfileUserId != USER_NULL) {
+ allProfileIds[allProfileIds.length - 1] = mPrivateProfileUserId;
+ }
+
+ return allProfileIds;
}
/**
- * Convenience method that combines the results of {@link
- * UserProfileGroup#getProfileParentUserId()} and {@link
- * UserProfileGroup#getManagedRunningProfilesUserIds()}.
+ * A convenience method to get all the profile ids of all the users (that are currently running)
+ * of all profile types. So, in essence, this is equivalent to iterating through all the profile
+ * {types using {@link ProfileType#ALL_PROFILE_TYPES} and getting all the users for each of the
+ * profile type using {@link #getProfilesOfType(int profileType)} only if they are running.
*/
- public int[] getProfileParentAndManagedRunningProfilesUserIds() {
- int[] profileParentAndManagedRunningProfilesUserIds =
- new int[mManagedRunningProfilesUserIds.length + 1];
- profileParentAndManagedRunningProfilesUserIds[0] = mProfileParentUserId;
+ public int[] getAllRunningProfilesUserIds() {
+ int[] allRunningProfileIds = new int[getNumRunningProfiles()];
+ allRunningProfileIds[0] = mProfileParentUserId;
System.arraycopy(
mManagedRunningProfilesUserIds,
/* srcPos= */ 0,
- profileParentAndManagedRunningProfilesUserIds,
+ allRunningProfileIds,
/* destPos= */ 1,
mManagedRunningProfilesUserIds.length);
- return profileParentAndManagedRunningProfilesUserIds;
+
+ if (mPrivateProfileRunning) {
+ allRunningProfileIds[allRunningProfileIds.length - 1] = mPrivateProfileUserId;
+ }
+
+ return allRunningProfileIds;
+ }
+
+ /**
+ * Returns the profiles of the specified type. Returns an empty array if no profile of the
+ * specified type exists.
+ */
+ public int[] getProfilesOfType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return new int[] {mProfileParentUserId};
+ case PROFILE_TYPE_MANAGED:
+ return mManagedProfilesUserIds;
+ case PROFILE_TYPE_PRIVATE:
+ return mPrivateProfileUserId != USER_NULL
+ ? new int[]{mPrivateProfileUserId} : new int[]{};
+ default:
+ Log.w(TAG, "profiles requested for unexpected profile type " + profileType);
+ return new int[] {};
+ }
+ }
+
+ /**
+ * Returns the running profiles of the specified type. Returns an empty array if no profile of
+ * the specified type exists.
+ */
+ public int[] getRunningProfilesOfType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return new int[] {mProfileParentUserId};
+ case PROFILE_TYPE_MANAGED:
+ return mManagedRunningProfilesUserIds;
+ case PROFILE_TYPE_PRIVATE:
+ //TODO(b/286539356) add the new feature flag protection when available.
+ return mPrivateProfileRunning
+ ? new int[] {mPrivateProfileUserId} : new int[] {};
+ default:
+ Log.w(TAG, "Unexpected profile type " + profileType);
+ return new int[] {};
+ }
+ }
+
+ /** Returns the total number of running profiles in this user profile group */
+ public int getNumRunningProfiles() {
+ return 1
+ + mManagedRunningProfilesUserIds.length
+ + (mPrivateProfileRunning ? 1 : 0);
+ }
+
+ /** Returns the total number of profiles in this user profile group */
+ private int getNumProfiles() {
+ return 1
+ + mManagedProfilesUserIds.length
+ + (mPrivateProfileUserId == USER_NULL ? 0 : 1);
+ }
+
+ /**
+ * Returns the {@link ProfileType} for the provided {@code userId}. Note that the provided
+ * {@code userId} must be supported by the {@link UserProfileGroup} i.e.
+ * {@link #isSupported(int, Context)} should return true for {@code userId}.
+ */
+ public static @ProfileType int getProfileTypeOfUser(@UserIdInt int userId, Context context) {
+ if (UserUtils.isManagedProfile(userId, context)) {
+ return PROFILE_TYPE_MANAGED;
+ }
+ if (UserUtils.isPrivateProfile(userId, context)) {
+ return PROFILE_TYPE_PRIVATE;
+ }
+ return PROFILE_TYPE_PRIMARY;
+ }
+
+ /**
+ * Returns true iff the given userId is contained in this {@link UserProfileGroup} and it's
+ * running.
+ */
+ boolean containsRunningUserId(@UserIdInt int userId, @ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return true;
+ case PROFILE_TYPE_MANAGED:
+ for (int i = 0; i < mManagedRunningProfilesUserIds.length; i++) {
+ if (mManagedRunningProfilesUserIds[i] == userId) {
+ return true;
+ }
+ }
+ return false;
+ case PROFILE_TYPE_PRIVATE:
+ return mPrivateProfileRunning;
+ default:
+ Log.w(TAG, "Unexpected profile type " + profileType);
+ return false;
+ }
}
/** Returns whether the {@link UserProfileGroup} contains the given {@code userId}. */
@@ -248,17 +395,7 @@ public final class UserProfileGroup {
}
}
- return false;
- }
-
- /** Returns whether the given {@code userId} is associated with a running managed profile. */
- boolean isManagedUserRunning(@UserIdInt int userId) {
- for (int i = 0; i < mManagedRunningProfilesUserIds.length; i++) {
- if (userId == mManagedRunningProfilesUserIds[i]) {
- return true;
- }
- }
- return false;
+ return USER_NULL != mPrivateProfileUserId && userId == mPrivateProfileUserId;
}
@Override
@@ -269,7 +406,9 @@ public final class UserProfileGroup {
return mProfileParentUserId == that.mProfileParentUserId
&& Arrays.equals(mManagedProfilesUserIds, that.mManagedProfilesUserIds)
&& Arrays.equals(
- mManagedRunningProfilesUserIds, that.mManagedRunningProfilesUserIds);
+ mManagedRunningProfilesUserIds, that.mManagedRunningProfilesUserIds)
+ && mPrivateProfileUserId == that.mPrivateProfileUserId
+ && mPrivateProfileRunning == that.mPrivateProfileRunning;
}
@Override
@@ -277,7 +416,9 @@ public final class UserProfileGroup {
return Objects.hash(
mProfileParentUserId,
Arrays.hashCode(mManagedProfilesUserIds),
- Arrays.hashCode(mManagedRunningProfilesUserIds));
+ Arrays.hashCode(mManagedRunningProfilesUserIds),
+ mPrivateProfileUserId,
+ mPrivateProfileRunning);
}
@Override
@@ -289,6 +430,10 @@ public final class UserProfileGroup {
+ Arrays.toString(mManagedProfilesUserIds)
+ ", mManagedRunningProfilesUserIds="
+ Arrays.toString(mManagedRunningProfilesUserIds)
+ + ", mPrivateProfileUserId"
+ + mPrivateProfileUserId
+ + ", mPrivateProfileRunning"
+ + mPrivateProfileRunning
+ '}';
}
}
diff --git a/service/java/com/android/safetycenter/data/SafetyCenterDataManager.java b/service/java/com/android/safetycenter/data/SafetyCenterDataManager.java
index dff7c4339..7385a2c3b 100644
--- a/service/java/com/android/safetycenter/data/SafetyCenterDataManager.java
+++ b/service/java/com/android/safetycenter/data/SafetyCenterDataManager.java
@@ -41,6 +41,7 @@ import com.android.safetycenter.SafetyCenterRefreshTracker;
import com.android.safetycenter.SafetySourceIssueInfo;
import com.android.safetycenter.SafetySourceKey;
import com.android.safetycenter.UserProfileGroup;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.internaldata.SafetyCenterIssueActionId;
import com.android.safetycenter.internaldata.SafetyCenterIssueKey;
import com.android.safetycenter.logging.SafetyCenterStatsdLogger;
@@ -567,7 +568,7 @@ public final class SafetyCenterDataManager {
* Writes a SafetySourceStateCollected atom for the given source in response to a stats pull.
*/
public void logSafetySourceStateCollectedAutomatic(
- SafetySourceKey sourceKey, boolean isManagedProfile) {
- mSafetySourceStateCollectedLogger.writeAutomaticAtom(sourceKey, isManagedProfile);
+ SafetySourceKey sourceKey, @ProfileType int profileType) {
+ mSafetySourceStateCollectedLogger.writeAutomaticAtom(sourceKey, profileType);
}
}
diff --git a/service/java/com/android/safetycenter/data/SafetyCenterInFlightIssueActionRepository.java b/service/java/com/android/safetycenter/data/SafetyCenterInFlightIssueActionRepository.java
index 82eb3a6c7..39809aa6f 100644
--- a/service/java/com/android/safetycenter/data/SafetyCenterInFlightIssueActionRepository.java
+++ b/service/java/com/android/safetycenter/data/SafetyCenterInFlightIssueActionRepository.java
@@ -28,8 +28,8 @@ import android.util.Log;
import androidx.annotation.Nullable;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.SafetySourceIssues;
+import com.android.safetycenter.UserProfileGroup;
import com.android.safetycenter.internaldata.SafetyCenterIssueActionId;
import com.android.safetycenter.internaldata.SafetyCenterIssueKey;
import com.android.safetycenter.logging.SafetyCenterStatsdLogger;
@@ -87,7 +87,7 @@ final class SafetyCenterInFlightIssueActionRepository {
SafetyCenterStatsdLogger.writeInlineActionSystemEvent(
issueKey.getSafetySourceId(),
- UserUtils.isManagedProfile(issueKey.getUserId(), mContext),
+ UserProfileGroup.getProfileTypeOfUser(issueKey.getUserId(), mContext),
issueTypeId,
duration,
result);
diff --git a/service/java/com/android/safetycenter/data/SafetyCenterIssueRepository.java b/service/java/com/android/safetycenter/data/SafetyCenterIssueRepository.java
index 2e6f707a3..3806584a8 100644
--- a/service/java/com/android/safetycenter/data/SafetyCenterIssueRepository.java
+++ b/service/java/com/android/safetycenter/data/SafetyCenterIssueRepository.java
@@ -31,12 +31,12 @@ import android.safetycenter.config.SafetySourcesGroup;
import android.util.SparseArray;
import com.android.modules.utils.build.SdkLevel;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.SafetyCenterConfigReader;
import com.android.safetycenter.SafetySourceIssueInfo;
import com.android.safetycenter.SafetySourceKey;
import com.android.safetycenter.SafetySources;
import com.android.safetycenter.UserProfileGroup;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.internaldata.SafetyCenterIssueKey;
import java.io.PrintWriter;
@@ -88,12 +88,12 @@ final class SafetyCenterIssueRepository {
* that can affect issues.
*/
void updateIssues(@UserIdInt int userId) {
- updateIssues(userId, UserUtils.isManagedProfile(userId, mContext));
+ updateIssues(userId, UserProfileGroup.getProfileTypeOfUser(userId, mContext));
}
- private void updateIssues(@UserIdInt int userId, boolean isManagedProfile) {
+ private void updateIssues(@UserIdInt int userId, @ProfileType int profileType) {
List<SafetySourceIssueInfo> issues =
- getAllStoredIssuesFromRawSourceData(userId, isManagedProfile);
+ getAllStoredIssuesFromRawSourceData(userId, profileType);
issues.sort(SAFETY_SOURCE_ISSUES_INFO_BY_SEVERITY_DESCENDING);
@@ -183,14 +183,14 @@ final class SafetyCenterIssueRepository {
}
private List<SafetySourceIssueInfo> getAllStoredIssuesFromRawSourceData(
- @UserIdInt int userId, boolean isManagedProfile) {
+ @UserIdInt int userId, @ProfileType int profileType) {
List<SafetySourceIssueInfo> allIssuesInfo = new ArrayList<>();
List<SafetySourcesGroup> safetySourcesGroups =
mSafetyCenterConfigReader.getSafetySourcesGroups();
for (int j = 0; j < safetySourcesGroups.size(); j++) {
addSafetySourceIssuesInfo(
- allIssuesInfo, safetySourcesGroups.get(j), userId, isManagedProfile);
+ allIssuesInfo, safetySourcesGroups.get(j), userId, profileType);
}
return allIssuesInfo;
@@ -200,7 +200,7 @@ final class SafetyCenterIssueRepository {
List<SafetySourceIssueInfo> issuesInfo,
SafetySourcesGroup safetySourcesGroup,
@UserIdInt int userId,
- boolean isManagedProfile) {
+ @ProfileType int profileType) {
List<SafetySource> safetySources = safetySourcesGroup.getSafetySources();
for (int i = 0; i < safetySources.size(); i++) {
SafetySource safetySource = safetySources.get(i);
@@ -208,7 +208,7 @@ final class SafetyCenterIssueRepository {
if (!SafetySources.isExternal(safetySource)) {
continue;
}
- if (isManagedProfile && !SafetySources.supportsManagedProfiles(safetySource)) {
+ if (!SafetySources.supportsProfileType(safetySource, profileType)) {
continue;
}
@@ -244,12 +244,11 @@ final class SafetyCenterIssueRepository {
* UserProfileGroup}.
*/
private List<SafetySourceIssueInfo> getIssuesFor(UserProfileGroup userProfileGroup) {
- List<SafetySourceIssueInfo> issues =
- new ArrayList<>(getIssuesForUser(userProfileGroup.getProfileParentUserId()));
+ List<SafetySourceIssueInfo> issues = new ArrayList<>();
- int[] managedRunningProfileUserIds = userProfileGroup.getManagedRunningProfilesUserIds();
- for (int i = 0; i < managedRunningProfileUserIds.length; i++) {
- issues.addAll(getIssuesForUser(managedRunningProfileUserIds[i]));
+ int[] allRunningProfileUserIds = userProfileGroup.getAllRunningProfilesUserIds();
+ for (int i = 0; i < allRunningProfileUserIds.length; i++) {
+ issues.addAll(getIssuesForUser(allRunningProfileUserIds[i]));
}
return issues;
diff --git a/service/java/com/android/safetycenter/data/SafetySourceDataValidator.java b/service/java/com/android/safetycenter/data/SafetySourceDataValidator.java
index 7355035b0..4b74b0440 100644
--- a/service/java/com/android/safetycenter/data/SafetySourceDataValidator.java
+++ b/service/java/com/android/safetycenter/data/SafetySourceDataValidator.java
@@ -29,10 +29,10 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.android.modules.utils.build.SdkLevel;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.SafetyCenterConfigReader;
import com.android.safetycenter.SafetyCenterFlags;
import com.android.safetycenter.SafetySources;
+import com.android.safetycenter.UserProfileGroup;
import java.util.List;
import java.util.Set;
@@ -90,10 +90,14 @@ final class SafetySourceDataValidator {
validateCallingPackage(safetySource, packageName, safetySourceId);
}
- if (UserUtils.isManagedProfile(userId, mContext)
- && !SafetySources.supportsManagedProfiles(safetySource)) {
+ @UserProfileGroup.ProfileType int profileType =
+ UserProfileGroup.getProfileTypeOfUser(userId, mContext);
+ if (!SafetySources.supportsProfileType(safetySource, profileType)) {
throw new IllegalArgumentException(
- "Unexpected managed profile request for safety source: " + safetySourceId);
+ "Unexpected profile type: "
+ + profileType
+ + " for safety source: "
+ + safetySourceId);
}
boolean retrievingOrClearingData = safetySourceData == null;
@@ -111,6 +115,8 @@ final class SafetySourceDataValidator {
}
if (safetySource.getType() == SafetySource.SAFETY_SOURCE_TYPE_DYNAMIC
+ && safetySource.getInitialDisplayState()
+ != SafetySource.INITIAL_DISPLAY_STATE_HIDDEN
&& safetySourceStatus == null) {
throw new IllegalArgumentException(
"Missing status for dynamic safety source: " + safetySourceId);
diff --git a/service/java/com/android/safetycenter/data/SafetySourceStateCollectedLogger.java b/service/java/com/android/safetycenter/data/SafetySourceStateCollectedLogger.java
index e73459598..1bf8685bf 100644
--- a/service/java/com/android/safetycenter/data/SafetySourceStateCollectedLogger.java
+++ b/service/java/com/android/safetycenter/data/SafetySourceStateCollectedLogger.java
@@ -26,9 +26,10 @@ import android.safetycenter.SafetySourceStatus;
import androidx.annotation.Nullable;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.SafetySourceIssueInfo;
import com.android.safetycenter.SafetySourceKey;
+import com.android.safetycenter.UserProfileGroup;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.internaldata.SafetyCenterIssueKey;
import com.android.safetycenter.logging.SafetyCenterStatsdLogger;
@@ -63,13 +64,13 @@ final class SafetySourceStateCollectedLogger {
/**
* Writes a SafetySourceStateCollected atom for the given source in response to a stats pull.
*/
- void writeAutomaticAtom(SafetySourceKey sourceKey, boolean isManagedProfile) {
+ void writeAutomaticAtom(SafetySourceKey sourceKey, @ProfileType int profileType) {
logSafetySourceStateCollected(
sourceKey,
mSourceDataRepository.getSafetySourceData(sourceKey),
/* refreshReason= */ null,
/* sourceDataDiffers= */ false,
- isManagedProfile,
+ profileType,
/* safetyEvent= */ null,
mSourceDataRepository.getSafetySourceLastUpdated(sourceKey));
}
@@ -90,7 +91,7 @@ final class SafetySourceStateCollectedLogger {
safetySourceData,
refreshReason,
sourceDataDiffers,
- UserUtils.isManagedProfile(userId, mContext),
+ UserProfileGroup.getProfileTypeOfUser(userId, mContext),
safetyEvent,
/* lastUpdatedElapsedTimeMillis= */ null);
}
@@ -100,7 +101,7 @@ final class SafetySourceStateCollectedLogger {
@Nullable SafetySourceData sourceData,
@Nullable @SafetyCenterManager.RefreshReason Integer refreshReason,
boolean sourceDataDiffers,
- boolean isManagedProfile,
+ @ProfileType int profileType,
@Nullable SafetyEvent safetyEvent,
@Nullable @ElapsedRealtimeLong Long lastUpdatedElapsedTimeMillis) {
SafetySourceStatus sourceStatus = sourceData == null ? null : sourceData.getStatus();
@@ -131,7 +132,7 @@ final class SafetySourceStateCollectedLogger {
Integer severityLevel = maxSeverityLevel > Integer.MIN_VALUE ? maxSeverityLevel : null;
SafetyCenterStatsdLogger.writeSafetySourceStateCollected(
sourceKey.getSourceId(),
- isManagedProfile,
+ profileType,
severityLevel,
openIssuesCount,
dismissedIssuesCount,
diff --git a/service/java/com/android/safetycenter/logging/SafetyCenterPullAtomCallback.java b/service/java/com/android/safetycenter/logging/SafetyCenterPullAtomCallback.java
index 168d73a0f..a8dc7568e 100644
--- a/service/java/com/android/safetycenter/logging/SafetyCenterPullAtomCallback.java
+++ b/service/java/com/android/safetycenter/logging/SafetyCenterPullAtomCallback.java
@@ -38,6 +38,7 @@ import com.android.safetycenter.SafetyCenterFlags;
import com.android.safetycenter.SafetySourceKey;
import com.android.safetycenter.SafetySources;
import com.android.safetycenter.UserProfileGroup;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import com.android.safetycenter.data.SafetyCenterDataManager;
import java.util.List;
@@ -149,19 +150,19 @@ public final class SafetyCenterPullAtomCallback implements StatsPullAtomCallback
continue;
}
- writeSafetySourceStateCollectedAtomLocked(
- loggableSource,
- userProfileGroup.getProfileParentUserId(),
- /* isUserManaged= */ false);
-
- if (!SafetySources.supportsManagedProfiles(loggableSource)) {
- continue;
- }
-
- int[] managedIds = userProfileGroup.getManagedRunningProfilesUserIds();
- for (int k = 0; k < managedIds.length; k++) {
- writeSafetySourceStateCollectedAtomLocked(
- loggableSource, managedIds[k], /* isUserManaged= */ true);
+ for (int profileTypeIdx = 0;
+ profileTypeIdx < ProfileType.ALL_PROFILE_TYPES.length;
+ ++profileTypeIdx) {
+ @ProfileType int profileType = ProfileType.ALL_PROFILE_TYPES[profileTypeIdx];
+ if (!SafetySources.supportsProfileType(loggableSource, profileType)) {
+ continue;
+ }
+
+ int[] profileIds = userProfileGroup.getProfilesOfType(profileType);
+ for (int profileIdx = 0; profileIdx < profileIds.length; profileIdx++) {
+ writeSafetySourceStateCollectedAtomLocked(
+ loggableSource, profileIds[profileIdx], profileType);
+ }
}
}
}
@@ -169,8 +170,8 @@ public final class SafetyCenterPullAtomCallback implements StatsPullAtomCallback
@GuardedBy("mApiLock")
private void writeSafetySourceStateCollectedAtomLocked(
- SafetySource safetySource, @UserIdInt int userId, boolean isUserManaged) {
+ SafetySource safetySource, @UserIdInt int userId, @ProfileType int profileType) {
SafetySourceKey sourceKey = SafetySourceKey.of(safetySource.getId(), userId);
- mDataManager.logSafetySourceStateCollectedAutomatic(sourceKey, isUserManaged);
+ mDataManager.logSafetySourceStateCollectedAutomatic(sourceKey, profileType);
}
}
diff --git a/service/java/com/android/safetycenter/logging/SafetyCenterStatsdLogger.java b/service/java/com/android/safetycenter/logging/SafetyCenterStatsdLogger.java
index 710c3f7ac..3311d0c1f 100644
--- a/service/java/com/android/safetycenter/logging/SafetyCenterStatsdLogger.java
+++ b/service/java/com/android/safetycenter/logging/SafetyCenterStatsdLogger.java
@@ -25,6 +25,8 @@ import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTIO
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SOURCE_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
+import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__SENSOR_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_CRITICAL_WARNING;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_INTERACTION_REPORTED__SEVERITY_LEVEL__SAFETY_SEVERITY_OK;
@@ -43,12 +45,15 @@ import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVE
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVENT_REPORTED__RESULT__TIMEOUT;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
import static com.android.permission.PermissionStatsLog.SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__COLLECTION_TYPE__AUTOMATIC;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__COLLECTION_TYPE__SOURCE_UPDATED;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
+import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SEVERITY_LEVEL__SAFETY_SEVERITY_CRITICAL_WARNING;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SEVERITY_LEVEL__SAFETY_SEVERITY_LEVEL_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_SOURCE_STATE_COLLECTED__SEVERITY_LEVEL__SAFETY_SEVERITY_OK;
@@ -69,6 +74,9 @@ import static com.android.permission.PermissionStatsLog.SAFETY_STATE__OVERALL_SE
import static com.android.permission.PermissionStatsLog.SAFETY_STATE__OVERALL_SEVERITY_LEVEL__SAFETY_SEVERITY_LEVEL_UNKNOWN;
import static com.android.permission.PermissionStatsLog.SAFETY_STATE__OVERALL_SEVERITY_LEVEL__SAFETY_SEVERITY_OK;
import static com.android.permission.PermissionStatsLog.SAFETY_STATE__OVERALL_SEVERITY_LEVEL__SAFETY_SEVERITY_RECOMMENDATION;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_MANAGED;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIMARY;
+import static com.android.safetycenter.UserProfileGroup.PROFILE_TYPE_PRIVATE;
import android.annotation.ElapsedRealtimeLong;
import android.annotation.IntDef;
@@ -84,6 +92,7 @@ import androidx.annotation.Nullable;
import com.android.permission.PermissionStatsLog;
import com.android.safetycenter.SafetyCenterFlags;
+import com.android.safetycenter.UserProfileGroup.ProfileType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -161,7 +170,7 @@ public final class SafetyCenterStatsdLogger {
/** Writes a {@link PermissionStatsLog#SAFETY_SOURCE_STATE_COLLECTED} atom. */
public static void writeSafetySourceStateCollected(
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
@Nullable @SafetySourceData.SeverityLevel Integer sourceSeverityLevel,
long openIssuesCount,
long dismissedIssuesCount,
@@ -181,7 +190,7 @@ public final class SafetyCenterStatsdLogger {
PermissionStatsLog.write(
SAFETY_SOURCE_STATE_COLLECTED,
idStringToLong(sourceId),
- toSourceStateCollectedProfileType(isManagedProfile),
+ toSourceStateCollectedProfileType(profileType),
toSafetySourceStateCollectedSeverityLevel(sourceSeverityLevel),
openIssuesCount,
dismissedIssuesCount,
@@ -203,7 +212,7 @@ public final class SafetyCenterStatsdLogger {
public static void writeSourceRefreshSystemEvent(
@RefreshRequestType int refreshType,
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
Duration duration,
@SystemEventResult int result,
long refreshReason,
@@ -215,7 +224,7 @@ public final class SafetyCenterStatsdLogger {
SAFETY_CENTER_SYSTEM_EVENT_REPORTED,
toSourceRefreshEventType(refreshType),
idStringToLong(sourceId),
- toSystemEventProfileType(isManagedProfile),
+ toSystemEventProfileType(profileType),
UNSET_ISSUE_TYPE_ID,
duration.toMillis(),
result,
@@ -254,7 +263,7 @@ public final class SafetyCenterStatsdLogger {
*/
public static void writeInlineActionSystemEvent(
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
@Nullable String issueTypeId,
Duration duration,
@SystemEventResult int result) {
@@ -265,7 +274,7 @@ public final class SafetyCenterStatsdLogger {
SAFETY_CENTER_SYSTEM_EVENT_REPORTED,
SAFETY_CENTER_SYSTEM_EVENT_REPORTED__EVENT_TYPE__INLINE_ACTION,
idStringToLong(sourceId),
- toSystemEventProfileType(isManagedProfile),
+ toSystemEventProfileType(profileType),
issueTypeId == null ? UNSET_ISSUE_TYPE_ID : idStringToLong(issueTypeId),
duration.toMillis(),
result,
@@ -279,13 +288,13 @@ public final class SafetyCenterStatsdLogger {
*/
public static void writeNotificationPostedEvent(
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
String issueTypeId,
@SafetySourceData.SeverityLevel int sourceSeverityLevel) {
writeNotificationInteractionReportedEvent(
SAFETY_CENTER_INTERACTION_REPORTED__ACTION__NOTIFICATION_POSTED,
sourceId,
- isManagedProfile,
+ profileType,
issueTypeId,
sourceSeverityLevel);
}
@@ -296,13 +305,13 @@ public final class SafetyCenterStatsdLogger {
*/
public static void writeNotificationDismissedEvent(
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
String issueTypeId,
@SafetySourceData.SeverityLevel int sourceSeverityLevel) {
writeNotificationInteractionReportedEvent(
SAFETY_CENTER_INTERACTION_REPORTED__ACTION__NOTIFICATION_DISMISSED,
sourceId,
- isManagedProfile,
+ profileType,
issueTypeId,
sourceSeverityLevel);
}
@@ -313,7 +322,7 @@ public final class SafetyCenterStatsdLogger {
*/
public static void writeNotificationActionClickedEvent(
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
String issueTypeId,
@SafetySourceData.SeverityLevel int sourceSeverityLevel,
boolean isPrimaryAction) {
@@ -322,13 +331,13 @@ public final class SafetyCenterStatsdLogger {
? SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_PRIMARY_ACTION_CLICKED
: SAFETY_CENTER_INTERACTION_REPORTED__ACTION__ISSUE_SECONDARY_ACTION_CLICKED;
writeNotificationInteractionReportedEvent(
- action, sourceId, isManagedProfile, issueTypeId, sourceSeverityLevel);
+ action, sourceId, profileType, issueTypeId, sourceSeverityLevel);
}
private static void writeNotificationInteractionReportedEvent(
int interactionReportedAction,
String sourceId,
- boolean isManagedProfile,
+ @ProfileType int profileType,
String issueTypeId,
@SafetySourceData.SeverityLevel int sourceSeverityLevel) {
if (!SafetyCenterFlags.getAllowStatsdLogging()) {
@@ -342,7 +351,7 @@ public final class SafetyCenterStatsdLogger {
SAFETY_CENTER_INTERACTION_REPORTED__NAVIGATION_SOURCE__SOURCE_UNKNOWN,
toInteractionReportedSeverityLevel(sourceSeverityLevel),
idStringToLong(sourceId),
- toInteractionReportedProfileType(isManagedProfile),
+ toInteractionReportedProfileType(profileType),
idStringToLong(issueTypeId),
SAFETY_CENTER_INTERACTION_REPORTED__SENSOR__SENSOR_UNKNOWN,
UNSET_SOURCE_GROUP_ID,
@@ -382,22 +391,43 @@ public final class SafetyCenterStatsdLogger {
return SAFETY_CENTER_SYSTEM_EVENT_REPORTED__EVENT_TYPE__EVENT_TYPE_UNKNOWN;
}
- private static int toSourceStateCollectedProfileType(boolean isManagedProfile) {
- return isManagedProfile
- ? SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED
- : SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ private static int toSourceStateCollectedProfileType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ case PROFILE_TYPE_MANAGED:
+ return SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
+ case PROFILE_TYPE_PRIVATE:
+ return SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
+ }
+ Log.w(TAG, "state collect arg requested for unknown profile type " + profileType);
+ return SAFETY_SOURCE_STATE_COLLECTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
}
- private static int toSystemEventProfileType(boolean isManagedProfile) {
- return isManagedProfile
- ? SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED
- : SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ private static int toSystemEventProfileType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ case PROFILE_TYPE_MANAGED:
+ return SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
+ case PROFILE_TYPE_PRIVATE:
+ return SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
+ }
+ Log.w(TAG, "system event arg requested for unknown profile type " + profileType);
+ return SAFETY_CENTER_SYSTEM_EVENT_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
}
- private static int toInteractionReportedProfileType(boolean isManagedProfile) {
- return isManagedProfile
- ? SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED
- : SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ private static int toInteractionReportedProfileType(@ProfileType int profileType) {
+ switch (profileType) {
+ case PROFILE_TYPE_PRIMARY:
+ return SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PERSONAL;
+ case PROFILE_TYPE_MANAGED:
+ return SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_MANAGED;
+ case PROFILE_TYPE_PRIVATE:
+ return SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_PRIVATE;
+ }
+ Log.w(TAG, "interaction enum requested for unknown profile type " + profileType);
+ return SAFETY_CENTER_INTERACTION_REPORTED__SAFETY_SOURCE_PROFILE_TYPE__PROFILE_TYPE_UNKNOWN;
}
/**
diff --git a/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationReceiver.java b/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationReceiver.java
index ed0e95177..6cfa39580 100644
--- a/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationReceiver.java
+++ b/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationReceiver.java
@@ -27,7 +27,6 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.android.internal.annotations.GuardedBy;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.ApiLock;
import com.android.safetycenter.PendingIntentFactory;
import com.android.safetycenter.SafetyCenterDataChangeNotifier;
@@ -214,7 +213,7 @@ public final class SafetyCenterNotificationReceiver extends BroadcastReceiver {
if (dismissedIssue != null) {
SafetyCenterStatsdLogger.writeNotificationDismissedEvent(
issueKey.getSafetySourceId(),
- UserUtils.isManagedProfile(userId, context),
+ UserProfileGroup.getProfileTypeOfUser(userId, context),
dismissedIssue.getIssueTypeId(),
dismissedIssue.getSeverityLevel());
}
@@ -240,7 +239,7 @@ public final class SafetyCenterNotificationReceiver extends BroadcastReceiver {
if (issue != null) {
SafetyCenterStatsdLogger.writeNotificationActionClickedEvent(
issueKey.getSafetySourceId(),
- UserUtils.isManagedProfile(issueKey.getUserId(), context),
+ UserProfileGroup.getProfileTypeOfUser(issueKey.getUserId(), context),
issue.getIssueTypeId(),
issue.getSeverityLevel(),
SafetySourceIssues.isPrimaryAction(
diff --git a/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationSender.java b/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationSender.java
index d17090c34..2e298fa90 100644
--- a/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationSender.java
+++ b/service/java/com/android/safetycenter/notifications/SafetyCenterNotificationSender.java
@@ -37,7 +37,6 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.android.modules.utils.build.SdkLevel;
-import com.android.permission.util.UserUtils;
import com.android.safetycenter.SafetyCenterFlags;
import com.android.safetycenter.SafetySourceIssueInfo;
import com.android.safetycenter.SafetySourceIssues;
@@ -210,11 +209,9 @@ public final class SafetyCenterNotificationSender {
/** Updates Safety Center notifications for the given {@link UserProfileGroup}. */
public void updateNotifications(UserProfileGroup userProfileGroup) {
- updateNotifications(userProfileGroup.getProfileParentUserId());
-
- int[] managedProfileUserIds = userProfileGroup.getManagedProfilesUserIds();
- for (int i = 0; i < managedProfileUserIds.length; i++) {
- updateNotifications(managedProfileUserIds[i]);
+ int[] allProfilesUserIds = userProfileGroup.getAllProfilesUserIds();
+ for (int i = 0; i < allProfilesUserIds.length; i++) {
+ updateNotifications(allProfilesUserIds[i]);
}
}
@@ -387,7 +384,7 @@ public final class SafetyCenterNotificationSender {
mNotifiedIssues.put(key, issue);
SafetyCenterStatsdLogger.writeNotificationPostedEvent(
key.getSafetySourceId(),
- UserUtils.isManagedProfile(key.getUserId(), mContext),
+ UserProfileGroup.getProfileTypeOfUser(key.getUserId(), mContext),
issue.getIssueTypeId(),
issue.getSeverityLevel());
}
diff --git a/service/lint-baseline.xml b/service/lint-baseline.xml
index dd7e79ef5..226175e91 100644
--- a/service/lint-baseline.xml
+++ b/service/lint-baseline.xml
@@ -1,42 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 8.0.0-dev" type="baseline" dependencies="true" variant="all" version="8.0.0-dev">
+<issues format="6" by="lint 8.4.0-alpha01" type="baseline" client="" dependencies="true" name="" variant="all" version="8.4.0-alpha01">
<issue
id="NewApi"
- message="Call requires API level 31 (current min is 30): `android.os.UserHandle#getUid`"
- errorLine1=" return UserHandle.of(userId).getUid(appId);"
- errorLine2=" ~~~~~~">
+ message="Call requires API level 34 (current min is 33): `getDeduplicationGroup`"
+ errorLine1=" String deduplicationGroup = issueInfo.getSafetySource().getDeduplicationGroup();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/service/java/com/android/permission/compat/UserHandleCompat.java"
- line="57"
- column="38"/>
+ file="packages/modules/Permission/service/java/com/android/safetycenter/data/SafetyCenterIssueDeduplicator.java"
+ line="316"
+ column="65"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `android.content.pm.PackageManager#getPackageUidAsUser`"
- errorLine1=" packageManager.getPackageUidAsUser("
- errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ message="Call requires API level 34 (current min is 33): `getDeduplicationId`"
+ errorLine1=" String deduplicationId = issueInfo.getSafetySourceIssue().getDeduplicationId();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/service/java/com/android/safetycenter/SafetyCenterService.java"
- line="651"
- column="40"/>
+ file="packages/modules/Permission/service/java/com/android/safetycenter/data/SafetyCenterIssueDeduplicator.java"
+ line="317"
+ column="67"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `getDeduplicationGroup`">
+ message="Call requires API level 34 (current min is 33): `android.content.pm.PackageManager#getPackageUidAsUser`"
+ errorLine1=" packageManager.getPackageUidAsUser("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
- file="packages/modules/Permission/service/java/com/android/safetycenter/data/SafetyCenterIssueDeduplicator.java"
- line="315"/>
+ file="packages/modules/Permission/service/java/com/android/safetycenter/SafetyCenterService.java"
+ line="732"
+ column="40"/>
</issue>
<issue
id="NewApi"
- message="Call requires API level 34 (current min is 33): `getDeduplicationId`">
+ message="Call requires API level 31 (current min is 30): `android.os.UserHandle#getUid`"
+ errorLine1=" return UserHandle.of(userId).getUid(appId);"
+ errorLine2=" ~~~~~~">
<location
- file="packages/modules/Permission/service/java/com/android/safetycenter/data/SafetyCenterIssueDeduplicator.java"
- line="316"/>
+ file="packages/modules/Permission/service/java/com/android/permission/compat/UserHandleCompat.java"
+ line="57"
+ column="38"/>
</issue>
</issues> \ No newline at end of file
diff --git a/tests/cts/permission/Android.bp b/tests/cts/permission/Android.bp
index 8849f41a7..ed7fcea25 100644
--- a/tests/cts/permission/Android.bp
+++ b/tests/cts/permission/Android.bp
@@ -30,6 +30,7 @@ android_test {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
// Include both the 32 and 64 bit versions
compile_multilib: "both",
@@ -52,6 +53,8 @@ android_test {
"sts-device-util",
"platform-test-rules",
"CtsVirtualDeviceCommonLib",
+ "android.permission.flags-aconfig-java",
+ "androidx.test.rules",
],
jni_libs: [
"libctspermission_jni",
diff --git a/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp b/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
index fdb0be452..df6bdf5c3 100644
--- a/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
+++ b/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/Android.bp
@@ -31,5 +31,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/AndroidManifest.xml b/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/AndroidManifest.xml
index ef4d82dfc..ece3ba1c7 100644
--- a/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/AndroidManifest.xml
+++ b/tests/cts/permission/AppThatAccessesCalendarContactsBodySensorCustomPermission/AndroidManifest.xml
@@ -34,6 +34,7 @@
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.BODY_SENSORS" />
+ <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.cts.appthatrequestcustompermission.TEST_PERMISSION" />
<application />
diff --git a/tests/cts/permission/AppThatAccessesLocationOnCommand/Android.bp b/tests/cts/permission/AppThatAccessesLocationOnCommand/Android.bp
index 2bb3dd3ab..d4573d264 100644
--- a/tests/cts/permission/AppThatAccessesLocationOnCommand/Android.bp
+++ b/tests/cts/permission/AppThatAccessesLocationOnCommand/Android.bp
@@ -32,6 +32,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: [
"src/**/*.java",
diff --git a/tests/cts/permission/AppThatAlsoDefinesPermissionA/Android.bp b/tests/cts/permission/AppThatAlsoDefinesPermissionA/Android.bp
index 46b7aecd3..af002df2b 100644
--- a/tests/cts/permission/AppThatAlsoDefinesPermissionA/Android.bp
+++ b/tests/cts/permission/AppThatAlsoDefinesPermissionA/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatAlsoDefinesPermissionADifferentCert/Android.bp b/tests/cts/permission/AppThatAlsoDefinesPermissionADifferentCert/Android.bp
index c88d0f7fe..6a622ca46 100644
--- a/tests/cts/permission/AppThatAlsoDefinesPermissionADifferentCert/Android.bp
+++ b/tests/cts/permission/AppThatAlsoDefinesPermissionADifferentCert/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert/Android.bp b/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert/Android.bp
index b1ef695ac..98f0a9aeb 100644
--- a/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert/Android.bp
+++ b/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert30/Android.bp b/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert30/Android.bp
index 52900dfc3..dd46066e9 100644
--- a/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert30/Android.bp
+++ b/tests/cts/permission/AppThatAlsoDefinesPermissionGroupADifferentCert30/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatDefinesPermissionA/Android.bp b/tests/cts/permission/AppThatDefinesPermissionA/Android.bp
index 54a575b4f..e8125cd76 100644
--- a/tests/cts/permission/AppThatDefinesPermissionA/Android.bp
+++ b/tests/cts/permission/AppThatDefinesPermissionA/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup/Android.bp b/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup/Android.bp
index 9029b3a98..06f181f40 100644
--- a/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup/Android.bp
+++ b/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup30/Android.bp b/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup30/Android.bp
index 04961e265..527594589 100644
--- a/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup30/Android.bp
+++ b/tests/cts/permission/AppThatDefinesPermissionWithInvalidGroup30/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatDefinesPermissionWithPlatformGroup/Android.bp b/tests/cts/permission/AppThatDefinesPermissionWithPlatformGroup/Android.bp
index 687ad7488..8d6279704 100644
--- a/tests/cts/permission/AppThatDefinesPermissionWithPlatformGroup/Android.bp
+++ b/tests/cts/permission/AppThatDefinesPermissionWithPlatformGroup/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp b/tests/cts/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
index c00d26d3a..684fd0559 100644
--- a/tests/cts/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
+++ b/tests/cts/permission/AppThatDefinesUndefinedPermissionGroupElement/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
srcs: ["src/**/*.kt"],
}
diff --git a/tests/cts/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp b/tests/cts/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
index f9ff21c6f..6e9936996 100644
--- a/tests/cts/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
+++ b/tests/cts/permission/AppThatDoesNotHaveBgLocationAccess/Android.bp
@@ -32,5 +32,6 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatHasNotificationListener/Android.bp b/tests/cts/permission/AppThatHasNotificationListener/Android.bp
index 419ab5d66..3f3563e87 100644
--- a/tests/cts/permission/AppThatHasNotificationListener/Android.bp
+++ b/tests/cts/permission/AppThatHasNotificationListener/Android.bp
@@ -32,6 +32,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: [
"src/**/*.java",
diff --git a/tests/cts/permission/AppThatRequestBluetoothPermission30/Android.bp b/tests/cts/permission/AppThatRequestBluetoothPermission30/Android.bp
index a3fe38109..5909e12b0 100644
--- a/tests/cts/permission/AppThatRequestBluetoothPermission30/Android.bp
+++ b/tests/cts/permission/AppThatRequestBluetoothPermission30/Android.bp
@@ -35,6 +35,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: [":AppThatRequestBluetoothPermission"],
}
diff --git a/tests/cts/permission/AppThatRequestBluetoothPermission31/Android.bp b/tests/cts/permission/AppThatRequestBluetoothPermission31/Android.bp
index 7dc2e2445..c5abe6c18 100644
--- a/tests/cts/permission/AppThatRequestBluetoothPermission31/Android.bp
+++ b/tests/cts/permission/AppThatRequestBluetoothPermission31/Android.bp
@@ -28,6 +28,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: [":AppThatRequestBluetoothPermission"],
}
diff --git a/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocation31/Android.bp b/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocation31/Android.bp
index 857f2e2f4..f5a0faa3a 100644
--- a/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocation31/Android.bp
+++ b/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocation31/Android.bp
@@ -28,6 +28,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: [":AppThatRequestBluetoothPermission"],
}
diff --git a/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocationNoProvider/Android.bp b/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocationNoProvider/Android.bp
index 6f635c0cc..88a2765ca 100644
--- a/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocationNoProvider/Android.bp
+++ b/tests/cts/permission/AppThatRequestBluetoothPermissionNeverForLocationNoProvider/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp b/tests/cts/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
index 1a057d010..a1364df32 100644
--- a/tests/cts/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
+++ b/tests/cts/permission/AppThatRequestContactsAndCallLogPermission16/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestContactsPermission15/Android.bp b/tests/cts/permission/AppThatRequestContactsPermission15/Android.bp
index 54618447e..bb9ea42dc 100644
--- a/tests/cts/permission/AppThatRequestContactsPermission15/Android.bp
+++ b/tests/cts/permission/AppThatRequestContactsPermission15/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestContactsPermission16/Android.bp b/tests/cts/permission/AppThatRequestContactsPermission16/Android.bp
index 2dca5aa2c..a378c0c7f 100644
--- a/tests/cts/permission/AppThatRequestContactsPermission16/Android.bp
+++ b/tests/cts/permission/AppThatRequestContactsPermission16/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestDevicePermissions/Android.bp b/tests/cts/permission/AppThatRequestDevicePermissions/Android.bp
index c0a9f9914..10ee18ed6 100644
--- a/tests/cts/permission/AppThatRequestDevicePermissions/Android.bp
+++ b/tests/cts/permission/AppThatRequestDevicePermissions/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission28/Android.bp b/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission28/Android.bp
index 5a60a3fbd..eaf10f50c 100644
--- a/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission28/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission28/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"vts10",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp b/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
index de6c3cbb2..095c24093 100644
--- a/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationAndBackgroundPermission29/Android.bp
@@ -29,5 +29,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationPermission22/Android.bp b/tests/cts/permission/AppThatRequestLocationPermission22/Android.bp
index 25d9893ec..32d8505fb 100644
--- a/tests/cts/permission/AppThatRequestLocationPermission22/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationPermission22/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationPermission28/Android.bp b/tests/cts/permission/AppThatRequestLocationPermission28/Android.bp
index bfeadbd58..29ade84d2 100644
--- a/tests/cts/permission/AppThatRequestLocationPermission28/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationPermission28/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationPermission29/Android.bp b/tests/cts/permission/AppThatRequestLocationPermission29/Android.bp
index ee3982ea4..240795b30 100644
--- a/tests/cts/permission/AppThatRequestLocationPermission29/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationPermission29/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestLocationPermission29v4/Android.bp b/tests/cts/permission/AppThatRequestLocationPermission29v4/Android.bp
index b56bb25eb..262438a04 100644
--- a/tests/cts/permission/AppThatRequestLocationPermission29v4/Android.bp
+++ b/tests/cts/permission/AppThatRequestLocationPermission29v4/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestMultiplePermissionsWithMinMaxSdk/Android.bp b/tests/cts/permission/AppThatRequestMultiplePermissionsWithMinMaxSdk/Android.bp
index 5fcc6c8ba..4a8cddd5c 100644
--- a/tests/cts/permission/AppThatRequestMultiplePermissionsWithMinMaxSdk/Android.bp
+++ b/tests/cts/permission/AppThatRequestMultiplePermissionsWithMinMaxSdk/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestOneTimePermission/Android.bp b/tests/cts/permission/AppThatRequestOneTimePermission/Android.bp
index c12a70871..50a347928 100644
--- a/tests/cts/permission/AppThatRequestOneTimePermission/Android.bp
+++ b/tests/cts/permission/AppThatRequestOneTimePermission/Android.bp
@@ -30,6 +30,7 @@ android_test_helper_app {
"cts",
"mts-permission",
"general-tests",
+ "mcts-permission",
],
srcs: ["src/**/*.java"],
}
diff --git a/tests/cts/permission/AppThatRequestPermissionAandB/Android.bp b/tests/cts/permission/AppThatRequestPermissionAandB/Android.bp
index 6c037b456..b583b4603 100644
--- a/tests/cts/permission/AppThatRequestPermissionAandB/Android.bp
+++ b/tests/cts/permission/AppThatRequestPermissionAandB/Android.bp
@@ -28,6 +28,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: ["src/**/*.java"],
}
diff --git a/tests/cts/permission/AppThatRequestPermissionAandC/Android.bp b/tests/cts/permission/AppThatRequestPermissionAandC/Android.bp
index b94965334..ae309b0bb 100644
--- a/tests/cts/permission/AppThatRequestPermissionAandC/Android.bp
+++ b/tests/cts/permission/AppThatRequestPermissionAandC/Android.bp
@@ -28,6 +28,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
srcs: ["src/**/*.java"],
}
diff --git a/tests/cts/permission/AppThatRequestStoragePermission28/Android.bp b/tests/cts/permission/AppThatRequestStoragePermission28/Android.bp
index 50ae9209b..a2bd97b3c 100644
--- a/tests/cts/permission/AppThatRequestStoragePermission28/Android.bp
+++ b/tests/cts/permission/AppThatRequestStoragePermission28/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestStoragePermission29/Android.bp b/tests/cts/permission/AppThatRequestStoragePermission29/Android.bp
index 4663be9dc..5b1c73f3a 100644
--- a/tests/cts/permission/AppThatRequestStoragePermission29/Android.bp
+++ b/tests/cts/permission/AppThatRequestStoragePermission29/Android.bp
@@ -27,5 +27,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestSystemAlertWindow22/Android.bp b/tests/cts/permission/AppThatRequestSystemAlertWindow22/Android.bp
index 43cc9de97..8f0ff524f 100644
--- a/tests/cts/permission/AppThatRequestSystemAlertWindow22/Android.bp
+++ b/tests/cts/permission/AppThatRequestSystemAlertWindow22/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRequestSystemAlertWindow23/Android.bp b/tests/cts/permission/AppThatRequestSystemAlertWindow23/Android.bp
index 403257d45..73c5c8813 100644
--- a/tests/cts/permission/AppThatRequestSystemAlertWindow23/Android.bp
+++ b/tests/cts/permission/AppThatRequestSystemAlertWindow23/Android.bp
@@ -28,5 +28,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppThatRunsRationaleTests/Android.bp b/tests/cts/permission/AppThatRunsRationaleTests/Android.bp
index 30019fba5..f6826784c 100644
--- a/tests/cts/permission/AppThatRunsRationaleTests/Android.bp
+++ b/tests/cts/permission/AppThatRunsRationaleTests/Android.bp
@@ -29,6 +29,7 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
srcs: ["src/**/*.java"],
diff --git a/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp b/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
index 8214c425d..43e40d887 100644
--- a/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
+++ b/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission28/Android.bp
@@ -29,5 +29,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp b/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
index 3df5c9a7d..c76088043 100644
--- a/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
+++ b/tests/cts/permission/AppWithSharedUidThatRequestLocationPermission29/Android.bp
@@ -29,5 +29,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp b/tests/cts/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
index 7dd3ef638..a00cf0df1 100644
--- a/tests/cts/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
+++ b/tests/cts/permission/AppWithSharedUidThatRequestsNoPermissions/Android.bp
@@ -26,5 +26,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/AppWithSharedUidThatRequestsPermissions/Android.bp b/tests/cts/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
index c58b3e81e..ff95c1b86 100644
--- a/tests/cts/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
+++ b/tests/cts/permission/AppWithSharedUidThatRequestsPermissions/Android.bp
@@ -26,5 +26,6 @@ android_test_helper_app {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/StorageEscalationApp28/Android.bp b/tests/cts/permission/StorageEscalationApp28/Android.bp
index 9ea70f565..f0c86433b 100644
--- a/tests/cts/permission/StorageEscalationApp28/Android.bp
+++ b/tests/cts/permission/StorageEscalationApp28/Android.bp
@@ -26,5 +26,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/StorageEscalationApp29Full/Android.bp b/tests/cts/permission/StorageEscalationApp29Full/Android.bp
index dcb64e68a..810032059 100644
--- a/tests/cts/permission/StorageEscalationApp29Full/Android.bp
+++ b/tests/cts/permission/StorageEscalationApp29Full/Android.bp
@@ -26,5 +26,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/StorageEscalationApp29Scoped/Android.bp b/tests/cts/permission/StorageEscalationApp29Scoped/Android.bp
index 8a780c07b..12a5310e2 100644
--- a/tests/cts/permission/StorageEscalationApp29Scoped/Android.bp
+++ b/tests/cts/permission/StorageEscalationApp29Scoped/Android.bp
@@ -26,5 +26,6 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/sdk28/Android.bp b/tests/cts/permission/sdk28/Android.bp
index 3043c9329..2bdffabe5 100644
--- a/tests/cts/permission/sdk28/Android.bp
+++ b/tests/cts/permission/sdk28/Android.bp
@@ -29,5 +29,6 @@ android_test {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permission/src/android/permission/cts/AccessibilityPrivacySourceTest.kt b/tests/cts/permission/src/android/permission/cts/AccessibilityPrivacySourceTest.kt
index e7bad2b05..42b9067f3 100644
--- a/tests/cts/permission/src/android/permission/cts/AccessibilityPrivacySourceTest.kt
+++ b/tests/cts/permission/src/android/permission/cts/AccessibilityPrivacySourceTest.kt
@@ -92,15 +92,6 @@ class AccessibilityPrivacySourceTest {
)
@get:Rule
- val deviceConfigA11ySourceEnabled =
- DeviceConfigStateChangerRule(
- context,
- DeviceConfig.NAMESPACE_PRIVACY,
- ACCESSIBILITY_SOURCE_ENABLED,
- true.toString()
- )
-
- @get:Rule
val deviceConfigA11yListenerDisabled =
DeviceConfigStateChangerRule(
context,
@@ -233,26 +224,6 @@ class AccessibilityPrivacySourceTest {
}
@Test
- fun testJobWithAccessibilityFeatureDisabledDoesNotSendNotification() {
- setDeviceConfigPrivacyProperty(ACCESSIBILITY_SOURCE_ENABLED, false.toString())
- mAccessibilityServiceRule.enableService()
- runJobAndWaitUntilCompleted()
- assertEmptyNotification(permissionControllerPackage, ACCESSIBILITY_NOTIFICATION_ID)
- }
-
- @Test
- fun testJobWithAccessibilityFeatureDisabledDoesNotSendIssueToSafetyCenter() {
- setDeviceConfigPrivacyProperty(ACCESSIBILITY_SOURCE_ENABLED, false.toString())
- mAccessibilityServiceRule.enableService()
- runJobAndWaitUntilCompleted()
- assertSafetyCenterIssueDoesNotExist(
- SC_ACCESSIBILITY_SOURCE_ID,
- safetyCenterIssueId,
- SC_ACCESSIBILITY_ISSUE_TYPE_ID
- )
- }
-
- @Test
fun testJobWithSafetyCenterDisabledDoesNotSendNotification() {
setDeviceConfigPrivacyProperty(SAFETY_CENTER_ENABLED, false.toString())
mAccessibilityServiceRule.enableService()
@@ -332,7 +303,6 @@ class AccessibilityPrivacySourceTest {
companion object {
private const val SC_ACCESSIBILITY_SOURCE_ID = "AndroidAccessibility"
- private const val ACCESSIBILITY_SOURCE_ENABLED = "sc_accessibility_source_enabled"
private const val SAFETY_CENTER_ENABLED = "safety_center_is_enabled"
private const val ACCESSIBILITY_LISTENER_ENABLED = "sc_accessibility_listener_enabled"
private const val ACCESSIBILITY_JOB_INTERVAL_MILLIS = "sc_accessibility_job_interval_millis"
diff --git a/tests/cts/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java b/tests/cts/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
index 294896d97..fa43bfb18 100644
--- a/tests/cts/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/AppWidgetManagerPermissionTest.java
@@ -20,7 +20,8 @@ import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Test that protected AppWidgetManager APIs cannot be called without permissions
diff --git a/tests/cts/permission/src/android/permission/cts/CameraPermissionTest.java b/tests/cts/permission/src/android/permission/cts/CameraPermissionTest.java
index 99f2862f1..981735388 100644
--- a/tests/cts/permission/src/android/permission/cts/CameraPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/CameraPermissionTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.hardware.Camera;
import android.os.Environment;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
import java.io.FileOutputStream;
diff --git a/tests/cts/permission/src/android/permission/cts/ContactsProviderTest.java b/tests/cts/permission/src/android/permission/cts/ContactsProviderTest.java
index 984fd6cfe..69b64d790 100644
--- a/tests/cts/permission/src/android/permission/cts/ContactsProviderTest.java
+++ b/tests/cts/permission/src/android/permission/cts/ContactsProviderTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.content.ContentValues;
import android.provider.ContactsContract;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify permissions are enforced.
diff --git a/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt b/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt
index ac02d53b5..d70375459 100644
--- a/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt
+++ b/tests/cts/permission/src/android/permission/cts/DevicePermissionsTest.kt
@@ -21,17 +21,24 @@ import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
import android.app.ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND_SERVICE
import android.app.Instrumentation
import android.companion.virtual.VirtualDeviceManager
+import android.companion.virtual.VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT
import android.companion.virtual.VirtualDeviceManager.VirtualDevice
import android.companion.virtual.VirtualDeviceParams
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager.FLAG_PERMISSION_ONE_TIME
+import android.content.pm.PackageManager.FLAG_PERMISSION_USER_FIXED
+import android.content.pm.PackageManager.FLAG_PERMISSION_USER_SET
import android.content.pm.PackageManager.PERMISSION_DENIED
import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.os.Build
import android.os.UserHandle
import android.permission.PermissionManager
+import android.permission.flags.Flags
import android.platform.test.annotations.AppModeFull
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
import android.virtualdevice.cts.common.FakeAssociationRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SdkSuppress
@@ -57,6 +64,7 @@ class DevicePermissionsTest {
private lateinit var virtualDevice: VirtualDevice
private lateinit var virtualDeviceContext: Context
+ private lateinit var persistentDeviceId: String
private lateinit var permissionManager: PermissionManager
@@ -69,9 +77,12 @@ class DevicePermissionsTest {
Manifest.permission.CREATE_VIRTUAL_DEVICE,
Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
Manifest.permission.MANAGE_ONE_TIME_PERMISSION_SESSIONS,
- Manifest.permission.REVOKE_RUNTIME_PERMISSIONS
+ Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
+ Manifest.permission.GET_RUNTIME_PERMISSIONS
)
+ @Rule @JvmField val mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
@Before
fun setup() {
val virtualDeviceManager =
@@ -84,6 +95,7 @@ class DevicePermissionsTest {
)
virtualDeviceContext = defaultDeviceContext.createDeviceContext(virtualDevice.deviceId)
permissionManager = virtualDeviceContext.getSystemService(PermissionManager::class.java)!!
+ persistentDeviceId = virtualDevice.persistentDeviceId!!
runShellCommandOrThrow("pm install -r $TEST_APK")
}
@@ -93,11 +105,16 @@ class DevicePermissionsTest {
virtualDevice.close()
}
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun testDeviceAwareRuntimePermissionIsGranted() {
grantPermissionAndAssertGranted(Manifest.permission.CAMERA, virtualDeviceContext)
}
+ @RequiresFlagsDisabled(Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED)
@Test
fun testDeviceAwareRuntimePermissionGrantIsInherited() {
grantPermissionAndAssertGranted(Manifest.permission.CAMERA, defaultDeviceContext)
@@ -107,33 +124,29 @@ class DevicePermissionsTest {
@Test
fun testNonDeviceAwareRuntimePermissionGrantIsInherited() {
- grantPermissionAndAssertGranted(Manifest.permission.READ_CONTACTS, defaultDeviceContext)
+ grantPermissionAndAssertGranted(NON_DEVICE_AWARE_PERMISSION, defaultDeviceContext)
- assertPermission(
- Manifest.permission.READ_CONTACTS,
- PERMISSION_GRANTED,
- virtualDeviceContext
- )
+ assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_GRANTED, virtualDeviceContext)
}
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun testDeviceAwareRuntimePermissionIsRevoked() {
- grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext)
+ grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext)
- revokePermissionAndAssertDenied(Manifest.permission.RECORD_AUDIO, virtualDeviceContext)
+ revokePermissionAndAssertDenied(DEVICE_AWARE_PERMISSION, virtualDeviceContext)
}
@Test
fun testNonDeviceAwareRuntimePermissionIsRevokedForDefaultDevice() {
- grantPermissionAndAssertGranted(Manifest.permission.READ_CONTACTS, defaultDeviceContext)
- assertPermission(
- Manifest.permission.READ_CONTACTS,
- PERMISSION_GRANTED,
- virtualDeviceContext
- )
+ grantPermissionAndAssertGranted(NON_DEVICE_AWARE_PERMISSION, defaultDeviceContext)
+ assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_GRANTED, virtualDeviceContext)
// Revoke call from virtualDeviceContext should revoke for default device as well.
- revokePermissionAndAssertDenied(Manifest.permission.READ_CONTACTS, virtualDeviceContext)
- assertPermission(Manifest.permission.READ_CONTACTS, PERMISSION_DENIED, defaultDeviceContext)
+ revokePermissionAndAssertDenied(NON_DEVICE_AWARE_PERMISSION, virtualDeviceContext)
+ assertPermission(NON_DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, defaultDeviceContext)
}
@Test
@@ -148,9 +161,9 @@ class DevicePermissionsTest {
@Test
fun testOneTimePermissionIsRevoked() {
- grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext)
+ grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext)
virtualDeviceContext.packageManager.updatePermissionFlags(
- Manifest.permission.RECORD_AUDIO,
+ DEVICE_AWARE_PERMISSION,
TEST_PACKAGE_NAME,
FLAG_PERMISSION_ONE_TIME,
FLAG_PERMISSION_ONE_TIME,
@@ -165,28 +178,311 @@ class DevicePermissionsTest {
IMPORTANCE_FOREGROUND_SERVICE
)
eventually {
- assertPermission(
- Manifest.permission.RECORD_AUDIO,
- PERMISSION_DENIED,
- virtualDeviceContext
- )
+ assertPermission(DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, virtualDeviceContext)
}
}
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun testRevokeSelfPermissionOnKill() {
- grantPermissionAndAssertGranted(Manifest.permission.RECORD_AUDIO, virtualDeviceContext)
+ grantPermissionAndAssertGranted(DEVICE_AWARE_PERMISSION, virtualDeviceContext)
- revokeSelfPermission(Manifest.permission.RECORD_AUDIO, virtualDeviceContext)
+ revokeSelfPermission(DEVICE_AWARE_PERMISSION, virtualDeviceContext)
eventually {
- assertPermission(
- Manifest.permission.RECORD_AUDIO,
- PERMISSION_DENIED,
- virtualDeviceContext
- )
+ assertPermission(DEVICE_AWARE_PERMISSION, PERMISSION_DENIED, virtualDeviceContext)
}
}
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
+ @Test
+ fun testGrantAndRevokeDeviceAwarePermissionByPersistentDeviceId() {
+ val deviceAwarePermission = DEVICE_AWARE_PERMISSION
+
+ permissionManager.grantRuntimePermission(
+ TEST_PACKAGE_NAME,
+ deviceAwarePermission,
+ persistentDeviceId
+ )
+
+ assertThat(
+ permissionManager.checkPermission(
+ deviceAwarePermission,
+ TEST_PACKAGE_NAME,
+ virtualDevice.persistentDeviceId!!
+ )
+ )
+ .isEqualTo(PERMISSION_GRANTED)
+
+ assertThat(
+ permissionManager.checkPermission(
+ deviceAwarePermission,
+ TEST_PACKAGE_NAME,
+ VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT
+ )
+ )
+ .isEqualTo(PERMISSION_DENIED)
+
+ permissionManager.revokeRuntimePermission(
+ TEST_PACKAGE_NAME,
+ deviceAwarePermission,
+ persistentDeviceId,
+ "test"
+ )
+
+ assertThat(
+ permissionManager.checkPermission(
+ deviceAwarePermission,
+ TEST_PACKAGE_NAME,
+ virtualDevice.persistentDeviceId!!
+ )
+ )
+ .isEqualTo(PERMISSION_DENIED)
+ }
+
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
+ @Test
+ fun testUpdateAndGetPermissionFlagsByPersistentDeviceId() {
+ val deviceAwarePermission = DEVICE_AWARE_PERMISSION
+ val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED
+ val flag = FLAG_PERMISSION_USER_SET
+
+ assertThat(
+ permissionManager.getPermissionFlags(
+ TEST_PACKAGE_NAME,
+ deviceAwarePermission,
+ persistentDeviceId
+ )
+ )
+ .isEqualTo(0)
+
+ permissionManager.updatePermissionFlags(
+ TEST_PACKAGE_NAME,
+ deviceAwarePermission,
+ persistentDeviceId,
+ flagMask,
+ flag
+ )
+
+ assertThat(
+ permissionManager.getPermissionFlags(
+ TEST_PACKAGE_NAME,
+ deviceAwarePermission,
+ persistentDeviceId
+ )
+ )
+ .isEqualTo(FLAG_PERMISSION_USER_SET)
+ }
+
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
+ @Test
+ fun testAllPermissionStatesApiGrantForVirtualDevice() {
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)
+ .isEmpty()
+ )
+ .isTrue()
+
+ permissionManager.grantRuntimePermission(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ persistentDeviceId
+ )
+
+ val permissionStateMap =
+ permissionManager.getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)
+ assertThat(permissionStateMap.size).isEqualTo(1)
+ assertThat(permissionStateMap[DEVICE_AWARE_PERMISSION]!!.isGranted).isTrue()
+ assertThat(permissionStateMap[DEVICE_AWARE_PERMISSION]!!.flags).isEqualTo(0)
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)
+ .contains(DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+
+ permissionManager.revokeRuntimePermission(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ persistentDeviceId,
+ "test"
+ )
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)
+ .contains(DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+ }
+
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
+ @Test
+ fun testAllPermissionStatesApiFlagsForVirtualDevice() {
+ val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED
+ val flag = FLAG_PERMISSION_USER_SET
+
+ assertThat(permissionManager.getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId))
+ .isEmpty()
+
+ permissionManager.updatePermissionFlags(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ persistentDeviceId,
+ flagMask,
+ flag
+ )
+
+ assertThat(
+ hasPermission(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)[
+ DEVICE_AWARE_PERMISSION]!!
+ .flags,
+ flag
+ )
+ )
+ .isTrue()
+
+ assertThat(
+ hasPermission(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)[
+ DEVICE_AWARE_PERMISSION]!!
+ .flags,
+ FLAG_PERMISSION_USER_FIXED
+ )
+ )
+ .isFalse()
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @Test
+ fun testAllPermissionStatesApiGrantForDefaultDevice() {
+ permissionManager.grantRuntimePermission(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ PERSISTENT_DEVICE_ID_DEFAULT
+ )
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[
+ DEVICE_AWARE_PERMISSION]!!
+ .isGranted
+ )
+ .isTrue()
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)
+ .contains(DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+
+ permissionManager.revokeRuntimePermission(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ PERSISTENT_DEVICE_ID_DEFAULT,
+ "test"
+ )
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)
+ .contains(DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @Test
+ fun testAllPermissionStatesApiFlagsForDefaultDevice() {
+ val flagMask = FLAG_PERMISSION_USER_SET or FLAG_PERMISSION_USER_FIXED
+ val flag = FLAG_PERMISSION_USER_SET
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)
+ .contains(DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+
+ permissionManager.updatePermissionFlags(
+ TEST_PACKAGE_NAME,
+ DEVICE_AWARE_PERMISSION,
+ PERSISTENT_DEVICE_ID_DEFAULT,
+ flagMask,
+ flag
+ )
+
+ assertThat(
+ hasPermission(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[
+ DEVICE_AWARE_PERMISSION]!!
+ .flags,
+ flag
+ )
+ )
+ .isTrue()
+
+ assertThat(
+ hasPermission(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[
+ DEVICE_AWARE_PERMISSION]!!
+ .flags,
+ FLAG_PERMISSION_USER_FIXED
+ )
+ )
+ .isFalse()
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @Test
+ fun testAllPermissionStatesApiThatNonDeviceAwareRuntimePermissionGrantIsNotInherited() {
+ permissionManager.grantRuntimePermission(
+ TEST_PACKAGE_NAME,
+ NON_DEVICE_AWARE_PERMISSION,
+ PERSISTENT_DEVICE_ID_DEFAULT
+ )
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, PERSISTENT_DEVICE_ID_DEFAULT)[
+ NON_DEVICE_AWARE_PERMISSION]!!
+ .isGranted
+ )
+ .isTrue()
+
+ assertThat(
+ permissionManager
+ .getAllPermissionStates(TEST_PACKAGE_NAME, persistentDeviceId)
+ .contains(NON_DEVICE_AWARE_PERMISSION)
+ )
+ .isFalse()
+ }
+
+ private fun hasPermission(permissionFlags: Int, permissionBit: Int): Boolean =
+ permissionFlags and permissionBit != 0
+
private fun revokeSelfPermission(permissionName: String, context: Context) {
val intent = Intent(PERMISSION_SELF_REVOKE_INTENT)
intent.setClassName(TEST_PACKAGE_NAME, PERMISSION_SELF_REVOKE_RECEIVER)
@@ -235,5 +531,8 @@ class DevicePermissionsTest {
"android.permission.cts.appthatrequestpermission.REVOKE_SELF_PERMISSION"
private const val PERMISSION_SELF_REVOKE_RECEIVER =
"android.permission.cts.appthatrequestpermission.RevokeSelfPermissionReceiver"
+
+ private const val DEVICE_AWARE_PERMISSION = Manifest.permission.RECORD_AUDIO
+ private const val NON_DEVICE_AWARE_PERMISSION = Manifest.permission.READ_CONTACTS
}
}
diff --git a/tests/cts/permission/src/android/permission/cts/MinMaxSdkVersionTest.kt b/tests/cts/permission/src/android/permission/cts/MinMaxSdkVersionTest.kt
index 58eaf598c..4679fbee8 100644
--- a/tests/cts/permission/src/android/permission/cts/MinMaxSdkVersionTest.kt
+++ b/tests/cts/permission/src/android/permission/cts/MinMaxSdkVersionTest.kt
@@ -80,7 +80,7 @@ class MinMaxSdkVersionTest {
mContext!!
.packageManager
.getPackageInfo(TEST_APP_PKG_NAME, PackageManager.GET_PERMISSIONS)
- return packageInfo.requestedPermissions.any { it == permName }
+ return packageInfo.requestedPermissions!!.any { it == permName }
}
companion object {
diff --git a/tests/cts/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
index 835ba124c..3d9ba8214 100644
--- a/tests/cts/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoActivityRelatedPermissionTest.java
@@ -21,7 +21,8 @@ import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.test.ActivityInstrumentationTestCase2;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
import java.util.List;
diff --git a/tests/cts/permission/src/android/permission/cts/NoAudioPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoAudioPermissionTest.java
index c2c42a10d..50498b1d5 100644
--- a/tests/cts/permission/src/android/permission/cts/NoAudioPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoAudioPermissionTest.java
@@ -25,9 +25,10 @@ import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
+import androidx.test.filters.SmallTest;
+
/**
* Verify the audio related operations require specific permissions.
*/
diff --git a/tests/cts/permission/src/android/permission/cts/NoBroadcastPackageRemovedPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoBroadcastPackageRemovedPermissionTest.java
index 5630c5b8c..1a46842b2 100644
--- a/tests/cts/permission/src/android/permission/cts/NoBroadcastPackageRemovedPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoBroadcastPackageRemovedPermissionTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.content.Intent;
import android.os.Bundle;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify Context related methods without specific BROADCAST series permissions.
diff --git a/tests/cts/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java
index 6ad048308..e0573044c 100644
--- a/tests/cts/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoCaptureVideoPermissionTest.java
@@ -22,9 +22,10 @@ import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.ImageReader;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
import android.util.DisplayMetrics;
+import androidx.test.filters.SmallTest;
+
/**
* Verify the capture system video output permission requirements.
*/
diff --git a/tests/cts/permission/src/android/permission/cts/NoKeyPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoKeyPermissionTest.java
index 5a0b25993..ac77947d9 100644
--- a/tests/cts/permission/src/android/permission/cts/NoKeyPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoKeyPermissionTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.app.KeyguardManager;
import android.content.Context;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify the key input related operations require specific permissions.
diff --git a/tests/cts/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
index b8d2ee21a..5dc73d520 100644
--- a/tests/cts/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoNetworkStatePermissionTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.content.Context;
import android.net.ConnectivityManager;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.net.InetAddress;
diff --git a/tests/cts/permission/src/android/permission/cts/NoReadLogsPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
index b6fb84dc7..f0d70b2ce 100644
--- a/tests/cts/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoReadLogsPermissionTest.java
@@ -21,7 +21,8 @@ import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
+
+import androidx.test.filters.MediumTest;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/tests/cts/permission/src/android/permission/cts/NoSystemFunctionPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoSystemFunctionPermissionTest.java
index 51b3bd830..437aa19c4 100644
--- a/tests/cts/permission/src/android/permission/cts/NoSystemFunctionPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoSystemFunctionPermissionTest.java
@@ -28,7 +28,8 @@ import android.os.VibratorManager;
import android.platform.test.annotations.AppModeFull;
import android.telephony.gsm.SmsManager;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import java.io.IOException;
import java.io.InputStream;
diff --git a/tests/cts/permission/src/android/permission/cts/NoWakeLockPermissionTest.java b/tests/cts/permission/src/android/permission/cts/NoWakeLockPermissionTest.java
index 030f341aa..95c4da727 100644
--- a/tests/cts/permission/src/android/permission/cts/NoWakeLockPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoWakeLockPermissionTest.java
@@ -26,7 +26,8 @@ import android.net.wifi.WifiManager.WifiLock;
import android.os.PowerManager;
import android.platform.test.annotations.AppModeFull;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify the Wake Lock related operations require specific permissions.
diff --git a/tests/cts/permission/src/android/permission/cts/NoWallpaperPermissionsTest.java b/tests/cts/permission/src/android/permission/cts/NoWallpaperPermissionsTest.java
index 18e4375bc..fc1d6b59f 100644
--- a/tests/cts/permission/src/android/permission/cts/NoWallpaperPermissionsTest.java
+++ b/tests/cts/permission/src/android/permission/cts/NoWallpaperPermissionsTest.java
@@ -27,7 +27,8 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.platform.test.annotations.AppModeFull;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
import org.junit.function.ThrowingRunnable;
diff --git a/tests/cts/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java b/tests/cts/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
index df3ec3c64..7ebb09f98 100644
--- a/tests/cts/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
+++ b/tests/cts/permission/src/android/permission/cts/PackageManagerRequiringPermissionsTest.java
@@ -21,7 +21,8 @@ import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.platform.test.annotations.AppModeFull;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify the PackageManager related operations require specific permissions.
diff --git a/tests/cts/permission/src/android/permission/cts/PermissionControllerTest.java b/tests/cts/permission/src/android/permission/cts/PermissionControllerTest.java
index 05b45c9b1..4367d2bf6 100644
--- a/tests/cts/permission/src/android/permission/cts/PermissionControllerTest.java
+++ b/tests/cts/permission/src/android/permission/cts/PermissionControllerTest.java
@@ -423,7 +423,7 @@ public class PermissionControllerTest {
}
assertThat(permissionInfos).isNotEmpty();
- assertThat(runtimePermissions.size()).isEqualTo(5);
+ assertThat(runtimePermissions.size()).isEqualTo(6);
assertRuntimePermissionLabelsAreValid(runtimePermissions, permissionInfos, 4, APP2);
}
diff --git a/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java b/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java
index 05aa41d69..33975f91c 100644
--- a/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java
+++ b/tests/cts/permission/src/android/permission/cts/PermissionUpdateListenerTest.java
@@ -23,18 +23,26 @@ import static com.android.compatibility.common.util.SystemUtil.runWithShellPermi
import static com.google.common.truth.Truth.assertThat;
import android.companion.virtual.VirtualDeviceManager;
+import android.companion.virtual.VirtualDeviceParams;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.OnPermissionsChangedListener;
+import android.permission.flags.Flags;
import android.platform.test.annotations.AppModeFull;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.virtualdevice.cts.common.FakeAssociationRule;
import androidx.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
import androidx.test.platform.app.InstrumentationRegistry;
+import com.android.compatibility.common.util.AdoptShellPermissionsRule;
import com.android.compatibility.common.util.SystemUtil;
import org.junit.After;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -52,15 +60,28 @@ public class PermissionUpdateListenerTest {
+ "CtsAppThatRequestsCalendarContactsBodySensorCustomPermission.apk";
private static final String PACKAGE_NAME =
"android.permission.cts.appthatrequestcustompermission";
- private static final String PERMISSION_NAME = "android.permission.READ_CONTACTS";
+ private static final String PERMISSION_NAME = "android.permission.RECORD_AUDIO";
private static final int TIMEOUT = 10000;
- private final Context mContext =
+ private final Context mDefaultContext =
InstrumentationRegistry.getInstrumentation().getContext();
- private final PackageManager mPackageManager = mContext.getPackageManager();
+ private final PackageManager mPackageManager = mDefaultContext.getPackageManager();
private int mTestAppUid;
+ private VirtualDeviceManager mVirtualDeviceManager;
+
+ @Rule
+ public FakeAssociationRule mFakeAssociationRule = new FakeAssociationRule();
+
+ @Rule
+ public AdoptShellPermissionsRule mAdoptShellPermissionsRule = new AdoptShellPermissionsRule(
+ InstrumentationRegistry.getInstrumentation().getUiAutomation(),
+ android.Manifest.permission.CREATE_VIRTUAL_DEVICE);
+
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
@Before
public void setup() throws PackageManager.NameNotFoundException, InterruptedException {
runShellCommandOrThrow("pm install " + APK);
@@ -69,6 +90,7 @@ public class PermissionUpdateListenerTest {
SystemUtil.waitForBroadcasts();
Thread.sleep(1000);
mTestAppUid = mPackageManager.getPackageUid(PACKAGE_NAME, 0);
+ mVirtualDeviceManager = mDefaultContext.getSystemService(VirtualDeviceManager.class);
}
@After
@@ -89,7 +111,7 @@ public class PermissionUpdateListenerTest {
runWithShellPermissionIdentity(() -> {
mPackageManager.addOnPermissionsChangeListener(permissionsChangedListener);
mPackageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
- mContext.getUser());
+ mDefaultContext.getUser());
});
countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS);
runWithShellPermissionIdentity(() -> {
@@ -100,61 +122,120 @@ public class PermissionUpdateListenerTest {
}
@Test
- public void testGrantPermissionNotifyListener() throws InterruptedException {
+ @RequiresFlagsEnabled({Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED})
+ public void testVirtualDeviceGrantPermissionNotifyListener() throws InterruptedException {
+ VirtualDeviceManager.VirtualDevice virtualDevice =
+ mVirtualDeviceManager.createVirtualDevice(
+ mFakeAssociationRule.getAssociationInfo().getId(),
+ new VirtualDeviceParams.Builder().build());
+ Context deviceContext = mDefaultContext.createDeviceContext(virtualDevice.getDeviceId());
+ testGrantPermissionNotifyListener(deviceContext, virtualDevice.getPersistentDeviceId());
+ }
+
+ @Test
+ public void testDefaultDeviceGrantPermissionNotifyListener() throws InterruptedException {
+ testGrantPermissionNotifyListener(
+ mDefaultContext, VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ }
+
+ private void testGrantPermissionNotifyListener(
+ Context context, String expectedDeviceId) throws InterruptedException {
+ final PackageManager packageManager = context.getPackageManager();
TestOnPermissionsChangedListener permissionsChangedListener =
new TestOnPermissionsChangedListener(1);
runWithShellPermissionIdentity(() -> {
- mPackageManager.addOnPermissionsChangeListener(permissionsChangedListener);
- mPackageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
- mContext.getUser());
+ packageManager.addOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
+ mDefaultContext.getUser());
});
permissionsChangedListener.waitForPermissionChangedCallbacks();
runWithShellPermissionIdentity(() -> {
- mPackageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
});
String deviceId = permissionsChangedListener.getNotifiedDeviceId(mTestAppUid);
- assertThat(deviceId).isEqualTo(VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ assertThat(deviceId).isEqualTo(expectedDeviceId);
}
@Test
- public void testRevokePermissionNotifyListener() throws InterruptedException {
+ public void testDefaultDeviceRevokePermissionNotifyListener() throws InterruptedException {
+ testRevokePermissionNotifyListener(
+ mDefaultContext, VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled({Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED})
+ public void testVirtualDeviceRevokePermissionNotifyListener() throws InterruptedException {
+ VirtualDeviceManager.VirtualDevice virtualDevice =
+ mVirtualDeviceManager.createVirtualDevice(
+ mFakeAssociationRule.getAssociationInfo().getId(),
+ new VirtualDeviceParams.Builder().build());
+ Context deviceContext = mDefaultContext.createDeviceContext(virtualDevice.getDeviceId());
+ testRevokePermissionNotifyListener(
+ deviceContext, virtualDevice.getPersistentDeviceId());
+ }
+
+ private void testRevokePermissionNotifyListener(
+ Context context, String expectedDeviceId) throws InterruptedException {
+ final PackageManager packageManager = context.getPackageManager();
TestOnPermissionsChangedListener permissionsChangedListener =
new TestOnPermissionsChangedListener(1);
runWithShellPermissionIdentity(() -> {
- mPackageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
- mContext.getUser());
- mPackageManager.addOnPermissionsChangeListener(permissionsChangedListener);
- mPackageManager.revokeRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
- mContext.getUser());
+ packageManager.grantRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
+ mDefaultContext.getUser());
+ packageManager.addOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.revokeRuntimePermission(PACKAGE_NAME, PERMISSION_NAME,
+ mDefaultContext.getUser());
});
permissionsChangedListener.waitForPermissionChangedCallbacks();
runWithShellPermissionIdentity(() -> {
- mPackageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
});
String deviceId = permissionsChangedListener.getNotifiedDeviceId(mTestAppUid);
- assertThat(deviceId).isEqualTo(VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ assertThat(deviceId).isEqualTo(expectedDeviceId);
}
@Test
- public void testUpdatePermissionFlagsNotifyListener() throws InterruptedException {
+ public void testDefaultDeviceUpdatePermissionFlagsNotifyListener() throws InterruptedException {
+ testUpdatePermissionFlagsNotifyListener(
+ mDefaultContext, VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ }
+
+ @Test
+ @RequiresFlagsEnabled({Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED})
+ public void testVirtualDeviceUpdatePermissionFlagsNotifyListener() throws InterruptedException {
+ VirtualDeviceManager.VirtualDevice virtualDevice =
+ mVirtualDeviceManager.createVirtualDevice(
+ mFakeAssociationRule.getAssociationInfo().getId(),
+ new VirtualDeviceParams.Builder().build());
+ Context deviceContext = mDefaultContext.createDeviceContext(virtualDevice.getDeviceId());
+ testUpdatePermissionFlagsNotifyListener(
+ deviceContext, virtualDevice.getPersistentDeviceId());
+ }
+
+ private void testUpdatePermissionFlagsNotifyListener(
+ Context context, String expectedDeviceId) throws InterruptedException {
TestOnPermissionsChangedListener permissionsChangedListener =
new TestOnPermissionsChangedListener(1);
+ final PackageManager packageManager = context.getPackageManager();
runWithShellPermissionIdentity(() -> {
- mPackageManager.addOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.addOnPermissionsChangeListener(permissionsChangedListener);
int flag = PackageManager.FLAG_PERMISSION_USER_SET;
- mPackageManager.updatePermissionFlags(PERMISSION_NAME, PACKAGE_NAME, flag, flag,
- mContext.getUser());
+ packageManager.updatePermissionFlags(PERMISSION_NAME, PACKAGE_NAME, flag, flag,
+ mDefaultContext.getUser());
});
permissionsChangedListener.waitForPermissionChangedCallbacks();
runWithShellPermissionIdentity(() -> {
- mPackageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
+ packageManager.removeOnPermissionsChangeListener(permissionsChangedListener);
});
String deviceId = permissionsChangedListener.getNotifiedDeviceId(mTestAppUid);
- assertThat(deviceId).isEqualTo(VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT);
+ assertThat(deviceId).isEqualTo(expectedDeviceId);
}
private class TestOnPermissionsChangedListener
diff --git a/tests/cts/permission/src/android/permission/cts/ProviderPermissionTest.java b/tests/cts/permission/src/android/permission/cts/ProviderPermissionTest.java
index 9f5a813d1..83c2ffaee 100644
--- a/tests/cts/permission/src/android/permission/cts/ProviderPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/ProviderPermissionTest.java
@@ -35,12 +35,11 @@ import android.provider.ContactsContract;
import android.provider.Settings;
import android.provider.Telephony;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.MediumTest;
import android.util.Log;
import androidx.test.InstrumentationRegistry;
+import androidx.test.filters.MediumTest;
-import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
diff --git a/tests/cts/permission/src/android/permission/cts/RebootPermissionTest.java b/tests/cts/permission/src/android/permission/cts/RebootPermissionTest.java
index b1d3d5afb..13f17dce8 100644
--- a/tests/cts/permission/src/android/permission/cts/RebootPermissionTest.java
+++ b/tests/cts/permission/src/android/permission/cts/RebootPermissionTest.java
@@ -18,7 +18,8 @@ package android.permission.cts;
import android.content.Intent;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify that rebooting requires Permission.
diff --git a/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt b/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt
index 05235e141..579b03f9c 100644
--- a/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt
+++ b/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt
@@ -50,21 +50,6 @@ class RevokePermissionTest {
@Test
@AppModeFull(reason = "Instant apps can't revoke permissions.")
- fun testRevokePermissionNotRequested() {
- testRevoke(
- packageName = APP_PKG_NAME,
- permission = CAMERA,
- throwableType = SecurityException::class.java,
- throwableMessages =
- listOf(
- "has not requested permission",
- "Permission $CAMERA isn't requested by package $APP_PKG_NAME"
- )
- )
- }
-
- @Test
- @AppModeFull(reason = "Instant apps can't revoke permissions.")
fun testRevokeFakePermission() {
val fakePermissionName = "FAKE_PERMISSION"
testRevoke(
@@ -100,22 +85,6 @@ class RevokePermissionTest {
@Test
@AppModeFull(reason = "Instant apps can't revoke permissions.")
- fun testRevokePermissionNotRequestedWithReason() {
- testRevoke(
- packageName = APP_PKG_NAME,
- permission = CAMERA,
- reason = "test reason",
- throwableType = SecurityException::class.java,
- throwableMessages =
- listOf(
- "has not requested permission",
- "Permission $CAMERA isn't requested by package $APP_PKG_NAME"
- )
- )
- }
-
- @Test
- @AppModeFull(reason = "Instant apps can't revoke permissions.")
fun testRevokeFakePermissionWithReason() {
val fakePermissionName = "FAKE_PERMISSION"
testRevoke(
diff --git a/tests/cts/permission/src/android/permission/cts/RevokeSawPermissionTest.kt b/tests/cts/permission/src/android/permission/cts/RevokeSawPermissionTest.kt
index 17327c6d4..57a2f7fcb 100644
--- a/tests/cts/permission/src/android/permission/cts/RevokeSawPermissionTest.kt
+++ b/tests/cts/permission/src/android/permission/cts/RevokeSawPermissionTest.kt
@@ -17,6 +17,7 @@
package android.permission.cts
import android.content.pm.PackageManager
+import android.platform.test.annotations.AppModeFull
import android.platform.test.annotations.AsbSecurityTest
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.After
@@ -27,6 +28,7 @@ private val APP_PKG_NAME = "android.permission.cts.usesystemalertwindowpermissio
private val APK_22 = "/data/local/tmp/cts-permission/" + "CtsAppThatRequestsSystemAlertWindow22.apk"
private val APK_23 = "/data/local/tmp/cts-permission/" + "CtsAppThatRequestsSystemAlertWindow23.apk"
+@AppModeFull
class RevokeSawPermissionTest {
fun installApp(apk: String) {
diff --git a/tests/cts/permission/src/android/permission/cts/ServicesInstantAppsCannotAccessTests.java b/tests/cts/permission/src/android/permission/cts/ServicesInstantAppsCannotAccessTests.java
index 8609e3379..0c1c885be 100644
--- a/tests/cts/permission/src/android/permission/cts/ServicesInstantAppsCannotAccessTests.java
+++ b/tests/cts/permission/src/android/permission/cts/ServicesInstantAppsCannotAccessTests.java
@@ -17,7 +17,6 @@
package android.permission.cts;
import static android.content.Context.DEVICE_POLICY_SERVICE;
-import static android.content.Context.FINGERPRINT_SERVICE;
import static android.content.Context.SHORTCUT_SERVICE;
import static android.content.Context.USB_SERVICE;
import static android.content.Context.WALLPAPER_SERVICE;
@@ -49,12 +48,6 @@ public class ServicesInstantAppsCannotAccessTests {
}
@Test
- public void cannotGetFingerprintManager() {
- assertNull(InstrumentationRegistry.getTargetContext().getSystemService(
- FINGERPRINT_SERVICE));
- }
-
- @Test
public void cannotGetShortcutManager() {
assertNull(InstrumentationRegistry.getTargetContext().getSystemService(
SHORTCUT_SERVICE));
diff --git a/tests/cts/permission/telephony/Android.bp b/tests/cts/permission/telephony/Android.bp
index bbfe06c55..5ded57ab3 100644
--- a/tests/cts/permission/telephony/Android.bp
+++ b/tests/cts/permission/telephony/Android.bp
@@ -26,6 +26,7 @@ android_test {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
// Include both the 32 and 64 bit versions
compile_multilib: "both",
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
index 6f0bcf111..344787045 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionDefinerApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
certificate: ":cts-testkey1",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
index 41f01e981..4265d0924 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/AdversarialPermissionUserApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
certificate: ":cts-testkey2",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
index a3e1f13d2..987d29039 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionDefinerApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
certificate: ":cts-testkey1",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
index caaa8e898..9fcebb09b 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionEscalatorApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
certificate: ":cts-testkey1",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
index d9ca4c8ea..a153e39c5 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/InstallPermissionUserApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
certificate: ":cts-testkey2",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
index b4ea30ada..6efcfdd01 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionDefinerApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
certificate: ":cts-testkey1",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
index 22c6ccd6f..ab0b8a7b5 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/RuntimePermissionUserApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"mts-permission",
"sts",
+ "mcts-permission",
],
certificate: ":cts-testkey2",
}
diff --git a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
index 5627a3d36..41333cb57 100644
--- a/tests/cts/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
+++ b/tests/cts/permission/testapps/RevokePermissionWhenRemoved/VictimPermissionDefinerApp/Android.bp
@@ -27,6 +27,7 @@ android_test_helper_app {
"general-tests",
"sts",
"mts-permission",
+ "mcts-permission",
],
certificate: ":cts-testkey1",
}
diff --git a/tests/cts/permissionmultidevice/Android.bp b/tests/cts/permissionmultidevice/Android.bp
index 61ac6541d..fdd115b5e 100644
--- a/tests/cts/permissionmultidevice/Android.bp
+++ b/tests/cts/permissionmultidevice/Android.bp
@@ -46,5 +46,6 @@ android_test {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permissionmultidevice/AndroidManifest.xml b/tests/cts/permissionmultidevice/AndroidManifest.xml
index e7c993d57..9bad85813 100644
--- a/tests/cts/permissionmultidevice/AndroidManifest.xml
+++ b/tests/cts/permissionmultidevice/AndroidManifest.xml
@@ -20,6 +20,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.permissionmultidevice.cts">
+ <uses-feature android:name="android.software.companion_device_setup" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
diff --git a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt
index 0eff95a3d..e8d35e614 100644
--- a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt
+++ b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt
@@ -26,6 +26,7 @@ class FakeVirtualDeviceRule : FakeAssociationRule() {
private lateinit var virtualDeviceManager: VirtualDeviceManager
lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice
+ lateinit var deviceDisplayName: String
var virtualDisplayId: Int = -1
override fun before() {
@@ -57,6 +58,10 @@ class FakeVirtualDeviceRule : FakeAssociationRule() {
)
Truth.assertThat(display).isNotNull()
virtualDisplayId = display!!.display.displayId
+ deviceDisplayName =
+ virtualDeviceManager
+ .getDisplayNameForPersistentDeviceId(virtualDevice.persistentDeviceId!!)
+ .toString()
}
}
diff --git a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/PermissionUtils.kt b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/PermissionUtils.kt
index fa58fc9f7..0ae0fd8e0 100644
--- a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/PermissionUtils.kt
+++ b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/PermissionUtils.kt
@@ -1,32 +1,24 @@
package android.permissionmultidevice.cts
import android.content.Context
-import android.content.pm.PackageManager
+import android.permission.PermissionManager
+import android.permission.PermissionManager.PermissionState
import android.provider.Settings
-import org.junit.Assert
+import com.android.compatibility.common.util.SystemUtil
object PermissionUtils {
- fun assertAppHasPermissionForDevice(
+ fun getHostDeviceName(context: Context): String {
+ return Settings.Global.getString(context.contentResolver, Settings.Global.DEVICE_NAME)
+ }
+
+ fun getAllPermissionStates(
context: Context,
packageName: String,
- permissionName: String,
- deviceId: Int,
- expectPermissionGranted: Boolean
- ) {
- val checkPermissionResult =
- context
- .createDeviceContext(deviceId)
- .packageManager
- .checkPermission(permissionName, packageName)
-
- if (expectPermissionGranted) {
- Assert.assertEquals(PackageManager.PERMISSION_GRANTED, checkPermissionResult)
- } else {
- Assert.assertEquals(PackageManager.PERMISSION_DENIED, checkPermissionResult)
+ companionDeviceId: String
+ ): Map<String, PermissionState> {
+ val permissionManager = context.getSystemService(PermissionManager::class.java)!!
+ return SystemUtil.runWithShellPermissionIdentity<Map<String, PermissionState>> {
+ permissionManager.getAllPermissionStates(packageName, companionDeviceId)
}
}
-
- fun getHostDeviceName(context: Context): String {
- return Settings.Global.getString(context.contentResolver, Settings.Global.DEVICE_NAME)
- }
}
diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
index 09f4c7f08..c199c7660 100644
--- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
+++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
@@ -19,14 +19,15 @@ package android.permissionmultidevice.cts
import android.Manifest
import android.app.ActivityOptions
import android.app.Instrumentation
+import android.companion.virtual.VirtualDeviceManager
import android.content.ComponentName
+import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.permission.flags.Flags
import android.permissionmultidevice.cts.PackageManagementUtils.installPackage
import android.permissionmultidevice.cts.PackageManagementUtils.uninstallPackage
-import android.permissionmultidevice.cts.PermissionUtils.assertAppHasPermissionForDevice
import android.permissionmultidevice.cts.PermissionUtils.getHostDeviceName
import android.permissionmultidevice.cts.UiAutomatorUtils.click
import android.permissionmultidevice.cts.UiAutomatorUtils.findTextForView
@@ -42,6 +43,7 @@ import com.android.compatibility.common.util.AdoptShellPermissionsRule
import com.android.compatibility.common.util.SystemUtil
import com.google.common.truth.Truth
import org.junit.After
+import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -74,7 +76,10 @@ class DeviceAwarePermissionGrantTest {
uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false)
}
- @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun onHostDevice_requestPermissionForHostDevice_shouldGrantPermission() {
testGrantPermissionForDevice(
@@ -87,20 +92,26 @@ class DeviceAwarePermissionGrantTest {
)
}
- @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun onHostDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
testGrantPermissionForDevice(
Display.DEFAULT_DISPLAY,
mFakeVirtualDeviceRule.virtualDevice.deviceId,
true,
- DEFAULT_REMOTE_DEVICE_NAME,
+ mFakeVirtualDeviceRule.deviceDisplayName,
expectPermissionGrantedOnDefaultDevice = false,
expectPermissionGrantedOnRemoteDevice = true
)
}
- @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun onRemoteDevice_requestPermissionForHostDevice_shouldGrantPermission() {
testGrantPermissionForDevice(
@@ -113,14 +124,17 @@ class DeviceAwarePermissionGrantTest {
)
}
- @RequiresFlagsEnabled(Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED)
+ @RequiresFlagsEnabled(
+ Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
+ Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED
+ )
@Test
fun onRemoteDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
testGrantPermissionForDevice(
mFakeVirtualDeviceRule.virtualDisplayId,
mFakeVirtualDeviceRule.virtualDevice.deviceId,
true,
- DEFAULT_REMOTE_DEVICE_NAME,
+ mFakeVirtualDeviceRule.deviceDisplayName,
expectPermissionGrantedOnDefaultDevice = false,
expectPermissionGrantedOnRemoteDevice = true
)
@@ -134,18 +148,10 @@ class DeviceAwarePermissionGrantTest {
expectPermissionGrantedOnDefaultDevice: Boolean,
expectPermissionGrantedOnRemoteDevice: Boolean
) {
- assertAppHasPermissionForDevice(
- defaultDeviceContext,
- APP_PACKAGE_NAME,
- Manifest.permission.CAMERA,
- DEVICE_ID_DEFAULT,
- false
- )
+ assertAppHasPermissionForDevice(defaultDeviceContext, DEVICE_ID_DEFAULT, false)
assertAppHasPermissionForDevice(
defaultDeviceContext,
- APP_PACKAGE_NAME,
- Manifest.permission.CAMERA,
mFakeVirtualDeviceRule.virtualDevice.deviceId,
false
)
@@ -160,16 +166,12 @@ class DeviceAwarePermissionGrantTest {
assertAppHasPermissionForDevice(
defaultDeviceContext,
- APP_PACKAGE_NAME,
- Manifest.permission.CAMERA,
DEVICE_ID_DEFAULT,
expectPermissionGrantedOnDefaultDevice
)
assertAppHasPermissionForDevice(
defaultDeviceContext,
- APP_PACKAGE_NAME,
- Manifest.permission.CAMERA,
mFakeVirtualDeviceRule.virtualDevice.deviceId,
expectPermissionGrantedOnRemoteDevice
)
@@ -194,14 +196,32 @@ class DeviceAwarePermissionGrantTest {
Truth.assertThat(text).contains(deviceName)
}
+ private fun assertAppHasPermissionForDevice(
+ context: Context,
+ deviceId: Int,
+ expectPermissionGranted: Boolean
+ ) {
+ val checkPermissionResult =
+ context
+ .createDeviceContext(deviceId)
+ .packageManager
+ .checkPermission(Manifest.permission.CAMERA, APP_PACKAGE_NAME)
+
+ if (expectPermissionGranted) {
+ Assert.assertEquals(PackageManager.PERMISSION_GRANTED, checkPermissionResult)
+ } else {
+ Assert.assertEquals(PackageManager.PERMISSION_DENIED, checkPermissionResult)
+ }
+ }
+
companion object {
const val APK_DIRECTORY = "/data/local/tmp/cts-permissionmultidevice"
const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk"
const val APP_PACKAGE_NAME = "android.permissionmultidevice.cts.accessremotedevicecamera"
const val PERMISSION_MESSAGE_ID = "com.android.permissioncontroller:id/permission_message"
- const val DEFAULT_REMOTE_DEVICE_NAME = "remote device"
const val ALLOW_BUTTON =
"com.android.permissioncontroller:id/permission_allow_foreground_only_button"
const val DEVICE_ID_DEFAULT = 0
+ const val PERSISTENT_DEVICE_ID_DEFAULT = VirtualDeviceManager.PERSISTENT_DEVICE_ID_DEFAULT
}
}
diff --git a/tests/cts/permissionmultiuser/Android.bp b/tests/cts/permissionmultiuser/Android.bp
index f577c82e3..b86b02205 100644
--- a/tests/cts/permissionmultiuser/Android.bp
+++ b/tests/cts/permissionmultiuser/Android.bp
@@ -43,5 +43,6 @@ android_test {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permissionpolicy/Android.bp b/tests/cts/permissionpolicy/Android.bp
index 127de939c..8f3c42b0e 100644
--- a/tests/cts/permissionpolicy/Android.bp
+++ b/tests/cts/permissionpolicy/Android.bp
@@ -25,7 +25,6 @@ android_test {
test_suites: [
"cts",
"general-tests",
- "mts-permission",
],
libs: ["android.test.base"],
static_libs: [
@@ -36,6 +35,8 @@ android_test {
"androidx.test.ext.junit-nodeps",
"truth",
"permission-test-util-lib",
+ "androidx.test.rules",
+ "flag-junit",
],
srcs: [
"src/**/*.java",
diff --git a/tests/cts/permissionpolicy/OWNERS b/tests/cts/permissionpolicy/OWNERS
index 395269207..3f0256275 100644
--- a/tests/cts/permissionpolicy/OWNERS
+++ b/tests/cts/permissionpolicy/OWNERS
@@ -5,3 +5,4 @@ include platform/frameworks/base:/core/java/android/permission/OWNERS
per-file NoLocationPermissionTest.java = tgunn@google.com
per-file RestrictedStoragePermissionSharedUidTest.java = nandana@google.com
per-file RestrictedStoragePermissionTest.java = nandana@google.com
+per-file NoReceiveSmsPermissionTest.java = sasindran@google.com
diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
index e736e201a..1acdc75a6 100644
--- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
@@ -48,6 +48,7 @@
<protected-broadcast android:name="android.intent.action.CANCEL_ENABLE_ROLLBACK" />
<protected-broadcast android:name="android.intent.action.ROLLBACK_COMMITTED" />
<protected-broadcast android:name="android.intent.action.PACKAGE_RESTARTED" />
+ <protected-broadcast android:name="android.intent.action.PACKAGE_UNSTOPPED" />
<protected-broadcast android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<protected-broadcast android:name="android.intent.action.PACKAGE_FIRST_LAUNCH" />
<protected-broadcast android:name="android.intent.action.PACKAGE_NEEDS_INTEGRITY_VERIFICATION" />
@@ -101,6 +102,7 @@
<protected-broadcast android:name="android.intent.action.OVERLAY_PRIORITY_CHANGED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_SUSPENDED" />
<protected-broadcast android:name="android.intent.action.MY_PACKAGE_UNSUSPENDED" />
+ <protected-broadcast android:name="android.intent.action.UNARCHIVE_PACKAGE" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
<protected-broadcast android:name="android.os.action.DEVICE_IDLE_MODE_CHANGED" />
@@ -144,6 +146,7 @@
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_ENABLED" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_HOST_RESTORED" />
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_RESTORED" />
+ <protected-broadcast android:name="android.appwidget.action.APPWIDGET_ENABLE_AND_UPDATE" />
<protected-broadcast android:name="android.os.action.SETTING_RESTORED" />
@@ -176,6 +179,7 @@
<protected-broadcast android:name="android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST" />
<protected-broadcast android:name="android.bluetooth.device.action.SDP_RECORD" />
<protected-broadcast android:name="android.bluetooth.device.action.BATTERY_LEVEL_CHANGED" />
+ <protected-broadcast android:name="android.bluetooth.device.action.REMOTE_ISSUE_OCCURRED" />
<protected-broadcast android:name="android.bluetooth.devicepicker.action.LAUNCH" />
<protected-broadcast android:name="android.bluetooth.devicepicker.action.DEVICE_SELECTED" />
<protected-broadcast
@@ -201,6 +205,8 @@
<protected-broadcast
android:name="android.bluetooth.headsetclient.profile.action.LAST_VTAG" />
<protected-broadcast
+ android:name="android.bluetooth.headsetclient.profile.action.NETWORK_SERVICE_STATE_CHANGED" />
+ <protected-broadcast
android:name="android.bluetooth.hearingaid.profile.action.CONNECTION_STATE_CHANGED" />
<protected-broadcast
android:name="android.bluetooth.hearingaid.profile.action.PLAYING_STATE_CHANGED" />
@@ -257,6 +263,7 @@
android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" />
<protected-broadcast
android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
+ <protected-broadcast android:name="android.bluetooth.action.HAP_CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_ACTIVE_DEVICE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_CONF_CHANGED" />
@@ -292,6 +299,7 @@
<protected-broadcast android:name="android.hardware.usb.action.USB_STATE" />
<protected-broadcast android:name="android.hardware.usb.action.USB_PORT_CHANGED" />
+ <protected-broadcast android:name="android.hardware.usb.action.USB_PORT_COMPLIANCE_CHANGED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_DETACHED" />
<protected-broadcast android:name="android.hardware.usb.action.USB_ACCESSORY_HANDSHAKE" />
@@ -313,6 +321,7 @@
<protected-broadcast android:name="android.media.MASTER_BALANCE_CHANGED_ACTION" />
<protected-broadcast android:name="android.media.SCO_AUDIO_STATE_CHANGED" />
<protected-broadcast android:name="android.media.ACTION_SCO_AUDIO_STATE_UPDATED" />
+ <protected-broadcast android:name="com.android.server.audio.action.CHECK_MUSIC_ACTIVE" />
<protected-broadcast android:name="android.intent.action.MEDIA_REMOVED" />
<protected-broadcast android:name="android.intent.action.MEDIA_UNMOUNTED" />
@@ -377,6 +386,8 @@
<protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_ACCEPTED" />
<protected-broadcast android:name="com.android.server.action.REMOTE_BUGREPORT_SHARING_DECLINED" />
<protected-broadcast android:name="com.android.internal.action.EUICC_FACTORY_RESET" />
+ <protected-broadcast
+ android:name="com.android.internal.action.EUICC_REMOVE_INVISIBLE_SUBSCRIPTIONS" />
<protected-broadcast android:name="com.android.server.usb.ACTION_OPEN_IN_APPS" />
<protected-broadcast android:name="com.android.server.am.DELETE_DUMPHEAP" />
<protected-broadcast android:name="com.android.server.net.action.SNOOZE_WARNING" />
@@ -400,6 +411,7 @@
<protected-broadcast android:name="android.net.wifi.WIFI_AP_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.WIFI_CREDENTIAL_CHANGED" />
<protected-broadcast android:name="android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED" />
+ <protected-broadcast android:name="android.net.wifi.aware.action.WIFI_AWARE_RESOURCE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED" />
<protected-broadcast android:name="android.net.wifi.SCAN_RESULTS" />
<protected-broadcast android:name="android.net.wifi.RSSI_CHANGED" />
@@ -470,11 +482,9 @@
android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />
<!-- Defined in RestrictionsManager -->
- <protected-broadcast
- android:name="android.intent.action.PERMISSION_RESPONSE_RECEIVED" />
- <!-- Defined in RestrictionsManager -->
+ <protected-broadcast android:name="android.content.action.PERMISSION_RESPONSE_RECEIVED" />
+ <protected-broadcast android:name="android.content.action.REQUEST_PERMISSION" />
- <protected-broadcast android:name="android.intent.action.REQUEST_PERMISSION" />
<protected-broadcast android:name="android.nfc.handover.intent.action.HANDOVER_STARTED" />
<protected-broadcast android:name="android.nfc.handover.intent.action.TRANSFER_DONE" />
<protected-broadcast android:name="android.nfc.handover.intent.action.TRANSFER_PROGRESS" />
@@ -525,6 +535,7 @@
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_ADDED" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_UNLOCKED" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_REMOVED" />
+ <protected-broadcast android:name="android.app.action.MANAGED_PROFILE_PROVISIONED" />
<protected-broadcast android:name="android.bluetooth.adapter.action.BLE_STATE_CHANGED" />
<protected-broadcast android:name="com.android.bluetooth.map.USER_CONFIRM_TIMEOUT" />
@@ -567,6 +578,7 @@
<protected-broadcast android:name="com.android.settings.network.SWITCH_TO_SUBSCRIPTION" />
<protected-broadcast android:name="com.android.settings.wifi.action.NETWORK_REQUEST" />
+ <protected-broadcast android:name="android.app.action.KEYGUARD_PRIVATE_NOTIFICATIONS_CHANGED" />
<protected-broadcast android:name="NotificationManagerService.TIMEOUT" />
<protected-broadcast android:name="NotificationHistoryDatabase.CLEANUP" />
<protected-broadcast android:name="ScheduleConditionProvider.EVALUATE" />
@@ -652,6 +664,8 @@
<protected-broadcast android:name="android.intent.action.DEVICE_LOCKED_CHANGED" />
+ <protected-broadcast android:name="com.android.content.pm.action.CAN_INTERACT_ACROSS_PROFILES_CHANGED"/>
+
<!-- Added in O -->
<protected-broadcast android:name="android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED" />
<protected-broadcast android:name="com.android.server.wm.ACTION_REVOKE_SYSTEM_ALERT_WINDOW_PERMISSION" />
@@ -663,7 +677,6 @@
<protected-broadcast android:name="android.media.tv.action.PREVIEW_PROGRAM_BROWSABLE_DISABLED" />
<protected-broadcast android:name="android.media.tv.action.WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" />
<protected-broadcast android:name="android.media.tv.action.CHANNEL_BROWSABLE_REQUESTED" />
- <protected-broadcast android:name="com.android.server.inputmethod.InputMethodManagerService.SHOW_INPUT_METHOD_PICKER" />
<!-- Made protected in P (was introduced in JB-MR2) -->
<protected-broadcast android:name="android.intent.action.GET_RESTRICTION_ENTRIES" />
@@ -791,14 +804,40 @@
<protected-broadcast android:name="android.telephony.action.CARRIER_SIGNAL_REQUEST_NETWORK_FAILED" />
<protected-broadcast android:name="com.android.phone.settings.CARRIER_PROVISIONING" />
<protected-broadcast android:name="com.android.phone.settings.TRIGGER_CARRIER_PROVISIONING" />
+ <protected-broadcast android:name="com.android.internal.telephony.ACTION_VOWIFI_ENABLED" />
<protected-broadcast android:name="android.telephony.action.ANOMALY_REPORTED" />
<protected-broadcast android:name="android.intent.action.SUBSCRIPTION_INFO_RECORD_ADDED" />
<protected-broadcast android:name="android.intent.action.ACTION_MANAGED_ROAMING_IND" />
<protected-broadcast android:name="android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE" />
<!-- Added in T -->
+ <protected-broadcast android:name="android.safetycenter.action.REFRESH_SAFETY_SOURCES" />
+ <protected-broadcast android:name="android.safetycenter.action.SAFETY_CENTER_ENABLED_CHANGED" />
+ <protected-broadcast android:name="android.app.action.DEVICE_POLICY_RESOURCE_UPDATED" />
+ <protected-broadcast android:name="android.intent.action.SHOW_FOREGROUND_SERVICE_MANAGER" />
+ <protected-broadcast android:name="android.service.autofill.action.DELAYED_FILL" />
+ <protected-broadcast android:name="android.app.action.PROVISIONING_COMPLETED" />
<protected-broadcast android:name="android.app.action.LOST_MODE_LOCATION_UPDATE" />
+ <!-- Added in U -->
+ <protected-broadcast android:name="android.intent.action.PROFILE_ADDED" />
+ <protected-broadcast android:name="android.intent.action.PROFILE_REMOVED" />
+ <protected-broadcast android:name="com.android.internal.telephony.cat.SMS_SENT_ACTION" />
+ <protected-broadcast android:name="com.android.internal.telephony.cat.SMS_DELIVERY_ACTION" />
+ <protected-broadcast android:name="com.android.internal.telephony.data.ACTION_RETRY" />
+ <protected-broadcast android:name="android.companion.virtual.action.VIRTUAL_DEVICE_REMOVED" />
+ <protected-broadcast android:name="com.android.internal.intent.action.FLASH_NOTIFICATION_START_PREVIEW" />
+ <protected-broadcast android:name="com.android.internal.intent.action.FLASH_NOTIFICATION_STOP_PREVIEW" />
+ <protected-broadcast android:name="android.app.admin.action.DEVICE_FINANCING_STATE_CHANGED" />
+ <protected-broadcast android:name="android.app.admin.action.DEVICE_POLICY_SET_RESULT" />
+ <protected-broadcast android:name="android.app.admin.action.DEVICE_POLICY_CHANGED" />
+
+ <!-- Added in V -->
+ <protected-broadcast android:name="android.intent.action.PROFILE_AVAILABLE" />
+ <protected-broadcast android:name="android.intent.action.PROFILE_UNAVAILABLE" />
+ <protected-broadcast android:name="android.app.action.CONSOLIDATED_NOTIFICATION_POLICY_CHANGED" />
+ <protected-broadcast android:name="android.intent.action.MAIN_USER_LOCKSCREEN_KNOWLEDGE_FACTOR_CHANGED" />
+
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
<!-- ====================================================================== -->
@@ -833,6 +872,7 @@
android:label="@string/permlab_readContacts"
android:description="@string/permdesc_readContacts"
android:protectionLevel="dangerous" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
<!-- Allows an application to write the user's contacts data.
<p>Protection level: dangerous
@@ -843,6 +883,20 @@
android:description="@string/permdesc_writeContacts"
android:protectionLevel="dangerous" />
+ <!-- Allows an app to update the verification status of E2EE contact keys owned by other apps.
+ <p>This permission is only granted to system apps.
+ <p>Protection level: signature|privileged
+ @SystemApi
+ @hide
+ @FlaggedApi("android.provider.user_keys")
+ -->
+ <permission android:name="android.permission.WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS"
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:label="@string/permlab_writeVerificationStateE2eeContactKeys"
+ android:description="@string/permdesc_writeVerificationStateE2eeContactKeys"
+ android:protectionLevel="signature|privileged"
+ android:featureFlag="android.provider.user_keys" />
+
<!-- Allows an application to set default account for new contacts.
<p> This permission is only granted to system applications fulfilling the Contacts app role.
<p>Protection level: internal|role
@@ -903,7 +957,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.SEND_SMS"
@@ -917,7 +971,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.RECEIVE_SMS"
@@ -931,7 +985,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.READ_SMS"
@@ -945,7 +999,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.RECEIVE_WAP_PUSH"
@@ -959,7 +1013,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.RECEIVE_MMS"
@@ -994,7 +1048,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
@hide Pending API council approval -->
@@ -1006,20 +1060,10 @@
android:protectionLevel="dangerous" />
<!-- @SystemApi @hide Allows an application to communicate over satellite.
- Only granted if the application is a system app.-->
+ Only granted if the application is a system app or privileged app. -->
<permission android:name="android.permission.SATELLITE_COMMUNICATION"
android:protectionLevel="role|signature|privileged" />
- <!-- @SystemApi @hide Allows an application to bind with satellite service.
- Only granted if the application is a system app.-->
- <permission android:name="android.permission.BIND_SATELLITE_SERVICE"
- android:protectionLevel="signature|privileged|vendorPrivileged" />
-
- <!-- @hide Allows an application to bind with satellite gateway service.
- Only granted if the application is a system app.-->
- <permission android:name="android.permission.BIND_SATELLITE_GATEWAY_SERVICE"
- android:protectionLevel="signature" />
-
<!-- ====================================================================== -->
<!-- Permissions for accessing external storage -->
<!-- ====================================================================== -->
@@ -1033,28 +1077,41 @@
android:priority="900" />
<!-- Allows an application to read from external storage.
- <p>Any app that declares the {@link #WRITE_EXTERNAL_STORAGE} permission is implicitly
- granted this permission.</p>
+ <p class="note"><strong>Note: </strong>Starting in API level 33, this permission has no
+ effect. If your app accesses other apps' media files, request one or more of these permissions
+ instead: <a href="#READ_MEDIA_IMAGES"><code>READ_MEDIA_IMAGES</code></a>,
+ <a href="#READ_MEDIA_VIDEO"><code>READ_MEDIA_VIDEO</code></a>,
+ <a href="#READ_MEDIA_AUDIO"><code>READ_MEDIA_AUDIO</code></a>. Learn more about the
+ <a href="{@docRoot}training/data-storage/shared/media#storage-permission">storage
+ permissions</a> that are associated with media files.</p>
+
<p>This permission is enforced starting in API level 19. Before API level 19, this
permission is not enforced and all apps still have access to read from external storage.
You can test your app with the permission enforced by enabling <em>Protect USB
- storage</em> under Developer options in the Settings app on a device running Android 4.1 or
- higher.</p>
+ storage</em> under <b>Developer options</b> in the Settings app on a device running Android
+ 4.1 or higher.</p>
<p>Also starting in API level 19, this permission is <em>not</em> required to
- read/write files in your application-specific directories returned by
+ read or write files in your application-specific directories returned by
{@link android.content.Context#getExternalFilesDir} and
- {@link android.content.Context#getExternalCacheDir}.
- <p class="note"><strong>Note:</strong> If <em>both</em> your <a
+ {@link android.content.Context#getExternalCacheDir}.</p>
+ <p>Starting in API level 29, apps don't need to request this permission to access files in
+ their app-specific directory on external storage, or their own files in the
+ <a href="{@docRoot}reference/android/provider/MediaStore"><code>MediaStore</code></a>. Apps
+ shouldn't request this permission unless they need to access other apps' files in the
+ <code>MediaStore</code>. Read more about these changes in the
+ <a href="{@docRoot}training/data-storage#scoped-storage">scoped storage</a> section of the
+ developer documentation.</p>
+ <p>If <em>both</em> your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
minSdkVersion}</a> and <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
targetSdkVersion}</a> values are set to 3 or lower, the system implicitly
grants your app this permission. If you don't need this permission, be sure your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
- targetSdkVersion}</a> is 4 or higher.
+ targetSdkVersion}</a> is 4 or higher.</p>
<p> This is a soft restricted permission which cannot be held by an app it its
- full form until the installer on record whitelists the permission.
+ full form until the installer on record allowlists the permission.
Specifically, if the permission is allowlisted the holder app can access
external storage and the visual and aural media collections while if the
permission is not allowlisted the holder app can only access to the visual
@@ -1080,10 +1137,12 @@
<!-- Allows an application to read audio files from external storage.
<p>This permission is enforced starting in API level
- {@link android.os.Build.VERSION_CODES#TIRAMISU}.
+ {@link android.os.Build.VERSION_CODES#TIRAMISU}. An app which targets
+ {@link android.os.Build.VERSION_CODES#TIRAMISU} or higher and needs to read audio files from
+ external storage must hold this permission; {@link #READ_EXTERNAL_STORAGE} is not required.
For apps with a <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
- targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S} or lower, this permission
- must not be used and the READ_EXTERNAL_STORAGE permission must be used instead.
+ targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S_V2} or lower, the
+ {@link #READ_EXTERNAL_STORAGE} permission is required, instead, to read audio files.
<p>Protection level: dangerous -->
<permission android:name="android.permission.READ_MEDIA_AUDIO"
android:permissionGroup="android.permission-group.UNDEFINED"
@@ -1099,12 +1158,14 @@
android:description="@string/permgroupdesc_readMediaVisual"
android:priority="1000" />
- <!-- Allows an application to read audio files from external storage.
- <p>This permission is enforced starting in API level
- {@link android.os.Build.VERSION_CODES#TIRAMISU}.
- For apps with a <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
- targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S} or lower, this permission
- must not be used and the READ_EXTERNAL_STORAGE permission must be used instead.
+ <!-- Allows an application to read video files from external storage.
+ <p>This permission is enforced starting in API level
+ {@link android.os.Build.VERSION_CODES#TIRAMISU}. An app which targets
+ {@link android.os.Build.VERSION_CODES#TIRAMISU} or higher and needs to read video files from
+ external storage must hold this permission; {@link #READ_EXTERNAL_STORAGE} is not required.
+ For apps with a <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
+ targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S_V2} or lower, the
+ {@link #READ_EXTERNAL_STORAGE} permission is required, instead, to read video files.
<p>Protection level: dangerous -->
<permission android:name="android.permission.READ_MEDIA_VIDEO"
android:permissionGroup="android.permission-group.UNDEFINED"
@@ -1114,22 +1175,32 @@
<!-- Allows an application to read image files from external storage.
<p>This permission is enforced starting in API level
- {@link android.os.Build.VERSION_CODES#TIRAMISU}.
+ {@link android.os.Build.VERSION_CODES#TIRAMISU}. An app which targets
+ {@link android.os.Build.VERSION_CODES#TIRAMISU} or higher and needs to read image files from
+ external storage must hold this permission; {@link #READ_EXTERNAL_STORAGE} is not required.
For apps with a <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
- targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S} or lower, this permission
- must not be used and the READ_EXTERNAL_STORAGE permission must be used instead.
- <p>Protection level: dangerous -->
+ targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S_V2} or lower, the
+ {@link #READ_EXTERNAL_STORAGE} permission is required, instead, to read image files.
+ <p>Protection level: dangerous -->
<permission android:name="android.permission.READ_MEDIA_IMAGES"
android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_readMediaImage"
- android:description="@string/permdesc_readMediaImage"
+ android:label="@string/permlab_readMediaImages"
+ android:description="@string/permdesc_readMediaImages"
android:protectionLevel="dangerous" />
<!-- Allows an application to read image or video files from external storage that a user has
selected via the permission prompt photo picker. Apps can check this permission to verify that
a user has decided to use the photo picker, instead of granting access to
- {@link #READ_MEDIA_IMAGES or #READ_MEDIA_VIDEO}. It does not prevent apps from accessing the
- standard photo picker manually.
+ {@link #READ_MEDIA_IMAGES} or {@link #READ_MEDIA_VIDEO}. It does not prevent apps from
+ accessing the standard photo picker manually. This permission should be requested alongside
+ {@link #READ_MEDIA_IMAGES} and/or {@link #READ_MEDIA_VIDEO}, depending on which type of media
+ is desired.
+ <p> This permission will be automatically added to an app's manifest if the app requests
+ {@link #READ_MEDIA_IMAGES}, {@link #READ_MEDIA_VIDEO}, or {@link #ACCESS_MEDIA_LOCATION}
+ regardless of target SDK. If an app does not request this permission, then the grant dialog
+ will return `PERMISSION_GRANTED` for {@link #READ_MEDIA_IMAGES} and/or
+ {@link #READ_MEDIA_VIDEO}, but the app will only have access to the media selected by the
+ user. This false grant state will persist until the app goes into the background.
<p>Protection level: dangerous -->
<permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
android:permissionGroup="android.permission-group.UNDEFINED"
@@ -1138,7 +1209,28 @@
android:protectionLevel="dangerous" />
<!-- Allows an application to write to external storage.
- <p class="note"><strong>Note:</strong> If <em>both</em> your <a
+ <p><strong>Note: </strong>If your app targets {@link android.os.Build.VERSION_CODES#R} or
+ higher, this permission has no effect.
+
+ <p>If your app is on a device that runs API level 19 or higher, you don't need to declare
+ this permission to read and write files in your application-specific directories returned
+ by {@link android.content.Context#getExternalFilesDir} and
+ {@link android.content.Context#getExternalCacheDir}.
+
+ <p>Learn more about how to
+ <a href="{@docRoot}training/data-storage/shared/media#update-other-apps-files">modify media
+ files</a> that your app doesn't own, and how to
+ <a href="{@docRoot}training/data-storage/shared/documents-files">modify non-media files</a>
+ that your app doesn't own.
+
+ <p>If your app is a file manager and needs broad access to external storage files, then
+ the system must place your app on an allowlist so that you can successfully request the
+ <a href="#MANAGE_EXTERNAL_STORAGE><code>MANAGE_EXTERNAL_STORAGE</code></a> permission.
+ Learn more about the appropriate use cases for
+ <a href="{@docRoot}training/data-storage/manage-all-files>managing all files on a storage
+ device</a>.
+
+ <p>If <em>both</em> your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
minSdkVersion}</a> and <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
@@ -1146,12 +1238,6 @@
grants your app this permission. If you don't need this permission, be sure your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code
targetSdkVersion}</a> is 4 or higher.
- <p>Starting in API level 19, this permission is <em>not</em> required to
- read/write files in your application-specific directories returned by
- {@link android.content.Context#getExternalFilesDir} and
- {@link android.content.Context#getExternalCacheDir}.
- <p>If this permission is not allowlisted for an app that targets an API level before
- {@link android.os.Build.VERSION_CODES#Q} this permission cannot be granted to apps.</p>
<p>Protection level: dangerous</p>
-->
<permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
@@ -1240,7 +1326,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"
@@ -1302,7 +1388,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.READ_CALL_LOG"
@@ -1312,8 +1398,7 @@
android:permissionFlags="hardRestricted"
android:protectionLevel="dangerous" />
- <!-- Allows an application to write (but not read) the user's
- call log data.
+ <!-- Allows an application to write and read the user's call log data.
<p class="note"><strong>Note:</strong> If your app uses the
{@link #WRITE_CONTACTS} permission and <em>both</em> your <a
href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code
@@ -1326,7 +1411,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.WRITE_CALL_LOG"
@@ -1342,7 +1427,7 @@
<p>Protection level: dangerous
<p> This is a hard restricted permission which cannot be held by an app until
- the installer on record whitelists the permission. For more details see
+ the installer on record allowlists the permission. For more details see
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
@deprecated Applications should use {@link android.telecom.CallRedirectionService} instead
@@ -1386,6 +1471,14 @@
android:description="@string/permdesc_readPhoneState"
android:protectionLevel="dangerous" />
+ <!-- Allows read only access to phone state with a non dangerous permission,
+ including the information like cellular network type, software version. -->
+ <permission android:name="android.permission.READ_BASIC_PHONE_STATE"
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:label="@string/permlab_readBasicPhoneState"
+ android:description="@string/permdesc_readBasicPhoneState"
+ android:protectionLevel="normal" />
+
<!-- Allows read access to the device's phone number(s). This is a subset of the capabilities
granted by {@link #READ_PHONE_STATE} but is exposed to instant applications.
<p>Protection level: dangerous-->
@@ -1397,7 +1490,9 @@
<!-- Allows an application to initiate a phone call without going through
the Dialer user interface for the user to confirm the call.
- <p>Protection level: dangerous
+ <p class="note"><b>Note:</b> An app holding this permission can also call carrier MMI
+ codes to change settings such as call forwarding or call waiting preferences.</p>
+ <p>Protection level: dangerous</p>
-->
<permission android:name="android.permission.CALL_PHONE"
android:permissionGroup="android.permission-group.UNDEFINED"
@@ -1630,12 +1725,24 @@
<!-- @SystemApi Allows camera access by Headless System User 0 when device is running in
HSUM Mode.
+ @FlaggedApi("com.android.internal.camera.flags.camera_hsum_permission")
@hide -->
<permission android:name="android.permission.CAMERA_HEADLESS_SYSTEM_USER"
android:permissionGroup="android.permission-group.UNDEFINED"
android:label="@string/permlab_cameraHeadlessSystemUser"
android:description="@string/permdesc_cameraHeadlessSystemUser"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature"
+ android:featureFlag="com.android.internal.camera.flags.camera_hsum_permission" />
+
+
+ <!-- @SystemApi Allows camera access of allowlisted driver assistance apps
+ to be controlled separately.
+ <p> Not for use by third-party applications.
+ @FlaggedApi("com.android.internal.camera.flags.camera_privacy_allowlist")
+ @hide
+ -->
+ <permission android:name="android.permission.CAMERA_PRIVACY_ALLOWLIST"
+ android:protectionLevel="signature|privileged" />
<!-- ====================================================================== -->
<!-- Permissions for accessing the device sensors -->
@@ -1663,11 +1770,11 @@
measure what is happening inside their body, such as heart rate.
<p>Protection level: dangerous -->
<permission android:name="android.permission.BODY_SENSORS"
- android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_bodySensors"
- android:description="@string/permdesc_bodySensors"
- android:backgroundPermission="android.permission.BODY_SENSORS_BACKGROUND"
- android:protectionLevel="dangerous" />
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:label="@string/permlab_bodySensors"
+ android:description="@string/permdesc_bodySensors"
+ android:backgroundPermission="android.permission.BODY_SENSORS_BACKGROUND"
+ android:protectionLevel="dangerous" />
<!-- Allows an application to access data from sensors that the user uses to measure what is
happening inside their body, such as heart rate. If you're requesting this permission, you
@@ -1680,11 +1787,11 @@
{@link android.content.pm.PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set)}.
-->
<permission android:name="android.permission.BODY_SENSORS_BACKGROUND"
- android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_bodySensors_background"
- android:description="@string/permdesc_bodySensors_background"
- android:protectionLevel="dangerous"
- android:permissionFlags="hardRestricted" />
+ android:permissionGroup="android.permission-group.UNDEFINED"
+ android:label="@string/permlab_bodySensors_background"
+ android:description="@string/permdesc_bodySensors_background"
+ android:protectionLevel="dangerous"
+ android:permissionFlags="hardRestricted" />
<!-- Allows an app to use fingerprint hardware.
<p>Protection level: normal
@@ -1706,7 +1813,7 @@
android:description="@string/permdesc_useBiometric"
android:protectionLevel="normal" />
- <!-- ======================================================================= -->
+ <!-- ====================================================================== -->
<!-- Permissions for posting notifications -->
<!-- ====================================================================== -->
<eat-comment />
@@ -1727,6 +1834,7 @@
android:label="@string/permlab_postNotification"
android:description="@string/permdesc_postNotification"
android:protectionLevel="dangerous|instant" />
+ <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- ====================================================================== -->
<!-- REMOVED PERMISSIONS -->
@@ -1762,7 +1870,7 @@
android:protectionLevel="normal"
android:permissionFlags="removed"/>
- <!-- @hide We need to keep this around for backwards compatibility -->
+ <!-- @SystemApi @hide We need to keep this around for backwards compatibility -->
<permission android:name="android.permission.WRITE_SMS"
android:protectionLevel="normal"
android:permissionFlags="removed"/>
@@ -1840,7 +1948,7 @@
<permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST"
android:protectionLevel="signature|privileged" />
- <!-- Allows an application to monitor incoming Bluetooth MAP messages, to record
+ <!-- @SystemApi Allows an application to monitor incoming Bluetooth MAP messages, to record
or perform processing on them. -->
<!-- @hide -->
<permission android:name="android.permission.RECEIVE_BLUETOOTH_MAP"
@@ -1954,7 +2062,8 @@
<permission android:name="android.permission.ACCESS_MOCK_LOCATION"
android:protectionLevel="signature" />
- <!-- @SystemApi @hide Allows automotive applications to control location
+ <!-- @hide @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES)
+ Allows automotive applications to control location
suspend state for power management use cases.
<p>Not for use by third-party applications.
-->
@@ -1999,10 +2108,10 @@
android:protectionLevel="normal" />
<!-- This permission is used to let OEMs grant their trusted app access to a subset of
- privileged wifi APIs to improve wifi performance. Allows applications to manage
- Wi-Fi network selection related features such as enable or disable global auto-join,
- modify connectivity scan intervals, and approve Wi-Fi Direct connections.
- <p>Not for use by third-party applications. -->
+ privileged wifi APIs to improve wifi performance. Allows applications to manage
+ Wi-Fi network selection related features such as enable or disable global auto-join,
+ modify connectivity scan intervals, and approve Wi-Fi Direct connections.
+ <p>Not for use by third-party applications. -->
<permission android:name="android.permission.MANAGE_WIFI_NETWORK_SELECTION"
android:protectionLevel="signature|privileged|knownSigner"
android:knownCerts="@array/wifi_known_signers" />
@@ -2061,14 +2170,14 @@
modifications.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"
- android:protectionLevel="signature|privileged|knownSigner"
- android:knownCerts="@array/wifi_known_signers" />
+ android:protectionLevel="signature|privileged|knownSigner"
+ android:knownCerts="@array/wifi_known_signers" />
- <!-- Allows applications to act as network scorers. @hide @SystemApi-->
+ <!-- @deprecated Allows applications to act as network scorers. @hide @SystemApi-->
<permission android:name="android.permission.SCORE_NETWORKS"
android:protectionLevel="signature|privileged" />
- <!-- Allows applications to request network
+ <!-- @deprecated Allows applications to request network
recommendations and scores from the NetworkScoreService.
@SystemApi
<p>Not for use by third-party applications. @hide -->
@@ -2172,7 +2281,7 @@
<!-- @SystemApi @hide Allows changing Thread network state and access to Thread network
credentials such as Network Key and PSKc.
<p>Not for use by third-party applications.
- @FlaggedApi("com.android.net.thread.flags.thread_enabled") -->
+ @FlaggedApi("com.android.net.thread.platform.flags.thread_enabled_platform") -->
<permission android:name="android.permission.THREAD_NETWORK_PRIVILEGED"
android:protectionLevel="signature|privileged" />
@@ -2222,10 +2331,12 @@
<!-- Allows system apps to call methods to register itself as a mDNS offload engine.
<p>Not for use by third-party or privileged applications.
@SystemApi
+ @FlaggedApi("android.net.platform.flags.register_nsd_offload_engine")
@hide This should only be used by system apps.
-->
<permission android:name="android.permission.REGISTER_NSD_OFFLOAD_ENGINE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature"
+ android:featureFlag="android.net.platform.flags.register_nsd_offload_engine" />
<!-- ======================================= -->
<!-- Permissions for short range, peripheral networks -->
@@ -2294,7 +2405,8 @@
them from running without explicit user action.
-->
<permission android:name="android.permission.QUARANTINE_APPS"
- android:protectionLevel="signature|verifier" />
+ android:protectionLevel="signature|verifier"
+ android:featureFlag="android.content.pm.quarantined_enabled" />
<!-- Allows applications to discover and pair bluetooth devices.
<p>Protection level: normal
@@ -2310,14 +2422,15 @@
<permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
android:protectionLevel="signature|privileged" />
- <!-- SystemApi Control access to email providers exclusively for Bluetooth
+ <!-- @SystemApi Control access to email providers exclusively for Bluetooth
@hide
-->
<permission android:name="android.permission.BLUETOOTH_MAP"
android:protectionLevel="signature|role" />
<!-- Allows bluetooth stack to access files
- @hide This should only be used by Bluetooth apk.
+ This should only be granted to the Bluetooth apk.
+ @hide @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES)
-->
<permission android:name="android.permission.BLUETOOTH_STACK"
android:protectionLevel="signature|role" />
@@ -2340,6 +2453,8 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.NFC_TRANSACTION_EVENT"
+ android:description="@string/permdesc_nfcTransactionEvent"
+ android:label="@string/permlab_nfcTransactionEvent"
android:protectionLevel="normal" />
<!-- Allows applications to receive NFC preferred payment service information.
@@ -2405,8 +2520,9 @@
<permission android:name="android.permission.NFC_HANDOVER_STATUS"
android:protectionLevel="signature|privileged" />
- <!-- @hide Allows internal management of Bluetooth state when on wireless consent mode.
- <p>Not for use by third-party applications. -->
+ <!-- @SystemApi Allows internal management of Bluetooth state when on wireless consent mode.
+ <p>Not for use by third-party applications.
+ @hide -->
<permission android:name="android.permission.MANAGE_BLUETOOTH_WHEN_WIRELESS_CONSENT_REQUIRED"
android:protectionLevel="signature" />
@@ -2502,6 +2618,15 @@
android:description="@string/permdesc_transmitIr"
android:protectionLevel="normal" />
+ <!-- Allows an app to turn on the screen on, e.g. with
+ {@link android.os.PowerManager#ACQUIRE_CAUSES_WAKEUP}.
+ <p>Intended to only be used by home automation apps.
+ -->
+ <permission android:name="android.permission.TURN_SCREEN_ON"
+ android:label="@string/permlab_turnScreenOn"
+ android:description="@string/permdesc_turnScreenOn"
+ android:protectionLevel="signature|privileged|appop" />
+
<!-- ==================================================== -->
<!-- Permissions related to changing audio settings -->
<!-- ==================================================== -->
@@ -2528,7 +2653,7 @@
<permission android:name="android.permission.LAUNCH_CAPTURE_CONTENT_ACTIVITY_FOR_NOTE"
android:protectionLevel="internal|role" />
- <!-- Allows an application to be notified whenever a screen capture is attempted.
+ <!-- Allows an application to get notified when a screen capture of its windows is attempted.
<p>Protection level: normal
-->
<permission android:name="android.permission.DETECT_SCREEN_CAPTURE"
@@ -2536,6 +2661,14 @@
android:description="@string/permdesc_detectScreenCapture"
android:protectionLevel="normal" />
+ <!-- Allows an application to get notified when it is being recorded.
+ <p>Protection level: normal
+ @FlaggedApi("com.android.window.flags.screen_recording_callbacks")
+ -->
+ <permission android:name="android.permission.DETECT_SCREEN_RECORDING"
+ android:protectionLevel="normal"
+ android:featureFlag="com.android.window.flags.screen_recording_callbacks" />
+
<!-- ======================================== -->
<!-- Permissions for factory reset protection -->
<!-- ======================================== -->
@@ -2656,6 +2789,12 @@
<permission android:name="android.permission.OEM_UNLOCK_STATE"
android:protectionLevel="signature" />
+ <!-- @SystemApi Allows configuration of factory reset protection
+ @FlaggedApi("android.security.frp_enforcement")
+ @hide <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.CONFIGURE_FACTORY_RESET_PROTECTION"
+ android:protectionLevel="signature|privileged" />
+
<!-- @SystemApi @hide Allows querying state of PersistentDataBlock
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCESS_PDB_STATE"
@@ -2763,6 +2902,13 @@
<permission android:name="android.permission.BIND_INCALL_SERVICE"
android:protectionLevel="signature|privileged" />
+ <!-- Must be required by a {@link android.telecom.CallStreamingService},
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature
+ @SystemApi @hide-->
+ <permission android:name="android.permission.BIND_CALL_STREAMING_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- Allows to query ongoing call details and manage ongoing calls
<p>Protection level: signature|appop -->
<permission android:name="android.permission.MANAGE_ONGOING_CALLS"
@@ -2816,13 +2962,6 @@
<permission android:name="android.permission.BIND_CALL_REDIRECTION_SERVICE"
android:protectionLevel="signature|privileged" />
- <!-- Must be required by a {@link android.telecom.CallStreamingService},
- to ensure that only the system can bind to it.
- <p>Protection level: signature
- @SystemApi @hide-->
- <permission android:name="android.permission.BIND_CALL_STREAMING_SERVICE"
- android:protectionLevel="signature" />
-
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
@deprecated {@link android.telecom.ConnectionService}s should require
@@ -2832,15 +2971,6 @@
<permission android:name="android.permission.BIND_CONNECTION_SERVICE"
android:protectionLevel="signature|privileged" />
- <!-- Must be required by a
- android.service.wallpapereffectsgeneration.WallpaperEffectsGenerationService,
- to ensure that only the system can bind to it.
- @SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
- <p>Protection level: signature
- -->
- <permission android:name="android.permission.BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE"
- android:protectionLevel="signature" />
-
<!-- Must be required by a {@link android.telecom.ConnectionService},
to ensure that only the system can bind to it.
<p>Protection level: signature|privileged
@@ -2869,6 +2999,16 @@
<permission android:name="android.permission.MANAGE_SENSORS"
android:protectionLevel="signature" />
+ <!-- Must be required by a DomainSelectionService to ensure that only the
+ system can bind to it.
+ <p>Protection level: signature
+ @SystemApi
+ @hide
+ @FlaggedApi("com.android.internal.telephony.flags.use_oem_domain_selection_service")
+ -->
+ <permission android:name="android.permission.BIND_DOMAIN_SELECTION_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- Must be required by an ImsService to ensure that only the
system can bind to it.
<p>Protection level: signature|privileged|vendorPrivileged
@@ -2878,6 +3018,23 @@
<permission android:name="android.permission.BIND_IMS_SERVICE"
android:protectionLevel="signature|privileged|vendorPrivileged" />
+ <!-- Must be required by a SatelliteService to ensure that only the
+ system can bind to it.
+ <p>Protection level: signature|privileged|vendorPrivileged
+ @SystemApi
+ @hide
+ -->
+ <permission android:name="android.permission.BIND_SATELLITE_SERVICE"
+ android:protectionLevel="signature|privileged|vendorPrivileged" />
+
+ <!-- Must be required by a SatelliteGatewayService to ensure that only the
+ system can bind to it.
+ <p>Protection level: signature
+ @hide
+ -->
+ <permission android:name="android.permission.BIND_SATELLITE_GATEWAY_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- Must be required by a telephony data service to ensure that only the
system can bind to it.
<p>Protection level: signature
@@ -2938,6 +3095,17 @@
<permission android:name="android.permission.ACCESS_RCS_USER_CAPABILITY_EXCHANGE"
android:protectionLevel="internal|role" />
+ <!-- Used to provide the Telecom framework with access to the last known call ID.
+ <p>Protection level: signature
+ @SystemApi
+ @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies")
+ @hide
+ -->
+ <permission android:name="android.permission.ACCESS_LAST_KNOWN_CELL_ID"
+ android:protectionLevel="signature"
+ android:label="@string/permlab_accessLastKnownCellId"
+ android:description="@string/permdesc_accessLastKnownCellId"/>
+
<!-- ================================== -->
<!-- Permissions for sdcard interaction -->
<!-- ================================== -->
@@ -3056,23 +3224,38 @@
types of interactions
@hide -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
- android:protectionLevel="signature|installer|role" />
+ android:protectionLevel="signature|installer|module|role" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<!-- Allows interaction across profiles in the same profile group. -->
<permission android:name="android.permission.INTERACT_ACROSS_PROFILES"
android:protectionLevel="signature|appop" />
+ <!-- Allows applications to access profiles with ACCESS_HIDDEN_PROFILES user property
+ <p>Protection level: normal
+ @FlaggedApi("android.multiuser.enable_permission_to_access_hidden_profiles") -->
+ <permission android:name="android.permission.ACCESS_HIDDEN_PROFILES"
+ android:label="@string/permlab_accessHiddenProfile"
+ android:description="@string/permdesc_accessHiddenProfile"
+ android:protectionLevel="normal" />
+
+ <!-- @SystemApi @hide Allows privileged applications to get details about hidden profile
+ users.
+ @FlaggedApi("android.multiuser.flags.enable_permission_to_access_hidden_profiles") -->
+ <permission
+ android:name="android.permission.ACCESS_HIDDEN_PROFILES_FULL"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @SystemApi @hide Allows starting activities across profiles in the same profile group. -->
+ <permission android:name="android.permission.START_CROSS_PROFILE_ACTIVITIES"
+ android:protectionLevel="signature|role" />
+
<!-- @SystemApi Allows configuring apps to have the INTERACT_ACROSS_PROFILES permission so that
they can interact across profiles in the same profile group.
@hide -->
<permission android:name="android.permission.CONFIGURE_INTERACT_ACROSS_PROFILES"
android:protectionLevel="signature|role" />
- <!-- @SystemApi @hide Allows starting activities across profiles in the same profile group. -->
- <permission android:name="android.permission.START_CROSS_PROFILE_ACTIVITIES"
- android:protectionLevel="signature|role" />
-
<!-- @SystemApi @hide Allows an application to call APIs that allow it to query and manage
users on the device. This permission is not available to
third party applications. -->
@@ -3446,11 +3629,18 @@
<!-- Allows an application to set policy related to <a
href="https://www.threadgroup.org">Thread</a> network.
- @FlaggedApi("com.android.net.thread.flags.thread_user_restriction_enabled")
+ @FlaggedApi("com.android.net.thread.platform.flags.thread_user_restriction_enabled")
-->
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_THREAD_NETWORK"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to set policy related to sending assist content to a
+ privileged app such as the Assistant app.
+ @FlaggedApi("android.app.admin.flags.assist_content_user_restriction_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_ASSIST_CONTENT"
+ android:protectionLevel="internal|role" />
+
<!-- Allows an application to set policy related to windows.
<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.
@@ -3500,6 +3690,14 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_SECURITY_LOGGING"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to use audit logging API.
+ @hide
+ @SystemApi
+ @FlaggedApi("android.app.admin.flags.security_log_v2_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_AUDIT_LOGGING"
+ android:protectionLevel="internal|role" />
+
<!-- Allows an application to set policy related to system updates.
<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.
@@ -3507,7 +3705,7 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_SYSTEM_UPDATES"
android:protectionLevel="internal|role" />
- <!-- Allows an application to query system updates.
+ <!-- Allows an application query system updates.
<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.
-->
@@ -3603,6 +3801,14 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_LOCK"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to manage policy related to theft detection.
+ @FlaggedApi("android.app.admin.flags.device_theft_api_enabled")
+ @hide
+ @SystemApi
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_THEFT_DETECTION"
+ android:protectionLevel="internal|role" />
+
<!-- Allows an application to manage policy related to system apps.
<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.
@@ -3626,6 +3832,38 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_DEVICE_IDENTIFIERS"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to manage policy related to content protection.
+ <p>Protection level: internal|role
+ @FlaggedApi("android.view.contentprotection.flags.manage_device_policy_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_CONTENT_PROTECTION"
+ android:protectionLevel="internal|role" />
+
+ <!-- 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.
+ @FlaggedApi("android.app.admin.flags.esim_management_enabled") -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_MANAGED_SUBSCRIPTIONS"
+ android:protectionLevel="internal|role" />
+
+ <!-- Allows an application to manage policy related to block package uninstallation.
+ @FlaggedApi("android.app.admin.flags.dedicated_device_control_api_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_BLOCK_UNINSTALL"
+ android:protectionLevel="internal|role" />
+
+ <!-- Allows an application to manage policy related to camera toggle.
+ @FlaggedApi("android.app.admin.flags.dedicated_device_control_api_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_CAMERA_TOGGLE"
+ android:protectionLevel="internal|role" />
+
+ <!-- Allows an application to manage policy related to microphone toggle.
+ @FlaggedApi("android.app.admin.flags.dedicated_device_control_api_enabled")
+ -->
+ <permission android:name="android.permission.MANAGE_DEVICE_POLICY_MICROPHONE_TOGGLE"
+ android:protectionLevel="internal|role" />
+
<!-- Allows an application to set device policies outside the current user
that are critical for securing data within the current user.
<p>Holding this permission allows the use of other held MANAGE_DEVICE_POLICY_*
@@ -3650,6 +3888,14 @@
<permission android:name="android.permission.MANAGE_DEVICE_POLICY_ACROSS_USERS_FULL"
android:protectionLevel="internal|role" />
+ <!-- Allows an application to access EnhancedConfirmationManager.
+ @SystemApi
+ @FlaggedApi("android.permission.flags.enhanced_confirmation_mode_apis_enabled")
+ @hide This is not a third-party API (intended for OEMs and system apps). -->
+ <permission android:name="android.permission.MANAGE_ENHANCED_CONFIRMATION_STATES"
+ android:protectionLevel="signature|installer" />
+ <uses-permission android:name="android.permission.MANAGE_ENHANCED_CONFIRMATION_STATES" />
+
<!-- @SystemApi @hide Allows an application to set a device owner on retail demo devices.-->
<permission android:name="android.permission.PROVISION_DEMO_DEVICE"
android:protectionLevel="signature|setup|knownSigner"
@@ -3665,11 +3911,6 @@
<permission android:name="android.permission.FORCE_DEVICE_POLICY_MANAGER_LOGS"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows an application to write to the security log buffer in logd.
- @hide -->
- <permission android:name="android.permission.WRITE_SECURITY_LOG"
- android:protectionLevel="signature|privileged" />
-
<!-- Allows an application to get full detailed information about
recently running tasks, with full fidelity to the real state.
@hide -->
@@ -3701,6 +3942,18 @@
<permission android:name="android.permission.ACTIVITY_EMBEDDING"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to embed any other apps in untrusted embedding mode without the need
+ for the embedded app to consent.
+ <p>For now, this permission is only granted to the Assistant application selected by
+ the user.
+ {@see https://developer.android.com/guide/topics/large-screens/activity-embedding#trust_model}
+ @SystemApi
+ @FlaggedApi("com.android.window.flags.untrusted_embedding_any_app_permission")
+ @hide
+ -->
+ <permission android:name="android.permission.EMBED_ANY_APP_IN_UNTRUSTED_MODE"
+ android:protectionLevel="internal|role" />
+
<!-- Allows an application to start any activity, regardless of permission
protection or exported state.
@hide -->
@@ -3747,13 +4000,15 @@
android:description="@string/permdesc_killBackgroundProcesses"
android:protectionLevel="normal" />
- <!-- @deprecated Allows an application to call
+ <!-- Allows an application to call
{@link android.app.ActivityManager#killBackgroundProcesses}.
<p>As of Android version {@link android.os.Build.VERSION_CODES#UPSIDE_DOWN_CAKE},
the {@link android.app.ActivityManager#killBackgroundProcesses} is no longer available to
third party applications. For backwards compatibility, the background processes of the
- caller's own package will still be killed when calling this API, meanwhile this permission
- is not required anymore in this case.
+ caller's own package will still be killed when calling this API. If the caller has
+ the system permission {@code KILL_ALL_BACKGROUND_PROCESSES}, other processes will be
+ killed too.
+
<p>Protection level: normal
-->
<permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"
@@ -3862,7 +4117,9 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND"
- android:protectionLevel="normal"/>
+ android:label="@string/permlab_startForegroundServicesFromBackground"
+ android:description="@string/permdesc_startForegroundServicesFromBackground"
+ android:protectionLevel="normal"/>
<!-- Allows a companion app to use data in the background.
<p>Protection level: normal
@@ -3878,6 +4135,8 @@
<p>Protection level: normal
-->
<permission android:name="android.permission.REQUEST_COMPANION_PROFILE_WATCH"
+ android:label="@string/permlab_companionProfileWatch"
+ android:description="@string/permdesc_companionProfileWatch"
android:protectionLevel="normal" />
<!-- Allows app to request to be associated with a device via
@@ -3897,8 +4156,7 @@
<permission android:name="android.permission.REQUEST_COMPANION_PROFILE_APP_STREAMING"
android:protectionLevel="signature|privileged" />
- <!-- Allows application to request to be associated with a virtual device associated to a
- nearby device capable of rendering an entire OS
+ <!-- Allows application to request to stream content from an Android host to a nearby device
({@link android.companion.AssociationRequest#DEVICE_PROFILE_NEARBY_DEVICE_STREAMING})
by {@link android.companion.CompanionDeviceManager}.
<p>Not for use by third-party applications.
@@ -3916,11 +4174,11 @@
android:protectionLevel="internal|role" />
<!-- Allows application to request to be associated with a computer to share functionality
- and/or data with other devices, such as notifications, photos and media
- ({@link android.companion.AssociationRequest#DEVICE_PROFILE_COMPUTER})
- by {@link android.companion.CompanionDeviceManager}.
- <p>Not for use by third-party applications.
- -->
+ and/or data with other devices, such as notifications, photos and media
+ ({@link android.companion.AssociationRequest#DEVICE_PROFILE_COMPUTER})
+ by {@link android.companion.CompanionDeviceManager}.
+ <p>Not for use by third-party applications.
+ -->
<permission android:name="android.permission.REQUEST_COMPANION_PROFILE_COMPUTER"
android:protectionLevel="signature|privileged" />
@@ -3953,6 +4211,8 @@
<!-- Allows an app to prevent non-system-overlay windows from being drawn on top of it -->
<permission android:name="android.permission.HIDE_OVERLAY_WINDOWS"
+ android:label="@string/permlab_hideOverlayWindows"
+ android:description="@string/permdesc_hideOverlayWindows"
android:protectionLevel="normal" />
<!-- ================================== -->
@@ -3976,8 +4236,7 @@
android:description="@string/permdesc_setWallpaperHints"
android:protectionLevel="normal" />
- <!-- Allow the app to read the system wallpaper image without
- holding the READ_EXTERNAL_STORAGE permission.
+ <!-- Allow the app to read the system and lock wallpaper images.
<p>Not for use by third-party applications.
@hide
@SystemApi
@@ -3988,6 +4247,7 @@
<!-- Allow apps to always update wallpaper by sending data.
@SystemApi
@hide
+ @FlaggedApi("com.android.window.flags.always_update_wallpaper_permission")
-->
<permission android:name="android.permission.ALWAYS_UPDATE_WALLPAPER"
android:protectionLevel="internal|role" />
@@ -4151,11 +4411,6 @@
<permission android:name="android.permission.WRITE_DEVICE_CONFIG"
android:protectionLevel="signature|verifier|configurator"/>
- <!-- @SystemApi @hide Allows an application to read config settings.
- <p>Not for use by third-party applications. -->
- <permission android:name="android.permission.READ_DEVICE_CONFIG"
- android:protectionLevel="signature|preinstalled" />
-
<!-- @SystemApi @TestApi @hide Allows an application to modify only allowlisted settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG"
@@ -4166,6 +4421,11 @@
<permission android:name="android.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG"
android:protectionLevel="signature|verifier|configurator"/>
+ <!-- @SystemApi @hide Allows an application to read config settings.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.READ_DEVICE_CONFIG"
+ android:protectionLevel="signature|preinstalled" />
+
<!-- @SystemApi @hide Allows applications like settings to read system-owned
application-specific locale configs.
<p>Not for use by third-party applications. -->
@@ -4177,7 +4437,7 @@
<permission android:name="android.permission.SET_APP_SPECIFIC_LOCALECONFIG"
android:protectionLevel="signature" />
- <!-- @hide Allows an application to monitor {@link android.provider.Settings.Config} access.
+ <!-- @SystemApi @hide Allows an application to monitor {@link android.provider.Settings.Config} access.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MONITOR_DEVICE_CONFIG_ACCESS"
android:protectionLevel="signature"/>
@@ -4352,7 +4612,8 @@
<!-- Allows an application to query the current time zone rules state
on device.
- @SystemApi @hide -->
+ @SystemApi @hide
+ @deprecated Vestigial permission declaration. No longer used. -->
<permission android:name="android.permission.QUERY_TIME_ZONE_RULES"
android:protectionLevel="signature|privileged" />
@@ -4361,7 +4622,8 @@
<p>An application requesting this permission is responsible for
verifying the source and integrity of the update before passing
it off to the installer components.
- @SystemApi @hide -->
+ @SystemApi @hide
+ @deprecated Vestigial permission declaration. No longer used. -->
<permission android:name="android.permission.UPDATE_TIME_ZONE_RULES"
android:protectionLevel="signature|privileged" />
@@ -4415,6 +4677,45 @@
<permission android:name="android.permission.REQUEST_UNIQUE_ID_ATTESTATION"
android:protectionLevel="signature" />
+ <!-- Allows an application to get enabled credential manager providers.
+ @hide -->
+ <permission android:name="android.permission.LIST_ENABLED_CREDENTIAL_PROVIDERS"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Allows a system application to be registered with credential manager without
+ having to be enabled by the user.
+ @hide @SystemApi -->
+ <permission android:name="android.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- Allows specifying candidate credential providers to be queried in Credential Manager
+ get flows, or to be preferred as a default in the Credential Manager create flows.
+ <p>Protection level: normal -->
+ <permission android:name="android.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS"
+ android:protectionLevel="normal" />
+
+ <!-- Allows a browser to invoke credential manager APIs on behalf of another RP.
+ <p>Protection level: normal -->
+ <permission android:name="android.permission.CREDENTIAL_MANAGER_SET_ORIGIN"
+ android:protectionLevel="normal" />
+
+ <!-- Allows a browser to invoke the set of query apis to get metadata about credential
+ candidates prepared during the CredentialManager.prepareGetCredential API.
+ <p>Protection level: normal -->
+ <permission android:name="android.permission.CREDENTIAL_MANAGER_QUERY_CANDIDATE_CREDENTIALS"
+ android:protectionLevel="normal" />
+
+ <!-- Allows permission to use Credential Manager UI for providing and saving credentials
+ @hide -->
+ <permission android:name="android.permission.LAUNCH_CREDENTIAL_SELECTOR"
+ android:protectionLevel="signature" />
+
+ <!-- Allows an application to be able to store and retrieve credentials from a remote
+ device.
+ <p>Protection level: signature|privileged|role -->
+ <permission android:name="android.permission.PROVIDE_REMOTE_CREDENTIALS"
+ android:protectionLevel="signature|privileged|role" />
+
<!-- ========================================= -->
<!-- Permissions for special development tools -->
<!-- ========================================= -->
@@ -4442,15 +4743,17 @@
<permission android:name="android.permission.READ_LOGS"
android:protectionLevel="signature|privileged|development" />
- <!-- Allows an application to access the data in Dropbox-->
- <permission android:name="android.permission.READ_DROPBOX_DATA"
- android:protectionLevel="signature|privileged|development" />
-
<!-- Configure an application for debugging.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.SET_DEBUG_APP"
android:protectionLevel="signature|privileged|development" />
+ <!-- Allows an application to access the data in Dropbox.
+ <p>Not for use by third-party applications.
+ @FlaggedApi("com.android.server.feature.flags.enable_read_dropbox_permission") -->
+ <permission android:name="android.permission.READ_DROPBOX_DATA"
+ android:protectionLevel="signature|privileged|development" />
+
<!-- Allows an application to set the maximum number of (not needed)
application processes that can be running.
<p>Not for use by third-party applications. -->
@@ -4585,7 +4888,7 @@
<permission android:name="android.permission.MANAGE_APP_OPS_RESTRICTIONS"
android:protectionLevel="signature|installer" />
- <!-- Allows an application to update the user app op modes.
+ <!-- @TestApi Allows an application to update the user app op modes.
Not for use by third party apps.
@hide -->
<permission android:name="android.permission.MANAGE_APP_OPS_MODES"
@@ -4666,6 +4969,13 @@
<permission android:name="android.permission.CHANGE_ACCESSIBILITY_VOLUME"
android:protectionLevel="signature" />
+ <!-- @FlaggedApi("com.android.server.accessibility.motion_event_observing")
+ @hide
+ @TestApi
+ Allows an accessibility service to observe motion events without consuming them. -->
+ <permission android:name="android.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING"
+ android:protectionLevel="signature" />
+
<!-- @hide Allows an application to collect frame statistics -->
<permission android:name="android.permission.FRAME_STATS"
android:protectionLevel="signature" />
@@ -4713,9 +5023,9 @@
android:protectionLevel="signature|recents" />
<!-- @SystemApi Allows an application to set the system audio caption and its UI
- enabled state.
- <p>Not for use by third-party applications.
- @hide -->
+ enabled state.
+ <p>Not for use by third-party applications.
+ @hide -->
<permission android:name="android.permission.SET_SYSTEM_AUDIO_CAPTION"
android:protectionLevel="signature|role" />
@@ -4734,7 +5044,8 @@
android:protectionLevel="signature" />
<!-- Allows access to Test APIs defined in {@link android.view.inputmethod.InputMethodManager}.
- @hide -->
+ @hide
+ @TestApi -->
<permission android:name="android.permission.TEST_INPUT_METHOD"
android:protectionLevel="signature" />
@@ -4790,7 +5101,7 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.BIND_NFC_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature|module" />
<!-- Must be required by a {@link android.service.quickaccesswallet.QuickAccessWalletService}
to ensure that only the system can bind to it.
@@ -4846,32 +5157,6 @@
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.BIND_ROTATION_RESOLVER_SERVICE" />
- <!-- @SystemApi Allows an application to access ambient context service.
- @hide <p>Not for use by third-party applications.</p> -->
- <permission android:name="android.permission.ACCESS_AMBIENT_CONTEXT_EVENT"
- android:protectionLevel="signature|privileged|role"/>
-
- <!-- @SystemApi Required by a AmbientContextEventDetectionService
- to ensure that only the service with this permission can bind to it.
- @hide <p>Not for use by third-party applications.</p> -->
- <permission android:name="android.permission.BIND_AMBIENT_CONTEXT_DETECTION_SERVICE"
- android:protectionLevel="signature"/>
-
- <!-- @SystemApi Required by a WearableSensingService to
- ensure that only the caller with this permission can bind to it.
- <p> Protection level: signature
- @hide
- -->
- <permission android:name="android.permission.BIND_WEARABLE_SENSING_SERVICE"
- android:protectionLevel="signature" />
-
- <!-- @SystemApi Allows an app to manage the wearable sensing service.
- <p>Protection level: signature|privileged
- @hide
- -->
- <permission android:name="android.permission.MANAGE_WEARABLE_SENSING_SERVICE"
- android:protectionLevel="signature|privileged" />
-
<!-- Must be required by a {@link android.net.VpnService},
to ensure that only the system can bind to it.
<p>Protection level: signature
@@ -4886,14 +5171,14 @@
<permission android:name="android.permission.BIND_WALLPAPER"
android:protectionLevel="signature|privileged" />
+
<!-- Must be required by a game service to ensure that only the
system can bind to it.
<p>Protection level: signature
- @SystemApi
@hide
-->
<permission android:name="android.permission.BIND_GAME_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- Must be required by a {@link android.service.voice.VoiceInteractionService},
to ensure that only the system can bind to it.
@@ -4910,15 +5195,6 @@
<permission android:name="android.permission.BIND_HOTWORD_DETECTION_SERVICE"
android:protectionLevel="signature" />
- <!-- @SystemApi Must be required by a {@link android.service.voice.visualQueryDetection},
- to ensure that only the system can bind to it.
- <p>Protection level: signature
- @hide This is not a third-party API (intended for OEMs and system apps).
- -->
- <permission android:name="android.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE"
- android:protectionLevel="signature" />
-
-
<!-- @SystemApi Allows an application to manage hotword detection and visual query detection
on the device.
<p>Protection level: internal|preinstalled
@@ -4927,19 +5203,20 @@
<permission android:name="android.permission.MANAGE_HOTWORD_DETECTION"
android:protectionLevel="internal|preinstalled" />
+ <!-- @SystemApi Must be required by a {@link android.service.voice.VisualQueryDetectionService},
+ to ensure that only the system can bind to it.
+ <p>Protection level: signature
+ @hide This is not a third-party API (intended for OEMs and system apps).
+ -->
+ <permission android:name="android.permission.BIND_VISUAL_QUERY_DETECTION_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to subscribe to keyguard locked (i.e., showing) state.
<p>Protection level: signature|role
<p>Intended for use by ROLE_ASSISTANT and signature apps only.
-->
<permission android:name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE"
- android:protectionLevel="signature|role"/>
-
- <!-- Must be required by a {@link android.service.credentials.CredentialProviderService},
- to ensure that only the system can bind to it.
- <p>Protection level: signature
- -->
- <permission android:name="android.permission.BIND_CREDENTIAL_PROVIDER_SERVICE"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature|module|role"/>
<!-- Must be required by a {@link android.service.autofill.AutofillService},
to ensure that only the system can bind to it.
@@ -4957,12 +5234,19 @@
<permission android:name="android.permission.BIND_FIELD_CLASSIFICATION_SERVICE"
android:protectionLevel="signature" />
- <!-- Alternative version of android.permission.BIND_AUTOFILL_FIELD_CLASSIFICATION_SERVICE.
- This permission was renamed during the O previews but it was supported on the final O
- release, so we need to carry it over.
+ <!-- Must be required by a CredentialProviderService to ensure that only the
+ system can bind to it.
<p>Protection level: signature
- @hide
- -->
+ -->
+ <permission android:name="android.permission.BIND_CREDENTIAL_PROVIDER_SERVICE"
+ android:protectionLevel="signature" />
+
+ <!-- Alternative version of android.permission.BIND_AUTOFILL_FIELD_CLASSIFICATION_SERVICE.
+ This permission was renamed during the O previews but it was supported on the final O
+ release, so we need to carry it over.
+ <p>Protection level: signature
+ @hide
+ -->
<permission android:name="android.permission.BIND_AUTOFILL"
android:protectionLevel="signature" />
@@ -4998,9 +5282,9 @@
android:protectionLevel="signature" />
<!-- Must be required by a android.service.selectiontoolbar.SelectionToolbarRenderService,
- to ensure that only the system can bind to it.
- @hide This is not a third-party API (intended for OEMs and system apps).
- <p>Protection level: signature
+ to ensure that only the system can bind to it.
+ @hide This is not a third-party API (intended for OEMs and system apps).
+ <p>Protection level: signature
-->
<permission android:name="android.permission.BIND_SELECTION_TOOLBAR_RENDER_SERVICE"
android:protectionLevel="signature" />
@@ -5036,6 +5320,16 @@
<permission android:name="android.permission.BIND_CONTENT_SUGGESTIONS_SERVICE"
android:protectionLevel="signature" />
+ <!-- Must be required by a
+ android.service.wallpapereffectsgeneration.WallpaperEffectsGenerationService,
+ to ensure that only the system can bind to it.
+ @SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
+ <p>Protection level: signature
+ -->
+ <permission android:name="android.permission.BIND_WALLPAPER_EFFECTS_GENERATION_SERVICE"
+ android:protectionLevel="signature" />
+
+
<!-- Must be declared by a android.service.musicrecognition.MusicRecognitionService,
to ensure that only the system can bind to it.
@SystemApi @hide This is not a third-party API (intended for OEMs and system apps).
@@ -5058,7 +5352,9 @@
this permission, it must hold the permission and be the active VoiceInteractionService in
the system.
{@see Settings.Secure.VOICE_INTERACTION_SERVICE}
- @hide -->
+ @hide @SystemApi Intended for OEM and system apps.
+ <p>Protection level: signature|privileged
+ -->
<permission android:name="android.permission.MANAGE_VOICE_KEYPHRASES"
android:protectionLevel="signature|privileged" />
@@ -5067,7 +5363,9 @@
sound models at any time. This permission should be reserved for system enrollment
applications detected by {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}
only.
- @hide <p>Not for use by third-party applications.</p> -->
+ @hide @SystemApi Intended for OEM and system apps.
+ <p>Protection level: signature|privileged
+ -->
<permission android:name="android.permission.KEYPHRASE_ENROLLMENT_APPLICATION"
android:protectionLevel="signature|privileged" />
@@ -5077,6 +5375,14 @@
<permission android:name="android.permission.BIND_REMOTE_DISPLAY"
android:protectionLevel="signature" />
+ <!-- Must be required by a android.media.tv.ad.TvAdService to ensure that only the system can
+ bind to it.
+ <p>Protection level: signature|privileged
+ @FlaggedApi("android.media.tv.flags.enable_ad_service_fw")
+ -->
+ <permission android:name="android.permission.BIND_TV_AD_SERVICE"
+ android:protectionLevel="signature|privileged" />
+
<!-- Must be required by a {@link android.media.tv.TvInputService}
to ensure that only the system can bind to it.
<p>Protection level: signature|privileged
@@ -5100,15 +5406,6 @@
<permission android:name="android.permission.BIND_TV_REMOTE_SERVICE"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows TV input apps and TV apps to use TIS extension interfaces for
- domain-specific features.
- <p>Protection level: signature|privileged|vendorPrivileged
- <p>Not for use by third-party applications.
- @hide
- -->
- <permission android:name="android.permission.TIS_EXTENSION_INTERFACE"
- android:protectionLevel="signature|privileged|vendorPrivileged" />
-
<!-- @SystemApi
Must be required for a virtual remote controller for TV.
<p>Protection level: signature|privileged
@@ -5152,7 +5449,7 @@
<!-- @SystemApi This permission is required by Media Resource Manager Service when
system services create MediaCodecs on behalf of other processes and apps.
- <p>Protection level: signature
+ <p>Protection level: signature|privileged|vendorPrivileged
<p>Not for use by third-party applications.
@hide -->
<permission android:name="android.permission.MEDIA_RESOURCE_OVERRIDE_PID"
@@ -5226,19 +5523,6 @@
<permission android:name="android.permission.SET_KEYBOARD_LAYOUT"
android:protectionLevel="signature" />
- <!-- Allows low-level access for re-mapping modifier keys.
- <p>Not for use by third-party applications.
- @hide
- @TestApi -->
- <permission android:name="android.permission.REMAP_MODIFIER_KEYS"
- android:protectionLevel="signature" />
-
- <!-- Allows low-level access for monitoring keyboard backlight changes.
- <p>Not for use by third-party applications.
- @hide -->
- <permission android:name="android.permission.MONITOR_KEYBOARD_BACKLIGHT"
- android:protectionLevel="signature" />
-
<!-- Allows an app to schedule a prioritized alarm that can be used to perform
background work even when the device is in doze.
<p>Not for use by third-party applications.
@@ -5249,27 +5533,53 @@
android:protectionLevel="signature|privileged"/>
<!-- Allows applications to use exact alarm APIs.
- <p>Exact alarms should only be used for user-facing features.
- For more details, see <a
- href="{@docRoot}about/versions/12/behavior-changes-12#exact-alarm-permission">
- Exact alarm permission</a>.
- <p>Apps who hold this permission and target API level 31 or above, always stay in the
+ <p>This is a special access permission that can be revoked by the system or the user.
+ It should only be used to enable <b>user-facing features</b> that require exact alarms.
+ For more details, please go through the associated
+ <a href="{@docRoot}training/scheduling/alarms#exact">developer docs</a>.
+ <p>Apps need to target API {@link android.os.Build.VERSION_CODES#S} or above to be able to
+ request this permission. Note that apps targeting lower API levels do not need this
+ permission to use exact alarm APIs.
+ <p>Apps that hold this permission and target API
+ {@link android.os.Build.VERSION_CODES#TIRAMISU} and below always stay in the
{@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_WORKING_SET WORKING_SET} or
lower standby bucket.
- Applications targeting API level 30 or below do not need this permission to use
- exact alarm APIs.
+ <p>If your app relies on exact alarms for core functionality, it can instead request
+ {@link android.Manifest.permission#USE_EXACT_ALARM} once it targets API
+ {@link android.os.Build.VERSION_CODES#TIRAMISU}. All apps using exact alarms for secondary
+ features (which should still be user facing) should continue using this permission.
+ <p>Protection level: signature|privileged|appop
-->
<permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
+ android:label="@string/permlab_schedule_exact_alarm"
+ android:description="@string/permdesc_schedule_exact_alarm"
android:protectionLevel="signature|privileged|appop"/>
- <!-- Allows apps to use exact alarms just like with SCHEDULE_EXACT_ALARM but without needing
- to request this permission from the user.
- <p><b>This is only for apps that rely on exact alarms for their core functionality.</b>
- App stores may enforce policies to audit and review the use of this permission. Any app that
- requests this but is found to not require exact alarms for its primary function may be
- removed from the app store.
+ <!-- Allows apps to use exact alarms just like with {@link
+ android.Manifest.permission#SCHEDULE_EXACT_ALARM} but without needing to request this
+ permission from the user.
+ <p><b> This is only intended for use by apps that rely on exact alarms for their core
+ functionality.</b> You should continue using {@code SCHEDULE_EXACT_ALARM} if your app needs
+ exact alarms for a secondary feature that users may or may not use within your app.
+ <p> Keep in mind that this is a powerful permission and app stores may enforce policies to
+ audit and review the use of this permission. Such audits may involve removal from the app
+ store if the app is found to be misusing this permission.
+ <p> Apps need to target API {@link android.os.Build.VERSION_CODES#TIRAMISU} or above to be
+ able to request this permission. Note that only one of {@code USE_EXACT_ALARM} or
+ {@code SCHEDULE_EXACT_ALARM} should be requested on a device. If your app is already using
+ {@code SCHEDULE_EXACT_ALARM} on older SDKs but needs {@code USE_EXACT_ALARM} on SDK 33 and
+ above, then {@code SCHEDULE_EXACT_ALARM} should be declared with a max-sdk attribute, like:
+ <pre>
+ &lt;uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
+ &Tab; android:maxSdkVersion="32" /&gt;
+ </pre>
+ <p>Apps that hold this permission, always stay in the
+ {@link android.app.usage.UsageStatsManager#STANDBY_BUCKET_WORKING_SET WORKING_SET} or
+ lower standby bucket.
-->
<permission android:name="android.permission.USE_EXACT_ALARM"
+ android:label="@string/permlab_use_exact_alarm"
+ android:description="@string/permdesc_use_exact_alarm"
android:protectionLevel="normal"/>
<!-- Allows an application to query tablet mode state and monitor changes
@@ -5360,9 +5670,10 @@
of a session based install.
<p>Not for use by third-party applications.
@hide
+ @FlaggedApi("android.content.pm.get_resolved_apk_path")
-->
<permission android:name="android.permission.READ_INSTALLED_SESSION_PATHS"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer" />
<uses-permission android:name="android.permission.READ_INSTALLED_SESSION_PATHS" />
<!-- Allows an application to use System Data Loaders.
@@ -5450,7 +5761,7 @@
<permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"
android:protectionLevel="signature|privileged|role" />
- <!-- @SystemApi Allows an application to grant specific permissions.
+ <!-- @SystemApi @TestApi iAllows an application to grant specific permissions.
@hide -->
<permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS"
android:protectionLevel="signature|installer|verifier" />
@@ -5472,11 +5783,11 @@
<permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS"
android:protectionLevel="signature|installer|verifier" />
- <!-- @TestApi Allows an application to revoke the POST_NOTIFICATIONS permission from an app
- without killing the app. Only granted to the shell.
- @hide -->
+ <!-- @TestApi Allows an application to revoke the POST_NOTIFICATIONS permission from an app
+ without killing the app. Only granted to the shell.
+ @hide -->
<permission android:name="android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @SystemApi Allows the system to read runtime permission state.
@hide -->
@@ -5490,7 +5801,7 @@
<permission android:name="android.permission.RESTORE_RUNTIME_PERMISSIONS"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows an application to change policy_fixed permissions.
+ <!-- @SystemApi @TestApi Allows an application to change policy_fixed permissions.
@hide -->
<permission android:name="android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY"
android:protectionLevel="signature|installer" />
@@ -5501,7 +5812,7 @@
android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to allowlist restricted permissions
- on any of the whitelists.
+ on any of the allowlists.
@hide -->
<permission android:name="android.permission.WHITELIST_RESTRICTED_PERMISSIONS"
android:protectionLevel="signature|installer" />
@@ -5524,7 +5835,8 @@
<!-- @SystemApi Allows an application to manage the holders of a role.
@hide -->
<permission android:name="android.permission.MANAGE_ROLE_HOLDERS"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer|module" />
+ <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
<!-- @SystemApi Allows an application to manage the holders of roles associated with default
applications.
@@ -5544,28 +5856,41 @@
<!-- @SystemApi Allows an application to observe role holder changes.
@hide -->
<permission android:name="android.permission.OBSERVE_ROLE_HOLDERS"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer|module" />
<!-- Allows an application to manage the companion devices.
@hide -->
<permission android:name="android.permission.MANAGE_COMPANION_DEVICES"
- android:protectionLevel="signature|role|module" />
+ android:protectionLevel="module|signature|role" />
<!-- Allows an application to subscribe to notifications about the presence status change
of their associated companion device
-->
<permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE"
+ android:label="@string/permlab_observeCompanionDevicePresence"
+ android:description="@string/permdesc_observeCompanionDevicePresence"
android:protectionLevel="normal" />
+ <!-- Allows an application to subscribe to notifications about the nearby devices' presence
+ status change base on the UUIDs.
+ <p>Not for use by third-party applications.</p>
+ @FlaggedApi("android.companion.flags.device_presence")
+ -->
+ <permission android:name="android.permission.REQUEST_OBSERVE_DEVICE_UUID_PRESENCE"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an application to deliver companion messages to system
-->
<permission android:name="android.permission.DELIVER_COMPANION_MESSAGES"
+ android:label="@string/permlab_deliverCompanionMessages"
+ android:description="@string/permdesc_deliverCompanionMessages"
android:protectionLevel="normal" />
- <!-- @SystemApi Allows an application to send and receive messages via CDM transports.
- @hide -->
+ <!-- @hide @FlaggedApi("android.companion.flags.companion_transport_apis")
+ Allows an application to send and receive messages via CDM transports.
+ -->
<permission android:name="android.permission.USE_COMPANION_TRANSPORTS"
- android:protectionLevel="signature|module" />
+ android:protectionLevel="signature" />
<!-- Allows an application to create new companion device associations.
@SystemApi
@@ -5588,7 +5913,7 @@
<permission android:name="android.permission.ROTATE_SURFACE_FLINGER"
android:protectionLevel="signature|recents" />
- <!-- @SystemApi Allows an application to provide hints to SurfaceFlinger that can influence
+ <!-- Allows an application to provide hints to SurfaceFlinger that can influence
its wakes up time to compose the next frame. This is a subset of the capabilities granted
by {@link #ACCESS_SURFACE_FLINGER}.
<p>Not for use by third-party applications.
@@ -5605,6 +5930,13 @@
<permission android:name="android.permission.READ_FRAME_BUFFER"
android:protectionLevel="signature|recents" />
+ <!-- Allows an application to change the touch mode state.
+ Without this permission, an app can only change the touch mode
+ if it currently has focus.
+ @hide -->
+ <permission android:name="android.permission.MODIFY_TOUCH_MODE_STATE"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to use InputFlinger's low level features.
@hide -->
<permission android:name="android.permission.ACCESS_INPUT_FLINGER"
@@ -5617,12 +5949,10 @@
<permission android:name="android.permission.DISABLE_INPUT_DEVICE"
android:protectionLevel="signature" />
- <!-- Allows an application to configure and connect to Wifi displays
- @hide
- @SystemApi -->
+ <!-- Allows an application to configure and connect to Wifi displays -->
<permission android:name="android.permission.CONFIGURE_WIFI_DISPLAY"
- android:protectionLevel="signature|knownSigner"
- android:knownCerts="@array/wifi_known_signers" />
+ android:protectionLevel="signature|knownSigner"
+ android:knownCerts="@array/wifi_known_signers" />
<!-- Allows an application to control low-level features of Wifi displays
such as opening an RTSP socket. This permission should only be used
@@ -5657,7 +5987,7 @@
<permission android:name="android.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS"
android:protectionLevel="signature|privileged" />
- <!-- Allows an application to collect usage infomation about brightness slider changes.
+ <!-- Allows an application to collect usage information about brightness slider changes.
<p>Not for use by third-party applications.</p>
@hide
@SystemApi
@@ -5802,21 +6132,21 @@
<permission android:name="android.permission.MODIFY_AUDIO_ROUTING"
android:protectionLevel="signature|privileged|role" />
- <!-- @SystemApi Allows an application to access the uplink and downlink audio of an ongoing
- call.
- <p>Not for use by third-party applications.</p>
- @hide -->
- <permission android:name="android.permission.CALL_AUDIO_INTERCEPTION"
- android:protectionLevel="signature|privileged|role" />
-
<!--@SystemApi Allows an application to modify system audio settings that shouldn't be
- controllable by external apps, such as volume settings or volume behaviors for audio
- devices, regardless of their connection status.
- <p>Not for use by third-party applications.
- @hide -->
+ controllable by external apps, such as volume settings or volume behaviors for audio
+ devices, regardless of their connection status.
+ <p>Not for use by third-party applications.
+ @hide -->
<permission android:name="android.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi Allows an application to access the uplink and downlink audio of an ongoing
+ call.
+ <p>Not for use by third-party applications.</p>
+ @hide -->
+ <permission android:name="android.permission.CALL_AUDIO_INTERCEPTION"
+ android:protectionLevel="signature|privileged|role" />
+
<!-- @TestApi Allows an application to query audio related state.
@hide -->
<permission android:name="android.permission.QUERY_AUDIO_STATE"
@@ -5862,9 +6192,9 @@
android:protectionLevel="signature|privileged" />
<!-- Allows an application to control the routing of media apps.
- <p>Only for use by role COMPANION_DEVICE_WATCH</p>
- @FlaggedApi("com.android.media.flags.enable_privileged_routing_for_media_routing_control")
- -->
+ <p>Only for use by role COMPANION_DEVICE_WATCH</p>
+ @FlaggedApi("com.android.media.flags.enable_privileged_routing_for_media_routing_control")
+ -->
<permission android:name="android.permission.MEDIA_ROUTING_CONTROL"
android:protectionLevel="signature|appop" />
@@ -5922,7 +6252,7 @@
<!-- @hide @SystemApi Allows an application to manage Low Power Standby settings.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.MANAGE_LOW_POWER_STANDBY"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide @SystemApi Allows an application to request ports to remain open during
Low Power Standby.
@@ -5986,6 +6316,7 @@
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CALL_PRIVILEGED"
android:protectionLevel="signature|privileged" />
+ <uses-permission android:name="android.permission.CALL_PRIVILEGED" />
<!-- @SystemApi Allows an application to perform CDMA OTA provisioning @hide -->
<permission android:name="android.permission.PERFORM_CDMA_PROVISIONING"
@@ -6052,8 +6383,7 @@
<permission android:name="android.permission.CHANGE_APP_IDLE_STATE"
android:protectionLevel="signature|privileged" />
- <!-- @hide @TestApi @SystemApi Allows an application to change the estimated launch time
- of an app.
+ <!-- @hide @SystemApi Allows an application to change the estimated launch time of an app.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.CHANGE_APP_LAUNCH_TIME_ESTIMATE"
android:protectionLevel="signature|privileged" />
@@ -6113,11 +6443,6 @@
<permission android:name="android.permission.RECOVER_KEYSTORE"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows application to verify lockscreen credentials provided by a remote device.
- @hide -->
- <permission android:name="android.permission.CHECK_REMOTE_LOCKSCREEN"
- android:protectionLevel="signature|privileged" />
-
<!-- Allows a package to launch the secure full-backup confirmation UI.
ONLY the system process may hold this permission.
@hide -->
@@ -6215,8 +6540,8 @@
<permission android:name="android.permission.SET_WALLPAPER_COMPONENT"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows applications to set wallpaper dim amount.
- @hide -->
+ <!-- @SystemApi Allows applications to set the wallpaper dim amount.
+ @hide. -->
<permission android:name="android.permission.SET_WALLPAPER_DIM_AMOUNT"
android:protectionLevel="signature|privileged" />
@@ -6416,6 +6741,11 @@
<permission android:name="android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS"
android:protectionLevel="signature"/>
+ <!-- @SystemApi Allows application to verify lockscreen credentials provided by a remote device.
+ @hide -->
+ <permission android:name="android.permission.CHECK_REMOTE_LOCKSCREEN"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows managing (adding, removing) fingerprint templates. Reserved for the system. @hide -->
<permission android:name="android.permission.MANAGE_FINGERPRINT"
android:protectionLevel="signature|privileged" />
@@ -6444,7 +6774,14 @@
<!-- Allows the system to control the BiometricDialog (SystemUI). Reserved for the system. @hide -->
<permission android:name="android.permission.MANAGE_BIOMETRIC_DIALOG"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
+
+ <!-- Allows an application to set the BiometricDialog (SystemUI) logo .
+ <p>Not for use by third-party applications.
+ @FlaggedApi("android.hardware.biometrics.custom_biometric_prompt")
+ -->
+ <permission android:name="android.permission.SET_BIOMETRIC_DIALOG_LOGO"
+ android:protectionLevel="signature" />
<!-- Allows an application to control keyguard. Only allowed for system processes.
@hide -->
@@ -6755,12 +7092,16 @@
<!-- Allows the holder to read blocked numbers. See
{@link android.provider.BlockedNumberContract}.
+ @SystemApi
+ @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies")
@hide -->
<permission android:name="android.permission.READ_BLOCKED_NUMBERS"
android:protectionLevel="signature" />
<!-- Allows the holder to write blocked numbers. See
{@link android.provider.BlockedNumberContract}.
+ @SystemApi
+ @FlaggedApi("com.android.server.telecom.flags.telecom_resolve_hidden_dependencies")
@hide -->
<permission android:name="android.permission.WRITE_BLOCKED_NUMBERS"
android:protectionLevel="signature" />
@@ -6819,6 +7160,11 @@
<permission android:name="android.permission.MANAGE_ROTATION_RESOLVER"
android:protectionLevel="signature"/>
+ <!-- @SystemApi Allows an application to manage the cloudsearch service.
+ @hide <p>Not for use by third-party applications.</p> -->
+ <permission android:name="android.permission.MANAGE_CLOUDSEARCH"
+ android:protectionLevel="signature|privileged|role" />
+
<!-- @SystemApi Allows an application to manage the music recognition service.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_MUSIC_RECOGNITION"
@@ -6829,10 +7175,10 @@
<permission android:name="android.permission.MANAGE_SPEECH_RECOGNITION"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows an application to manage the content suggestions service.
+ <!-- @SystemApi Allows an application to interact with the content suggestions service.
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_CONTENT_SUGGESTIONS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature|role" />
<!-- @SystemApi Allows an application to manage the app predictions service.
@hide <p>Not for use by third-party applications.</p> -->
@@ -6850,21 +7196,17 @@
android:protectionLevel="signature" />
<!-- @SystemApi Allows an application to access the smartspace service as a client.
+ @FlaggedApi(android.app.smartspace.flags.Flags.FLAG_ACCESS_SMARTSPACE)
@hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.ACCESS_SMARTSPACE"
android:protectionLevel="signature|privileged|development" />
<!-- @SystemApi Allows an application to manage the wallpaper effects
- generation service.
- @hide <p>Not for use by third-party applications.</p> -->
+ generation service.
+ @hide <p>Not for use by third-party applications.</p> -->
<permission android:name="android.permission.MANAGE_WALLPAPER_EFFECTS_GENERATION"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows an application to manage the cloudsearch service.
- @hide <p>Not for use by third-party applications.</p> -->
- <permission android:name="android.permission.MANAGE_CLOUDSEARCH"
- android:protectionLevel="signature|privileged|role" />
-
<!-- Allows an app to set the theme overlay in /vendor/overlay
being used.
@hide <p>Not for use by third-party applications.</p> -->
@@ -6890,6 +7232,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA"
+ android:description="@string/permdesc_foregroundServiceCamera"
+ android:label="@string/permlab_foregroundServiceCamera"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6897,6 +7241,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE"
+ android:description="@string/permdesc_foregroundServiceConnectedDevice"
+ android:label="@string/permlab_foregroundServiceConnectedDevice"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6904,6 +7250,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC"
+ android:description="@string/permdesc_foregroundServiceDataSync"
+ android:label="@string/permlab_foregroundServiceDataSync"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6911,6 +7259,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"
+ android:description="@string/permdesc_foregroundServiceLocation"
+ android:label="@string/permlab_foregroundServiceLocation"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6918,6 +7268,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"
+ android:description="@string/permdesc_foregroundServiceMediaPlayback"
+ android:label="@string/permlab_foregroundServiceMediaPlayback"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6925,6 +7277,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION"
+ android:description="@string/permdesc_foregroundServiceMediaProjection"
+ android:label="@string/permlab_foregroundServiceMediaProjection"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6932,6 +7286,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"
+ android:description="@string/permdesc_foregroundServiceMicrophone"
+ android:label="@string/permlab_foregroundServiceMicrophone"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6939,6 +7295,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_PHONE_CALL"
+ android:description="@string/permdesc_foregroundServicePhoneCall"
+ android:label="@string/permlab_foregroundServicePhoneCall"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6946,6 +7304,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH"
+ android:description="@string/permdesc_foregroundServiceHealth"
+ android:label="@string/permlab_foregroundServiceHealth"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6953,6 +7313,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING"
+ android:description="@string/permdesc_foregroundServiceRemoteMessaging"
+ android:label="@string/permlab_foregroundServiceRemoteMessaging"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6962,6 +7324,8 @@
<p>Protection level: normal|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED"
+ android:description="@string/permdesc_foregroundServiceSystemExempted"
+ android:label="@string/permlab_foregroundServiceSystemExempted"
android:protectionLevel="normal|instant" />
<!-- Allows a regular application to use {@link android.app.Service#startForeground
@@ -6974,11 +7338,23 @@
android:label="@string/permlab_foregroundServiceFileManagement"
android:protectionLevel="normal|instant" />
+ <!-- @FlaggedApi("android.content.pm.introduce_media_processing_type")
+ Allows a regular application to use {@link android.app.Service#startForeground
+ Service.startForeground} with the type "mediaProcessing".
+ <p>Protection level: normal|instant
+ -->
+ <permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROCESSING"
+ android:description="@string/permdesc_foregroundServiceMediaProcessing"
+ android:label="@string/permlab_foregroundServiceMediaProcessing"
+ android:protectionLevel="normal|instant" />
+
<!-- Allows a regular application to use {@link android.app.Service#startForeground
Service.startForeground} with the type "specialUse".
<p>Protection level: normal|appop|instant
-->
<permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE"
+ android:description="@string/permdesc_foregroundServiceSpecialUse"
+ android:label="@string/permlab_foregroundServiceSpecialUse"
android:protectionLevel="normal|appop|instant" />
<!-- @SystemApi Allows to access all app shortcuts.
@@ -7073,17 +7449,11 @@
android:protectionLevel="signature" />
<!-- @SystemApi Allows modifying accessibility state.
+ <p> The only approved role for this permission is COMPANION_DEVICE_APP_STREAMING.
@hide -->
<permission android:name="android.permission.MANAGE_ACCESSIBILITY"
android:protectionLevel="signature|setup|recents|role" />
- <!-- @FlaggedApi("com.android.server.accessibility.motion_event_observing")
- @hide
- @TestApi
- Allows an accessibility service to observe motion events without consuming them. -->
- <permission android:name="android.permission.ACCESSIBILITY_MOTION_EVENT_OBSERVING"
- android:protectionLevel="signature" />
-
<!-- @SystemApi Allows an app to grant a profile owner access to device identifiers.
<p>Not for use by third-party applications.
@deprecated
@@ -7198,8 +7568,8 @@
<!-- Allows input events to be monitored. Very dangerous! @hide -->
<permission android:name="android.permission.MONITOR_INPUT"
android:protectionLevel="signature|recents" />
- <!-- Allows the use of FLAG_SLIPPERY, which permits touch events to slip from the current
- window to the window where the touch currently is on top of. @hide -->
+ <!-- @SystemApi Allows the use of FLAG_SLIPPERY, which permits touch events to slip from the
+ current window to the window where the touch currently is on top of. @hide -->
<permission android:name="android.permission.ALLOW_SLIPPERY_TOUCHES"
android:protectionLevel="signature|privileged|recents|role" />
<!-- Allows the caller to change the associations between input devices and displays.
@@ -7261,6 +7631,11 @@
<permission android:name="android.permission.RESET_APP_ERRORS"
android:protectionLevel="signature" />
+ <!-- @hide Allows ThemeOverlayController to delay launch of Home / SetupWizard on boot, ensuring
+ Theme Palettes and Colors are ready -->
+ <permission android:name="android.permission.SET_THEME_OVERLAY_CONTROLLER_READY"
+ android:protectionLevel="signature|setup" />
+
<!-- @hide Allows an application to create/destroy input consumer. -->
<permission android:name="android.permission.INPUT_CONSUMER"
android:protectionLevel="signature" />
@@ -7290,38 +7665,34 @@
<permission android:name="android.permission.MANAGE_GAME_MODE"
android:protectionLevel="signature|privileged" />
+ <!-- @TestApi Allows setting the game service provider, meant for tests only.
+ @hide -->
+ <permission android:name="android.permission.SET_GAME_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows accessing the frame rate per second of a given application
- @hide -->
+ @hide -->
<permission android:name="android.permission.ACCESS_FPS_COUNTER"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows managing the GameService APIs
- @hide -->
+ <!-- @SystemApi Allows the GameService provider to create GameSession and call GameSession
+ APIs and overlay a view on top of the game's Activity.
+ @hide -->
<permission android:name="android.permission.MANAGE_GAME_ACTIVITY"
android:protectionLevel="signature|privileged" />
- <!-- Allows managing the Game service
- @hide @TestApi Used only for testing. -->
- <permission android:name="android.permission.SET_GAME_SERVICE"
- android:protectionLevel="signature" />
-
<!-- @SystemApi Allows the holder to register callbacks to inform the RebootReadinessManager
when they are performing reboot-blocking work.
@hide -->
<permission android:name="android.permission.SIGNAL_REBOOT_READINESS"
android:protectionLevel="signature|privileged" />
- <!-- @SystemApi Allows an application to change the touch mode state.
- @hide -->
- <permission android:name="android.permission.MODIFY_TOUCH_MODE_STATE"
- android:protectionLevel="signature" />
-
<!-- @SystemApi Allows the holder to launch an Intent Resolver flow with custom presentation
and/or targets.
- @FlaggedApi("android.service.chooser.support_nfc_resolver")
+ @FlaggedApi("android.nfc.enable_nfc_mainline")
@hide -->
<permission android:name="android.permission.SHOW_CUSTOMIZED_RESOLVER"
- android:protectionLevel="signature|privileged" />
+ android:protectionLevel="signature|privileged" />
<!-- @hide Allows an application to get a People Tile preview for a given shortcut. -->
<permission android:name="android.permission.GET_PEOPLE_TILE_PREVIEW"
@@ -7339,7 +7710,10 @@
android:protectionLevel="signature|privileged" />
<!-- Allows an application to read nearby streaming policy. The policy controls
- whether to allow the device to stream its notifications and apps to nearby devices. -->
+ whether to allow the device to stream its notifications and apps to nearby devices.
+ Applications that are not the device owner will need this permission to call
+ {@link android.app.admin.DevicePolicyManager#getNearbyNotificationStreamingPolicy} or
+ {@link android.app.admin.DevicePolicyManager#getNearbyAppStreamingPolicy}. -->
<permission android:name="android.permission.READ_NEARBY_STREAMING_POLICY"
android:protectionLevel="normal" />
@@ -7375,6 +7749,7 @@
android:protectionLevel="normal" />
<uses-permission android:name="android.permission.ENFORCE_UPDATE_OWNERSHIP" />
+
<!-- Allows an application to take screenshots of layers that normally would be blacked out when
a screenshot is taken. Specifically, layers that have the flag
{@link android.view.SurfaceControl#SECURE} will be screenshot if the caller requests to
@@ -7385,16 +7760,8 @@
<permission android:name="android.permission.CAPTURE_BLACKOUT_CONTENT"
android:protectionLevel="signature" />
- <!-- Allows read only access to phone state with a non dangerous permission,
- including the information like cellular network type, software version. -->
- <permission android:name="android.permission.READ_BASIC_PHONE_STATE"
- android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_readBasicPhoneState"
- android:description="@string/permdesc_readBasicPhoneState"
- android:protectionLevel="normal" />
-
<!-- @SystemApi Allows an application to query over global data in AppSearch.
- @hide -->
+ @hide -->
<permission android:name="android.permission.READ_GLOBAL_APP_SEARCH_DATA"
android:protectionLevel="internal|role" />
@@ -7465,6 +7832,19 @@
<permission android:name="android.permission.MANAGE_SAFETY_CENTER"
android:protectionLevel="internal|installer|role" />
+ <!-- @SystemApi Allows an application to access the AmbientContextEvent service.
+ @hide
+ -->
+ <permission android:name="android.permission.ACCESS_AMBIENT_CONTEXT_EVENT"
+ android:protectionLevel="signature|privileged|role"/>
+
+ <!-- @SystemApi Required by a AmbientContextEventDetectionService
+ to ensure that only the service with this permission can bind to it.
+ @hide
+ -->
+ <permission android:name="android.permission.BIND_AMBIENT_CONTEXT_DETECTION_SERVICE"
+ android:protectionLevel="signature" />
+
<!-- @SystemApi Allows an app to set keep-clear areas without restrictions on the size or
number of keep-clear areas (see {@link android.view.View#setPreferKeepClearRects}).
When the system arranges floating windows onscreen, it might decide to ignore keep-clear
@@ -7481,9 +7861,23 @@
<permission android:name="android.permission.SET_UNRESTRICTED_GESTURE_EXCLUSION"
android:protectionLevel="signature|privileged|recents" />
+ <!-- @SystemApi Allows TV input apps and TV apps to use TIS extension interfaces for
+ domain-specific features.
+ <p>Protection level: signature|privileged|vendorPrivileged
+ <p>Not for use by third-party applications.
+ @hide
+ -->
+ <permission android:name="android.permission.TIS_EXTENSION_INTERFACE"
+ android:protectionLevel="signature|privileged|vendorPrivileged" />
+
+ <!-- @SystemApi Allows an application to write to the security log buffer in logd.
+ @hide -->
+ <permission android:name="android.permission.WRITE_SECURITY_LOG"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows an UID to be visible to the application based on an interaction between the
two apps. This permission is not intended to be held by apps.
- @hide @TestApi -->
+ @hide @TestApi @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES) -->
<permission android:name="android.permission.MAKE_UID_VISIBLE"
android:protectionLevel="signature" />
@@ -7491,21 +7885,77 @@
@hide -->
<permission android:name="android.permission.HANDLE_QUERY_PACKAGE_RESTART"
android:protectionLevel="signature" />
+
+ <!-- Allows low-level access to re-mapping modifier keys.
+ <p>Not for use by third-party applications.
+ @hide
+ @TestApi -->
+ <permission android:name="android.permission.REMAP_MODIFIER_KEYS"
+ android:protectionLevel="signature" />
+
+ <!-- Allows low-level access to monitor keyboard backlight changes.
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.MONITOR_KEYBOARD_BACKLIGHT"
+ android:protectionLevel="signature" />
+
+ <!-- Allows low-level access to monitor sticky modifier state changes when A11Y Sticky keys
+ feature is enabled.
+ <p>Not for use by third-party applications.
+ @hide -->
+ <permission android:name="android.permission.MONITOR_STICKY_MODIFIER_STATE"
+ android:protectionLevel="signature" />
+
<uses-permission android:name="android.permission.HANDLE_QUERY_PACKAGE_RESTART" />
<!-- Allows financed device kiosk apps to perform actions on the Device Lock service
- @hide @TestApi @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES) -->
+ <p>Protection level: internal|role
+ <p>Intended for use by the FINANCED_DEVICE_KIOSK role only.
+ -->
<permission android:name="android.permission.MANAGE_DEVICE_LOCK_STATE"
android:protectionLevel="internal|role" />
- <!-- Allows an app to turn on the screen on, e.g. with
- {@link android.os.PowerManager#ACQUIRE_CAUSES_WAKEUP}.
- <p>Intended to only be used by home automation apps.
+ <!-- @SystemApi Required by a WearableSensingService to
+ ensure that only the caller with this permission can bind to it.
+ <p> Protection level: signature
+ @hide
-->
- <permission android:name="android.permission.TURN_SCREEN_ON"
- android:label="@string/permlab_turnScreenOn"
- android:description="@string/permdesc_turnScreenOn"
- android:protectionLevel="signature|privileged|appop" />
+ <permission android:name="android.permission.BIND_WEARABLE_SENSING_SERVICE"
+ android:protectionLevel="signature" />
+
+ <!-- @SystemApi Allows an app to manage the wearable sensing service.
+ <p>Protection level: signature|privileged
+ @hide
+ -->
+ <permission android:name="android.permission.MANAGE_WEARABLE_SENSING_SERVICE"
+ android:protectionLevel="signature|privileged" />
+
+ <!-- @SystemApi Allows an app to use the on-device intelligence service.
+ <p>Protection level: signature|privileged
+ @hide
+ @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence")
+ -->
+ <permission android:name="android.permission.USE_ON_DEVICE_INTELLIGENCE"
+ android:protectionLevel="signature|privileged" />
+
+
+ <!-- @SystemApi Allows an app to bind the on-device intelligence service.
+ <p>Protection level: signature|privileged
+ @hide
+ @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence")
+ -->
+ <permission android:name="android.permission.BIND_ON_DEVICE_INTELLIGENCE_SERVICE"
+ android:protectionLevel="signature|privileged" />
+
+
+ <!-- @SystemApi Allows an app to bind the on-device sandboxed service.
+ <p>Protection level: signature|privileged
+ @hide
+ @FlaggedApi("android.app.ondeviceintelligence.flags.enable_on_device_intelligence")
+ -->
+ <permission android:name="android.permission.BIND_ON_DEVICE_SANDBOXED_INFERENCE_SERVICE"
+ android:protectionLevel="signature"/>
+
<!-- Allows applications to use the user-initiated jobs API. For more details
see {@link android.app.job.JobInfo.Builder#setUserInitiated}.
@@ -7514,52 +7964,22 @@
<permission android:name="android.permission.RUN_USER_INITIATED_JOBS"
android:protectionLevel="normal"/>
- <!-- Allows a browser to invoke the set of credential candidate query apis.
- <p>Protection level: normal
- -->
- <permission android:name="android.permission.CREDENTIAL_MANAGER_QUERY_CANDIDATE_CREDENTIALS"
- android:protectionLevel="normal" />
-
- <!-- Allows browsers to call on behalf of another app by passing in a custom origin.
- <p>Protection level: normal
+ <!-- @FlaggedApi("android.app.job.backup_jobs_exemption")
+ Gives applications with a <b>major use case</b> of backing-up or syncing content increased
+ job execution allowance in order to complete the related work. The jobs must have a valid
+ content URI trigger and network constraint set.
+ <p>This is a special access permission that can be revoked by the system or the user.
+ <p>Protection level: signature|privileged|appop
-->
- <permission android:name="android.permission.CREDENTIAL_MANAGER_SET_ORIGIN"
- android:protectionLevel="normal"/>
-
- <!-- Allows specifying candidate credential providers to be queried in Credential Manager
- get flows, or to be preferred as a default in the Credential Manager create flows.
- <p>Protection level: normal -->
- <permission android:name="android.permission.CREDENTIAL_MANAGER_SET_ALLOWED_PROVIDERS"
- android:protectionLevel="normal"/>
-
- <!-- Allows permission to use Credential Manager UI for providing and saving credentials
- @hide -->
- <permission android:name="android.permission.LAUNCH_CREDENTIAL_SELECTOR"
- android:protectionLevel="signature" />
-
- <!-- Allows an app to list Credential Manager providers.
- @hide
- -->
- <permission android:name="android.permission.LIST_ENABLED_CREDENTIAL_PROVIDERS"
- android:protectionLevel="signature|privileged"/>
-
- <!-- Allows a system application to be registered with credential manager without
- having to be enabled by the user.
- @SystemApi
- @hide -->
- <permission android:name="android.permission.PROVIDE_DEFAULT_ENABLED_CREDENTIAL_SERVICE"
- android:protectionLevel="signature|privileged" />
-
- <!-- Allows an application to be able to store and retrieve credentials from a remote
- device. -->
- <permission android:name="android.permission.PROVIDE_REMOTE_CREDENTIALS"
- android:protectionLevel="signature|privileged|role" />
+ <permission android:name="android.permission.RUN_BACKUP_JOBS"
+ android:protectionLevel="signature|privileged|appop"/>
<!-- Allows an app access to the installer provided app metadata.
@SystemApi
- @hide -->
+ @hide
+ -->
<permission android:name="android.permission.GET_APP_METADATA"
- android:protectionLevel="signature|installer" />
+ android:protectionLevel="signature|installer|verifier" />
<!-- @hide @SystemApi Allows an application to stage HealthConnect's remote data so that
HealthConnect can later integrate it. -->
@@ -7572,15 +7992,15 @@
<permission android:name="android.permission.DELETE_STAGED_HEALTH_CONNECT_REMOTE_DATA"
android:protectionLevel="signature" />
- <!-- @hide @TestApi Allows CTS tests running in Sandbox mode to launch activities -->
+ <!-- @hide @TestApi Allows tests running in CTS-in-sandbox mode to launch activities -->
<permission android:name="android.permission.START_ACTIVITIES_FROM_SDK_SANDBOX"
android:protectionLevel="signature" />
<!-- @SystemApi Allows the holder to call health connect migration APIs.
- @hide -->
+ @hide -->
<permission android:name="android.permission.MIGRATE_HEALTH_CONNECT_DATA"
- android:protectionLevel="signature|knownSigner"
- android:knownCerts="@array/config_healthConnectMigrationKnownSigners" />
+ android:protectionLevel="signature|knownSigner"
+ android:knownCerts="@array/config_healthConnectMigrationKnownSigners" />
<!-- @SystemApi Allows an app to query apps in clone profile. The permission is
bidirectional in nature, i.e. cloned apps would be able to query apps in root user.
@@ -7623,6 +8043,7 @@
<permission android:name="android.permission.GET_ANY_PROVIDER_TYPE"
android:protectionLevel="signature" />
+
<!-- @hide Allows internal applications to read and synchronize non-core flags.
Apps without this permission can only read a subset of flags specifically intended
for use in "core", (i.e. third party apps). Apps with this permission can define their
@@ -7631,14 +8052,14 @@
<p>Protection level: signature
-->
<permission android:name="android.permission.SYNC_FLAGS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide Allows internal applications to override flags in the FeatureFlags service.
<p>Not for use by third-party applications.
<p>Protection level: signature
-->
<permission android:name="android.permission.WRITE_FLAGS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature" />
<!-- @hide @SystemApi
@FlaggedApi("android.app.get_binding_uid_importance")
@@ -7650,22 +8071,14 @@
android:protectionLevel="signature|privileged" />
<!-- @hide Allows internal applications to manage displays.
- <p>This means intercept internal signals about displays being (dis-)connected
- and being able to enable or disable connected displays.
- <p>Not for use by third-party applications.
- <p>Protection level: signature
+ <p>This means intercept internal signals about displays being (dis-)connected
+ and being able to enable or disable the external displays.
+ <p>Not for use by third-party applications.
+ <p>Protection level: signature
-->
<permission android:name="android.permission.MANAGE_DISPLAYS"
android:protectionLevel="signature" />
- <!-- @SystemApi Allows apps to reset hotword training data egress count for testing.
- <p>CTS tests will use UiAutomation.AdoptShellPermissionIdentity() to gain access.
- <p>Protection level: signature
- @FlaggedApi("android.service.voice.flags.allow_training_data_egress_from_hds")
- @hide -->
- <permission android:name="android.permission.RESET_HOTWORD_TRAINING_DATA_EGRESS_COUNT"
- android:protectionLevel="signature" />
-
<!-- @SystemApi Allows an app to track all preparations for a complete factory reset.
<p>Protection level: signature|privileged
@FlaggedApi("android.permission.flags.factory_reset_prep_permission_apis")
@@ -7689,6 +8102,47 @@
<permission android:name="android.permission.OVERRIDE_SYSTEM_KEY_BEHAVIOR_IN_FOCUSED_WINDOW"
android:protectionLevel="signature|privileged" />
+ <!-- @hide @SystemApi
+ @FlaggedApi("com.android.server.notification.flags.redact_otp_notifications_from_untrusted_listeners")
+ Allows apps with a NotificationListenerService to receive notifications with sensitive
+ information
+ <p>Apps with a NotificationListenerService without this permission will not be able
+ to view certain types of sensitive information contained in notifications
+ <p>Protection level: signature|role
+ -->
+ <permission android:name="android.permission.RECEIVE_SENSITIVE_NOTIFICATIONS"
+ android:protectionLevel="signature|role" />
+
+ <!-- @SystemApi
+ @FlaggedApi("android.app.bic_client")
+ Allows app to call BackgroundInstallControlManager API to retrieve silently installed apps
+ for all users on device.
+ <p>Apps with a BackgroundInstallControlManager client will not be able to call any API without
+ this permission.
+ <p>Protection level: signature|role
+ @hide
+ -->
+ <permission android:name="android.permission.GET_BACKGROUND_INSTALLED_PACKAGES"
+ android:protectionLevel="signature|role" />
+
+ <!-- @SystemApi Allows an application to read the system grammatical gender.
+ @FlaggedApi("android.app.system_terms_of_address_enabled")
+ <p>Protection level: signature|privileged
+ @hide
+ -->
+ <permission android:name="android.permission.READ_SYSTEM_GRAMMATICAL_GENDER"
+ android:protectionLevel="signature|privileged"/>
+
+ <!-- @SystemApi
+ @FlaggedApi("android.content.pm.emergency_install_permission")
+ Allows each app store in the system image to designate another app in the system image to
+ update the app store
+ <p>Protection level: signature|privileged
+ @hide
+ -->
+ <permission android:name="android.permission.EMERGENCY_INSTALL_PACKAGES"
+ android:protectionLevel="signature|privileged"/>
+
<!-- Attribution for Geofencing service. -->
<attribution android:tag="GeofencingService" android:label="@string/geofencing_service"/>
<!-- Attribution for Country Detector. -->
@@ -7709,6 +8163,9 @@
<p>Not for use by third-party applications.</p> -->
<attribution android:tag="MusicRecognitionManagerService"
android:label="@string/music_recognition_manager_service"/>
+ <!-- Attribution for Device Policy Manager service. -->
+ <attribution android:tag="DevicePolicyManagerService"
+ android:label="@string/device_policy_manager_service"/>
<application android:process="system"
android:persistent="true"
@@ -7723,22 +8180,6 @@
android:defaultToDeviceProtectedStorage="true"
android:forceQueryable="true"
android:directBootAware="true">
- <activity android:name="com.android.internal.app.ChooserActivity"
- android:theme="@style/Theme.DeviceDefault.Chooser"
- android:finishOnCloseSystemDialogs="true"
- android:excludeFromRecents="true"
- android:documentLaunchMode="never"
- android:relinquishTaskIdentity="true"
- android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
- android:process=":ui"
- android:exported="true"
- android:visibleToInstantApps="true">
- <intent-filter android:priority="100">
- <action android:name="android.intent.action.CHOOSER" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.VOICE" />
- </intent-filter>
- </activity>
<activity android:name="com.android.internal.accessibility.dialog.AccessibilityShortcutChooserActivity"
android:exported="false"
android:theme="@style/Theme.DeviceDefault.Dialog.Alert.DayNight"
@@ -7768,10 +8209,25 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+ <activity android:name="com.android.internal.app.NfcResolverActivity"
+ android:theme="@style/Theme.Dialog.Alert"
+ android:finishOnCloseSystemDialogs="true"
+ android:excludeFromRecents="true"
+ android:multiprocess="true"
+ android:permission="android.permission.SHOW_CUSTOMIZED_RESOLVER"
+ android:exported="true">
+ <intent-filter android:priority="100" >
+ <action android:name="android.nfc.action.SHOW_NFC_RESOLVER" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
<activity android:name="com.android.internal.app.IntentForwarderActivity"
android:finishOnCloseSystemDialogs="true"
- android:theme="@style/Theme.Translucent.NoTitleBar"
+ android:theme="@style/Theme.DeviceDefault.Resolver"
android:excludeFromRecents="true"
+ android:documentLaunchMode="never"
+ android:relinquishTaskIdentity="true"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
android:label="@string/user_owner_label"
android:exported="true"
android:visibleToInstantApps="true"
@@ -7796,8 +8252,9 @@
android:process=":ui">
</activity>
<activity android:name="com.android.internal.app.PlatLogoActivity"
- android:theme="@style/Theme.DeviceDefault.Wallpaper.NoTitleBar"
+ android:theme="@style/Theme.NoTitleBar.Fullscreen"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
+ android:enableOnBackInvokedCallback="true"
android:icon="@drawable/platlogo"
android:process=":ui">
</activity>
@@ -7869,12 +8326,6 @@
</intent-filter>
</activity>
- <activity android:name="com.android.internal.app.NetInitiatedActivity"
- android:theme="@style/Theme.Dialog.Confirmation"
- android:excludeFromRecents="true"
- android:process=":ui">
- </activity>
-
<activity android:name="com.android.internal.app.SystemUserHomeActivity"
android:enabled="false"
android:process=":ui"
@@ -7912,6 +8363,12 @@
android:process=":ui">
</activity>
+ <activity android:name="com.android.internal.app.SetScreenLockDialogActivity"
+ android:theme="@style/Theme.Dialog.Confirmation"
+ android:excludeFromRecents="true"
+ android:process=":ui">
+ </activity>
+
<activity android:name="com.android.internal.app.BlockedAppActivity"
android:theme="@style/Theme.Dialog.Confirmation"
android:excludeFromRecents="true"
@@ -7919,6 +8376,12 @@
android:process=":ui">
</activity>
+ <activity android:name="com.android.internal.app.BlockedAppStreamingActivity"
+ android:theme="@style/Theme.Dialog.Confirmation"
+ android:excludeFromRecents="true"
+ android:process=":ui">
+ </activity>
+
<activity android:name="com.android.internal.app.LaunchAfterAuthenticationActivity"
android:theme="@style/Theme.Translucent.NoTitleBar"
android:excludeFromRecents="true"
@@ -7944,6 +8407,13 @@
android:exported="false">
</activity>
+ <activity android:name="android.service.games.GameSessionTrampolineActivity"
+ android:excludeFromRecents="true"
+ android:exported="true"
+ android:permission="android.permission.MANAGE_GAME_ACTIVITY"
+ android:theme="@style/Theme.GameSessionTrampoline">
+ </activity>
+
<receiver android:name="com.android.server.BootReceiver"
android:exported="true"
android:systemUserOnly="true">
@@ -8085,6 +8555,16 @@
</intent-filter>
</receiver>
+ <!-- Broadcast Receiver listens to sufficient verifier broadcast from Package Manager
+ when installing new SDK. Verification of SDK code during installation time is run
+ to determine compatibility with privacy sandbox restrictions. -->
+ <receiver android:name="com.android.server.sdksandbox.SdkSandboxVerifierReceiver"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.intent.action.PACKAGE_NEEDS_VERIFICATION"/>
+ </intent-filter>
+ </receiver>
+
<service android:name="android.hardware.location.GeofenceHardwareService"
android:permission="android.permission.LOCATION_HARDWARE"
android:exported="false" />
@@ -8094,6 +8574,11 @@
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
+ <service android:name="com.android.server.SmartStorageMaintIdler"
+ android:exported="true"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
<service android:name="com.android.server.ZramWriteback"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" >
@@ -8121,6 +8606,18 @@
android:permission="android.permission.BIND_JOB_SERVICE">
</service>
+ <service android:name="com.android.server.selinux.SelinuxAuditLogsService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.compos.IsolatedCompilationJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.system.virtualmachine.SecretkeeperJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
<service android:name="com.android.server.PruneInstantAppsJobService"
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
@@ -8157,6 +8654,10 @@
android:permission="android.permission.BIND_JOB_SERVICE" >
</service>
+ <service android:name="com.android.server.pm.GentleUpdateHelper$Service"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
<service
android:name="com.android.server.autofill.AutofillCompatAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
@@ -8171,6 +8672,42 @@
android:permission="android.permission.BIND_JOB_SERVICE">
</service>
+ <service android:name="com.android.server.companion.association.InactiveAssociationsRemovalService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.appsearch.contactsindexer.ContactsIndexerMaintenanceService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.BinaryTransparencyService$UpdateMeasurementsJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.notification.ReviewNotificationPermissionsJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.notification.NotificationHistoryJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
+ <service android:name="com.android.server.notification.NotificationBitmapJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
+ <service android:name="com.android.server.healthconnect.HealthConnectDailyService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
+ <service android:name="com.android.server.healthconnect.migration.MigrationBroadcastJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
+ <service android:name="com.android.server.healthconnect.backuprestore.BackupRestore$BackupRestoreJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE">
+ </service>
+
<service android:name="com.android.server.pm.PackageManagerShellCommandDataLoader"
android:exported="false">
<intent-filter>
@@ -8178,6 +8715,38 @@
</intent-filter>
</service>
+ <!-- TODO: Move to ExtServices or relevant component. -->
+ <service android:name="android.service.selectiontoolbar.DefaultSelectionToolbarRenderService"
+ android:permission="android.permission.BIND_SELECTION_TOOLBAR_RENDER_SERVICE"
+ android:process=":ui"
+ android:exported="false">
+ <intent-filter>
+ <action android:name="android.service.selectiontoolbar.SelectionToolbarRenderService"/>
+ </intent-filter>
+ </service>
+
+ <service android:name="com.android.server.art.BackgroundDexoptJobService"
+ android:permission="android.permission.BIND_JOB_SERVICE" >
+ </service>
+
+ <service android:name="com.android.server.companion.datatransfer.contextsync.CallMetadataSyncInCallService"
+ android:permission="android.permission.BIND_INCALL_SERVICE"
+ android:exported="true">
+ <meta-data android:name="android.telecom.INCLUDE_SELF_MANAGED_CALLS"
+ android:value="true" />
+ <intent-filter>
+ <action android:name="android.telecom.InCallService"/>
+ </intent-filter>
+ </service>
+
+ <service android:name="com.android.server.companion.datatransfer.contextsync.CallMetadataSyncConnectionService"
+ android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.telecom.ConnectionService"/>
+ </intent-filter>
+ </service>
+
<provider
android:name="com.android.server.textclassifier.IconsContentProvider"
android:authorities="com.android.textclassifier.icons"
@@ -8186,6 +8755,10 @@
android:exported="true">
</provider>
+ <meta-data
+ android:name="com.android.server.patch.25239169"
+ android:value="true" />
+
</application>
</manifest>
diff --git a/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml b/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
index dcd8ec4bd..4729d44c2 100644
--- a/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/automotive_android_manifest.xml
@@ -206,6 +206,42 @@
android:protectionLevel="signature|privileged"
android:label="@string/car_permission_label_control_car_powertrain"
android:description="@string/car_permission_desc_control_car_powertrain"/>
+ <permission android:name="android.car.permission.READ_CAR_SEAT_BELTS"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_car_seat_belts"
+ android:description="@string/car_permission_desc_read_car_seat_belts"/>
+ <permission android:name="android.car.permission.CONTROL_CAR_DYNAMICS_STATE"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_control_car_dynamics_state"
+ android:description="@string/car_permission_desc_control_car_dynamics_state"/>
+ <permission android:name="android.car.permission.READ_IMPACT_SENSORS"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_impact_sensors"
+ android:description="@string/car_permission_desc_read_impact_sensors"/>
+ <permission android:name="android.car.permission.READ_HEAD_UP_DISPLAY_STATUS"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_head_up_display_status"
+ android:description="@string/car_permission_desc_read_head_up_display_status"/>
+ <permission android:name="android.car.permission.CONTROL_HEAD_UP_DISPLAY"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_control_head_up_display"
+ android:description="@string/car_permission_desc_control_head_up_display"/>
+ <permission android:name="android.car.permission.READ_VALET_MODE"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_valet_mode"
+ android:description="@string/car_permission_desc_read_valet_mode"/>
+ <permission android:name="android.car.permission.CONTROL_VALET_MODE"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_control_valet_mode"
+ android:description="@string/car_permission_desc_control_valet_mode"/>
+ <permission android:name="android.car.permission.READ_CAR_AIRBAGS"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_car_airbags"
+ android:description="@string/car_permission_desc_read_car_airbags"/>
+ <permission android:name="android.car.permission.READ_ULTRASONICS_SENSOR_DATA"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_ultrasonics_sensor_data"
+ android:description="@string/car_permission_desc_read_ultrasonics_sensor_data"/>
<permission android:name="android.car.permission.CAR_NAVIGATION_MANAGER"
android:protectionLevel="signature|privileged"
android:label="@string/car_permission_car_navigation_manager"
@@ -574,4 +610,9 @@
android:protectionLevel="signature|privileged"
android:label="@string/car_permission_label_query_display_compatibility"
android:description="@string/car_permission_desc_query_display_compatibility"/>
+ <permission
+ android:name="android.car.permission.READ_PERSIST_TETHERING_SETTINGS"
+ android:protectionLevel="signature|privileged"
+ android:label="@string/car_permission_label_read_persist_tethering_settings"
+ android:description="@string/car_permission_desc_read_persist_tethering_settings" />
</manifest>
diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/ContactsProviderTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/ContactsProviderTest.java
index d8dc11a14..f34170a9b 100644
--- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/ContactsProviderTest.java
+++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/ContactsProviderTest.java
@@ -21,7 +21,8 @@ import android.content.ContentValues;
import android.platform.test.annotations.AppModeFull;
import android.provider.ContactsContract;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify that deprecated contacts permissions are not enforced.
diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoCaptureAudioOutputPermissionTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoCaptureAudioOutputPermissionTest.java
index 0f7638694..ef38573ab 100644
--- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoCaptureAudioOutputPermissionTest.java
+++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoCaptureAudioOutputPermissionTest.java
@@ -21,7 +21,8 @@ import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder.AudioSource;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify the capture system video output permission requirements.
diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoReceiveSmsPermissionTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoReceiveSmsPermissionTest.java
index c3a29ccb3..ecd31e620 100644
--- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoReceiveSmsPermissionTest.java
+++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/NoReceiveSmsPermissionTest.java
@@ -28,10 +28,13 @@ import android.platform.test.annotations.SystemUserOnly;
import android.telephony.SmsManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.test.AndroidTestCase;
import android.text.TextUtils;
import android.util.Log;
+import java.util.Arrays;
+import java.util.List;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
@@ -55,6 +58,14 @@ public class NoReceiveSmsPermissionTest extends AndroidTestCase {
private static final String LOG_TAG = "NoReceiveSmsPermissionTest";
+ // List of carrier-id that does not support loop back messages
+ // This is copied from
+ // cts/tests/tests/telephony/current/src/android/telephony/cts/CarrierCapability.java
+ public static final List<Integer> UNSUPPORT_LOOP_BACK_MESSAGES =
+ Arrays.asList(
+ 1 // "T-Mobile - US"
+ );
+
private Semaphore mSemaphore = new Semaphore(0);
/**
@@ -101,6 +112,11 @@ public class NoReceiveSmsPermissionTest extends AndroidTestCase {
return;
}
+ int carrierId = getContext().getSystemService(TelephonyManager.class).getSimCarrierId();
+ assertFalse("[RERUN] Carrier [carrier-id: " + carrierId + "] does not support "
+ + "loop back messages. Use another carrier.",
+ UNSUPPORT_LOOP_BACK_MESSAGES.contains(carrierId));
+
AppSpecificSmsReceiver receiver = new AppSpecificSmsReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(TELEPHONY_SMS_RECEIVED);
diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionMaxSdkVersionTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionMaxSdkVersionTest.java
index b02b32f22..8bf3e83a4 100644
--- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionMaxSdkVersionTest.java
+++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionMaxSdkVersionTest.java
@@ -19,7 +19,8 @@ package android.permission.cts;
import android.content.pm.PackageManager;
import android.os.Process;
import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
+
+import androidx.test.filters.SmallTest;
/**
* Verify permission behaviors with android:maxSdkVersion
diff --git a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionPolicyTest.java b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionPolicyTest.java
index 94bd2be1b..c28b5d560 100644
--- a/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionPolicyTest.java
+++ b/tests/cts/permissionpolicy/src/android/permissionpolicy/cts/PermissionPolicyTest.java
@@ -19,6 +19,7 @@ package android.permissionpolicy.cts;
import static android.content.pm.PermissionInfo.FLAG_INSTALLED;
import static android.content.pm.PermissionInfo.PROTECTION_MASK_BASE;
import static android.os.Build.VERSION.SECURITY_PATCH;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -32,13 +33,12 @@ import android.content.pm.PermissionInfo;
import android.os.Process;
import android.os.SystemProperties;
import android.platform.test.annotations.AppModeFull;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Xml;
-import com.android.modules.utils.build.SdkLevel;
-
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -87,6 +87,7 @@ public class PermissionPolicyTest {
private static final String ATTR_PERMISSION_FLAGS = "permissionFlags";
private static final String ATTR_PROTECTION_LEVEL = "protectionLevel";
private static final String ATTR_BACKGROUND_PERMISSION = "backgroundPermission";
+ private static final String ATTR_FEATURE_FLAG = "featureFlag";
private static final Context sContext =
InstrumentationRegistry.getInstrumentation().getTargetContext();
@@ -117,13 +118,17 @@ public class PermissionPolicyTest {
declaredGroupsSet.add(declaredGroup.name);
}
+ boolean filterFlaggedPermissions = sContext.getPackageManager()
+ .getApplicationInfo(PLATFORM_PACKAGE_NAME, 0).minSdkVersion <= UPSIDE_DOWN_CAKE;
+
Set<String> expectedPermissionGroups = loadExpectedPermissionGroupNames(
R.raw.android_manifest);
List<ExpectedPermissionInfo> expectedPermissions = loadExpectedPermissions(
- R.raw.android_manifest);
+ R.raw.android_manifest, filterFlaggedPermissions);
if (sContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
- expectedPermissions.addAll(loadExpectedPermissions(R.raw.automotive_android_manifest));
+ expectedPermissions.addAll(loadExpectedPermissions(R.raw.automotive_android_manifest,
+ filterFlaggedPermissions));
String carServicePackageName = SystemProperties.get("ro.android.car.carservice.package",
null);
@@ -301,8 +306,11 @@ public class PermissionPolicyTest {
return false;
}
- private List<ExpectedPermissionInfo> loadExpectedPermissions(int resourceId) throws Exception {
+ private List<ExpectedPermissionInfo> loadExpectedPermissions(int resourceId,
+ boolean filterFlaggedPermissions) throws Exception {
List<ExpectedPermissionInfo> permissions = new ArrayList<>();
+ DeviceFlagsValueProvider flagsValueProvider = new DeviceFlagsValueProvider();
+ flagsValueProvider.setUp();
try (InputStream in = sContext.getResources().openRawResource(resourceId)) {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, null);
@@ -315,6 +323,22 @@ public class PermissionPolicyTest {
continue;
}
if (TAG_PERMISSION.equals(parser.getName())) {
+ if (filterFlaggedPermissions) {
+ String featureFlag = parser.getAttributeValue(null, ATTR_FEATURE_FLAG);
+ if (featureFlag != null) {
+ featureFlag = featureFlag.trim();
+ boolean invert = featureFlag.startsWith("!");
+ if (invert) {
+ featureFlag = featureFlag.substring(1).trim();
+ }
+ boolean flagEnabled =
+ invert != flagsValueProvider.getBoolean(featureFlag);
+ if (!flagEnabled) {
+ continue;
+ }
+ }
+ }
+
ExpectedPermissionInfo permissionInfo = new ExpectedPermissionInfo(
parser.getAttributeValue(null, ATTR_NAME),
parser.getAttributeValue(null, ATTR_PERMISSION_GROUP),
@@ -328,6 +352,8 @@ public class PermissionPolicyTest {
Log.e(LOG_TAG, "Unknown tag " + parser.getName());
}
}
+ } finally {
+ flagsValueProvider.tearDownBeforeTest();
}
return permissions;
diff --git a/tests/cts/permissionui/Android.bp b/tests/cts/permissionui/Android.bp
index 12fdbe533..07167284d 100644
--- a/tests/cts/permissionui/Android.bp
+++ b/tests/cts/permissionui/Android.bp
@@ -42,6 +42,7 @@ android_test {
"CtsAccessibilityCommon",
"platform-test-rules",
"platform-test-annotations",
+ "android.permission.flags-aconfig-java",
],
data: [
":CtsPermissionPolicyApp25",
@@ -77,5 +78,6 @@ android_test {
"mts-permission",
"automotive-tests",
"automotive-general-tests",
+ "mcts-permission",
],
}
diff --git a/tests/cts/permissionui/UsePermissionAppLatest/AndroidManifest.xml b/tests/cts/permissionui/UsePermissionAppLatest/AndroidManifest.xml
index 49e45fc01..0b92f5ef1 100644
--- a/tests/cts/permissionui/UsePermissionAppLatest/AndroidManifest.xml
+++ b/tests/cts/permissionui/UsePermissionAppLatest/AndroidManifest.xml
@@ -20,6 +20,9 @@
xmlns:android="http://schemas.android.com/apk/res/android"
package="android.permissionui.cts.usepermission">
+ <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
+ <uses-permission android:name="android.permission.CALL_PHONE"/>
+
<!-- Request two different permissions within the same group -->
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
index b47fba56f..8c300e328 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BasePermissionTest.kt
@@ -111,6 +111,11 @@ abstract class BasePermissionTest {
@JvmStatic
protected val isAutomotive =
packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ @JvmStatic
+ protected val isAutomotiveSplitscreen = isAutomotive &&
+ packageManager.hasSystemFeature(
+ /* PackageManager.FEATURE_CAR_SPLITSCREEN_MULTITASKING */
+ "android.software.car.splitscreen_multitasking")
}
@get:Rule val screenRecordRule = ScreenRecordRule(false, false)
@@ -276,9 +281,13 @@ abstract class BasePermissionTest {
protected fun installPackageViaSession(
apkName: String,
appMetadata: PersistableBundle? = null,
- packageSource: Int? = null
+ packageSource: Int? = null,
+ allowlistedRestrictedPermissions: Set<String>? = null
) {
- val (sessionId, session) = createPackageInstallerSession(packageSource)
+ val (sessionId, session) = createPackageInstallerSession(
+ packageSource,
+ allowlistedRestrictedPermissions
+ )
runWithShellPermissionIdentity {
writePackageInstallerSession(session, apkName)
if (appMetadata != null) {
@@ -443,10 +452,15 @@ abstract class BasePermissionTest {
}
private fun createPackageInstallerSession(
- packageSource: Int? = null
+ packageSource: Int? = null,
+ allowlistedRestrictedPermissions: Set<String>? = null
): Pair<Int, PackageInstaller.Session> {
// Create session
val sessionParam = SessionParams(SessionParams.MODE_FULL_INSTALL)
+ allowlistedRestrictedPermissions?.let {
+ sessionParam.setWhitelistedRestrictedPermissions(it)
+ }
+
if (packageSource != null) {
sessionParam.setPackageSource(packageSource)
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
index d24f4fd27..42555c2d7 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
@@ -29,6 +29,7 @@ import android.content.pm.PackageInstaller.PACKAGE_SOURCE_DOWNLOADED_FILE
import android.content.pm.PackageInstaller.PACKAGE_SOURCE_LOCAL_FILE
import android.content.pm.PackageInstaller.PACKAGE_SOURCE_OTHER
import android.content.pm.PackageInstaller.PACKAGE_SOURCE_STORE
+import android.content.pm.PackageInstaller.SessionParams
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
@@ -63,6 +64,7 @@ import org.junit.Before
abstract class BaseUsePermissionTest : BasePermissionTest() {
companion object {
const val APP_APK_NAME_31 = "CtsUsePermissionApp31.apk"
+ const val APP_APK_NAME_LATEST = "CtsUsePermissionAppLatest.apk"
const val APP_APK_PATH_22 = "$APK_DIRECTORY/CtsUsePermissionApp22.apk"
const val APP_APK_PATH_22_CALENDAR_ONLY =
@@ -443,6 +445,17 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
)
}
+ protected fun installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ apkName: String
+ ) {
+ installPackageViaSession(
+ apkName,
+ AppMetadata.createDefaultAppMetadata(),
+ PACKAGE_SOURCE_DOWNLOADED_FILE,
+ allowlistedRestrictedPermissions = SessionParams.RESTRICTED_PERMISSIONS_ALL
+ )
+ }
+
protected fun installPackageWithInstallSourceAndMetadataFromOther(apkName: String) {
installPackageViaSession(
apkName,
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt
new file mode 100644
index 000000000..4a505d1fd
--- /dev/null
+++ b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt
@@ -0,0 +1,265 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permissionui.cts
+
+import android.Manifest
+import android.app.AppOpsManager
+import android.app.Instrumentation
+import android.app.ecm.EnhancedConfirmationManager
+import android.content.Context
+import android.content.pm.PackageManager
+import android.os.Build
+import android.permission.flags.Flags
+import android.platform.test.annotations.AppModeFull
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.CheckFlagsRule
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
+import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import com.android.compatibility.common.util.SystemUtil.eventually
+import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.Assume
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+
+@AppModeFull(reason = "Instant apps cannot install packages")
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName = "VanillaIceCream")
+@RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+class EnhancedConfirmationManagerTest : BaseUsePermissionTest() {
+ private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
+ private val context: Context = instrumentation.targetContext
+ private val ecm by lazy { context.getSystemService(EnhancedConfirmationManager::class.java)!! }
+
+ @Rule
+ @JvmField
+ val mCheckFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+ @Before
+ fun assumeNotAutoTvOrWear() {
+ Assume.assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK))
+ Assume.assumeFalse(
+ context.packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
+ )
+ Assume.assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenStoreAppThenIsNotRestrictedFromProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenLocalAppThenIsRestrictedFromProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromLocalFile(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenDownloadedThenAppIsRestrictedFromProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenExplicitlyRestrictedAppThenIsRestrictedFromProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromStore(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ setAppEcmState(context, APP_PACKAGE_NAME, MODE_ERRORED)
+ eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenRestrictedAppThenIsNotRestrictedFromNonProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, NON_PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenRestrictedAppThenClearRestrictionNotAllowedByDefault() {
+ installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertFalse(ecm.isClearRestrictionAllowed(APP_PACKAGE_NAME)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun givenRestrictedAppWhenClearRestrictionThenNotRestrictedFromProtectedSetting() {
+ installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST)
+ runWithShellPermissionIdentity {
+ eventually { assertTrue(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ ecm.setClearRestrictionAllowed(APP_PACKAGE_NAME)
+ eventually { assertTrue(ecm.isClearRestrictionAllowed(APP_PACKAGE_NAME)) }
+ ecm.clearRestriction(APP_PACKAGE_NAME)
+ eventually { assertFalse(ecm.isRestricted(APP_PACKAGE_NAME, PROTECTED_SETTING)) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun createRestrictedSettingDialogIntentReturnsIntent() {
+ installPackageWithInstallSourceAndMetadataFromDownloadedFile(APP_APK_NAME_LATEST)
+
+ val intent = ecm.createRestrictedSettingDialogIntent(APP_PACKAGE_NAME, PROTECTED_SETTING)
+
+ assertNotNull(intent)
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun grantDialogBlocksRestrictedPermissionsOfSameGroupTogether() {
+ installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ APP_APK_NAME_LATEST
+ )
+
+ requestAppPermissionsAndAssertResult(
+ GROUP_1_PERMISSION_1_RESTRICTED to false,
+ GROUP_1_PERMISSION_2_RESTRICTED to false
+ ) {
+ click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS)
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun grantDialogBlocksRestrictedPermissionsOfDifferentGroupsIndividually() {
+ installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ APP_APK_NAME_LATEST
+ )
+
+ requestAppPermissionsAndAssertResult(
+ GROUP_1_PERMISSION_1_RESTRICTED to false,
+ GROUP_2_PERMISSION_1_RESTRICTED to false,
+ waitForWindowTransition = false
+ ) {
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun grantDialogBlocksRestrictedGroupsThenRequestsUnrestrictedGroupsDespiteOutOfOrderRequest() {
+ installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ APP_APK_NAME_LATEST
+ )
+
+ requestAppPermissionsAndAssertResult(
+ GROUP_3_PERMISSION_1_UNRESTRICTED to true,
+ GROUP_2_PERMISSION_1_RESTRICTED to false,
+ GROUP_3_PERMISSION_2_UNRESTRICTED to true,
+ GROUP_2_PERMISSION_2_RESTRICTED to false,
+ waitForWindowTransition = false
+ ) {
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { clickPermissionRequestAllowForegroundButton() }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun grantDialogBlocksRestrictedGroupsThenRequestsUnrestrictedHighPriorityGroups() {
+ installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ APP_APK_NAME_LATEST
+ )
+
+ requestAppPermissionsAndAssertResult(
+ GROUP_3_PERMISSION_1_UNRESTRICTED to true,
+ GROUP_2_PERMISSION_1_RESTRICTED to false,
+ GROUP_1_PERMISSION_1_RESTRICTED to false,
+ waitForWindowTransition = false
+ ) {
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { clickPermissionRequestAllowForegroundButton() }
+ }
+ }
+
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @Test
+ fun grantDialogBlocksRestrictedGroupsThenRequestsUnrestrictedLowPriorityGroups() {
+ installPackageWithInstallSourceFromDownloadedFileAndAllowHardRestrictedPerms(
+ APP_APK_NAME_LATEST
+ )
+
+ requestAppPermissionsAndAssertResult(
+ GROUP_4_PERMISSION_1_UNRESTRICTED to true,
+ GROUP_2_PERMISSION_1_RESTRICTED to false,
+ GROUP_1_PERMISSION_1_RESTRICTED to false,
+ waitForWindowTransition = false
+ ) {
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { click(By.res(ALERT_DIALOG_OK_BUTTON), TIMEOUT_MILLIS) }
+ doAndWaitForWindowTransition { clickPermissionRequestAllowForegroundButton() }
+ }
+ }
+
+ companion object {
+ private const val GROUP_1_PERMISSION_1_RESTRICTED = Manifest.permission.CALL_PHONE
+ private const val GROUP_1_PERMISSION_2_RESTRICTED = Manifest.permission.READ_PHONE_STATE
+ private const val GROUP_2_PERMISSION_1_RESTRICTED = Manifest.permission.SEND_SMS
+ private const val GROUP_2_PERMISSION_2_RESTRICTED = Manifest.permission.READ_SMS
+ private const val GROUP_3_PERMISSION_1_UNRESTRICTED =
+ Manifest.permission.ACCESS_FINE_LOCATION
+ private const val GROUP_3_PERMISSION_2_UNRESTRICTED =
+ Manifest.permission.ACCESS_COARSE_LOCATION
+ private const val GROUP_4_PERMISSION_1_UNRESTRICTED = Manifest.permission.BODY_SENSORS
+
+ private const val NON_PROTECTED_SETTING = "example_setting_which_is_not_protected"
+ private const val PROTECTED_SETTING = "android:bind_accessibility_service"
+ private const val MODE_ERRORED = 2
+
+ @Throws(PackageManager.NameNotFoundException::class)
+ private fun setAppEcmState(context: Context, packageName: String, mode: Int) {
+ val appOpsManager = context.getSystemService(AppOpsManager::class.java)!!
+ appOpsManager.setMode(
+ AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS,
+ context.packageManager
+ .getApplicationInfoAsUser(
+ packageName,
+ /* flags */ 0,
+ android.os.Process.myUserHandle()
+ )
+ .uid,
+ packageName,
+ mode
+ )
+ }
+ }
+}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
index 3a8a6a838..b81432369 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PermissionTapjackingTest.kt
@@ -43,6 +43,9 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
// PermissionController for television uses a floating window.
assumeFalse(isTv)
+ // Automotive split-screen multitasking uses multi-window mode
+ assumeFalse(isAutomotiveSplitscreen)
+
assertAppHasPermission(ACCESS_FINE_LOCATION, false)
requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {}
@@ -63,6 +66,9 @@ class PermissionTapjackingTest : BaseUsePermissionTest() {
// PermissionController for television uses a floating window.
assumeFalse(isTv)
+ // Automotive split-screen multitasking uses multi-window mode
+ assumeFalse(isAutomotiveSplitscreen)
+
assertAppHasPermission(ACCESS_FINE_LOCATION, false)
requestAppPermissionsForNoResult(ACCESS_FINE_LOCATION) {}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/SensorBlockedBannerTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/SensorBlockedBannerTest.kt
index f8c7d4f51..614b59f3c 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/SensorBlockedBannerTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/SensorBlockedBannerTest.kt
@@ -31,6 +31,7 @@ import androidx.test.filters.SdkSuppress
import androidx.test.uiautomator.By
import com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
+import com.android.modules.utils.build.SdkLevel
import java.util.regex.Pattern
import org.junit.Assert.assertTrue
import org.junit.Assume
@@ -50,7 +51,6 @@ class SensorBlockedBannerTest : BaseUsePermissionTest() {
private val sensorPrivacyManager = context.getSystemService(SensorPrivacyManager::class.java)!!
private val locationManager = context.getSystemService(LocationManager::class.java)!!
- private val safetyCenterManager = context.getSystemService(SafetyCenterManager::class.java)!!
private val sensorToPermissionGroup =
mapOf(
@@ -122,7 +122,11 @@ class SensorBlockedBannerTest : BaseUsePermissionTest() {
@Test
fun testCardClickOpenPrivacyControls() {
+ Assume.assumeTrue(SdkLevel.isAtLeastT())
Assume.assumeTrue(sensorPrivacyManager.supportsSensorToggle(CAMERA))
+ val safetyCenterManager = context.getSystemService(SafetyCenterManager::class.java)
+ Assume.assumeNotNull(safetyCenterManager)
+
var isSafetyCenterEnabled = false
runWithShellPermissionIdentity {
isSafetyCenterEnabled = safetyCenterManager.isSafetyCenterEnabled
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt b/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
index 8caa4e6bf..f9f9e8cd2 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
@@ -21,7 +21,9 @@ import android.app.Instrumentation
import android.content.Intent
import android.os.Bundle
import android.util.Log
+import android.util.LruCache
import java.util.concurrent.CompletableFuture
+import java.util.concurrent.atomic.AtomicInteger
class StartForFutureActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -36,26 +38,25 @@ class StartForFutureActivity : Activity() {
intent: Intent,
future: CompletableFuture<Instrumentation.ActivityResult>
) {
- if (StartForFutureActivity.future != null) {
- throw RuntimeException(
- "StartForFutureActivity only supports launching one " +
- "concurrent activity, but more than one was attempted."
- )
- }
-
- startActivityForResult(intent, 1)
- StartForFutureActivity.future = future
+ val requestCode = nextRequestCode.getAndIncrement()
+ futures.put(requestCode, future)
+ startActivityForResult(intent, requestCode)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
- future!!.complete(Instrumentation.ActivityResult(resultCode, data))
- future = null
+ val future =
+ futures.remove(requestCode)
+ ?: throw IllegalStateException(
+ "StartForFutureActivity received an activity result with an unknown requestCode"
+ )
+ future.complete(Instrumentation.ActivityResult(resultCode, data))
finish()
}
companion object {
- private var future: CompletableFuture<Instrumentation.ActivityResult>? = null
private val TAG = StartForFutureActivity::class.simpleName
+ private var nextRequestCode = AtomicInteger(1)
+ private val futures = LruCache<Int, CompletableFuture<Instrumentation.ActivityResult>>(10)
}
}
diff --git a/tests/cts/role/Android.bp b/tests/cts/role/Android.bp
index 368a45263..2a312976b 100644
--- a/tests/cts/role/Android.bp
+++ b/tests/cts/role/Android.bp
@@ -28,17 +28,19 @@ android_test {
],
static_libs: [
+ "android.permission.flags-aconfig-java",
"androidx.test.rules",
"compatibility-device-util-axt",
"ctstestrunner-axt",
- "truth",
"platform-test-annotations",
+ "truth",
],
test_suites: [
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
data: [
diff --git a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
index 001a761c2..d15142f7c 100644
--- a/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
+++ b/tests/cts/role/src/android/app/role/cts/RoleManagerTest.java
@@ -27,9 +27,11 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import android.app.Activity;
+import android.app.AppOpsManager;
import android.app.Instrumentation;
import android.app.role.OnRoleHoldersChangedListener;
import android.app.role.RoleManager;
@@ -41,8 +43,13 @@ import android.content.pm.PermissionInfo;
import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
+import android.permission.flags.Flags;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.provider.Settings;
import android.provider.Telephony;
+import android.telephony.TelephonyManager;
import android.util.Pair;
import androidx.annotation.NonNull;
@@ -56,6 +63,7 @@ import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.UiObject2;
import androidx.test.uiautomator.UiObjectNotFoundException;
+import androidx.test.uiautomator.Until;
import com.android.compatibility.common.util.DisableAnimationRule;
import com.android.compatibility.common.util.FreezeRotationRule;
@@ -126,6 +134,10 @@ public class RoleManagerTest {
private static final Context sContext = InstrumentationRegistry.getTargetContext();
private static final PackageManager sPackageManager = sContext.getPackageManager();
private static final RoleManager sRoleManager = sContext.getSystemService(RoleManager.class);
+ private static final boolean sIsAutomotive = sPackageManager.hasSystemFeature(
+ PackageManager.FEATURE_AUTOMOTIVE);
+ private static final boolean sIsTelevision = sPackageManager.hasSystemFeature(
+ PackageManager.FEATURE_TELEVISION);
private static final boolean sIsWatch = sPackageManager.hasSystemFeature(
PackageManager.FEATURE_WATCH);
@@ -141,6 +153,8 @@ public class RoleManagerTest {
: By.res("com.android.permissioncontroller:id/dont_ask_again");
@Rule
+ public CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+ @Rule
public DisableAnimationRule mDisableAnimationRule = new DisableAnimationRule();
@Rule
@@ -231,6 +245,25 @@ public class RoleManagerTest {
assertIsRoleHolder(ROLE_NAME, APP_PACKAGE_NAME, true);
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName =
+ "VanillaIceCream")
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO")
+ public void requestRoleAndSelectRestrictedAppThenRestrictedSettingDialog() throws Exception {
+ assumeFalse(sIsWatch || sIsAutomotive || sIsTelevision);
+ runWithShellPermissionIdentity(
+ () -> setEnhancedConfirmationRestrictedAppOpMode(sContext, APP_PACKAGE_NAME,
+ AppOpsManager.MODE_ERRORED));
+
+ requestRole(ROLE_NAME);
+ waitFindObject(By.text(APP_LABEL).enabled(false))
+ .clickAndWait(Until.newWindow(), TIMEOUT_MILLIS);
+ waitFindObject(By.textContains("Restricted setting"), TIMEOUT_MILLIS);
+ pressBack();
+ respondToRoleRequest(false);
+ }
+
@Test
@FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO")
public void requestRoleFirstTimeNoDontAskAgain() throws Exception {
@@ -633,6 +666,34 @@ public class RoleManagerTest {
pressBack();
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM, codeName =
+ "VanillaIceCream")
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED)
+ @FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO")
+ public void openDefaultAppDetailsOnHandHeldThenRestrictedAppIsNotSelectableAsDefaultApp()
+ throws Exception {
+ assumeFalse(sIsWatch || sIsAutomotive || sIsTelevision);
+ runWithShellPermissionIdentity(
+ () -> setEnhancedConfirmationRestrictedAppOpMode(sContext, APP_PACKAGE_NAME,
+ AppOpsManager.MODE_ERRORED));
+
+ runWithShellPermissionIdentity(() -> sContext.startActivity(new Intent(
+ Intent.ACTION_MANAGE_DEFAULT_APP)
+ .addCategory(Intent.CATEGORY_DEFAULT)
+ .putExtra(Intent.EXTRA_ROLE_NAME, ROLE_NAME)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TASK)));
+
+ waitFindObject(By.text(APP_LABEL).enabled(false)).clickAndWait(Until.newWindow(),
+ TIMEOUT_MILLIS);
+
+ waitFindObject(By.textContains("Restricted setting"), TIMEOUT_MILLIS);
+ pressBack();
+
+ pressBack();
+ }
+
@Test
@FlakyTest(bugId = 288468003, detail = "CtsRoleTestCases is breaching 20min SLO")
public void openDefaultAppDetailsAndSetDefaultAppThenIsDefaultApp() throws Exception {
@@ -687,8 +748,8 @@ public class RoleManagerTest {
if (sIsWatch) {
waitFindObject(By.clickable(true).checked(false)).click();
} else {
- waitFindObject(
- By.clickable(true).hasDescendant(By.checkable(true).checked(false))).click();
+ waitFindObject(By.clickable(true).hasDescendant(By.checkable(true).enabled(true)
+ .checked(false))).click();
}
if (sIsWatch) {
@@ -781,6 +842,15 @@ public class RoleManagerTest {
pressBack();
}
+ private void setEnhancedConfirmationRestrictedAppOpMode(@NonNull Context context,
+ @NonNull String packageName, int mode)
+ throws PackageManager.NameNotFoundException {
+ AppOpsManager appOpsManager = context.getSystemService(AppOpsManager.class);
+ appOpsManager.setMode(AppOpsManager.OPSTR_ACCESS_RESTRICTED_SETTINGS,
+ context.getPackageManager().getApplicationInfo(packageName, 0).uid,
+ packageName, mode);
+ }
+
private static void waitForIdle() {
UiAutomatorUtils.getUiDevice().waitForIdle();
}
@@ -1066,6 +1136,28 @@ public class RoleManagerTest {
assertThat(Telephony.Sms.getDefaultSmsPackage(sContext)).isEqualTo(APP_PACKAGE_NAME);
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.VANILLA_ICE_CREAM,
+ codeName = "VanillaIceCream")
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_GET_EMERGENCY_ROLE_HOLDER_API_ENABLED)
+ public void telephonyManagerGetEmergencyAssistancePackageNameBackedByRole() throws Exception {
+ TelephonyManager telephonyManager = sContext.getSystemService(TelephonyManager.class);
+ List<String> emergencyRoleHolders = getRoleHolders(RoleManager.ROLE_EMERGENCY);
+
+ if (telephonyManager.isVoiceCapable()
+ && callWithShellPermissionIdentity(() ->
+ telephonyManager.isEmergencyAssistanceEnabled())) {
+ String emergencyAssistancePackageName = callWithShellPermissionIdentity(() ->
+ telephonyManager.getEmergencyAssistancePackageName());
+ assertThat(emergencyRoleHolders).hasSize(1);
+ assertThat(emergencyAssistancePackageName).isEqualTo(emergencyRoleHolders.get(0));
+ } else {
+ assertThrows(IllegalStateException.class, () ->
+ callWithShellPermissionIdentity(() ->
+ telephonyManager.getEmergencyAssistancePackageName()));
+ }
+ }
+
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.S, codeName = "S")
@Test
public void cannotBypassRoleQualificationWithoutPermission() throws Exception {
diff --git a/tests/cts/safetycenter/Android.bp b/tests/cts/safetycenter/Android.bp
index 6e0fedec0..e49587c39 100644
--- a/tests/cts/safetycenter/Android.bp
+++ b/tests/cts/safetycenter/Android.bp
@@ -48,5 +48,6 @@ android_test {
"cts",
"general-tests",
"mts-permission",
+ "mcts-permission",
],
}
diff --git a/tests/cts/safetycenter/src/android/safetycenter/cts/config/SafetySourceTest.kt b/tests/cts/safetycenter/src/android/safetycenter/cts/config/SafetySourceTest.kt
index 59cc6547a..4b6f0f6f9 100644
--- a/tests/cts/safetycenter/src/android/safetycenter/cts/config/SafetySourceTest.kt
+++ b/tests/cts/safetycenter/src/android/safetycenter/cts/config/SafetySourceTest.kt
@@ -18,11 +18,14 @@ package android.safetycenter.cts.config
import android.content.res.Resources
import android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE
+import android.os.Build.VERSION_CODES.VANILLA_ICE_CREAM
+import android.platform.test.annotations.RequiresFlagsEnabled
import android.safetycenter.config.SafetySource
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.ext.truth.os.ParcelableSubject.assertThat
import androidx.test.filters.SdkSuppress
import com.android.modules.utils.build.SdkLevel
+import com.android.permission.flags.Flags
import com.android.safetycenter.testing.EqualsHashCodeToStringTester
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertThrows
@@ -126,6 +129,35 @@ class SafetySourceTest {
}
}
+ @RequiresFlagsEnabled(Flags.FLAG_PRIVATE_PROFILE_TITLE_API)
+ @SdkSuppress(minSdkVersion = VANILLA_ICE_CREAM, codeName = "VanillaIceCream")
+ @Test
+ fun getTitleForPrivateProfileResId_returnsTitleForPrivateProfileResIdOrThrows() {
+ if (!Flags.privateProfileTitleApi()) {
+ return
+ }
+ assertThrows(UnsupportedOperationException::class.java) {
+ DYNAMIC_BAREBONE.titleForPrivateProfileResId
+ }
+ assertThat(dynamicAllOptional().titleForPrivateProfileResId).isEqualTo(REFERENCE_RES_ID)
+ assertThrows(UnsupportedOperationException::class.java) {
+ DYNAMIC_DISABLED.titleForPrivateProfileResId
+ }
+ assertThat(DYNAMIC_HIDDEN.titleForPrivateProfileResId).isEqualTo(Resources.ID_NULL)
+ assertThat(DYNAMIC_HIDDEN_WITH_SEARCH.titleForPrivateProfileResId)
+ .isEqualTo(REFERENCE_RES_ID)
+ assertThrows(UnsupportedOperationException::class.java) {
+ STATIC_BAREBONE.titleForPrivateProfileResId
+ }
+ assertThat(STATIC_ALL_OPTIONAL.titleForPrivateProfileResId).isEqualTo(REFERENCE_RES_ID)
+ assertThrows(UnsupportedOperationException::class.java) {
+ ISSUE_ONLY_BAREBONE.titleForPrivateProfileResId
+ }
+ assertThrows(UnsupportedOperationException::class.java) {
+ issueOnlyAllOptional().titleForPrivateProfileResId
+ }
+ }
+
@Test
fun getSummaryResId_returnsSummaryResIdOrThrows() {
assertThat(DYNAMIC_BAREBONE.summaryResId).isEqualTo(REFERENCE_RES_ID)
@@ -360,6 +392,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -390,6 +425,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -413,6 +451,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -436,6 +477,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -459,6 +503,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -482,6 +529,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -505,6 +555,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -536,6 +589,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -559,6 +615,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -582,6 +641,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -605,6 +667,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -628,6 +693,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
)
@@ -650,6 +718,11 @@ class SafetySourceTest {
.setNotificationsAllowed(false)
.setDeduplicationGroup(DEDUPLICATION_GROUP)
.addPackageCertificateHash(HASH1)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
)
addEqualityGroup(
@@ -669,6 +742,11 @@ class SafetySourceTest {
.setNotificationsAllowed(true)
.setDeduplicationGroup("other_deduplication_group")
.addPackageCertificateHash(HASH1)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
)
// With no package cert hashes provided
@@ -688,6 +766,11 @@ class SafetySourceTest {
.setRefreshOnPageOpenAllowed(true)
.setNotificationsAllowed(true)
.setDeduplicationGroup(DEDUPLICATION_GROUP)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
)
// With longer package cert hash list
@@ -709,6 +792,11 @@ class SafetySourceTest {
.setDeduplicationGroup(DEDUPLICATION_GROUP)
.addPackageCertificateHash(HASH1)
.addPackageCertificateHash(HASH2)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
)
// With package cert hash list with different value
@@ -729,6 +817,11 @@ class SafetySourceTest {
.setNotificationsAllowed(true)
.setDeduplicationGroup(DEDUPLICATION_GROUP)
.addPackageCertificateHash(HASH2)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
)
}
@@ -785,6 +878,9 @@ class SafetySourceTest {
setDeduplicationGroup(DEDUPLICATION_GROUP)
addPackageCertificateHash(HASH1)
}
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
}
.build()
@@ -817,6 +913,11 @@ class SafetySourceTest {
.setProfile(SafetySource.PROFILE_ALL)
.setInitialDisplayState(SafetySource.INITIAL_DISPLAY_STATE_HIDDEN)
.setSearchTermsResId(REFERENCE_RES_ID)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
internal val STATIC_BAREBONE =
@@ -837,6 +938,11 @@ class SafetySourceTest {
.setIntentAction(INTENT_ACTION)
.setProfile(SafetySource.PROFILE_ALL)
.setSearchTermsResId(REFERENCE_RES_ID)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(REFERENCE_RES_ID)
+ }
+ }
.build()
internal val ISSUE_ONLY_BAREBONE =
diff --git a/tests/functional/safetycenter/multiusers/Android.bp b/tests/functional/safetycenter/multiusers/Android.bp
index b5caf48e6..2f1cda9ed 100644
--- a/tests/functional/safetycenter/multiusers/Android.bp
+++ b/tests/functional/safetycenter/multiusers/Android.bp
@@ -36,6 +36,7 @@ android_test {
"Harrier",
"Nene",
"TestApp",
+ "permissions-aconfig-flags-lib",
],
test_suites: [
"general-tests",
diff --git a/tests/functional/safetycenter/multiusers/src/android/safetycenter/functional/multiusers/SafetyCenterMultiUsersTest.kt b/tests/functional/safetycenter/multiusers/src/android/safetycenter/functional/multiusers/SafetyCenterMultiUsersTest.kt
index acbc5cfc0..2eb1a6c48 100644
--- a/tests/functional/safetycenter/multiusers/src/android/safetycenter/functional/multiusers/SafetyCenterMultiUsersTest.kt
+++ b/tests/functional/safetycenter/multiusers/src/android/safetycenter/functional/multiusers/SafetyCenterMultiUsersTest.kt
@@ -21,6 +21,8 @@ import android.Manifest.permission.INTERACT_ACROSS_USERS_FULL
import android.app.PendingIntent
import android.content.Context
import android.os.UserHandle
+import android.platform.test.annotations.RequiresFlagsDisabled
+import android.platform.test.annotations.RequiresFlagsEnabled
import android.safetycenter.SafetyCenterData
import android.safetycenter.SafetyCenterEntry
import android.safetycenter.SafetyCenterEntry.ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING
@@ -43,6 +45,7 @@ import com.android.bedstead.harrier.DeviceState
import com.android.bedstead.harrier.annotations.EnsureHasAdditionalUser
import com.android.bedstead.harrier.annotations.EnsureHasCloneProfile
import com.android.bedstead.harrier.annotations.EnsureHasNoWorkProfile
+import com.android.bedstead.harrier.annotations.EnsureHasPrivateProfile
import com.android.bedstead.harrier.annotations.EnsureHasWorkProfile
import com.android.bedstead.harrier.annotations.enterprise.EnsureHasDeviceOwner
import com.android.bedstead.harrier.annotations.enterprise.EnsureHasNoDeviceOwner
@@ -227,6 +230,13 @@ class SafetyCenterMultiUsersTest {
.setEnabled(false)
.build()
+ private val dynamicDisabledForPrivateUpdated: SafetyCenterEntry
+ get() =
+ safetyCenterEntryOkForPrivate(DYNAMIC_DISABLED_ID, deviceState.privateProfile().id())
+
+ private val dynamicHiddenForPrivateUpdated: SafetyCenterEntry
+ get() = safetyCenterEntryOkForPrivate(DYNAMIC_HIDDEN_ID, deviceState.privateProfile().id())
+
private val staticGroupBuilder =
SafetyCenterEntryGroup.Builder(STATIC_GROUP_ID, "OK")
.setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNSPECIFIED)
@@ -267,6 +277,24 @@ class SafetyCenterMultiUsersTest {
.setEnabled(false)
.build()
+ private val staticAllOptionalForPrivateBuilder
+ get() =
+ safetyCenterTestData
+ .safetyCenterEntryDefaultStaticBuilder(
+ STATIC_ALL_OPTIONAL_ID,
+ userId = deviceState.privateProfile().id(),
+ title = "Unknown"
+ )
+ .setPendingIntent(
+ createTestActivityRedirectPendingIntentForUser(
+ deviceState.privateProfile().userHandle(),
+ explicit = false
+ )
+ )
+
+ private val staticAllOptionalForPrivate
+ get() = staticAllOptionalForPrivateBuilder.build()
+
private fun createStaticEntry(explicit: Boolean = true): SafetyCenterStaticEntry =
SafetyCenterStaticEntry.Builder("OK")
.setSummary("OK")
@@ -292,9 +320,25 @@ class SafetyCenterMultiUsersTest {
)
)
+ private fun staticEntryForPrivateBuilder(
+ title: CharSequence = "Unknown",
+ explicit: Boolean = true
+ ) =
+ SafetyCenterStaticEntry.Builder(title)
+ .setSummary("OK")
+ .setPendingIntent(
+ createTestActivityRedirectPendingIntentForUser(
+ deviceState.privateProfile().userHandle(),
+ explicit
+ )
+ )
+
private fun createStaticEntryForWork(explicit: Boolean = true): SafetyCenterStaticEntry =
staticEntryForWorkBuilder(explicit = explicit).build()
+ private fun createStaticEntryForPrivate(explicit: Boolean = true): SafetyCenterStaticEntry =
+ staticEntryForPrivateBuilder(explicit = explicit).build()
+
private fun createStaticEntryForWorkPaused(): SafetyCenterStaticEntry =
staticEntryForWorkBuilder(explicit = false)
.setSummary(safetyCenterResourcesApk.getStringByName("work_profile_paused"))
@@ -313,6 +357,13 @@ class SafetyCenterMultiUsersTest {
.setPendingIntent(safetySourceTestData.createTestActivityRedirectPendingIntent())
.build()
+ private val staticEntryForPrivateUpdated: SafetyCenterStaticEntry
+ get() =
+ SafetyCenterStaticEntry.Builder("Unspecified title for Private")
+ .setSummary("Unspecified summary")
+ .setPendingIntent(safetySourceTestData.createTestActivityRedirectPendingIntent())
+ .build()
+
private val safetyCenterDataForAdditionalUser
get() =
SafetyCenterData(
@@ -657,10 +708,122 @@ class SafetyCenterMultiUsersTest {
@Test
@EnsureHasWorkProfile(installInstrumentedApp = TRUE)
- fun getSafetyCenterData_withComplexConfigWithAllDataProvided_returnsAllDataProvided() {
+ fun getSafetyCenterData_withComplexConfigWithExtraWorkOnlyWithAllDataProvided_returnsAllDataProvided() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig)
+ updatePrimaryProfileSources()
+ updateWorkProfileSources()
+
+ val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
+
+ val managedUserId = deviceState.workProfile().id()
+ val safetyCenterDataFromComplexConfig =
+ SafetyCenterData(
+ safetyCenterTestData.safetyCenterStatusCritical(11),
+ listOf(
+ safetyCenterTestData.safetyCenterIssueCritical(
+ DYNAMIC_BAREBONE_ID,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueCritical(
+ ISSUE_ONLY_BAREBONE_ID,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueRecommendation(
+ DYNAMIC_DISABLED_ID,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueRecommendation(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_IN_STATELESS_ID,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_DISABLED_ID,
+ managedUserId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_HIDDEN_ID,
+ managedUserId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ managedUserId,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_IN_STATELESS_ID,
+ managedUserId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ managedUserId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ )
+ ),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK")
+ .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .setSummary("Critical summary")
+ .setEntries(
+ listOf(
+ dynamicBareboneUpdated,
+ dynamicDisabledUpdated,
+ dynamicDisabledForWorkUpdated,
+ dynamicHiddenUpdated,
+ dynamicHiddenForWorkUpdated
+ )
+ )
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION
+ )
+ .build()
+ ),
+ SafetyCenterEntryOrGroup(
+ staticGroupBuilder
+ .setEntries(
+ listOf(staticBarebone, staticAllOptional, staticAllOptionalForWork)
+ )
+ .build()
+ )
+ ),
+ listOf(
+ SafetyCenterStaticEntryGroup(
+ "OK",
+ listOf(
+ staticEntryUpdated,
+ staticEntryForWorkUpdated,
+ createStaticEntry(explicit = false),
+ createStaticEntryForWork(explicit = false)
+ )
+ )
+ )
+ )
+ assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig)
+ }
+
+ @Test
+ @RequiresFlagsDisabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED)
+ @EnsureHasWorkProfile(installInstrumentedApp = TRUE)
+ @EnsureHasPrivateProfile(installInstrumentedApp = TRUE)
+ fun getSafetyCenterData_withComplexConfigWithPrivateProfileDisallowedWithAllDataProvided_returnsAllDataProvided() {
safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig)
updatePrimaryProfileSources()
updateWorkProfileSources()
+ updatePrivateProfileSources()
val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
@@ -764,6 +927,155 @@ class SafetyCenterMultiUsersTest {
assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig)
}
+ // TODO(b/286539356) add the os feature flag requirement when available.
+ @Test
+ @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED)
+ @EnsureHasWorkProfile(installInstrumentedApp = TRUE)
+ @EnsureHasPrivateProfile(installInstrumentedApp = TRUE)
+ fun getSafetyCenterData_withComplexConfigWithAllDataProvided_returnsAllDataProvided() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.complexAllProfileConfig)
+ updatePrimaryProfileSources()
+ updateWorkProfileSources()
+ updatePrivateProfileSources()
+
+ val apiSafetyCenterData = safetyCenterManager.getSafetyCenterDataWithPermission()
+
+ val managedUserId = deviceState.workProfile().id()
+ val privateProfileId = deviceState.privateProfile().id()
+ val safetyCenterDataFromComplexConfig =
+ SafetyCenterData(
+ safetyCenterTestData.safetyCenterStatusCritical(11),
+ listOf(
+ safetyCenterTestData.safetyCenterIssueCritical(
+ DYNAMIC_BAREBONE_ID,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueCritical(
+ ISSUE_ONLY_BAREBONE_ID,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueRecommendation(
+ DYNAMIC_DISABLED_ID,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueRecommendation(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_IN_STATELESS_ID,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_DISABLED_ID,
+ managedUserId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_HIDDEN_ID,
+ managedUserId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ managedUserId,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_IN_STATELESS_ID,
+ managedUserId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ managedUserId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_DISABLED_ID,
+ privateProfileId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_HIDDEN_ID,
+ privateProfileId,
+ groupId = DYNAMIC_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ privateProfileId,
+ attributionTitle = null,
+ groupId = ISSUE_ONLY_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ DYNAMIC_IN_STATELESS_ID,
+ privateProfileId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ ),
+ safetyCenterTestData.safetyCenterIssueInformation(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ privateProfileId,
+ groupId = MIXED_STATELESS_GROUP_ID
+ )
+ ),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(DYNAMIC_GROUP_ID, "OK")
+ .setSeverityLevel(ENTRY_SEVERITY_LEVEL_CRITICAL_WARNING)
+ .setSummary("Critical summary")
+ .setEntries(
+ listOf(
+ dynamicBareboneUpdated,
+ dynamicDisabledUpdated,
+ dynamicDisabledForWorkUpdated,
+ dynamicDisabledForPrivateUpdated,
+ dynamicHiddenUpdated,
+ dynamicHiddenForWorkUpdated,
+ dynamicHiddenForPrivateUpdated
+ )
+ )
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION
+ )
+ .build()
+ ),
+ SafetyCenterEntryOrGroup(
+ staticGroupBuilder
+ .setEntries(
+ listOf(
+ staticBarebone,
+ staticAllOptional,
+ staticAllOptionalForWork,
+ staticAllOptionalForPrivate
+ )
+ )
+ .build()
+ )
+ ),
+ listOf(
+ SafetyCenterStaticEntryGroup(
+ "OK",
+ listOf(
+ staticEntryUpdated,
+ staticEntryForWorkUpdated,
+ staticEntryForPrivateUpdated,
+ createStaticEntry(explicit = false),
+ createStaticEntryForWork(explicit = false),
+ createStaticEntryForPrivate(explicit = false)
+ )
+ )
+ )
+ )
+ assertThat(apiSafetyCenterData.withoutExtras()).isEqualTo(safetyCenterDataFromComplexConfig)
+ }
+
@Test
@EnsureHasWorkProfile(installInstrumentedApp = TRUE)
fun getSafetyCenterData_withQuietMode_shouldHaveWorkProfilePausedSummaryAndNoWorkIssues() {
@@ -920,6 +1232,79 @@ class SafetyCenterMultiUsersTest {
}
@Test
+ @RequiresFlagsEnabled(com.android.permission.flags.Flags.FLAG_PRIVATE_PROFILE_SUPPORTED)
+ @EnsureHasPrivateProfile(installInstrumentedApp = TRUE)
+ fun getSafetyCenterData_afterPrivateProfileRemoved_returnsDefaultData() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig)
+ val privateSafetyCenterManager =
+ getSafetyCenterManagerForUser(deviceState.privateProfile().userHandle())
+ val safetyCenterDataWithPrivateProfile =
+ SafetyCenterData(
+ safetyCenterTestData.safetyCenterStatusUnknown,
+ emptyList(),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ SafetyCenterEntryGroup.Builder(SINGLE_SOURCE_GROUP_ID, "OK")
+ .setSeverityLevel(ENTRY_SEVERITY_LEVEL_UNKNOWN)
+ .setSummary(
+ safetyCenterResourcesApk.getStringByName("group_unknown_summary")
+ )
+ .setEntries(
+ listOf(
+ safetyCenterTestData.safetyCenterEntryDefault(
+ SINGLE_SOURCE_ALL_PROFILE_ID
+ ),
+ safetyCenterTestData.safetyCenterEntryDefault(
+ SINGLE_SOURCE_ALL_PROFILE_ID,
+ deviceState.privateProfile().id(),
+ title = "Unknown",
+ pendingIntent =
+ createTestActivityRedirectPendingIntentForUser(
+ deviceState.privateProfile().userHandle()
+ )
+ )
+ )
+ )
+ .setSeverityUnspecifiedIconType(
+ SEVERITY_UNSPECIFIED_ICON_TYPE_NO_RECOMMENDATION
+ )
+ .build()
+ )
+ ),
+ emptyList()
+ )
+
+ checkState(
+ safetyCenterManager.getSafetyCenterDataWithPermission() ==
+ safetyCenterDataWithPrivateProfile
+ )
+ checkState(
+ privateSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission() ==
+ safetyCenterDataWithPrivateProfile
+ )
+
+ deviceState.privateProfile().remove()
+
+ val safetyCenterDataForPrimaryUser =
+ SafetyCenterData(
+ safetyCenterTestData.safetyCenterStatusUnknown,
+ emptyList(),
+ listOf(
+ SafetyCenterEntryOrGroup(
+ safetyCenterTestData.safetyCenterEntryDefault(SINGLE_SOURCE_ALL_PROFILE_ID)
+ )
+ ),
+ emptyList()
+ )
+ assertThat(safetyCenterManager.getSafetyCenterDataWithPermission())
+ .isEqualTo(safetyCenterDataForPrimaryUser)
+ assertThat(
+ privateSafetyCenterManager.getSafetyCenterDataWithInteractAcrossUsersPermission()
+ )
+ .isEqualTo(SafetyCenterTestData.DEFAULT)
+ }
+
+ @Test
@EnsureHasAdditionalUser(installInstrumentedApp = TRUE)
fun getSafetyCenterData_afterAdditionalUserRemoved_returnsDefaultData() {
safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceAllProfileConfig)
@@ -1290,6 +1675,11 @@ class SafetyCenterMultiUsersTest {
.safetyCenterEntryOkBuilder(sourceId, managedUserId, title = "Ok title for Work")
.build()
+ private fun safetyCenterEntryOkForPrivate(sourceId: String, managedUserId: Int) =
+ safetyCenterTestData
+ .safetyCenterEntryOkBuilder(sourceId, managedUserId, title = "Ok title for Private")
+ .build()
+
private fun updatePrimaryProfileSources() {
safetyCenterTestHelper.setData(
DYNAMIC_BAREBONE_ID,
@@ -1342,4 +1732,29 @@ class SafetyCenterMultiUsersTest {
SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue)
)
}
+
+ private fun updatePrivateProfileSources() {
+ val privateSafetyCenterManager =
+ getSafetyCenterManagerForUser(deviceState.privateProfile().userHandle())
+ privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission(
+ DYNAMIC_DISABLED_ID,
+ safetySourceTestData.informationWithIssueForPrivate
+ )
+ privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission(
+ DYNAMIC_HIDDEN_ID,
+ safetySourceTestData.informationWithIssueForPrivate
+ )
+ privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission(
+ ISSUE_ONLY_ALL_OPTIONAL_ID,
+ SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue)
+ )
+ privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission(
+ DYNAMIC_IN_STATELESS_ID,
+ safetySourceTestData.unspecifiedWithIssueForPrivate
+ )
+ privateSafetyCenterManager.setSafetySourceDataWithInteractAcrossUsersPermission(
+ ISSUE_ONLY_IN_STATELESS_ID,
+ SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue)
+ )
+ }
}
diff --git a/tests/functional/safetycenter/singleuser/src/android/safetycenter/functional/SafetyCenterManagerTest.kt b/tests/functional/safetycenter/singleuser/src/android/safetycenter/functional/SafetyCenterManagerTest.kt
index 963c593cd..8bcc724f3 100644
--- a/tests/functional/safetycenter/singleuser/src/android/safetycenter/functional/SafetyCenterManagerTest.kt
+++ b/tests/functional/safetycenter/singleuser/src/android/safetycenter/functional/SafetyCenterManagerTest.kt
@@ -3796,6 +3796,17 @@ class SafetyCenterManagerTest {
assertThat(lastUpdated[key]).isNotNull()
}
+ @Test
+ fun setSafetySourceData_dynamicHiddenWithIssueOnlyData_allowed() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.hiddenSourceConfig)
+ val expectedData = SafetySourceTestData.issuesOnly(safetySourceTestData.informationIssue)
+
+ safetyCenterTestHelper.setData(DYNAMIC_HIDDEN_ID, expectedData)
+
+ val actualData = safetyCenterManager.getSafetySourceDataWithPermission(DYNAMIC_HIDDEN_ID)
+ assertThat(actualData).isEqualTo(expectedData)
+ }
+
private fun dumpLastUpdated(): Map<String, String> {
val dump = SystemUtil.runShellCommand("dumpsys safety_center data")
return dump
diff --git a/tests/hostside/safetycenter/helper-app/Android.bp b/tests/hostside/safetycenter/helper-app/Android.bp
index d15caceaa..04e660134 100644
--- a/tests/hostside/safetycenter/helper-app/Android.bp
+++ b/tests/hostside/safetycenter/helper-app/Android.bp
@@ -31,6 +31,7 @@ android_test_helper_app {
static_libs: [
"androidx.test.rules",
"androidx.test.ext.junit",
+ "safety-center-pending-intents",
"safety-center-test-util-lib",
],
}
diff --git a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt
index 784701b8a..6afcff85a 100644
--- a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt
+++ b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt
@@ -19,14 +19,23 @@ package android.safetycenter.hostside.device
import android.content.Context
import android.os.Bundle
import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCES_GROUP_ID
+import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID
+import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.compatibility.common.util.UiAutomatorUtils2
import com.android.safetycenter.testing.SafetyCenterActivityLauncher.launchSafetyCenterActivity
+import com.android.safetycenter.testing.SafetyCenterActivityLauncher.launchSafetyCenterQsActivity
import com.android.safetycenter.testing.SafetyCenterActivityLauncher.openPageAndExit
import com.android.safetycenter.testing.SafetyCenterFlags
import com.android.safetycenter.testing.SafetyCenterTestConfigs
+import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.SINGLE_SOURCE_ID
import com.android.safetycenter.testing.SafetyCenterTestHelper
import com.android.safetycenter.testing.SafetyCenterTestRule
+import com.android.safetycenter.testing.SafetySourceTestData
+import com.android.safetycenter.testing.SafetySourceTestData.Companion.INFORMATION_ISSUE_ID
+import com.android.safetycenter.testing.UiTestHelper.waitAllTextDisplayed
+import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -47,6 +56,7 @@ class SafetyCenterInteractionLoggingHelperTests {
private val context: Context = ApplicationProvider.getApplicationContext()
private val safetyCenterTestHelper = SafetyCenterTestHelper(context)
private val safetyCenterTestConfigs = SafetyCenterTestConfigs(context)
+ private val safetySourceTestData = SafetySourceTestData(context)
@get:Rule val safetyCenterTestRule = SafetyCenterTestRule(safetyCenterTestHelper)
@@ -55,12 +65,48 @@ class SafetyCenterInteractionLoggingHelperTests {
SafetyCenterFlags.showSubpages = true
}
+ @After
+ fun tearDown() {
+ // When an assertion fails, it will end up leaving the previous view open, which screws
+ // with the logging assertions made by this test (polluting with view events from whatever
+ // view was left open). Here we preemptively clear whatever's open to get back to home
+ UiAutomatorUtils2.getUiDevice().pressHome()
+ }
+
@Test
fun openSafetyCenter() {
context.launchSafetyCenterActivity {}
}
@Test
+ fun openSafetyCenterFullFromQs() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig)
+ safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, safetySourceTestData.informationWithIssue)
+
+ context.launchSafetyCenterQsActivity {
+ openPageAndExit("Settings") { waitAllTextDisplayed(safetySourceTestData.informationIssue.title) }
+ }
+ }
+
+ @Test
+ fun openSafetyCenterWithIssueIntent() {
+ safetyCenterTestHelper.setConfig(safetyCenterTestConfigs.singleSourceConfig)
+
+ safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, safetySourceTestData.informationWithIssue)
+
+ val extras = Bundle()
+ extras.putString(EXTRA_SAFETY_SOURCE_ID, SINGLE_SOURCE_ID)
+ extras.putString(EXTRA_SAFETY_SOURCE_ISSUE_ID, INFORMATION_ISSUE_ID)
+
+ context.launchSafetyCenterActivity(extras) {}
+ }
+
+ @Test
+ fun openSafetyCenterQs() {
+ context.launchSafetyCenterQsActivity {}
+ }
+
+ @Test
fun openSubpageFromIntentExtra() {
val config = safetyCenterTestConfigs.singleSourceConfig
safetyCenterTestHelper.setConfig(config)
diff --git a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterNotificationLoggingHelperTests.kt b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterNotificationLoggingHelperTests.kt
index 458516379..dc3cb3fc2 100644
--- a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterNotificationLoggingHelperTests.kt
+++ b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterNotificationLoggingHelperTests.kt
@@ -21,12 +21,16 @@ import android.safetycenter.SafetySourceData
import android.safetycenter.SafetySourceIssue
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.safetycenter.pendingintents.PendingIntentSender
+import com.android.safetycenter.testing.SafetyCenterActivityLauncher
import com.android.safetycenter.testing.SafetyCenterFlags
import com.android.safetycenter.testing.SafetyCenterTestConfigs
import com.android.safetycenter.testing.SafetyCenterTestConfigs.Companion.SINGLE_SOURCE_ID
import com.android.safetycenter.testing.SafetyCenterTestHelper
import com.android.safetycenter.testing.SafetyCenterTestRule
import com.android.safetycenter.testing.SafetySourceTestData
+import com.android.safetycenter.testing.StatusBarNotificationWithChannel
+import com.android.safetycenter.testing.TestNotificationListener
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -49,7 +53,9 @@ class SafetyCenterNotificationLoggingHelperTests {
private val safetySourceTestData = SafetySourceTestData(context)
private val safetyCenterTestConfigs = SafetyCenterTestConfigs(context)
- @get:Rule val safetyCenterTestRule = SafetyCenterTestRule(safetyCenterTestHelper)
+ @get:Rule
+ val safetyCenterTestRule =
+ SafetyCenterTestRule(safetyCenterTestHelper, withNotifications = true)
@Before
fun setUp() {
@@ -64,6 +70,13 @@ class SafetyCenterNotificationLoggingHelperTests {
safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, newTestDataWithNotifiableIssue())
}
+ @Test
+ fun openSafetyCenterFromNotification() {
+ safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, newTestDataWithNotifiableIssue())
+
+ sendContentPendingIntent(TestNotificationListener.waitForSingleNotification())
+ }
+
private fun newTestDataWithNotifiableIssue(): SafetySourceData =
safetySourceTestData
.defaultCriticalDataBuilder()
@@ -74,4 +87,17 @@ class SafetyCenterNotificationLoggingHelperTests {
.build()
)
.build()
+
+ companion object {
+ private fun sendContentPendingIntent(
+ statusBarNotificationWithChannel: StatusBarNotificationWithChannel
+ ) {
+ val contentIntent =
+ statusBarNotificationWithChannel.statusBarNotification.notification.contentIntent
+ SafetyCenterActivityLauncher.executeBlockAndExit(
+ launchActivity = { PendingIntentSender.send(contentIntent) },
+ block = {} // No action required
+ )
+ }
+ }
}
diff --git a/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt b/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt
index 5fe9e0a2a..42a2a8a89 100644
--- a/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt
+++ b/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt
@@ -24,13 +24,17 @@ import com.android.compatibility.common.util.ApiLevelUtil
import com.android.os.AtomsProto.Atom
import com.android.os.AtomsProto.SafetyCenterInteractionReported
import com.android.os.AtomsProto.SafetyCenterInteractionReported.Action
+import com.android.os.AtomsProto.SafetyCenterInteractionReported.NavigationSource
import com.android.os.AtomsProto.SafetyCenterInteractionReported.ViewType
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner
import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test
import com.google.common.truth.Truth.assertThat
+import java.math.BigInteger
+import java.security.MessageDigest
import org.junit.After
import org.junit.Assume.assumeTrue
import org.junit.Before
+import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -67,15 +71,77 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() {
val safetyCenterViewedAtoms = getInteractionReportedAtoms(Action.SAFETY_CENTER_VIEWED)
- assertThat(safetyCenterViewedAtoms).isNotEmpty()
+ assertThat(safetyCenterViewedAtoms).hasSize(1)
+ with(safetyCenterViewedAtoms.first()) {
+ assertThat(navigationSource).isEqualTo(NavigationSource.SOURCE_UNKNOWN)
+ assertThat(viewType).isEqualTo(ViewType.FULL)
+ }
}
@Test
- fun sendNotification_recordsNotificationPostedEvent() {
+ fun openSafetyCenterQs_recordsSafetyCenterViewedEvent() {
+ helperAppRule.runTest(TEST_CLASS_NAME, "openSafetyCenterQs")
+
+ val safetyCenterViewedAtoms = getInteractionReportedAtoms(Action.SAFETY_CENTER_VIEWED)
+
+ assertThat(safetyCenterViewedAtoms).hasSize(1)
+ with(safetyCenterViewedAtoms.first()) {
+ assertThat(navigationSource).isEqualTo(NavigationSource.QUICK_SETTINGS_TILE)
+ assertThat(viewType).isEqualTo(ViewType.QUICK_SETTINGS)
+ }
+ }
+
+ @Ignore // TODO: b/323269529 - Deflake this test
+ @Test
+ fun openSafetyCenterFullFromQs_recordsViewEventWithCorrectSource() {
+ helperAppRule.runTest(TEST_CLASS_NAME, "openSafetyCenterFullFromQs")
+
+ val safetyCenterViewedAtoms = getInteractionReportedAtoms(Action.SAFETY_CENTER_VIEWED)
+
+ val viewTypesToNavSources =
+ safetyCenterViewedAtoms.associate { Pair(it.viewType, it.navigationSource) }
+ assertThat(viewTypesToNavSources)
+ .containsEntry(ViewType.FULL, NavigationSource.QUICK_SETTINGS_TILE)
+ }
+
+ @Test
+ fun openSafetyCenterWithIssueIntent_recordsViewEventWithAssociatedIssueMetadata() {
+ helperAppRule.runTest(TEST_CLASS_NAME, testMethodName = "openSafetyCenterWithIssueIntent")
+
+ val safetyCenterViewedAtoms = getInteractionReportedAtoms(Action.SAFETY_CENTER_VIEWED)
+
+ assertThat(safetyCenterViewedAtoms).hasSize(1)
+ with(safetyCenterViewedAtoms.first()) {
+ assertThat(navigationSource).isEqualTo(NavigationSource.NOTIFICATION)
+ assertThat(encodedSafetySourceId).isEqualTo(ENCODED_SINGLE_SOURCE_ID)
+ assertThat(encodedIssueTypeId).isEqualTo(ENCODED_ISSUE_TYPE_ID)
+ }
+ }
+
+ @Test
+ fun openSafetyCenterWithNotification_recordsViewEventWithAssociatedIssueMetadata() {
assumeAtLeastUpsideDownCake("Safety Center notification APIs require Android U+")
helperAppRule.runTest(
testClassName = ".SafetyCenterNotificationLoggingHelperTests",
+ testMethodName = "openSafetyCenterFromNotification"
+ )
+
+ val safetyCenterViewedAtoms = getInteractionReportedAtoms(Action.SAFETY_CENTER_VIEWED)
+
+ assertThat(safetyCenterViewedAtoms).hasSize(1)
+ with(safetyCenterViewedAtoms.first()) {
+ assertThat(navigationSource).isEqualTo(NavigationSource.NOTIFICATION)
+ assertThat(encodedSafetySourceId).isEqualTo(ENCODED_SINGLE_SOURCE_ID)
+ assertThat(encodedIssueTypeId).isEqualTo(ENCODED_ISSUE_TYPE_ID)
+ }
+ }
+
+ @Test
+ fun sendNotification_recordsNotificationPostedEvent() {
+ assumeAtLeastUpsideDownCake("Safety Center notification APIs require Android U+")
+ helperAppRule.runTest(
+ testClassName = ".SafetyCenterNotificationLoggingHelperTests",
testMethodName = "sendNotification"
)
@@ -97,8 +163,7 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() {
assertThat(safetyCenterViewedAtoms).hasSize(1)
with(safetyCenterViewedAtoms.first()) {
assertThat(viewType).isEqualTo(ViewType.SUBPAGE)
- assertThat(navigationSource)
- .isEqualTo(SafetyCenterInteractionReported.NavigationSource.SOURCE_UNKNOWN)
+ assertThat(navigationSource).isEqualTo(NavigationSource.SOURCE_UNKNOWN)
assertThat(sessionId).isNotNull()
}
}
@@ -113,8 +178,7 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() {
val subpageViewedEvent = safetyCenterViewedAtoms.find { it.viewType == ViewType.SUBPAGE }
assertThat(subpageViewedEvent).isNotNull()
- assertThat(subpageViewedEvent!!.navigationSource)
- .isEqualTo(SafetyCenterInteractionReported.NavigationSource.SAFETY_CENTER)
+ assertThat(subpageViewedEvent!!.navigationSource).isEqualTo(NavigationSource.SAFETY_CENTER)
assertThat(safetyCenterViewedAtoms.map { it.sessionId }.distinct()).hasSize(1)
}
@@ -129,8 +193,7 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() {
assertThat(safetyCenterViewedAtoms).hasSize(1)
with(safetyCenterViewedAtoms.first()) {
assertThat(viewType).isEqualTo(ViewType.SUBPAGE)
- assertThat(navigationSource)
- .isEqualTo(SafetyCenterInteractionReported.NavigationSource.SETTINGS)
+ assertThat(navigationSource).isEqualTo(NavigationSource.SETTINGS)
assertThat(sessionId).isNotNull()
}
}
@@ -148,5 +211,27 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() {
private companion object {
const val TEST_CLASS_NAME = ".SafetyCenterInteractionLoggingHelperTests"
+
+ // LINT.IfChange(single_source_id)
+ val ENCODED_SINGLE_SOURCE_ID = encodeId("test_single_source_id")
+ // LINT.ThenChange(/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt:issue_type_id)
+
+ // LINT.IfChange(issue_type_id)
+ val ENCODED_ISSUE_TYPE_ID = encodeId("issue_type_id")
+ // LINT.ThenChange(/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt:issue_type_id)
+
+ /**
+ * Encodes a string into an long ID. The ID is a SHA-256 of the string, truncated to 64
+ * bits.
+ */
+ fun encodeId(id: String?): Long {
+ if (id == null) return 0
+
+ val digest = MessageDigest.getInstance("MD5")
+ digest.update(id.toByteArray())
+
+ // Truncate to the size of a long
+ return BigInteger(digest.digest()).toLong()
+ }
}
}
diff --git a/tests/hostside/safetycenter/src/android/safetycenter/hostside/rules/RequireSafetyCenterRule.kt b/tests/hostside/safetycenter/src/android/safetycenter/hostside/rules/RequireSafetyCenterRule.kt
index edf76e888..fe75a05a2 100644
--- a/tests/hostside/safetycenter/src/android/safetycenter/hostside/rules/RequireSafetyCenterRule.kt
+++ b/tests/hostside/safetycenter/src/android/safetycenter/hostside/rules/RequireSafetyCenterRule.kt
@@ -24,14 +24,23 @@ import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
+/** toBooleanString() doesn't seem available on all Kotlin versions we need to support. */
+private fun String.toBooleanStrictInt(): Boolean =
+ when (this) {
+ "true" -> true
+ "false" -> false
+ else ->
+ throw IllegalArgumentException("The string doesn't represent a boolean value: $this")
+ }
+
/** JUnit rule for host side tests that requires Safety Center to be supported and enabled. */
class RequireSafetyCenterRule(private val hostTestClass: BaseHostJUnit4Test) : TestRule {
private val safetyCenterSupported: Boolean by lazy {
- shellCommandStdoutOrThrow("cmd safety_center supported").toBooleanStrict()
+ shellCommandStdoutOrThrow("cmd safety_center supported").toBooleanStrictInt()
}
private val safetyCenterEnabled: Boolean by lazy {
- shellCommandStdoutOrThrow("cmd safety_center enabled").toBooleanStrict()
+ shellCommandStdoutOrThrow("cmd safety_center enabled").toBooleanStrictInt()
}
override fun apply(base: Statement, description: Description): Statement {
diff --git a/tests/utils/safetycenter/Android.bp b/tests/utils/safetycenter/Android.bp
index 6accefae9..8514b0662 100644
--- a/tests/utils/safetycenter/Android.bp
+++ b/tests/utils/safetycenter/Android.bp
@@ -36,6 +36,7 @@ android_library {
"kotlinx-coroutines-android",
"safety-center-internal-data",
"safety-center-resources-lib",
+ "permissions-aconfig-flags-lib",
],
apex_available: [
"com.android.permission",
diff --git a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt
index 60c3b4d6a..a4600e88b 100644
--- a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt
+++ b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetyCenterTestConfigs.kt
@@ -31,6 +31,7 @@ import android.safetycenter.config.SafetySource.SAFETY_SOURCE_TYPE_STATIC
import android.safetycenter.config.SafetySourcesGroup
import androidx.annotation.RequiresApi
import com.android.modules.utils.build.SdkLevel
+import com.android.permission.flags.Flags
import com.android.safetycenter.testing.SettingsPackage.getSettingsPackageName
import java.security.MessageDigest
@@ -159,6 +160,14 @@ class SafetyCenterTestConfigs(private val context: Context) {
/** A [SafetyCenterConfig] with a dynamic source in a different, missing package. */
val singleSourceOtherPackageConfig = singleSourceConfig(dynamicOtherPackageSafetySource)
+ /** A [SafetyCenterConfig] with a dynamic hidden-by-default source. */
+ val hiddenSourceConfig =
+ singleSourceConfig(
+ dynamicSafetySourceBuilder(DYNAMIC_HIDDEN_ID)
+ .setInitialDisplayState(SafetySource.INITIAL_DISPLAY_STATE_HIDDEN)
+ .build()
+ )
+
/** A simple [SafetyCenterConfig] with a source supporting all profiles. */
val singleSourceAllProfileConfig =
singleSourceConfig(
@@ -678,6 +687,11 @@ class SafetyCenterTestConfigs(private val context: Context) {
.setSummaryResId(Resources.ID_NULL)
.setIntentAction(null)
.setInitialDisplayState(SafetySource.INITIAL_DISPLAY_STATE_HIDDEN)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(Resources.ID_NULL)
+ }
+ }
.build()
)
.build()
@@ -780,6 +794,11 @@ class SafetyCenterTestConfigs(private val context: Context) {
dynamicSafetySourceBuilder(id)
.setProfile(SafetySource.PROFILE_ALL)
.setTitleForWorkResId(android.R.string.paste)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(android.R.string.paste)
+ }
+ }
private fun staticSafetySource(id: String) = staticSafetySourceBuilder(id).build()
@@ -795,6 +814,11 @@ class SafetyCenterTestConfigs(private val context: Context) {
staticSafetySourceBuilder(id)
.setProfile(SafetySource.PROFILE_ALL)
.setTitleForWorkResId(android.R.string.paste)
+ .apply {
+ if (SdkLevel.isAtLeastV() && Flags.privateProfileTitleApi()) {
+ setTitleForPrivateProfileResId(android.R.string.unknownName)
+ }
+ }
@RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
private fun issueOnlySafetySourceWithDuplicationInfo(id: String, deduplicationGroup: String) =
@@ -848,7 +872,9 @@ class SafetyCenterTestConfigs(private val context: Context) {
* ID of the only source provided in [singleSourceConfig], [severityZeroConfig] and
* [noPageOpenConfig].
*/
+ // LINT.IfChange(single_source_id)
const val SINGLE_SOURCE_ID = "test_single_source_id"
+ // LINT.ThenChange(/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt:single_source_id)
/** ID of the only source provided in [singleSourceAllProfileConfig]. */
const val SINGLE_SOURCE_ALL_PROFILE_ID = "test_single_source_all_profile_id"
diff --git a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt
index 2c4f856bb..559215c0c 100644
--- a/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt
+++ b/tests/utils/safetycenter/java/com/android/safetycenter/testing/SafetySourceTestData.kt
@@ -175,6 +175,24 @@ class SafetySourceTestData(private val context: Context) {
.addIssue(informationIssue)
.build()
+ /**
+ * A [SafetySourceData] with a [SEVERITY_LEVEL_INFORMATION] redirecting [SafetySourceIssue] and
+ * a [SEVERITY_LEVEL_UNSPECIFIED] [SafetySourceStatus], to be used for a private profile entry.
+ */
+ val unspecifiedWithIssueForPrivate =
+ SafetySourceData.Builder()
+ .setStatus(
+ SafetySourceStatus.Builder(
+ "Unspecified title for Private",
+ "Unspecified summary",
+ SEVERITY_LEVEL_UNSPECIFIED
+ )
+ .setPendingIntent(createTestActivityRedirectPendingIntent())
+ .build()
+ )
+ .addIssue(informationIssue)
+ .build()
+
/** A [SafetySourceData] with a [SEVERITY_LEVEL_INFORMATION] [SafetySourceStatus]. */
val information =
SafetySourceData.Builder()
@@ -284,6 +302,24 @@ class SafetySourceTestData(private val context: Context) {
/**
* A [SafetySourceData] with a [SEVERITY_LEVEL_INFORMATION] redirecting [SafetySourceIssue] and
+ * [SafetySourceStatus], to be used for a private profile entry.
+ */
+ val informationWithIssueForPrivate =
+ SafetySourceData.Builder()
+ .setStatus(
+ SafetySourceStatus.Builder(
+ "Ok title for Private",
+ "Ok summary",
+ SEVERITY_LEVEL_INFORMATION
+ )
+ .setPendingIntent(createTestActivityRedirectPendingIntent())
+ .build()
+ )
+ .addIssue(informationIssue)
+ .build()
+
+ /**
+ * A [SafetySourceData] with a [SEVERITY_LEVEL_INFORMATION] redirecting [SafetySourceIssue] and
* [SafetySourceStatus].
*/
val informationWithSubtitleIssue =
@@ -802,7 +838,9 @@ class SafetySourceTestData(private val context: Context) {
const val CRITICAL_ISSUE_ACTION_ID = "critical_issue_action_id"
/** Issue type ID for all the issues in this file */
+ // LINT.IfChange(issue_type_id)
const val ISSUE_TYPE_ID = "issue_type_id"
+ // LINT.ThenChange(/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt:issue_type_id)
const val CONFIRMATION_TITLE = "Confirmation title"
const val CONFIRMATION_TEXT = "Confirmation text"