summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PermissionController/Android.bp2
-rw-r--r--PermissionController/OWNERS1
-rw-r--r--PermissionController/lint-baseline.xml136
-rw-r--r--PermissionController/res/values-af/strings.xml19
-rw-r--r--PermissionController/res/values-am/strings.xml19
-rw-r--r--PermissionController/res/values-ar-v33/strings.xml3
-rw-r--r--PermissionController/res/values-ar/strings.xml15
-rw-r--r--PermissionController/res/values-as/strings.xml17
-rw-r--r--PermissionController/res/values-az/strings.xml19
-rw-r--r--PermissionController/res/values-b+sr+Latn/strings.xml17
-rw-r--r--PermissionController/res/values-be-v33/strings.xml3
-rw-r--r--PermissionController/res/values-be/strings.xml13
-rw-r--r--PermissionController/res/values-bg/strings.xml19
-rw-r--r--PermissionController/res/values-bn/strings.xml19
-rw-r--r--PermissionController/res/values-bs/strings.xml17
-rw-r--r--PermissionController/res/values-ca/strings.xml19
-rw-r--r--PermissionController/res/values-cs-v33/strings.xml5
-rw-r--r--PermissionController/res/values-cs/strings.xml17
-rw-r--r--PermissionController/res/values-da/strings.xml17
-rw-r--r--PermissionController/res/values-de/strings.xml21
-rw-r--r--PermissionController/res/values-el/strings.xml19
-rw-r--r--PermissionController/res/values-en-rAU/strings.xml19
-rw-r--r--PermissionController/res/values-en-rCA/strings.xml12
-rw-r--r--PermissionController/res/values-en-rGB/strings.xml19
-rw-r--r--PermissionController/res/values-en-rIN/strings.xml19
-rw-r--r--PermissionController/res/values-es-rUS/strings.xml17
-rw-r--r--PermissionController/res/values-es-v33/strings.xml2
-rw-r--r--PermissionController/res/values-es/strings.xml19
-rw-r--r--PermissionController/res/values-et-v33/strings.xml2
-rw-r--r--PermissionController/res/values-et/strings.xml17
-rw-r--r--PermissionController/res/values-eu/strings.xml19
-rw-r--r--PermissionController/res/values-fa-watch/strings.xml2
-rw-r--r--PermissionController/res/values-fa/strings.xml19
-rw-r--r--PermissionController/res/values-fi/strings.xml19
-rw-r--r--PermissionController/res/values-fr-rCA/strings.xml27
-rw-r--r--PermissionController/res/values-fr/strings.xml19
-rw-r--r--PermissionController/res/values-gl/strings.xml17
-rw-r--r--PermissionController/res/values-gu/strings.xml21
-rw-r--r--PermissionController/res/values-hi-v33/strings.xml2
-rw-r--r--PermissionController/res/values-hi/strings.xml19
-rw-r--r--PermissionController/res/values-hr/strings.xml17
-rw-r--r--PermissionController/res/values-hu-v33/strings.xml2
-rw-r--r--PermissionController/res/values-hu/strings.xml19
-rw-r--r--PermissionController/res/values-hy-v33/strings.xml3
-rw-r--r--PermissionController/res/values-hy/strings.xml15
-rw-r--r--PermissionController/res/values-in/strings.xml19
-rw-r--r--PermissionController/res/values-is/strings.xml17
-rw-r--r--PermissionController/res/values-it/strings.xml17
-rw-r--r--PermissionController/res/values-iw/strings.xml19
-rw-r--r--PermissionController/res/values-ja/strings.xml17
-rw-r--r--PermissionController/res/values-ka/strings.xml19
-rw-r--r--PermissionController/res/values-kk/strings.xml19
-rw-r--r--PermissionController/res/values-km/strings.xml17
-rw-r--r--PermissionController/res/values-kn/strings.xml17
-rw-r--r--PermissionController/res/values-ko/strings.xml19
-rw-r--r--PermissionController/res/values-ky/strings.xml19
-rw-r--r--PermissionController/res/values-lo/strings.xml19
-rw-r--r--PermissionController/res/values-lt/strings.xml17
-rw-r--r--PermissionController/res/values-lv/strings.xml19
-rw-r--r--PermissionController/res/values-mk/strings.xml19
-rw-r--r--PermissionController/res/values-ml/strings.xml17
-rw-r--r--PermissionController/res/values-mn/strings.xml19
-rw-r--r--PermissionController/res/values-mr/strings.xml19
-rw-r--r--PermissionController/res/values-ms/strings.xml17
-rw-r--r--PermissionController/res/values-my-v33/strings.xml3
-rw-r--r--PermissionController/res/values-my/strings.xml15
-rw-r--r--PermissionController/res/values-nb-v33/strings.xml2
-rw-r--r--PermissionController/res/values-nb/strings.xml19
-rw-r--r--PermissionController/res/values-ne-v33/strings.xml2
-rw-r--r--PermissionController/res/values-ne/strings.xml23
-rw-r--r--PermissionController/res/values-nl/strings.xml17
-rw-r--r--PermissionController/res/values-or/strings.xml19
-rw-r--r--PermissionController/res/values-pa/strings.xml19
-rw-r--r--PermissionController/res/values-pl/strings.xml19
-rw-r--r--PermissionController/res/values-pt-rBR/strings.xml17
-rw-r--r--PermissionController/res/values-pt-rPT/strings.xml23
-rw-r--r--PermissionController/res/values-pt/strings.xml17
-rw-r--r--PermissionController/res/values-ro/strings.xml21
-rw-r--r--PermissionController/res/values-ru/strings.xml17
-rw-r--r--PermissionController/res/values-si/strings.xml17
-rw-r--r--PermissionController/res/values-sk-watch/strings.xml6
-rw-r--r--PermissionController/res/values-sk/strings.xml23
-rw-r--r--PermissionController/res/values-sl/strings.xml17
-rw-r--r--PermissionController/res/values-sq/strings.xml19
-rw-r--r--PermissionController/res/values-sr/strings.xml17
-rw-r--r--PermissionController/res/values-sv/strings.xml19
-rw-r--r--PermissionController/res/values-sw/strings.xml19
-rw-r--r--PermissionController/res/values-ta/strings.xml19
-rw-r--r--PermissionController/res/values-te/strings.xml17
-rw-r--r--PermissionController/res/values-th/strings.xml17
-rw-r--r--PermissionController/res/values-tl/strings.xml17
-rw-r--r--PermissionController/res/values-tr-v33/strings.xml3
-rw-r--r--PermissionController/res/values-tr/strings.xml15
-rw-r--r--PermissionController/res/values-uk-v33/strings.xml3
-rw-r--r--PermissionController/res/values-uk/strings.xml15
-rw-r--r--PermissionController/res/values-ur/strings.xml19
-rw-r--r--PermissionController/res/values-uz/strings.xml17
-rw-r--r--PermissionController/res/values-vi/strings.xml19
-rw-r--r--PermissionController/res/values-zh-rCN/strings.xml19
-rw-r--r--PermissionController/res/values-zh-rHK/strings.xml19
-rw-r--r--PermissionController/res/values-zh-rTW/strings.xml19
-rw-r--r--PermissionController/res/values-zu/strings.xml19
-rw-r--r--PermissionController/res/values/config.xml9
-rw-r--r--PermissionController/res/values/overlayable.xml94
-rw-r--r--PermissionController/res/values/strings.xml17
-rw-r--r--PermissionController/res/xml/roles.xml1
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/model/Role.java69
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/util/PackageUtils.java20
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/util/SignedPackage.java188
-rw-r--r--PermissionController/role-controller/java/com/android/role/controller/util/SignedPackageUtils.java106
-rw-r--r--PermissionController/src/com/android/permissioncontroller/appops/data/repository/v31/AppOpRepository.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt40
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/LightAppPermGroupLiveData.kt73
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt147
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt23
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java11
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/BasePermissionUsageDetailsViewModel.kt124
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt827
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt242
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/LocationProviderDialogScreen.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt38
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationDialogFragment.kt4
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationScreen.kt24
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt17
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionScreen.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionScreen.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsScreen.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt9
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt11
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt15
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt32
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt9
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/RemoteConnectionProgressIndicator.kt75
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt203
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt191
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt3
-rw-r--r--PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java97
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java173
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java27
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListViewModel.java6
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppViewModel.java37
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataFilterFunction.java (renamed from PermissionController/src/com/android/permissioncontroller/role/ui/RoleListFilterFunction.java)32
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataSortFunction.java49
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/MergeRoleLiveData.java17
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java92
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationItem.java53
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RoleListSortFunction.java25
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RoleLiveData.java12
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/RoleSortFunction.java34
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/behavior/AssistantRoleUiBehavior.java23
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java16
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java37
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessViewModel.java13
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt9
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppHelper.kt22
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListScreen.kt8
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppScreen.kt31
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleFragment.kt20
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleHelper.kt37
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleScreen.kt31
-rw-r--r--PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java15
-rw-r--r--PermissionController/tests/inprocess/src/com/android/permissioncontroller/permission/ui/model/PermissionUsageDetailsViewModelTest.kt9
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt108
-rw-r--r--PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/utils/GrantRevokeTests.kt2
-rw-r--r--PermissionController/tests/permissionui/Android.bp2
-rw-r--r--PermissionController/tests/permissionui/AndroidTest.xml4
-rw-r--r--PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/Android.bp34
-rw-r--r--PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/AndroidManifest.xml25
-rw-r--r--PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/Android.bp34
-rw-r--r--PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/AndroidManifest.xml25
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt73
-rw-r--r--PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/TestAppUtils.kt8
-rw-r--r--PermissionController/wear-permission-components/Android.bp67
-rw-r--r--PermissionController/wear-permission-components/AndroidManifest.xml18
-rw-r--r--PermissionController/wear-permission-components/res/drawable/ic_security_update_good.xml (renamed from PermissionController/res/drawable/ic_security_update_good.xml)0
-rw-r--r--PermissionController/wear-permission-components/res/values/donottranslate.xml (renamed from PermissionController/res/values-watch/donottranslate.xml)0
-rw-r--r--PermissionController/wear-permission-components/res/values/overlayable.xml87
-rw-r--r--PermissionController/wear-permission-components/res/values/strings.xml7
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/AnnotatedText.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt)9
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/CheckYourPhone.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/CheckYourPhone.kt)74
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/DrawablePainter.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/DrawablePainter.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt)25
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/AlertDialog.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/AlertDialog.kt)19
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Chip.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/Icon.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Icon.kt)10
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/ListFooter.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListFooter.kt)3
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/ListHeader.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListHeader.kt)3
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/ResponsiveDialog.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ResponsiveDialog.kt)18
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ToggleChip.kt)7
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/Wear2Scaffold.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Wear2Scaffold.kt)9
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnDefaults.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnDefaults.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnState.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnState.kt)6
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButton.kt)8
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButtonStyle.kt)15
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionConfirmationDialog.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionConfirmationDialog.kt)6
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionIconBuilder.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionIconBuilder.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListFooter.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListFooter.kt)9
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListSubHeader.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListSubHeader.kt)8
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffold.kt)183
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffoldPaddingDefaults.kt)18
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControl.kt)10
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControlStyle.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControlStyle.kt)6
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/ResourceHelper.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/ResourceHelper.kt)10
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3ColorScheme.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt)21
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Shapes.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Shapes.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3TypeScaleTokens.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3TypeScaleTokens.kt)2
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Typography.kt)4
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3VariableFontTokens.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3VariableFontTokens.kt)2
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearMaterialBridgedLegacyTheme.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt)6
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearOverlayableMaterial3Theme.kt (renamed from PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt)18
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTheme.kt59
-rw-r--r--PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTonalPalette.kt216
-rw-r--r--SafetyCenter/Resources/res/values-sk/strings.xml2
-rw-r--r--flags/flags.aconfig9
-rw-r--r--tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt67
-rw-r--r--tests/cts/permissionpolicy/res/raw/android_manifest.xml8
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt9
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/MediaPermissionTest.kt35
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt69
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt59
230 files changed, 3867 insertions, 3093 deletions
diff --git a/PermissionController/Android.bp b/PermissionController/Android.bp
index 397870c20..dd1b82dc7 100644
--- a/PermissionController/Android.bp
+++ b/PermissionController/Android.bp
@@ -158,10 +158,10 @@ android_library {
"androidx.compose.runtime_runtime",
"androidx.compose.runtime_runtime-livedata",
"androidx.compose.ui_ui",
- "androidx.wear.compose_compose-material",
"androidx.wear.compose_compose-material3",
"android.content.pm.flags-aconfig-java-export",
"android.os.flags-aconfig-java-export",
+ "wear-permission-components",
],
lint: {
diff --git a/PermissionController/OWNERS b/PermissionController/OWNERS
index 5a58ec2f5..aceac6afa 100644
--- a/PermissionController/OWNERS
+++ b/PermissionController/OWNERS
@@ -17,6 +17,7 @@ per-file res/** = file:platform/packages/modules/Permission:/SafetyCenter/OWNERS
# For Wear related changes
per-file WEAR_OWNERS = file:/PermissionController/WEAR_OWNERS
+per-file wear-permission-components/** = file:/PermissionController/WEAR_OWNERS
per-file src/com/android/permissioncontroller/permission/ui/wear/** = file:/PermissionController/WEAR_OWNERS
per-file src/com/android/permissioncontroller/role/ui/wear/** = file:/PermissionController/WEAR_OWNERS
per-file src/com/android/permissioncontroller/incident/wear/** = file:/PermissionController/WEAR_OWNERS
diff --git a/PermissionController/lint-baseline.xml b/PermissionController/lint-baseline.xml
index be77a0d18..b1570d0b7 100644
--- a/PermissionController/lint-baseline.xml
+++ b/PermissionController/lint-baseline.xml
@@ -1,16 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
-<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="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/v31/AllLightHistoricalPackageOpsLiveData.kt"
- line="46"
- column="5"/>
- </issue>
+<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"
@@ -20,7 +10,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="504"
- column="31"/>
+ column="31" />
</issue>
<issue
@@ -31,7 +21,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="505"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -42,7 +32,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="509"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -53,7 +43,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="513"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -64,7 +54,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="515"
- column="59"/>
+ column="59" />
</issue>
<issue
@@ -75,7 +65,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="518"
- column="42"/>
+ column="42" />
</issue>
<issue
@@ -86,7 +76,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="519"
- column="42"/>
+ column="42" />
</issue>
<issue
@@ -97,7 +87,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="521"
- column="18"/>
+ column="18" />
</issue>
<issue
@@ -108,7 +98,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionFragment.java"
line="522"
- column="29"/>
+ column="29" />
</issue>
<issue
@@ -119,7 +109,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="709"
- column="31"/>
+ column="31" />
</issue>
<issue
@@ -130,7 +120,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="710"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -141,7 +131,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="714"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -152,7 +142,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="718"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -163,7 +153,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="720"
- column="59"/>
+ column="59" />
</issue>
<issue
@@ -174,7 +164,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="722"
- column="67"/>
+ column="67" />
</issue>
<issue
@@ -185,7 +175,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="722"
- column="42"/>
+ column="42" />
</issue>
<issue
@@ -196,7 +186,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="724"
- column="18"/>
+ column="18" />
</issue>
<issue
@@ -207,7 +197,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/AppPermissionFragment.java"
line="725"
- column="29"/>
+ column="29" />
</issue>
<issue
@@ -218,7 +208,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionsFragment.java"
line="159"
- column="35"/>
+ column="35" />
</issue>
<issue
@@ -229,7 +219,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/AppPermissionsFragment.java"
line="367"
- column="35"/>
+ column="35" />
</issue>
<issue
@@ -240,7 +230,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="463"
- column="31"/>
+ column="31" />
</issue>
<issue
@@ -251,7 +241,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="464"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -262,7 +252,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="468"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -273,7 +263,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="472"
- column="41"/>
+ column="41" />
</issue>
<issue
@@ -284,7 +274,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="474"
- column="59"/>
+ column="59" />
</issue>
<issue
@@ -295,7 +285,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="476"
- column="67"/>
+ column="67" />
</issue>
<issue
@@ -306,7 +296,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="476"
- column="42"/>
+ column="42" />
</issue>
<issue
@@ -317,7 +307,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="478"
- column="18"/>
+ column="18" />
</issue>
<issue
@@ -328,7 +318,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/AutoAppPermissionFragment.java"
line="479"
- column="29"/>
+ column="29" />
</issue>
<issue
@@ -339,7 +329,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/GrantPermissionsViewModel.kt"
line="1059"
- column="45"/>
+ column="45" />
</issue>
<issue
@@ -350,7 +340,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
line="48"
- column="74"/>
+ column="74" />
</issue>
<issue
@@ -361,7 +351,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/data/HibernatedPackagesLiveData.kt"
line="51"
- column="44"/>
+ column="44" />
</issue>
<issue
@@ -372,7 +362,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardAnimator.kt"
line="47"
- column="37"/>
+ column="37" />
</issue>
<issue
@@ -383,7 +373,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
line="653"
- column="29"/>
+ column="29" />
</issue>
<issue
@@ -394,7 +384,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
line="662"
- column="18"/>
+ column="18" />
</issue>
<issue
@@ -405,7 +395,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt"
line="1689"
- column="48"/>
+ column="48" />
</issue>
<issue
@@ -416,7 +406,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
line="140"
- column="72"/>
+ column="72" />
</issue>
<issue
@@ -427,7 +417,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightPackageInfo.kt"
line="140"
- column="62"/>
+ column="62" />
</issue>
<issue
@@ -438,7 +428,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="288"
- column="19"/>
+ column="19" />
</issue>
<issue
@@ -449,7 +439,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="291"
- column="48"/>
+ column="48" />
</issue>
<issue
@@ -460,7 +450,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="291"
- column="30"/>
+ column="30" />
</issue>
<issue
@@ -471,7 +461,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="292"
- column="30"/>
+ column="30" />
</issue>
<issue
@@ -482,7 +472,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="292"
- column="39"/>
+ column="39" />
</issue>
<issue
@@ -493,7 +483,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="298"
- column="5"/>
+ column="5" />
</issue>
<issue
@@ -504,7 +494,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="298"
- column="12"/>
+ column="12" />
</issue>
<issue
@@ -515,7 +505,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="301"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -526,7 +516,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/model/LiveSafetyCenterViewModel.kt"
line="308"
- column="13"/>
+ column="13" />
</issue>
<issue
@@ -537,7 +527,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/MoreIssuesCardAnimator.kt"
line="110"
- column="21"/>
+ column="21" />
</issue>
<issue
@@ -548,7 +538,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/MoreIssuesCardAnimator.kt"
line="110"
- column="46"/>
+ column="46" />
</issue>
<issue
@@ -559,7 +549,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
line="114"
- column="35"/>
+ column="35" />
</issue>
<issue
@@ -570,7 +560,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/television/PermissionAppsFragment.java"
line="365"
- column="35"/>
+ column="35" />
</issue>
<issue
@@ -581,7 +571,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/ui/model/PermissionAppsViewModel.kt"
line="100"
- column="43"/>
+ column="43" />
</issue>
<issue
@@ -592,7 +582,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
line="521"
- column="43"/>
+ column="43" />
</issue>
<issue
@@ -603,7 +593,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
line="521"
- column="75"/>
+ column="75" />
</issue>
<issue
@@ -614,7 +604,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
line="522"
- column="48"/>
+ column="48" />
</issue>
<issue
@@ -625,7 +615,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/permission/service/PermissionControllerServiceImpl.java"
line="522"
- column="24"/>
+ column="24" />
</issue>
<issue
@@ -636,7 +626,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
line="85"
- column="42"/>
+ column="42" />
</issue>
<issue
@@ -647,7 +637,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
line="97"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -658,7 +648,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
line="141"
- column="73"/>
+ column="73" />
</issue>
<issue
@@ -669,7 +659,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
line="146"
- column="34"/>
+ column="34" />
</issue>
<issue
@@ -680,7 +670,7 @@
<location
file="packages/modules/Permission/PermissionController/src/com/android/permissioncontroller/safetycenter/service/SafetyCenterBackgroundRefreshJobService.java"
line="152"
- column="29"/>
+ column="29" />
</issue>
</issues> \ No newline at end of file
diff --git a/PermissionController/res/values-af/strings.xml b/PermissionController/res/values-af/strings.xml
index 9267438f9..dc996a30d 100644
--- a/PermissionController/res/values-af/strings.xml
+++ b/PermissionController/res/values-af/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g>toegang vir hierdie app op <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Sien al <xliff:g id="APP">%1$s</xliff:g> se toestemmings"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Sien alle apps met hierdie toestemming"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Wys Assistent-mikrofoongebruik"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Instellings vir ongebruikte apps"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Verwyder toestemmings as app nie gebruik word nie"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Laat beperkte instellings toe"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Beperkte instelling"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Hierdie instelling is vir jou veiligheid tans onbeskikbaar."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Handeling nie beskikbaar tydens ’n foonoproep nie"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Swendelaars versoek dikwels hierdie soort handeling tydens foonoproepgesprekke en dis dus geblokkeer om jou te beskerm. As jy aangesê word om hierdie handeling te doen deur iemand wat jy nie ken nie, kan dit ’n swendelary wees."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Jy kan nie tydens ’n foonoproep apps toelaat om ander apps te installeer nie."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Jy kan nie tydens ’n foonoproep ’n app toegang tot toeganklikheid gee nie."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Jy kan nie tydens ’n foonoproep hierdie instelling aktiveer nie."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Toegang tot <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> is geweier vir die app"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Die app het toegang tot toestemming vir sensitiewe inligting versoek wat jou persoonlike en finansiële inligting in gevaar kan stel.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Dit is moontlik dat die app nie reg sal werk sonder hierdie beperkte toestemming nie. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Kry meer inligting oor hoe om toegang toe te laat&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Toegang is geweier vir app om die verstek <xliff:g id="ROLE_NAME">%1$s</xliff:g> te wees"</string>
diff --git a/PermissionController/res/values-am/strings.xml b/PermissionController/res/values-am/strings.xml
index 1cbb312af..6affc55dd 100644
--- a/PermissionController/res/values-am/strings.xml
+++ b/PermissionController/res/values-am/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ላይ ለዚህ መተግበሪያ የ<xliff:g id="PERM">%1$s</xliff:g> መዳረሻ"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"የተገደቡ ቅንብሮችን ፍቀድ"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"የተገደበ ቅንብር"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ለእርስዎ ደህንነት ሲባል ይህ ቅንብር በአሁኑ ጊዜ አይገኝም።"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"በስልክ ጥሪ ላይ ሳለ እርምጃ አይገኝም"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n አጭበርባሪዎች ብዙ ጊዜ እንደዚህ ዓይነት እርምጃ በስልክ ጥሪ ውይይቶች ወቅት ይጠይቃሉ፣ ስለዚህ እርስዎን ለመጠበቅ ታግዷል። ይህን እርምጃ በማያውቁት ሰው እንዲወስዱ እየተመሩ ከሆነ፣ ማጭበርበር ሊሆን ይችላል።"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"መተግበሪያዎች በስልክ ጥሪ ወቅት ሌሎች መተግበሪያዎችን እንዲጭኑ መፍቀድ አይፈቀድም።"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"በስልክ ጥሪ ጊዜ ለመተግበሪያ የተደራሽነት መዳረሻ መስጠት አይፈቀድም።"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"በስልክ ጥሪ ወቅት ይህን ቅንብር ማንቃት አይፈቀድም።"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"መተግበሪያ የ<xliff:g id="PERMISSION_NAME">%1$s</xliff:g> መዳረሻ ተከልክሏል"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"መተግበሪያው የእርስዎን የግል እና የፋይናንስ መረጃ አደጋ ላይ የሚጥል አደገኛ ፈቃድ እንዲደርስ ጠይቋል።<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ያለዚህ የተገደበ ፈቃድ መተግበሪያው በትክክል ላይሰራ ይችላል። &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;እንዴት መዳረሻን እንደሚፈቅዱ ይረዱ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"መተግበሪያ ነባሪ <xliff:g id="ROLE_NAME">%1$s</xliff:g> የመሆን መዳረሻ ተከልክሏል"</string>
diff --git a/PermissionController/res/values-ar-v33/strings.xml b/PermissionController/res/values-ar-v33/strings.xml
index b85d9f90a..3c86f5ffd 100644
--- a/PermissionController/res/values-ar-v33/strings.xml
+++ b/PermissionController/res/values-ar-v33/strings.xml
@@ -30,8 +30,7 @@
<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{التوسيع لعرض تنبيه واحد إضافي}zero{التوسيع لعرض # تنبيه إضافي}two{التوسيع لعرض تنبيهين إضافيَين}few{التوسيع لعرض # تنبيهات إضافية}many{التوسيع لعرض # تنبيهًا إضافيًا}other{التوسيع لعرض # تنبيه إضافي}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"تصغير"</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>
diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml
index da4f5fcd3..f6d9312e6 100644
--- a/PermissionController/res/values-ar/strings.xml
+++ b/PermissionController/res/values-ar/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"إذن \"<xliff:g id="PERM">%1$s</xliff:g>\" لهذا التطبيق على \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"‏عرض أذونات استخدام ميكروفون \"مساعد Google\""</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"إعدادات التطبيقات غير المُستخدَمة"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"إزالة الأذونات في حال عدم استخدام التطبيق"</string>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"السماح بالإعدادات المحظورة"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"الإعداد محظور"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"للحفاظ على أمانك، هذا الإعداد غير متوفِّر حاليًا."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"لا يتوفّر هذا الإجراء أثناء إجراء مكالمة هاتفية"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"تم منع التطبيق من الوصول إلى <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"‏طلب التطبيق أحد أذونات الوصول إلى المعلومات الحساسة، ما قد يعرّض معلوماتك الشخصية والمالية للخطر.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>من المحتمل ألا يعمل التطبيق بشكل صحيح إذا لم يحصل على هذا الإذن المقيَّد. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;مزيد من المعلومات حول كيفية منح الأذونات&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-as/strings.xml b/PermissionController/res/values-as/strings.xml
index 5ec136613..f9fd61375 100644
--- a/PermissionController/res/values-as/strings.xml
+++ b/PermissionController/res/values-as/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>ত এই এপৰ <xliff:g id="PERM">%1$s</xliff:g>ৰ এক্সেছ"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"তথ্য"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"ছেটিং"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"প্ৰতিবন্ধিত ছেটিঙৰ অনুমতি দিয়ক"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"প্ৰতিবন্ধিত ছেটিং"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"আপোনাৰ সুৰক্ষাৰ বাবে, এই ছেটিংটো বৰ্তমান উপলব্ধ নহয়।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ফ’ন কল চলি থকাৰ সময়ত এই কাৰ্যটো কৰিব নোৱাৰি"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ফ’ন কলত বাৰ্তালাপ চলি থকাৰ সময়ত প্ৰৱঞ্চকে প্ৰায়েই এই ধৰণৰ কাৰ্য কৰিবলৈ অনুৰোধ কৰে, গতিকে আপোনাক সুৰক্ষিত কৰিবলৈ এইটো অৱৰোধ কৰা হৈছে। যদি আপোনাক আপুনি চিনি নোপোৱা কোনো লোকে এই কাৰ্যটো কৰিবলৈ নিৰ্দেশনা দিয়ে, সেয়া প্ৰৱঞ্চনা হ’ব পাৰে।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ফ’ন কল চলি থকাৰ সময়ত কোনো এপক অন্য এপ্‌ ইনষ্টল কৰিবলৈ অনুমতি দিয়া নহয়।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"কোনো এপক ফ’ন কলৰ সময়ত সাধ্য সুবিধাৰ এক্সেছ প্ৰদান কৰাৰ অনুমতি দিয়া নহয়।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ফ’ন কল চলি থকাৰ সময়ত এই ছেটিংটো সক্ষম কৰাৰ অনুমতি দিয়া নহয়।"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"এপ্‌টোক <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>ৰ এক্সেছ প্ৰত্যাখ্যান কৰা হৈছে"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"এপ্‌টোৱে সংবেদনশীল অনুমতি এক্সেছ কৰিবলৈ অনুৰোধ কৰিছে, যিটোৱে আপোনাৰ ব্যক্তিগত আৰু বিত্তীয় তথ্য বিপদাপন্ন কৰিব পাৰে।<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>এপ্‌টোৱে এই প্ৰতিবন্ধিত অনুমতিটোৰ অবিহনে সঠিককৈ কাম নকৰাটো সম্ভৱ হ’ব পাৰে। &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;কেনেকৈ এক্সেছৰ অনুমতি দিব লাগে জানক&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"এপ্‌টোক ডিফ’ল্ট <xliff:g id="ROLE_NAME">%1$s</xliff:g>ৰ এক্সেছ প্ৰত্যাখ্যান কৰা হৈছে"</string>
diff --git a/PermissionController/res/values-az/strings.xml b/PermissionController/res/values-az/strings.xml
index a630b9c27..5f6682fec 100644
--- a/PermissionController/res/values-az/strings.xml
+++ b/PermissionController/res/values-az/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> cihazında bu tətbiq üçün <xliff:g id="PERM">%1$s</xliff:g> girişi"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Bütün <xliff:g id="APP">%1$s</xliff:g> icazələrinə baxın"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Bu icazəyə sahib olan bütün tətbiqlərə baxın"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistent üçün mikrofon istifadəsini göstərin"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"İstifadə edilməyən tətbiq ayarları"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Tətbiq işlənməyəndə icazə ləğv edilsin"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Məhdudlaşdırılmış ayarlara icazə verin"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Məhdudlaşdırılmış ayar"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Güvənlik üçün bu ayar əlçatan deyil."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Telefon zəngi zamanı əməliyyat mümkün deyil"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Adətən, fırıldaqçılar telefon danışıqları zamanı bu cür əməliyyatı icra etməyinizi tələb edirlər, ona görə də sizi qorumaq üçün bloklanıb. Tanımadığınız şəxsin bu əməliyyatı icra etməyinizi istəməsi fırıldaqçılıq ola bilər."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Telefon zəngi zamanı tətbiqlərin digər tətbiqləri quraşdırmağına icazə verilmir."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Telefon zəngi zamanı tətbiqə xüsusi imkanlara giriş icazəsi verilmir."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Telefon zəngi zamanı bu ayarın aktivləşdirilməsinə icazə verilmir."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Tətbiqə <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> icazəsinə giriş verilmədi"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Tətbiq şəxsi və maliyyə məlumatlarınızı riskə ata biləcək həssas məlumat icazəsinə giriş istədi.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Bu məhdud icazə olmadan tətbiq düzgün işləməyə bilər. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Girişə icazə vermək haqqında ətraflı&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Tətbiqə defolt <xliff:g id="ROLE_NAME">%1$s</xliff:g> roluna giriş verilmədi"</string>
diff --git a/PermissionController/res/values-b+sr+Latn/strings.xml b/PermissionController/res/values-b+sr+Latn/strings.xml
index 4b1d9c287..e9b76eaa6 100644
--- a/PermissionController/res/values-b+sr+Latn/strings.xml
+++ b/PermissionController/res/values-b+sr+Latn/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Ova aplikacija ima pristup za: <xliff:g id="PERM">%1$s</xliff:g> na uređaju <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Prikaži sve dozvole za: <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Prikaži sve aplikacije sa ovom dozvolom"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informacije"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Podešavanja"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Prikaži kako Pomoćnik koristi mikrofon"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Podešavanja nekorišćenih aplikacija"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni dozvole ako se aplikacija ne koristi"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Dozvoli ograničena podešavanja"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ograničeno podešavanje"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ovo podešavanje je trenutno nedostupno radi vaše bezbednosti."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Radnja nije dostupna tokom telefonskog poziva"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Prevaranti često traže ovaj tip radnje tokom telefonskog poziva, pa smo je blokirali da bismo vas zaštitili. Ako vas neko koga ne poznajete upućuje na ovu radnju, to bi mogla da bude prevara."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Nije dozvoljeno da aplikacije instaliraju druge aplikacije tokom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Nije dozvoljeno da aplikacija dobije pristup usluzi pristupačnosti tokom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Omogućavanje ovog podešavanja nije dozvoljeno tokom telefonskog poziva."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaciji nije dozvoljen pristup dozvoli: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zatražila pristup osetljivoj dozvoli, što može da ugrozi bezbednost ličnih i finansijskih podataka.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Aplikacija možda neće raditi ispravno bez ove ograničene dozvole. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako da dozvolite pristup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji nije dozvoljen pristup da postane podrazumevana: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-be-v33/strings.xml b/PermissionController/res/values-be-v33/strings.xml
index ef1c1e6d1..0742aa8d7 100644
--- a/PermissionController/res/values-be-v33/strings.xml
+++ b/PermissionController/res/values-be-v33/strings.xml
@@ -30,8 +30,7 @@
<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{Разгарніце, каб убачыць яшчэ # абвестку}few{Разгарніце, каб убачыць яшчэ # абвесткі}many{Разгарніце, каб убачыць яшчэ # абвестак}other{Разгарніце, каб убачыць яшчэ # абвесткі}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Згарнуць"</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>
diff --git a/PermissionController/res/values-be/strings.xml b/PermissionController/res/values-be/strings.xml
index ed0c0ea0c..1445a34d4 100644
--- a/PermissionController/res/values-be/strings.xml
+++ b/PermissionController/res/values-be/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Дазвол \"<xliff:g id="PERM">%1$s</xliff:g>\" для гэтай праграмы на прыладзе \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
<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="app_permission_info_button" msgid="8973692370208562556">"Інфармацыя"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Налады"</string>
<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>
@@ -674,14 +676,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Дазволіць абмежаваныя налады"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Налада з абмежаваным доступам"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"У мэтах бяспекі гэта налада цяпер недаступная."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Дзеянне недаступнае падчас тэлефоннага выкліку"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Праграме адмоўлена ў дазволе \"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>\""</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Праграма запытала дазвол на доступ да канфідэнцыяльнай інфармацыі. Калі вы яго дасце, ваша асабістая і фінансавая інфармацыя можа аказацца ў небяспецы.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Магчыма, без гэтага абмежаванага дазволу праграма не будзе працаваць належным чынам. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Даведацца, як дазволіць доступ&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-bg/strings.xml b/PermissionController/res/values-bg/strings.xml
index b6c019624..8836e5d06 100644
--- a/PermissionController/res/values-bg/strings.xml
+++ b/PermissionController/res/values-bg/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Достъп до <xliff:g id="PERM">%1$s</xliff:g> на <xliff:g id="DEVICE_NAME">%2$s</xliff:g> за това приложение"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Разрешаване на ограничените настройки"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ограничена настройка"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"От съображения за сигурност понастоящем тази настройка не е налице."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Действието не е налице по време на тел. обаждане"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\nТова действие е блокирано от съображения за сигурност, защото често се използва от измамници по време на телефонни разговори. Ако човек, когото не познавате, ви напътства, за да предприемете това действие, възможно е да става дума за измама."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"По време на телефонно обаждане не можете да разрешавате на приложенията да инсталират други приложения."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"По време на телефонно обаждане не е разрешено да давате на приложение достъп до услугата за достъпност."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Активирането на тази настройка не е разрешено по време на телефонно обаждане."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"На приложението бе отказан достъп до <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Приложението поиска разрешение за достъп до поверителни данни, което може да изложи на риск личната или финансовата ви информация.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Възможно е приложението да не работи правилно без това ограничено разрешение. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Научете как да разрешите достъпа&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Приложението не получи разрешение да бъде по подразбиране: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-bn/strings.xml b/PermissionController/res/values-bn/strings.xml
index a1dc63ec2..b041f25b6 100644
--- a/PermissionController/res/values-bn/strings.xml
+++ b/PermissionController/res/values-bn/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>-এ এই অ্যাপের জন্য <xliff:g id="PERM">%1$s</xliff:g>-এর অ্যাক্সেস"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant-এর মাইক্রোফোন ব্যবহার সম্পর্কিত ডেটা দেখুন"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"ব্যবহার করা হয়নি এমন অ্যাপ সেটিংস"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"অ্যাপ ব্যবহার করা না হলে সেটি থেকে অনুমতি প্রত্যাহার করে নিন"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"বিধিনিষেধযুক্ত সেটিংসের অনুমতি দিন"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"বিধিনিষেধযুক্ত সেটিংস"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"আপনার নিরাপত্তার জন্য, এই সেটিং বর্তমানে উপলভ্য নেই।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ফোন কলের সময় অ্যাকশন নেওয়া যাবে না"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ফোন কলের সময় স্ক্যামার প্রায়ই এই ধরনের অ্যাকশনের অনুরোধ করেন, তাই আপনাকে সুরক্ষিত রাখতে এটি ব্লক করা হয়েছে। আপনি চেনেন না এমন কেউ আপনাকে এই অ্যাকশন নিতে বললে, সেটি স্ক্যাম হতে পারে।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ফোন কলের সময় অ্যাপকে অন্য অ্যাপ ইনস্টল করার অনুমতি দেওয়া হয় না।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ফোন কল চলার সময় কোনও অ্যাপকে অ্যাক্সেসিবিলিটির অ্যাক্সেস দেওয়ার অনুমতি দেওয়া হয় না।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ফোন কল চলার সময় এই সেটিংস চালু করার অনুমতি দেওয়া হয় না।"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"অ্যাপকে <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> অ্যাক্সেস করতে দেওয়া হয়নি"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"অ্যাপটি সংবেদনশীল অনুমতি অ্যাক্সেস করার অনুরোধ জানিয়েছে, যার জন্য আপনার ব্যক্তিগত ও আর্থিক অবস্থা সম্পর্কিত তথ্যের ক্ষেত্রে ঝুঁকির সম্ভাবনা থাকতে পারে।<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>এই সীমাবদ্ধ অনুমতি ছাড়া অ্যাপটি সঠিকভাবে কাজ না করার সম্ভাবনাও আছে। &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;কীভাবে অ্যাক্সেস করার অনুমতি দেবেন সেই সম্পর্কে জানুন&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"অ্যাপকে ডিফল্ট <xliff:g id="ROLE_NAME">%1$s</xliff:g> হিসেবে কাজ করার অ্যাক্সেস দেওয়া হয়নি"</string>
diff --git a/PermissionController/res/values-bs/strings.xml b/PermissionController/res/values-bs/strings.xml
index f89c78760..447941fad 100644
--- a/PermissionController/res/values-bs/strings.xml
+++ b/PermissionController/res/values-bs/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Pristup aplikaciji \"<xliff:g id="PERM">%1$s</xliff:g>\" za ovu aplikaciju na uređaju \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Prikaži sva odobrenja aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Prikaži sve aplikacije s ovim odobrenjem"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informacije"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Postavke"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Prikaži korištenje mikrofona asistenta"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Postavke za nekorištene aplikacije"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni odobrenja ako se aplikacija ne koristi"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Dozvoli ograničene postavke"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ograničena postavka"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Radi vaše sigurnosti postavka trenutno nije dostupna."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Radnja nije dostupna tokom telefonskog poziva"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Prevaranti često traže ovu vrstu radnje tokom telefonskih razgovora, pa ovo blokiramo da vas zaštitimo. Ako neko koga ne poznajete traži da poduzmete ovu radnju, to može biti prevara."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Dozvoljavanje aplikacijama da instaliraju druge aplikacije nije dozvoljeno tokom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Davanje aplikaciji pristup pristupačnosti nije dozvoljeno tokom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Omogućavanje ove postavke nije dozvoljeno tokom telefonskog poziva."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaciji je odbijen pristup odobrenju <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zatražila pristup osjetljivom odobrenju, što može ugroziti vaše lične i finansijske informacije.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće ispravno raditi bez ovog ograničenog odobrenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako dozvoliti pristup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji je odbijen pristup da bude zadana <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-ca/strings.xml b/PermissionController/res/values-ca/strings.xml
index 67b3b63ff..650a98944 100644
--- a/PermissionController/res/values-ca/strings.xml
+++ b/PermissionController/res/values-ca/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Accés de <xliff:g id="PERM">%1$s</xliff:g> a aquesta aplicació (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Mostra tots els permisos per a <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Mostra totes les aplicacions que tenen aquest permís"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostra l\'ús del micròfon de l\'Assistent"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Configuració d\'aplicació no utilitzada"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Suprimeix els permisos si no s\'utilitza l\'aplicació"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permet la configuració restringida"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Opció de configuració restringida"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Per a la teva seguretat, aquesta opció de configuració no està disponible en aquests moments."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Acció no disponible durant les trucades"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Els estafadors solen demanar aquest tipus d\'acció durant les trucades, de manera que s\'ha bloquejat per protegir-te. Si algú que no coneixes t\'indica que facis aquesta acció, pot ser que es tracti d\'una estafa."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"No es permet que les aplicacions instal·lin altres aplicacions durant una trucada."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"No es permet donar a una aplicació accés a l\'accessibilitat durant una trucada."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"No es permet activar aquesta opció de configuració durant una trucada."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"A l\'aplicació se li ha denegat l\'accés a <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"L\'aplicació ha demanat accés a un permís sensible, el qual pot posar en risc la teva informació personal o financera.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>És possible que l\'aplicació no funcioni correctament sense aquest permís restringit. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Més informació sobre com pots permetre l\'accés&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"A l\'aplicació se li ha denegat l\'accés per ser <xliff:g id="ROLE_NAME">%1$s</xliff:g> de manera predeterminada"</string>
diff --git a/PermissionController/res/values-cs-v33/strings.xml b/PermissionController/res/values-cs-v33/strings.xml
index e46488c6f..0f17ff2d3 100644
--- a/PermissionController/res/values-cs-v33/strings.xml
+++ b/PermissionController/res/values-cs-v33/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="role_dialer_request_description" msgid="6188305064871543419">"Tato aplikace vám bude moci zasílat oznámení a bude mít přístup k fotoaparátu, kontaktům, mikrofonu, telefonu a SMS"</string>
- <string name="role_sms_request_description" msgid="1506966389698625395">"Tato aplikace vám bude moci zasílat oznámení a bude mít přístup k fotoaparátu, kontaktům, souborům, mikrofonu, telefonu a SMS"</string>
+ <string name="role_sms_request_description" msgid="1506966389698625395">"Tato aplikace vám bude moct zasílat oznámení a bude mít přístup k fotoaparátu, kontaktům, souborům, mikrofonu, telefonu a SMS"</string>
<string name="permission_description_summary_storage" msgid="1917071243213043858">"Aplikace s tímto oprávněním mají přístup ke všem souborům v tomto zařízení"</string>
<string name="work_policy_title" msgid="832967780713677409">"Informace o vašich pracovních zásadách"</string>
<string name="work_policy_summary" msgid="3886113358084963931">"Nastavení spravuje IT administrátor"</string>
@@ -30,8 +30,7 @@
<string name="safety_center_more_issues_card_title" msgid="7425844746197493312">"Další upozornění"</string>
<string name="safety_center_dismissed_issues_card_title" msgid="2340129842725145733">"Zavřená upozornění"</string>
<string name="safety_center_more_issues_card_expand_action" msgid="7109451851052272946">"{count,plural, =1{Rozbalením zobrazíte jedno další upozornění}few{Rozbalením zobrazíte # další upozornění}many{Rozbalením zobrazíte # dalšího upozornění}other{Rozbalením zobrazíte # dalších upozornění}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Sbalit"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Upozornění. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"Akce dokončena"</string>
<string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Zkontrolujte nastavení, která mohou zvýšit ochranu vašeho zařízení"</string>
diff --git a/PermissionController/res/values-cs/strings.xml b/PermissionController/res/values-cs/strings.xml
index eaf2b1041..6d41087a7 100644
--- a/PermissionController/res/values-cs/strings.xml
+++ b/PermissionController/res/values-cs/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Přístup k <xliff:g id="PERM">%1$s</xliff:g> pro tuto aplikaci v zařízení <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Zobrazit všechna oprávnění aplikace <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Zobrazit všechny aplikace s tímto oprávněním"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Zobrazit používání mikrofonu asistentem"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nastavení nepoužívaných aplikací"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Odebrat oprávnění, pokud se aplikace nepoužívá"</string>
@@ -450,7 +454,7 @@
<string name="special_app_access_no_apps" msgid="4102911722787886970">"Žádné aplikace"</string>
<string name="home_missing_work_profile_support" msgid="1756855847669387977">"Nepodporuje pracovní profil"</string>
<string name="encryption_unaware_confirmation_message" msgid="8274491794636402484">"Poznámka: Pokud restartujete zařízení a máte nastavený zámek obrazovky, tato aplikace se nespustí, dokud zařízení neodemknete."</string>
- <string name="assistant_confirmation_message" msgid="7476540402884416212">"Asistent bude moci číst informace o aplikacích používaných v systému, včetně údajů viditelných na obrazovce a přístupných v rámci aplikací."</string>
+ <string name="assistant_confirmation_message" msgid="7476540402884416212">"Asistent bude moct číst informace o aplikacích používaných v systému, včetně údajů viditelných na obrazovce a přístupných v rámci aplikací."</string>
<string name="incident_report_channel_name" msgid="3144954065936288440">"Sdílet data ladění"</string>
<string name="incident_report_notification_title" msgid="4635984625656519773">"Sdílet podrobná data pro ladění?"</string>
<string name="incident_report_notification_text" msgid="3376480583513587923">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> chce nahrát informace pro ladění."</string>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Povolit omezená nastavení"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Blokované nastavení"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Z důvodu vaší bezpečnosti toto nastavení momentálně není dostupné."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Akce není během telefonního hovoru k dispozici"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaci byl odepřen přístup k oprávnění <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikace požádala o přístup k citlivému oprávnění, které může ohrozit vaše osobní a finanční údaje.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Je možné, že aplikace bez tohoto oprávnění nebude fungovat správně. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Jak povolit přístup&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-da/strings.xml b/PermissionController/res/values-da/strings.xml
index 8965558f5..f5c2e2c77 100644
--- a/PermissionController/res/values-da/strings.xml
+++ b/PermissionController/res/values-da/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"adgang til <xliff:g id="PERM">%1$s</xliff:g> for denne app på <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Se alle tilladelser for <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Se alle apps med denne tilladelse"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Oplysninger"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Indstillinger"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Vis brug af Assistent-mikrofonen"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ubrugte appindstillinger"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjern tilladelser, hvis appen ikke bruges"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Tillad begrænsede indstillinger"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Begrænset indstilling"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Af hensyn til din sikkerhed er denne indstilling i øjeblikket ikke tilgængelig."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Handlingen er utilgængelig under et telefonopkald"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Svindlere opfordrer ofte til denne type handling under telefonopkald, så den er blokeret for at beskytte dig. Hvis du bliver bedt om at foretage denne handling af en person, du ikke kender, kan det være svindel."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Det er ikke tilladt at give apps tilladelse til at installere andre apps under et telefonopkald."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Det er ikke tilladt at give en app adgang til hjælpefunktioner under et telefonopkald."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Det er ikke tilladt at aktivere denne indstilling under et telefonopkald."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Appen blev nægtet adgang til <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Appen anmodede om adgang til en følsom tilladelse, der kan kompromittere dine personlige eller økonomiske oplysninger.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Appen fungerer muligvis ikke korrekt uden denne begrænsede tilladelse. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Se, hvordan du giver tilladelse&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Appen blev nægtet adgang til at være <xliff:g id="ROLE_NAME">%1$s</xliff:g> som standard"</string>
diff --git a/PermissionController/res/values-de/strings.xml b/PermissionController/res/values-de/strings.xml
index 57a6657a2..177a19556 100644
--- a/PermissionController/res/values-de/strings.xml
+++ b/PermissionController/res/values-de/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g>-Zugriff für diese App auf dem <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Alle Berechtigungen der App „<xliff:g id="APP">%1$s</xliff:g>“ anzeigen"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Alle Apps mit dieser Berechtigung anzeigen"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Nutzung der Berechtigung \"Mikrofon\" für Assistant anzeigen"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nicht verwendete App-Einstellungen"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Berechtigungen entfernen, wenn die App nicht verwendet wird"</string>
@@ -362,7 +366,7 @@
<string name="role_browser_request_title" msgid="2895200507835937192">"<xliff:g id="APP_NAME">%1$s</xliff:g> als Standard-Browser-App festlegen?"</string>
<string name="role_browser_request_description" msgid="5888803407905985941">"Keine Berechtigungen erforderlich"</string>
<string name="role_dialer_label" msgid="1100224146343237968">"Standard-App zum Telefonieren"</string>
- <string name="role_dialer_short_label" msgid="7186888549465352489">"Telefon"</string>
+ <string name="role_dialer_short_label" msgid="7186888549465352489">"Telefon App"</string>
<string name="role_dialer_description" msgid="8768708633696539612">"Apps, mit denen du dein Gerät zum Telefonieren benutzen kannst"</string>
<string name="role_dialer_request_title" msgid="5959618560705912058">"<xliff:g id="APP_NAME">%1$s</xliff:g> als Standard-App zum Telefonieren festlegen?"</string>
<string name="role_dialer_request_description" msgid="6288839625724909320">"Diese App erhält Zugriff auf Folgendes: Kamera, Kontakte, Mikrofon, Telefon und SMS"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Eingeschränkte Einstellungen zulassen"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Eingeschränkte Einstellung"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Aus Sicherheitsgründen ist diese Einstellung derzeit nicht verfügbar."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Aktion während Anrufen nicht verfügbar"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Betrüger versuchen oft, dich am Telefon genau dazu zu bringen, daher haben wir diese Art von Aktion zu deinem Schutz blockiert. Drängt dich jemand Unbekanntes dazu, könnte es sich um Betrug handeln."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Während eines Anrufs kannst du Apps nicht erlauben, andere Apps zu installieren."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Während eines Anrufs kannst du einer App keinen Zugriff auf die Bedienungshilfen gewähren."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Während eines Anrufs kannst du diese Einstellung nicht aktivieren."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App wurde Zugriff auf „<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>“ verweigert"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Die App hat Zugriff auf eine vertrauliche Berechtigung angefordert. Wenn du diesen zulässt, sind deine privaten Daten und Finanzdaten eventuell gefährdet.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Die App funktioniert ohne diese eingeschränkte Berechtigung aber möglicherweise nicht richtig. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Informationen dazu, wie du den Zugriff erlaubst&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App wurde der Zugriff verweigert, die standardmäßige <xliff:g id="ROLE_NAME">%1$s</xliff:g> zu sein"</string>
diff --git a/PermissionController/res/values-el/strings.xml b/PermissionController/res/values-el/strings.xml
index 8c5002324..f246d1142 100644
--- a/PermissionController/res/values-el/strings.xml
+++ b/PermissionController/res/values-el/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Πρόσβαση στην άδεια <xliff:g id="PERM">%1$s</xliff:g> για αυτή την εφαρμογή στη συσκευή <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Επιτρέπονται περιορισμένες ρυθμίσεις"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Περιορισμένη ρύθμιση"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Για την ασφάλειά σας, αυτή η ρύθμιση δεν είναι διαθέσιμη αυτή τη στιγμή."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Δεν διατίθεται κατά τη διάρκεια τηλεφωνικής κλήσης"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Οι απατεώνες συχνά ζητούν να κάνετε τέτοιες ενέργειες κατά τη διάρκεια τηλεφωνικών κλήσεων, επομένως η ενέργεια έχει αποκλειστεί για την προστασία σας. Αν κάποιος που δεν γνωρίζετε σας ζητάει να πραγματοποιήσετε αυτή την ενέργεια, ενδέχεται να πρόκειται για απάτη."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Κατά τη διάρκεια μιας τηλεφωνικής κλήσης, δεν επιτρέπεται η παραχώρηση άδειας σε μια εφαρμογή για εγκατάσταση άλλων εφαρμογών."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Κατά τη διάρκεια μιας τηλεφωνικής κλήσης, δεν επιτρέπεται η παραχώρηση πρόσβασης σε μια εφαρμογή στη λειτουργία προσβασιμότητας."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Κατά τη διάρκεια μιας τηλεφωνικής κλήσης, δεν επιτρέπεται η ενεργοποίηση αυτής της ρύθμισης."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Απορρίφθηκε η πρόσβαση της εφαρμογής στην άδεια <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Η εφαρμογή ζήτησε πρόσβαση σε μια άδεια πρόσβασης σε ευαίσθητες πληροφορίες, γεγονός που μπορεί να θέσει σε κίνδυνο τα προσωπικά και οικονομικά στοιχεία σας.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Είναι πιθανό η εφαρμογή να μην λειτουργεί σωστά χωρίς αυτή την περιορισμένη άδεια. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Μάθετε πώς μπορείτε να επιτρέψετε την πρόσβαση&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Δεν επιτράπηκε στην εφαρμογή να οριστεί ως η προεπιλεγμένη <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-en-rAU/strings.xml b/PermissionController/res/values-en-rAU/strings.xml
index b6ebb1439..52394cb99 100644
--- a/PermissionController/res/values-en-rAU/strings.xml
+++ b/PermissionController/res/values-en-rAU/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> access for this app on <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"See all <xliff:g id="APP">%1$s</xliff:g> permissions"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"See all apps with this permission"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Show Assistant microphone usage"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Unused app settings"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Allow restricted settings"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Restricted setting"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"For your security, this setting is currently unavailable."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action not available while on a phone call"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammers often request this type of action during phone call conversations, so it\'s blocked to protect you. If you are being guided to take this action by someone whom you don\'t know, it might be a scam."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Allowing apps to install other apps is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Giving an app access to accessibility is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Enabling this setting is not allowed during a phone call."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App was denied access to <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"The app requested access to a sensitive permission which can put your personal and financial info at risk.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>It\'s possible that the app won\'t work properly without this restricted permission. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Learn how to allow access&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App was denied access to be default <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-en-rCA/strings.xml b/PermissionController/res/values-en-rCA/strings.xml
index dd24b181a..1dd6cf62e 100644
--- a/PermissionController/res/values-en-rCA/strings.xml
+++ b/PermissionController/res/values-en-rCA/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> access for this app on <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"See all <xliff:g id="APP">%1$s</xliff:g> permissions"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"See all apps with this permission"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Information"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Settings"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Show assistant microphone usage"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Unused app settings"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
@@ -674,11 +676,11 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Allow restricted settings"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Restricted setting"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"For your security, this setting is currently unavailable."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action not available while on a phone call"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammers often request this type of action during phone call conversations, so it’s blocked to protect you. If you are being guided to take this action by someone you don’t know, it might be a scam."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Allowing apps to install other apps is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Giving an app access to accessibility is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Enabling this setting is not allowed during a phone call."</string>
+ <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5054064107559019689">"Can’t complete action during call"</string>
+ <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="5049619986796367451">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n This setting is blocked to protect your device and data"</string>
+ <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="7153600694011441796">"Scammers may try to install harmful apps by asking you to install unknown apps from a new source."</string>
+ <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="1086282331085551407">"Scammers may try to take control of your device by asking you to allow accessibility access for an app."</string>
+ <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="8141411486179553156">"Scammers may attempt to harm your device with this setting."</string>
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App was denied access to <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"The app requested access to a sensitive permission which can put your personal and financial info at risk.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>It\'s possible the app won\'t work properly without this restricted permission. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Learn how to allow access&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App was denied access to be default <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-en-rGB/strings.xml b/PermissionController/res/values-en-rGB/strings.xml
index 27aad5e69..4636d123a 100644
--- a/PermissionController/res/values-en-rGB/strings.xml
+++ b/PermissionController/res/values-en-rGB/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> access for this app on <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"See all <xliff:g id="APP">%1$s</xliff:g> permissions"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"See all apps with this permission"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Show Assistant microphone usage"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Unused app settings"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Allow restricted settings"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Restricted setting"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"For your security, this setting is currently unavailable."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action not available while on a phone call"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammers often request this type of action during phone call conversations, so it\'s blocked to protect you. If you are being guided to take this action by someone whom you don\'t know, it might be a scam."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Allowing apps to install other apps is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Giving an app access to accessibility is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Enabling this setting is not allowed during a phone call."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App was denied access to <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"The app requested access to a sensitive permission which can put your personal and financial info at risk.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>It\'s possible that the app won\'t work properly without this restricted permission. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Learn how to allow access&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App was denied access to be default <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-en-rIN/strings.xml b/PermissionController/res/values-en-rIN/strings.xml
index 27aad5e69..4636d123a 100644
--- a/PermissionController/res/values-en-rIN/strings.xml
+++ b/PermissionController/res/values-en-rIN/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> access for this app on <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"See all <xliff:g id="APP">%1$s</xliff:g> permissions"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"See all apps with this permission"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Show Assistant microphone usage"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Unused app settings"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remove permissions if app isn’t used"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Allow restricted settings"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Restricted setting"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"For your security, this setting is currently unavailable."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action not available while on a phone call"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammers often request this type of action during phone call conversations, so it\'s blocked to protect you. If you are being guided to take this action by someone whom you don\'t know, it might be a scam."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Allowing apps to install other apps is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Giving an app access to accessibility is not allowed during a phone call."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Enabling this setting is not allowed during a phone call."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App was denied access to <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"The app requested access to a sensitive permission which can put your personal and financial info at risk.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>It\'s possible that the app won\'t work properly without this restricted permission. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Learn how to allow access&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App was denied access to be default <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-es-rUS/strings.xml b/PermissionController/res/values-es-rUS/strings.xml
index 1dfed45f7..897c3a641 100644
--- a/PermissionController/res/values-es-rUS/strings.xml
+++ b/PermissionController/res/values-es-rUS/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acceso a <xliff:g id="PERM">%1$s</xliff:g> para esta app en <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todos los permisos de <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ver todas las apps que tienen este permiso"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Información"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Configuración"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar el uso del micrófono del Asistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Configuración de apps sin usar"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar los permisos si la app no se usa"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir configuración restringida"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Parámetro restringido"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Por seguridad, este parámetro de configuración no está disponible actualmente."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"La acción no está disponible durante una llamada telefónica"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Esta es una medida de protección contra estafadores que puedan solicitar este tipo de acciones durante conversaciones telefónicas. Si alguien que no conoces te indica que realices esta acción, es posible que se trate de una estafa."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"No se permite que las apps instalen otras apps durante una llamada telefónica."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"No se permite que una app acceda a los servicios de accesibilidad durante una llamada telefónica."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"No se puede habilitar este parámetro de configuración durante una llamada telefónica."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"A la app se le negó el acceso a <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"La app solicitó acceso a un permiso sensible, lo que puede poner en riesgo tu información financiera y personal.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Es posible que la app no funcione como corresponde sin este permiso restringido. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Descubre cómo permitir el acceso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"A la app se le negó el acceso para usarse como <xliff:g id="ROLE_NAME">%1$s</xliff:g> de forma predeterminada"</string>
diff --git a/PermissionController/res/values-es-v33/strings.xml b/PermissionController/res/values-es-v33/strings.xml
index 251059388..fec5ccaee 100644
--- a/PermissionController/res/values-es-v33/strings.xml
+++ b/PermissionController/res/values-es-v33/strings.xml
@@ -33,7 +33,7 @@
<string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Ocultar"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Alerta. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"Acción completada"</string>
- <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Comprueba los ajustes que pueden proteger más tu dispositivo"</string>
+ <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Comprueba los ajustes que pueden ofrecer una mayor protección a tu dispositivo"</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"Ajustes rápidos de seguridad y privacidad"</string>
<string name="safety_center_qs_close_button" msgid="1352313308176244599">"Cerrar"</string>
<string name="safety_center_qs_expand_action" msgid="2193190557696484169">"Desplegar y mostrar opciones"</string>
diff --git a/PermissionController/res/values-es/strings.xml b/PermissionController/res/values-es/strings.xml
index eb54a9e1c..265db38ea 100644
--- a/PermissionController/res/values-es/strings.xml
+++ b/PermissionController/res/values-es/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acceso de <xliff:g id="PERM">%1$s</xliff:g> a esta aplicación en <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todos los permisos de <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ver todas las aplicaciones con este permiso"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar el uso del micrófono del Asistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ajustes de aplicaciones sin usar"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar permisos si la aplicación no se usa"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir ajustes restringidos"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ajuste restringido"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Por seguridad, este ajuste no está disponible actualmente."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Acción no disponible durante una llamada"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Los estafadores suelen solicitar este tipo de acciones durante las conversaciones telefónicas, por lo que esta acción se bloquea para protegerte. Si alguien que no conoces te indica que debes realizar esta acción, podría tratarse de una estafa."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"No es posible permitir que las aplicaciones instalen otras aplicaciones durante una llamada telefónica."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"No se puede dar acceso a los servicios de accesibilidad a una aplicación durante una llamada."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"No se puede habilitar este ajuste durante una llamada telefónica."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Se ha denegado el acceso a <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> a la aplicación"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"La aplicación ha solicitado acceso a un permiso sensible que puede poner en riesgo tu información personal y financiera.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Es posible que la aplicación no funcione correctamente sin este permiso restringido. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Consulta cómo permitir el acceso&lt;/a&gt;."</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Se ha denegado el acceso para que la aplicación sea <xliff:g id="ROLE_NAME">%1$s</xliff:g> predeterminada"</string>
diff --git a/PermissionController/res/values-et-v33/strings.xml b/PermissionController/res/values-et-v33/strings.xml
index d7adc10a0..56dd683ca 100644
--- a/PermissionController/res/values-et-v33/strings.xml
+++ b/PermissionController/res/values-et-v33/strings.xml
@@ -33,7 +33,7 @@
<string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Ahenda"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Hoiatus. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"Toiming on lõpetatud"</string>
- <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Kontrollige seadeid, mis võivad teie seadme kaitset tõhusamaks muuta"</string>
+ <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Kontrollige seadeid, mis võivad teie seadme kaitset tõhusamaks muuta."</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"Turvalisuse ja privaatsuse kiirseaded"</string>
<string name="safety_center_qs_close_button" msgid="1352313308176244599">"Sule"</string>
<string name="safety_center_qs_expand_action" msgid="2193190557696484169">"Laienda ja kuva valikud"</string>
diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml
index f7036cd77..1abb8e473 100644
--- a/PermissionController/res/values-et/strings.xml
+++ b/PermissionController/res/values-et/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> juurdepääs sellele rakendusele seadmes <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Kuva rakenduse <xliff:g id="APP">%1$s</xliff:g> kõik load"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Kuva kõik selle loaga rakendused"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Teave"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Seaded"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Kuva assistendi mikrofoni kasutamine"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Kasutamata rakenduse seaded"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Eemalda load, kui rakendust ei kasutata"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Piiratud seadete lubamine"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Piiratud seade"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Teie turvalisuse huvides pole see seade praegu saadaval."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Toiming pole telefonikõne ajal saadaval"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Petised taotlevad telefonivestluse ajal sageli seda tüüpi toimingut, mistõttu on see teie kaitsmiseks blokeeritud. Kui keegi, keda te ei tea, suunab teid seda toimingut tegema, võib tegu olla pettusega."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Telefonikõne ajal pole lubatud anda rakendustele luba installida teisi rakendusi."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Telefonikõne ajal rakendusele juurdepääsu andmine juurdepääsetavusfunktsioonidele ei ole lubatud."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Selle seade lubamine telefonikõne ajal ei ole lubatud."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Rakendusele ei antud luba <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Rakendus taotles tundlikku luba, mis võib teie isikuandmed ja finantsteabe ohtu seada.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Võimalik, et rakendus ei tööta ilma selle piiratud loata korralikult. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt; Teave juurdepääsu andmise kohta&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Rakendusele ei antud luba olla vaikimisi <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-eu/strings.xml b/PermissionController/res/values-eu/strings.xml
index 01b1924ed..5acbcddab 100644
--- a/PermissionController/res/values-eu/strings.xml
+++ b/PermissionController/res/values-eu/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> erabiltzeko baimena aplikazio honetarako <xliff:g id="DEVICE_NAME">%2$s</xliff:g> gailuan"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Erakutsi laguntzaileak mikrofonoa erabiltzeko duen baimena"</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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Eman ezarpen mugatuak erabiltzeko baimena"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Murriztapenak ditu ezarpenak"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Zure segurtasuna bermatzeko, ezarpena ez dago erabilgarri une honetan."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Ekintza hori ez dago erabilgarri telefono-deietan"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Iruzurgileek halako ekintzak egiteko eskatu ohi dute telefono bidezko elkarrizketetan; beraz, aukera hori blokeatu dugu zu babesteko. Ezagutzen ez duzun norbaitek halako zerbait egiteko esaten badizu, baliteke azpikeria izatea."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Telefono-dei batean zaudenean ezin diezu eman beste aplikazio batzuk instalatzeko baimena aplikazioei."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Telefono-deiak egin bitartean ezin zaio eman erabilerraztasuna erabiltzeko baimena inongo aplikaziori."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Telefono-dei batean zaudenean ezin da gaitu ezarpen hau."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikazioari <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> erabiltzeko baimena ukatu zaio"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Kontuzko informazioa erabiltzeko baimen bat eskatu du aplikazioak, eta agian horrek arriskuan jarriko ditu zure informazio pertsonala eta finantzei buruzko informazioa.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Baliteke aplikazioak behar bezala ez funtzionatzea baimen murriztu hori gabe. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Lortu baimena emateko argibideak&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikazioari <xliff:g id="ROLE_NAME">%1$s</xliff:g> lehenetsia izateko baimena ukatu zaio"</string>
diff --git a/PermissionController/res/values-fa-watch/strings.xml b/PermissionController/res/values-fa-watch/strings.xml
index b602b38f3..16acde24b 100644
--- a/PermissionController/res/values-fa-watch/strings.xml
+++ b/PermissionController/res/values-fa-watch/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="grant_dialog_button_deny_dont_ask_again" msgid="5709879604352260492">"مجاز نیست، دیگر سؤال نشود"</string>
+ <string name="grant_dialog_button_deny_dont_ask_again" msgid="5709879604352260492">"مجاز نیست، دوباره پرسیده نشود"</string>
<string name="current_permission_template" msgid="6634462553790549887">"<xliff:g id="CURRENT_PERMISSION_INDEX">%1$s</xliff:g> / <xliff:g id="PERMISSION_COUNT">%2$s</xliff:g>"</string>
<string name="preference_show_system_apps" msgid="1055740303992024300">"نمایش‌ برنامه‌های سیستم"</string>
<string name="permission_summary_enforced_by_policy" msgid="2352478756952948019">"امکان تغییر نیست"</string>
diff --git a/PermissionController/res/values-fa/strings.xml b/PermissionController/res/values-fa/strings.xml
index 56e2b3e65..2d5759125 100644
--- a/PermissionController/res/values-fa/strings.xml
+++ b/PermissionController/res/values-fa/strings.xml
@@ -75,7 +75,7 @@
<string name="app_disable_dlg_positive" msgid="7418444149981904940">"غیرفعال کردن برنامه"</string>
<string name="app_disable_dlg_text" msgid="3126943217146120240">"‏اگر این برنامه را غیرفعال کنید، ممکن است Android و سایر برنامه‌های دیگر عملکرد موردانتظار را نداشته باشند. به‌خاطر داشته باشید که نمی‌توانید این برنامه را حذف کنید، چون از برنامه‌های ازپیش نصب‌شده روی دستگاه است. این برنامه، با غیرفعال کردن، خاموش می‌شود و در دستگاه پنهان می‌شود."</string>
<string name="app_permission_manager" msgid="3903811137630909550">"مدیر اجازه‌ها"</string>
- <string name="never_ask_again" msgid="4728762438198560329">"دوباره سؤال نشود"</string>
+ <string name="never_ask_again" msgid="4728762438198560329">"دوباره پرسیده نشود"</string>
<string name="no_permissions" msgid="3881676756371148563">"مجوزی موجود نیست"</string>
<string name="additional_permissions" msgid="5801285469338873430">"اجازه‌های جانبی"</string>
<string name="app_permissions_info_button_label" msgid="7633312050729974623">"باز کردن اطلاعات برنامه"</string>
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"دسترسی <xliff:g id="PERM">%1$s</xliff:g> از این برنامه در <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"اطلاعات"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"تنظیمات"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"مجاز کردن تنظیمات محدودشده"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"تنظیم محدودشده"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"برای حفظ امنیت شما، درحال‌حاضر این تنظیم دردسترس نیست."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"اقدام درطول تماس تلفنی دردسترس نیست"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n افراد کلاهبردار اغلب این نوع اقدامات را درطول مکالمه‌های تلفنی درخواست می‌کنند، بنابراین این کار برای محافظت از شما مسدود شده است. اگر شخص ناآشنایی شما را ترغیب به انجام این اقدام می‌کند، ممکن است موضوع کلاهبرداری باشد."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"درطول تماس تلفنی، اجازه دادن به برنامه‌ها برای نصب برنامه‌های دیگر مجاز نیست."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"درطول تماس تلفنی، ارائه دسترسی به دسترس‌پذیری به برنامه مجاز نیست."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"درطول تماس تلفنی، فعال کردن این تنظیمات مجاز نیست."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"درخواست برنامه برای دسترسی به <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> رد شد"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"‏این برنامه درخواست دسترسی به اجازه‌ای حساس را داشته است که می‌تواند اطلاعات شخصی و مالی‌تان را درمعرض خطر قرار دهد.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ممکن است برنامه بدون این اجازه محدودشده به‌درستی کار نکند. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;با نحوه اعطای دسترسی آشنا شوید&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"درخواست دسترسی برنامه برای تبدیل شدن به <xliff:g id="ROLE_NAME">%1$s</xliff:g> پیش‌فرض رد شد"</string>
diff --git a/PermissionController/res/values-fi/strings.xml b/PermissionController/res/values-fi/strings.xml
index 1bb6fbc9f..08af63071 100644
--- a/PermissionController/res/values-fi/strings.xml
+++ b/PermissionController/res/values-fi/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Tällä sovelluksella on pääsy (<xliff:g id="PERM">%1$s</xliff:g>) laitteella <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Näytä kaikki luvat, jotka <xliff:g id="APP">%1$s</xliff:g> on saanut"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Näytä kaikki sovellukset, joilla on tämä lupa"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Näytä Assistantin mikrofonin käyttö"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Käyttämättömien sovellusten asetukset"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Poista luvat, jos sovellusta ei käytetä"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Salli rajoitetut asetukset"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Rajoitettu asetus"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Asetus ei ole tällä hetkellä käytettävissä turvallisuussyistä."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Toiminto ei ole käytettävissä puhelun aikana"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Huijarit pyytävät usein tätä puhelun aikana, joten se on estetty suojataksesi sinua. Jos joku, jota et tunne, kehottaa sinua toimimaan näin, kyseessä voi olla huijaus."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Sovellusten ei sallita asentaa muita sovelluksia puhelun aikana."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Sovelluksen pääsyä saavutettavuusominaisuuksiin ei sallita puhelun aikana."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Asetusta ei voi ottaa käyttöön puhelun aikana."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Sovellukselta on evätty pääsy: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Sovellus on pyytänyt pääsyä arkaluontoiseen lupaan, joka voi vaarantaa henkilökohtaisia tietojasi ja taloustietojasi.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Sovellus ei välttämättä toimi oikein ilman tätä rajoitettua lupaa. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Lue, miten voit sallia pääsyn&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Sovellus ei saa olla oletuksena <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-fr-rCA/strings.xml b/PermissionController/res/values-fr-rCA/strings.xml
index e4fa8b767..7740adba5 100644
--- a/PermissionController/res/values-fr-rCA/strings.xml
+++ b/PermissionController/res/values-fr-rCA/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Accès <xliff:g id="PERM">%1$s</xliff:g> pour cette appli sur <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Afficher toutes les autorisations pour <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Afficher toutes les applis qui possèdent cette autorisation"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Afficher l\'usage du microphone de l\'assistant"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Paramètres des applis inutilisées"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Retirer les autorisations si l\'appli est inutilisée"</string>
@@ -357,11 +361,11 @@
<string name="role_assistant_short_label" msgid="3369003713187703399">"Appli d\'assistant numérique"</string>
<string name="role_assistant_description" msgid="6622458130459922952">"Les applis d\'assistance peuvent vous aider en fonction de l\'information affichée à l\'écran. Certaines applis sont compatibles à la fois avec le lanceur d\'applis et les services d\'entrée vocale, vous permettant de bénéficier d\'une assistance intégrée."</string>
<string name="role_browser_label" msgid="2877796144554070207">"Appli de navigation par défaut"</string>
- <string name="role_browser_short_label" msgid="6745009127123292296">"Appli de navigateur"</string>
+ <string name="role_browser_short_label" msgid="6745009127123292296">"Appli de navigation"</string>
<string name="role_browser_description" msgid="3465253637499842671">"Applis qui vous donnent accès à Internet et qui affichent des liens que vous pouvez toucher"</string>
<string name="role_browser_request_title" msgid="2895200507835937192">"Définir <xliff:g id="APP_NAME">%1$s</xliff:g> comme appli par défaut pour la navigation?"</string>
<string name="role_browser_request_description" msgid="5888803407905985941">"Aucune autorisation nécessaire"</string>
- <string name="role_dialer_label" msgid="1100224146343237968">"Appli de téléphone par défaut"</string>
+ <string name="role_dialer_label" msgid="1100224146343237968">"Appli Téléphone par défaut"</string>
<string name="role_dialer_short_label" msgid="7186888549465352489">"Appli Téléphone"</string>
<string name="role_dialer_description" msgid="8768708633696539612">"Applis qui vous permettent de faire et de recevoir des appels téléphoniques sur votre appareil"</string>
<string name="role_dialer_request_title" msgid="5959618560705912058">"Définir <xliff:g id="APP_NAME">%1$s</xliff:g> comme appli de téléphonie par défaut?"</string>
@@ -380,8 +384,8 @@
<string name="role_emergency_request_description" msgid="131645948770262850">"Aucune autorisation nécessaire"</string>
<string name="role_emergency_search_keywords" msgid="1920007722599213358">"En cas d\'urgence"</string>
<string name="role_home_label" msgid="3871847846649769412">"Appli d\'accueil par défaut"</string>
- <string name="role_home_short_label" msgid="8544733747952272337">"Appli sur l\'écran d\'accueil"</string>
- <string name="role_home_description" msgid="7997371519626556675">"Applis qui remplacent les écrans d\'accueil sur votre appareil Android et qui vous donnent accès au contenu et aux fonctionnalités de votre appareil"</string>
+ <string name="role_home_short_label" msgid="8544733747952272337">"Appli d\'accueil"</string>
+ <string name="role_home_description" msgid="7997371519626556675">"Applis, aussi appelées lanceurs d\'applis, qui remplacent les écrans d\'accueil sur votre appareil Android et qui vous donnent accès au contenu et aux fonctionnalités de votre appareil"</string>
<string name="role_home_request_title" msgid="738136983453341081">"Définir <xliff:g id="APP_NAME">%1$s</xliff:g> comme appli d\'écran d\'accueil par défaut?"</string>
<string name="role_home_request_description" msgid="2658833966716057673">"Aucune autorisation nécessaire"</string>
<string name="role_home_search_keywords" msgid="3830755001192666285">"lanceur d\'applis"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Autoriser les paramètres restreints"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Paramètre restreint"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Pour protéger votre sécurité, ce paramètre n\'est pas accessible actuellement."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action non proposée lors d\'un appel téléphonique"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Les escrocs demandent souvent ce type d\'action lors de conversations téléphoniques, alors ces actions sont bloquées pour vous protéger. Si quelqu\'un que vous ne connaissez pas vous guide dans cette démarche, il pourrait s\'agir d\'une escroquerie."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Autoriser les applis à installer d\'autres applis n\'est pas permis lors d\'un appel téléphonique."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Donner à une appli l\'accès au service d\'accessibilité n\'est pas permis lors d\'un appel téléphonique."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"L\'activation de ce paramètre n\'est pas permise lors d\'un appel téléphonique."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"L\'appli n\'a pas obtenu l\'accès à <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"L\'appli a demandé l\'accès à une autorisation sensible qui pose un risque pour vos renseignements personnels et financiers.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Il est possible que l\'appli ne fonctionne pas correctement sans cette autorisation limitée. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Découvrir comment autoriser l\'accès&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"L\'appli n\'a pas obtenu l\'accès pour avoir le rôle<xliff:g id="ROLE_NAME">%1$s</xliff:g> par défaut"</string>
diff --git a/PermissionController/res/values-fr/strings.xml b/PermissionController/res/values-fr/strings.xml
index f404da7c6..9a1ca1ea7 100644
--- a/PermissionController/res/values-fr/strings.xml
+++ b/PermissionController/res/values-fr/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Accès à <xliff:g id="PERM">%1$s</xliff:g> pour cette application sur <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Voir toutes les autorisations pour <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Voir toutes les applis ayant cette autorisation"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Afficher l\'utilisation du micro par l\'Assistant"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Paramètres des applis inutilisées"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Supprimer les autorisations si l\'application n\'est pas utilisée"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Autoriser les paramètres restreints"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Paramètre restreint"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Pour votre sécurité, ce paramètre est actuellement indisponible."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Action non disponible lors d\'un appel téléphonique"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Les escrocs demandent souvent d\'effectuer ce type d\'action lors d\'appels téléphoniques. Cette action est donc bloquée pour vous protéger. Si quelqu\'un que vous ne connaissez pas vous demande d\'effectuer cette action, il s\'agit peut-être d\'une escroquerie."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Vous ne pouvez pas autoriser des applis à installer d\'autres applis pendant un appel téléphonique."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Vous ne pouvez pas autoriser une appli à accéder aux fonctionnalités d\'accessibilité pendant un appel téléphonique."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Vous ne pouvez pas activer ce paramètre pendant un appel téléphonique."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"L\'appli s\'est vu refuser l\'accès à <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Cette appli a demandé l\'accès à une autorisation sensible susceptible d\'exposer vos informations financières et personnelles à un risque.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Si elle ne dispose pas d\'un accès à cette autorisation restreinte, l\'appli peut ne pas fonctionner correctement. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Découvrez comment autoriser l\'accès&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"L\'appli s\'est vu refuser l\'accès au statut de <xliff:g id="ROLE_NAME">%1$s</xliff:g> par défaut"</string>
diff --git a/PermissionController/res/values-gl/strings.xml b/PermissionController/res/values-gl/strings.xml
index 911eacaf9..45c6911e9 100644
--- a/PermissionController/res/values-gl/strings.xml
+++ b/PermissionController/res/values-gl/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Esta aplicación ten o seguinte permiso de acceso en <xliff:g id="DEVICE_NAME">%2$s</xliff:g>: <xliff:g id="PERM">%1$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todos os permisos de <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ver todas as aplicacións que teñen este permiso"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Información"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Configuración"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar uso do micrófono do Asistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Configuración das aplicacións sen uso"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Quitar permisos se non se usa a aplicación"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir opcións restrinxidas"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Opción de configuración restrinxida"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Pola túa seguranza, esta opción de configuración non está dispoñible nestes momentos."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Acción non dispoñible nas chamadas telefónicas"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Como os estafadores adoitan solicitar este tipo de accións durante as chamadas telefónicas, bloqueámola para protexerte. Se alguén pretende que realices esta acción, é posible que sexa unha estafa."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Non está permitido que as aplicacións instalen outras aplicacións durante as chamadas telefónicas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Non está permitido que as aplicacións accedan ao servizo de accesibilidade durante as chamadas telefónicas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Non está permitido activar esta opción de configuración durante as chamadas telefónicas."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Denegóuselle á aplicación o acceso ao permiso: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"A aplicación solicitou acceso a un permiso confidencial que pode poñer en perigo a túa información persoal e financeira.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>É posible que a aplicación non funcione correctamente sen este permiso restrinxido. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Máis información sobre como permitir o acceso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Denegóuselle á aplicación o acceso para actuar como <xliff:g id="ROLE_NAME">%1$s</xliff:g> de forma predeterminada"</string>
diff --git a/PermissionController/res/values-gu/strings.xml b/PermissionController/res/values-gu/strings.xml
index 977d79579..577f24f9e 100644
--- a/PermissionController/res/values-gu/strings.xml
+++ b/PermissionController/res/values-gu/strings.xml
@@ -64,7 +64,7 @@
<string name="unused_apps" msgid="2058057455175955094">"ન વપરાયેલી ઍપ"</string>
<string name="edit_photos_description" msgid="5540108003480078892">"આ ઍપ માટે પસંદ કરેલા ફોટામાં ફેરફાર કરો"</string>
<string name="no_unused_apps" msgid="12809387670415295">"કોઈ બિનવપરાયેલી ઍપ નથી"</string>
- <string name="zero_unused_apps" msgid="9024448554157499748">"બિનવપરાયેલી 0 ઍપ"</string>
+ <string name="zero_unused_apps" msgid="9024448554157499748">"0 બિનવપરાયેલી ઍપ"</string>
<string name="review_permission_decisions" msgid="309559429150613632">"પરવાનગી સંબંધિત નિર્ણયો"</string>
<string name="review_permission_decisions_view_all" msgid="90391040431566130">"તાજેતરની પરવાનગી સંબંધિત બધા નિર્ણયો જુઓ"</string>
<string name="review_permission_decisions_empty" msgid="8120775336417279806">"તાજેતરની પરવાનગી સંબંધિત કોઈ નિર્ણય નથી"</string>
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> પર આ ઍપ માટે <xliff:g id="PERM">%1$s</xliff:g>નો ઍક્સેસ"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"પ્રતિબંધિત સેટિંગને મંજૂરી આપો"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"પ્રતિબંધિત સેટિંગ"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"તમારી સુરક્ષા માટે, આ સેટિંગ હાલમાં ઉપલબ્ધ નથી."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ફોન કૉલ પર હોવા દરમિયાન આ ક્રિયા ઉપલબ્ધ હોતી નથી"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n સ્કૅમર દ્વારા ફોન કૉલ પરની વાતચીતો દરમિયાન આ પ્રકારની ક્રિયાની વિનંતી સામાન્ય રીતે કરવામાં આવતી હોય છે, તેથી તમારી સુરક્ષા માટે આને બ્લૉક કરવામાં આવે છે. જો કોઈ અજાણી વ્યક્તિ દ્વારા આ ક્રિયા કરવા માટે તમને માર્ગદર્શન આપવામાં આવતું હોય, તો આ સ્કૅમ હોઈ શકે છે."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ફોન કૉલ દરમિયાન, ઍપને બીજી ઍપ ઇન્સ્ટૉલ કરવાની મંજૂરી આપવામાં આવતી નથી."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ફોન કૉલ દરમિયાન કોઈ ઍપને ઍક્સેસિબિલિટીનો ઍક્સેસ આપવાની મંજૂરી આપવામાં આવતી નથી."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ફોન કૉલ દરમિયાન આ સેટિંગ ચાલુ કરવાની મંજૂરી આપવામાં આવતી નથી."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"ઍપને <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>નો ઍક્સેસ નકારવામાં આવ્યો"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"આ ઍપ દ્વારા કોઈ સંવેદનશીલ માહિતીની પરવાનગીના ઍક્સેસની વિનંતી કરવામાં આવી છે, જેને કારણે તમારી વ્યક્તિગત અને નાણાકીય માહિતી જોખમમાં આવી શકે છે.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>એ પણ શક્ય છે કે આ પ્રતિબંધિત પરવાનગી વિના ઍપ કદાચ યોગ્ય રીતે કામ ન પણ કરી શકે. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ઍક્સેસ મંજૂર કરવાની રીત જાણો&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ઍપને ડિફૉલ્ટ <xliff:g id="ROLE_NAME">%1$s</xliff:g> બનવાનો ઍક્સેસ નકારવામાં આવ્યો"</string>
diff --git a/PermissionController/res/values-hi-v33/strings.xml b/PermissionController/res/values-hi-v33/strings.xml
index 701dd64f9..ef727a060 100644
--- a/PermissionController/res/values-hi-v33/strings.xml
+++ b/PermissionController/res/values-hi-v33/strings.xml
@@ -41,7 +41,7 @@
<string name="safety_center_qs_privacy_control" msgid="1160682635058529673">"स्विच करें. <xliff:g id="PRIVACY_CONTROL_TITLE">%1$s</xliff:g>. <xliff:g id="PRIVACY_CONTROL_STATUS">%2$s</xliff:g>"</string>
<string name="safety_center_qs_toggle_action" msgid="5920465736488119255">"टॉगल करें"</string>
<string name="safety_center_qs_open_action" msgid="2760200829912423728">"खोलें"</string>
- <string name="safety_center_review_settings_button" msgid="938981137942443930">"सेटिंग की समीक्षा करें"</string>
+ <string name="safety_center_review_settings_button" msgid="938981137942443930">"सेटिंग देखें"</string>
<string name="safety_center_gear_label" msgid="5175877094379694098">"सेटिंग"</string>
<string name="safety_center_info_label" msgid="8993181584061825412">"जानकारी"</string>
</resources>
diff --git a/PermissionController/res/values-hi/strings.xml b/PermissionController/res/values-hi/strings.xml
index e88e270fe..f1795e1ba 100644
--- a/PermissionController/res/values-hi/strings.xml
+++ b/PermissionController/res/values-hi/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> पर इस ऐप्लिकेशन के लिए <xliff:g id="PERM">%1$s</xliff:g> का ऐक्सेस"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"पाबंदी वाली सेटिंग को अनुमति दें"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"इस सेटिंग पर पाबंदी लगाई गई है"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"आपकी सुरक्षा के लिए, यह सेटिंग फ़िलहाल उपलब्ध नहीं है."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"फ़ोन कॉल के दौरान, कार्रवाई नहीं की जा सकती"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n फ़ोन कॉल पर बातचीत करते समय, धोखाधड़ी करने वाले लोग अक्सर इस तरह की कार्रवाई करने का अनुरोध करते हैं. इसलिए, आपको सुरक्षित रखने के लिए यह अनुमति नहीं दी जाती है. अगर कोई अनज़ान व्यक्ति, आपको यह कार्रवाई करने के निर्देश देता है, तो हो सकता है कि आपके साथ धोखाधड़ी की कोशिश की जा रही हो."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"फ़ोन कॉल के दौरान, ऐप्लिकेशन को अन्य ऐप्लिकेशन इंस्टॉल करने की अनुमति नहीं है."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"फ़ोन कॉल के दौरान, किसी ऐप्लिकेशन को सुलभता सेवा का ऐक्सेस देने की अनुमति नहीं है."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"फ़ोन कॉल के दौरान, इस सेटिंग को चालू करने की अनुमति नहीं है."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"ऐप्लिकेशन को, <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> को ऐक्सेस करने की अनुमति नहीं मिली"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"इस ऐप्लिकेशन ने संवेदनशील जानकारी ऐक्सेस करने का अनुरोध किया है. इसे अनुमति देने पर, आपकी निजी और वित्तीय जानकारी की सुरक्षा को खतरा हो सकता है.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>हालांकि, हो सकता है कि पाबंदी वाली अनुमति न मिलने पर, ऐप्लिकेशन सही तरह से काम न करें. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ऐक्सेस देने का तरीका जानें&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ऐप्लिकेशन को डिफ़ॉल्ट <xliff:g id="ROLE_NAME">%1$s</xliff:g> के तौर पर सेट करने की अनुमति नहीं दी गई"</string>
diff --git a/PermissionController/res/values-hr/strings.xml b/PermissionController/res/values-hr/strings.xml
index f35de43ea..8ad436efe 100644
--- a/PermissionController/res/values-hr/strings.xml
+++ b/PermissionController/res/values-hr/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Pristup značajke <xliff:g id="PERM">%1$s</xliff:g> za ovu aplikaciju na uređaju <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Pogledajte sva dopuštenja aplikacije <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Pogledajte sve aplikacije s tim dopuštenjem"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informacije"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Postavke"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Prikaz korištenja mikrofona Asistenta"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Postavke nekorištenih aplikacija"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ukloni dopuštenja ako se aplikacija ne upotrebljava"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Dopusti ograničene postavke"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ograničena postavka"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Radi vaše sigurnosti ova postavka trenutačno nije dostupna."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Radnja nije dostupna tijekom telefonskog poziva"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Prevaranti često zahtijevaju tu vrstu radnje tijekom telefonskih razgovora, pa je ona blokirana radi vaše zaštite. Ako vas netko koga ne poznajete navodi na tu radnju, možda je riječ o prijevari."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Aplikacijama nije dopušteno instalirati druge aplikacije tijekom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Omogućivanje pristupa usluzi pristupačnosti za aplikaciju nije dopušteno tijekom telefonskog poziva."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Omogućivanje te postavke nije dopušteno tijekom telefonskog poziva."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaciji je odbijen pristup dopuštenju <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zatražila pristup dopuštenju za osjetljive podatke koje može ugroziti vaše osobne i financijske podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Moguće je da aplikacija neće pravilno funkcionirati bez tog uskraćenog dopuštenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saznajte kako omogućiti pristup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji je uskraćeno da bude zadana <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-hu-v33/strings.xml b/PermissionController/res/values-hu-v33/strings.xml
index 2ab18af60..ede269016 100644
--- a/PermissionController/res/values-hu-v33/strings.xml
+++ b/PermissionController/res/values-hu-v33/strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="role_dialer_request_description" msgid="6188305064871543419">"Az alkalmazás engedélyt kap értesítések küldésére, és hozzáférhet majd a következőkhöz: Kamera, Névjegyek, Mikrofon, Telefon és SMS."</string>
- <string name="role_sms_request_description" msgid="1506966389698625395">"Az alkalmazás engedélyt kap értesítések küldésére, és hozzáférhet majd a következőkhöz: Kamera, Címtár, Files, Mikrofon, Telefon és SMS."</string>
+ <string name="role_sms_request_description" msgid="1506966389698625395">"Az alkalmazás engedélyt kap értesítések küldésére, és hozzáférhet majd a következőkhöz: Kamera, Névjegyek, Fájlok, Mikrofon, Telefon és SMS."</string>
<string name="permission_description_summary_storage" msgid="1917071243213043858">"Az ezzel az engedéllyel rendelkező alkalmazások hozzáférhetnek az ezen az eszközön lévő összes fájlhoz"</string>
<string name="work_policy_title" msgid="832967780713677409">"Munkahelyi házirendekkel kapcsolatos adatok"</string>
<string name="work_policy_summary" msgid="3886113358084963931">"A rendszergazda által kezelt beállítások"</string>
diff --git a/PermissionController/res/values-hu/strings.xml b/PermissionController/res/values-hu/strings.xml
index a0faf34fe..12427b186 100644
--- a/PermissionController/res/values-hu/strings.xml
+++ b/PermissionController/res/values-hu/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> – hozzáférés az alkalmazás számára a(z) <xliff:g id="DEVICE_NAME">%2$s</xliff:g> eszközön"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"A(z) <xliff:g id="APP">%1$s</xliff:g> összes engedélyének megtekintése"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Az ezzel az engedéllyel rendelkező összes alkalmazás megtekintése"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Mikrofon Segéd általi használatának megjelenítése"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nem használt alkalmazások beállításai"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Engedélyek eltávolítása, ha nem használja az alkalmazást"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Korlátozott beállítások engedélyezése"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Korlátozott beállítás"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Biztonsága érdekében ez a beállítás jelenleg nem használható."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"A művelet nem végezhető el telefonhívás közben"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n A csalók gyakran kérik ilyen jellegű műveletek végrehajtását a telefonhívások során, ezért a rendszer az Ön védelme érdekében letiltja ezt a lehetőséget. Ha valaki, akit nem ismer, arra kéri, hogy végezze el ezt a műveletet, előfordulhat, hogy csalárd szándékkal teszi."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Telefonhívás közben nem lehet engedélyezni, hogy alkalmazások más alkalmazásokat telepítsenek."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Telefonhívás közben nem lehet hozzáférést adni az alkalmazásoknak a kisegítő lehetőségekhez."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"A beállítás engedélyezése nem lehetséges telefonhívás közben."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Az app nem kapott hozzáférést a következőhöz: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Az alkalmazás hozzáférési engedélyt kért a bizalmas adatokhoz, ami veszélybe sodorhatja az Ön személyes és pénzügyi adatait.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Lehetséges, hogy az alkalmazás nem működik megfelelően enélkül a korlátozott engedély nélkül. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;További információ a hozzáférés megadásának módjáról.&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Az app nem kapott hozzáférést a következőhöz: alapértelmezett <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-hy-v33/strings.xml b/PermissionController/res/values-hy-v33/strings.xml
index 99b0b890f..790addb16 100644
--- a/PermissionController/res/values-hy-v33/strings.xml
+++ b/PermissionController/res/values-hy-v33/strings.xml
@@ -30,8 +30,7 @@
<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>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Ծալել"</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>
diff --git a/PermissionController/res/values-hy/strings.xml b/PermissionController/res/values-hy/strings.xml
index 495bd9b38..6ddab6d5e 100644
--- a/PermissionController/res/values-hy/strings.xml
+++ b/PermissionController/res/values-hy/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g>ն օգտագործելու թույլտվություն այս հավելվածի համար <xliff:g id="DEVICE_NAME">%2$s</xliff:g> սարքում"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Թույլատրել սահմանափակ ռեժիմի կարգավորումները"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Սահմանափակումներով կարգավորում"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Անվտանգության նկատառումներից ելնելով՝ այս կարգավորումը ներկայումս անհասանելի է։"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Գործողությունը հասանելի չէ հեռախոսազանգի ժամանակ"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Հավելվածին մերժվել է <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>ի օգտագործման թույլտվությունը"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Հավելվածը հայցել է կոնֆիդենցիալ տեղեկությունների օգտագործման թույլտվություն, որը կարող է վտանգի ենթարկել ձեր անձնական և ֆինանսական տեղեկությունները։<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Հնարավոր է, որ առանց այս սահմանափակված թույլտվության՝ հավելվածը չաշխատի պատշաճ կերպով։ &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ինչպես տրամադրել տվյալների օգտագործման թույլտվություն&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml
index d4ce7c291..5ed5ee9a6 100644
--- a/PermissionController/res/values-in/strings.xml
+++ b/PermissionController/res/values-in/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Akses <xliff:g id="PERM">%1$s</xliff:g> untuk aplikasi ini di <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Lihat semua izin <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Lihat semua aplikasi yang memiliki izin ini"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Tampilkan penggunaan mikrofon Asisten"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Setelan aplikasi yang tidak digunakan"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Hapus izin jika aplikasi tidak digunakan"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Izinkan setelan terbatas"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Setelan terbatas"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Demi keamanan Anda, setelan ini tidak tersedia untuk saat ini."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Tindakan tidak tersedia selama panggilan telepon"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammer sering meminta jenis tindakan ini selama percakapan panggilan telepon, jadi tindakan ini diblokir untuk melindungi Anda. Jika Anda diarahkan untuk melakukan tindakan ini oleh seseorang yang tidak Anda kenal, hal tersebut mungkin merupakan scam."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Mengizinkan aplikasi menginstal aplikasi lain tidak diizinkan selama panggilan telepon berlangsung."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Memberikan akses aksesibilitas ke aplikasi tidak diizinkan selama panggilan telepon."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Mengaktifkan setelan ini tidak diizinkan selama panggilan telepon berlangsung."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikasi ditolak aksesnya ke <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikasi meminta akses ke izin sensitif yang dapat membahayakan info pribadi dan keuangan Anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Aplikasi mungkin tidak dapat berfungsi dengan baik tanpa izin terbatas ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&amp;gtPelajari cara mengizinkan akses&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikasi ditolak aksesnya untuk menjadi <xliff:g id="ROLE_NAME">%1$s</xliff:g> default"</string>
diff --git a/PermissionController/res/values-is/strings.xml b/PermissionController/res/values-is/strings.xml
index 785da40f2..bdf37ba7e 100644
--- a/PermissionController/res/values-is/strings.xml
+++ b/PermissionController/res/values-is/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Aðgangur að <xliff:g id="PERM">%1$s</xliff:g> fyrir þetta forrit í <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Sjá allar heimildir fyrir „<xliff:g id="APP">%1$s</xliff:g>“"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Sjá öll forrit með þessa heimild"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Upplýsingar"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Stillingar"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Sýna hljóðnemanotkun hjálpara"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ónotaðar forritastillingar"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjarlægja heimildir ef forrit er ekki notað"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Leyfa takmarkaðar stillingar"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Takmörkuð stilling"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Til að tryggja öryggi þitt er þessi stilling ekki tiltæk eins og er."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Aðgerð ekki í boði á meðan á símtali stendur"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Svikarar eiga það til að biðja notendur um að framkvæma aðgerðir á borð við þessa á meðan á samtali stendur. Þar af leiðandi er lokað á hana til að vernda þig. Ef einhver sem þú þekkir ekki bað þig um að framkvæma þessa aðgerð gæti verið um svik að ræða."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Ekki er heimilt að leyfa forritum að setja önnur forrit upp á meðan á símtali stendur."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Ekki er heimilt að veita forriti aðgang að aðgengi á meðan á símtali stendur."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Ekki er heimilt að kveikja á þessari stillingu á meðan á símtali stendur."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Forritið fékk ekki aðgang að <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Forritið bað um aðgang að heimild fyrir viðkvæmu efni sem getur stofnað persónu- og fjármálaupplýsingum þínum í hættu.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Forritið virkar hugsanlega ekki sem skyldi án þessarar takmörkuðu heimildar. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Kynntu þér hvernig þú leyfir aðgang&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Forritið fékk ekki aðgang að sjálfgefnu <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-it/strings.xml b/PermissionController/res/values-it/strings.xml
index 49fec0ed3..1001cb108 100644
--- a/PermissionController/res/values-it/strings.xml
+++ b/PermissionController/res/values-it/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> accesso per questa app su <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Mostra tutte le autorizzazioni di <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Mostra tutte le app con questa autorizzazione"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informazioni"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Impostazioni"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostra utilizzo microfono dell\'assistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Impostazioni app inutilizzate"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Rimuovi autorizzazioni se non in uso"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Consenti impostazioni con limitazioni"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Impostazione con limitazioni"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Per la tua sicurezza, questa impostazione non è al momento disponibile."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Azione non disponibile durante una telefonata"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n I truffatori richiedono spesso questo tipo di azione durante le conversazioni telefoniche, quindi è bloccata per proteggerti. Se qualcuno che non conosci ti guida a compiere questa azione, potrebbe trattarsi di una frode."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"È vietato consentire alle app di installare altre app durante una telefonata."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"È vietato concedere a un\'app l\'accesso al servizio di accessibilità durante una telefonata."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Non è consentito attivare questa impostazione durante una telefonata."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"All\'app è stato negato l\'accesso a <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"L\'app ha richiesto l\'accesso a un\'autorizzazione sensibile che può mettere a rischio le tue informazioni finanziarie e personali.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>È possibile che l\'app non funzioni correttamente senza questa autorizzazione limitata. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Scopri di più su come consentire l\'accesso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"All\'app è stato negato l\'accesso al ruolo <xliff:g id="ROLE_NAME">%1$s</xliff:g> predefinita"</string>
diff --git a/PermissionController/res/values-iw/strings.xml b/PermissionController/res/values-iw/strings.xml
index ee980429d..d3ba48c1f 100644
--- a/PermissionController/res/values-iw/strings.xml
+++ b/PermissionController/res/values-iw/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"גישה ל<xliff:g id="PERM">%1$s</xliff:g> לאפליקציה הזו ב<xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"‏השימוש במיקרופון של Assistant"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"הגדרות של אפליקציות שמזמן לא השתמשת בהן"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"הסרת ההרשאות כשלא בשימוש"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"הרשאה להגדרות מוגבלות"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"הגדרה מוגבלת"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"מטעמי אבטחה, ההגדרה הזו לא זמינה כרגע."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"הפעולה לא זמינה במהלך שיחת טלפון"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n לרוב, אנשים שמבצעים תרמיות מבקשים לבצע פעולות מהסוג הזה בזמן שיחות טלפון, לכן הפעולה הזו חסומה כדי להגן עליך. אם מישהו לא מוכר מנחה אותך לבצע את הפעולה הזו, יכול להיות שמדובר בתרמית."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"אי אפשר לתת לאפליקציות הרשאה להתקין אפליקציות אחרות בזמן שיחת טלפון."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"אי אפשר לתת לאפליקציה הרשאת גישה לתכונות הנגישות בזמן שיחת טלפון."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"אי אפשר להפעיל את ההגדרה הזו בזמן שיחת טלפון."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"בקשת הגישה של האפליקציה ל<xliff:g id="PERMISSION_NAME">%1$s</xliff:g> נדחתה"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"‏האפליקציה ביקשה הרשאת גישה למידע רגיש שעלולה לסכן את המידע האישי והפיננסי שלך.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>יכול להיות שהאפליקציה לא תעבוד כמו שצריך ללא ההרשאה המוגבלת הזו. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;מידע נוסף על מתן גישה להרשאות&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"בקשת הגישה של האפליקציה לשמש כברירת המחדל של <xliff:g id="ROLE_NAME">%1$s</xliff:g> נדחתה"</string>
diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml
index 497676f4d..a8dd76416 100644
--- a/PermissionController/res/values-ja/strings.xml
+++ b/PermissionController/res/values-ja/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> でこのアプリに <xliff:g id="PERM">%1$s</xliff:g> へのアクセス権が付与されています"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"情報"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"設定"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"制限付き設定を許可"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"制限付き設定"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"セキュリティ保護のため、この設定は現在利用できません。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"この操作は通話中はできません"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n このような操作は、詐欺師が電話での会話中に要求することが多いため、ユーザー保護を目的に禁止されています。知らない相手からこのような操作を求められた場合は、詐欺の可能性があります。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"通話中にアプリが他のアプリをインストールすることはできません。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"通話中はアプリにユーザー補助へのアクセスを許可できません。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"通話中はこの設定を有効にできません。"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"アプリは<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>へのアクセスを拒否されました"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"機密情報に関わる権限へのアクセスをアプリがリクエストしました。この権限へのアクセスは、あなたの個人情報や財務情報を危険にさらす恐れがあります。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>この制限付きの権限がないとアプリは正しく動作しない可能性があります。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;アクセスを許可する方法の詳細&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"アプリはデフォルトの<xliff:g id="ROLE_NAME">%1$s</xliff:g>としてのアクセスを拒否されました"</string>
diff --git a/PermissionController/res/values-ka/strings.xml b/PermissionController/res/values-ka/strings.xml
index 3e8311d30..a30db36a7 100644
--- a/PermissionController/res/values-ka/strings.xml
+++ b/PermissionController/res/values-ka/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"(<xliff:g id="PERM">%1$s</xliff:g>) წვდომა ამ აპისთვის <xliff:g id="DEVICE_NAME">%2$s</xliff:g>-ზე"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"შეზღუდული პარამეტრების დაშვება"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"შეზღუდული პარამეტრი"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"თქვენივე უსაფრთხოებისთვის ეს პარამეტრი ამჟამად მიუწვდომელია."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"სატელეფონო ზარისას მოქმედება არ არის ხელმისაწვდომი"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n თაღლითები ხშირად ითხოვენ ამ ტიპის ქმედებას სატელეფონო საუბრებისას, შესაბამისად, აღნიშნული ქმედება დაბლოკილია თქვენი უსაფრთხოებისთვის. თუ ამ ქმედების განხორციელებისკენ მიგითითათ ვინმემ, ვისაც არ იცნობთ, ეს შესაძლოა თაღლითური სქემა იყოს."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"აპებისთვის სხვა აპების ინსტალაციის დაშვება არ არის ნებადართული სატელეფონო ზარის დროს."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"მარტივ წვდომაზე აპისთვის წვდომის მიცემა არ არის ნებადართული სატელეფონო ზარის დროს."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ამ პარამეტრის ჩართვა არ არის ნებადართული სატელეფონო ზარის დროს."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"აპისთვის უარყოფილია ნებართვაზე წვდომა: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"აპმა სენსიტიურ ინფორმაციაზე წვდომა მოითხოვა, რაც თქვენს პირად და ფინანსურ ინფორმაციას საფრთხის ქვეშ აყენებს.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>შესაძლოა აპმა ამ შეზღუდული ნებართვის გარეშე სათანადოდ ვერ იმუშაოს. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;შეიტყვეთ მეტი ნებართვის დაშვების შესახებ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"აპისთვის ნაგულისხმევ როლზე (<xliff:g id="ROLE_NAME">%1$s</xliff:g>) წვდომა უარყოფილია"</string>
diff --git a/PermissionController/res/values-kk/strings.xml b/PermissionController/res/values-kk/strings.xml
index e36145d06..a344642e4 100644
--- a/PermissionController/res/values-kk/strings.xml
+++ b/PermissionController/res/values-kk/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Құрылғыдағы (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>) осы қолданбаның рұқсаты: <xliff:g id="PERM">%1$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant микрофонының пайдаланылуын көрсету"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Пайдаланылмайтын қолданба параметрлері"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Қолданба пайдаланылмаса, рұқсаттарды өшіру"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Шектелген параметрлерге рұқсат беру"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Шектелген параметр"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Қауіпсіздік мақсатында бұл параметрді қазір пайдалану мүмкін емес."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Телефон қоңырауы кезінде бұл әрекет мүмкін емес"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Алаяқтар телефонмен сөйлесу кезінде көбіне осындай әрекеттерді жасауды сұрайды, сондықтан сізді қорғау үшін бұл әрекет блокталған. Таныс емес адам осылай әрекет етуге нұсқау берсе, бұл алаяқтық болуы мүмкін."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Телефон қоңырауы кезінде қолданбаларға басқа қолданбаларды орнатуға рұқсат берілмейді."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Телефон қоңырауы кезінде қолданбаға арнайы мүмкіндіктерді пайдалану рұқсаты берілмейді."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Телефон қоңырауы кезінде бұл параметрді қосуға рұқсат берілмейді."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Қолданбаға <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> рұқсаты берілмеді"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Қолданба жеке және қаржылық ақпаратыңызға қауіп төндіруі мүмкін құпия ақпарат рұқсатын сұрады.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Қолданба бұл шектеулі рұқсатсыз дұрыс жұмыс істемеуі мүмкін. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Рұқсат беру туралы ақпарат&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Қолданбаға әдепкі <xliff:g id="ROLE_NAME">%1$s</xliff:g> болу рұқсаты берілмеді"</string>
diff --git a/PermissionController/res/values-km/strings.xml b/PermissionController/res/values-km/strings.xml
index cdf68d190..2f5fbe932 100644
--- a/PermissionController/res/values-km/strings.xml
+++ b/PermissionController/res/values-km/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"សិទ្ធិចូលប្រើ <xliff:g id="PERM">%1$s</xliff:g> សម្រាប់កម្មវិធីនេះនៅលើ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"ព័ត៌មាន"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"ការកំណត់"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"អនុញ្ញាតការកំណត់​ដែលបានដាក់កំហិត"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ការកំណត់​ដែលបានដាក់កំហិត"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ដើម្បីសុវត្ថិភាព​របស់អ្នក បច្ចុប្បន្នមិនអាចប្រើការកំណត់នេះបានទេ។"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"មិនអាចធ្វើសកម្មភាពបានទេ ពេលកំពុងហៅទូរសព្ទ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ជារឿយៗ ជនឆបោកស្នើសុំសកម្មភាពប្រភេទនេះ ក្នុងអំឡុងពេលសន្ទនាតាមទូរសព្ទ ដូច្នេះសកម្មភាពនេះត្រូវបានទប់ស្កាត់ដើម្បីការពារអ្នក។ ប្រសិនបើអ្នកត្រូវបានណែនាំឱ្យធ្វើសកម្មភាពនេះដោយនរណាម្នាក់ដែលអ្នកមិនស្គាល់ វាអាចជាការឆបោក។"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ការអនុញ្ញាតឱ្យកម្មវិធីដំឡើងកម្មវិធីផ្សេងទៀតមិនត្រូវបានអនុញ្ញាត ក្នុងអំឡុងការហៅទូរសព្ទទេ។"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ការផ្ដល់សិទ្ធិឱ្យកម្មវិធីចូលប្រើភាពងាយស្រួលមិនត្រូវបានអនុញ្ញាត ក្នុងអំឡុងការហៅទូរសព្ទទេ។"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ការបើកការកំណត់នេះមិនត្រូវបានអនុញ្ញាត ក្នុងអំឡុងការហៅទូរសព្ទទេ។"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"កម្មវិធីត្រូវបានបដិសេធមិនឱ្យចូលប្រើ<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"កម្មវិធីបានស្នើសុំសិទ្ធិចូលប្រើការអនុញ្ញាត​ដែលមានលក្ខណៈរសើប ដែលអាចធ្វើឱ្យព័ត៌មានហិរញ្ញវត្ថុ និងព័ត៌មានផ្ទាល់ខ្លួនរបស់អ្នកប្រឈមនឹងហានិភ័យ។<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>កម្មវិធីអាចនឹងមិនដំណើរការបានត្រឹមត្រូវទេ ប្រសិនបើគ្មានការអនុញ្ញាតដែលមានការរឹតបន្តឹងនេះ។ &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ស្វែងយល់អំពីរបៀបផ្ដល់សិទ្ធិចូលប្រើ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"កម្មវិធីត្រូវបានបដិសេធមិនឱ្យចូលប្រើជា<xliff:g id="ROLE_NAME">%1$s</xliff:g>លំនាំដើម"</string>
diff --git a/PermissionController/res/values-kn/strings.xml b/PermissionController/res/values-kn/strings.xml
index 579f810c1..ce41f1f5b 100644
--- a/PermissionController/res/values-kn/strings.xml
+++ b/PermissionController/res/values-kn/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> ನಲ್ಲಿ ಈ ಆ್ಯಪ್‌ಗಾಗಿ <xliff:g id="PERM">%1$s</xliff:g> ಆ್ಯಕ್ಸೆಸ್"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"ಮಾಹಿತಿ"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ನಿರ್ಬಂಧಿಸಲಾದ ಸೆಟ್ಟಿಂಗ್"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ನಿಮ್ಮ ಸುರಕ್ಷತೆಗಾಗಿ, ಈ ಸೆಟ್ಟಿಂಗ್ ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ಫೋನ್ ಕರೆಯಲ್ಲಿರುವಾಗ ಕ್ರಿಯೆ ಲಭ್ಯವಿರುವುದಿಲ್ಲ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ಫೋನ್ ಕರೆ ಸಂಭಾಷಣೆಯ ಸಮಯದಲ್ಲಿ ಸ್ಕ್ಯಾಮರ್‌ಗಳು ಆಗಾಗ್ಗೆ ಈ ರೀತಿಯ ಕ್ರಿಯೆಯನ್ನು ವಿನಂತಿಸುತ್ತಾರೆ, ಆದ್ದರಿಂದ ನಿಮ್ಮನ್ನು ರಕ್ಷಿಸಲು ಇದನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗುತ್ತದೆ. ನಿಮಗೆ ಪರಿಚಯವಿಲ್ಲದ ಯಾರಾದರೂ ಈ ಕ್ರಮವನ್ನು ತೆಗೆದುಕೊಳ್ಳಲು ನಿಮಗೆ ಮಾರ್ಗದರ್ಶನ ನೀಡುತ್ತಿದ್ದರೆ, ಅದು ಸ್ಕ್ಯಾಮ್ ಆಗಿರಬಹುದು."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ಫೋನ್ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಇತರ ಆ್ಯಪ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡುವುದಕ್ಕೆ ಆ್ಯಪ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ಫೋನ್ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿಗೆ ಆ್ಯಪ್ ಆ್ಯಕ್ಸೆಸ್ ನೀಡುವುದನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ಫೋನ್ ಕರೆಯ ಸಮಯದಲ್ಲಿ ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g> ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು ಆ್ಯಪ್‌ಗೆ ನಿರಾಕರಿಸಲಾಗಿದೆ"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ಮತ್ತು ಹಣಕಾಸಿನ ಮಾಹಿತಿಯನ್ನು ಅಪಾಯಕ್ಕೆ ಸಿಲುಕಿಸಬಹುದಾದ ಸೂಕ್ಷ್ಮ ಅನುಮತಿಗೆ ಆ್ಯಪ್ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ವಿನಂತಿಸಿದೆ.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>.ಈ ನಿರ್ಬಂಧಿತ ಅನುಮತಿಯಿಲ್ಲದೆ ಆ್ಯಪ್ ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರುವ ಸಾಧ್ಯತೆಯಿದೆ. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ಹೇಗೆ ಅನುಮತಿಸುವುದು ಎಂಬುದನ್ನು ತಿಳಿಯಿರಿ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ಡೀಫಾಲ್ಟ್ <xliff:g id="ROLE_NAME">%1$s</xliff:g> ಆಗಿರಲು ಆ್ಯಪ್‌ಗೆ ಆ್ಯಕ್ಸೆಸ್ ಅನ್ನು ನಿರಾಕರಿಸಲಾಗಿದೆ"</string>
diff --git a/PermissionController/res/values-ko/strings.xml b/PermissionController/res/values-ko/strings.xml
index 21157a47b..94da3dfda 100644
--- a/PermissionController/res/values-ko/strings.xml
+++ b/PermissionController/res/values-ko/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"이 앱의 <xliff:g id="DEVICE_NAME">%2$s</xliff:g> <xliff:g id="PERM">%1$s</xliff:g> 액세스 권한"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"제한된 설정 허용"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"제한된 설정"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"보안을 위해 이 설정은 현재 사용할 수 없습니다."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"통화 중에 수행할 수 없는 작업입니다"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n 사기범은 전화 통화 중에 종종 이러한 유형의 작업을 요청하므로, 사용자를 보호하기 위해 해당 작업은 차단됩니다. 모르는 사람이 이 작업을 수행하도록 안내하는 경우 사기일 수도 있습니다."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"통화 중에는 앱이 다른 앱을 설치하도록 허용할 수 없습니다."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"통화 중에는 앱에 접근성 액세스 권한을 부여할 수 없습니다."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"통화 중에는 이 설정을 사용할 수 없습니다."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>에 대한 앱의 액세스가 거부됨"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"앱에서 개인 정보 및 금융 정보가 위험에 노출될 수 있는 민감한 권한에 대한 액세스를 요청했습니다.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>이 제한된 권한 없이는 앱이 제대로 작동하지 않을 수 있습니다. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;액세스 허용 방법 알아보기&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"앱을 기본 <xliff:g id="ROLE_NAME">%1$s</xliff:g>으로 사용하기 위한 액세스가 거부됨"</string>
diff --git a/PermissionController/res/values-ky/strings.xml b/PermissionController/res/values-ky/strings.xml
index eb12e7aef..9a7342b0b 100644
--- a/PermissionController/res/values-ky/strings.xml
+++ b/PermissionController/res/values-ky/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> түзмөгүндө бул колдонмо үчүн <xliff:g id="PERM">%1$s</xliff:g> уруксаты"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Чектелген параметрлерге уруксат берүү"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Чектелген функция"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Коопсуздук максатында бул параметр азырынча иштебейт."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Телефон чалуу учурунда аракет жеткиликсиз"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Телефон чалуу аркылуу сүйлөшүп жатканда шылуундар көбүнчө ушул сыяктуу аракетти аткарууну суранышат, андыктан коопсуздугуңузду коргоо үчүн бул нерсе бөгөттөлдү. Эгер сиз тааныбаган адам мындай аракетти аткарууну айтса, ал кесепчилик болушу мүмкүн."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Телефон чалуу учурунда колдонмолорго башка колдонмолорду орнотууга уруксат берүүгө болбойт."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Телефон чалуу учурунда колдонмого атайын мүмкүнчүлүктөрдү пайдаланууга уруксат берүүгө болбойт."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Телефон чалуу учурунда бул параметрди иштетүүгө болбойт."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Колдонмого <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> параметрин колдонууга тыюу салынды"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Колдонмо жеке жана каржы маалыматыңызга коркунуч жаратышы мүмкүн болгон купуя маалыматты көрүүгө уруксат сурады.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Мындай уруксатсыз колдонмо ойдогудай иштебей коюшу мүмкүн. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Мүмкүнчүлүк берүү жөнүндө кеңири маалымат&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Колдонмого демейки <xliff:g id="ROLE_NAME">%1$s</xliff:g> ролуна тыюу салынды"</string>
diff --git a/PermissionController/res/values-lo/strings.xml b/PermissionController/res/values-lo/strings.xml
index e82581d20..45fb7cd7d 100644
--- a/PermissionController/res/values-lo/strings.xml
+++ b/PermissionController/res/values-lo/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> ເຂົ້າເຖິງແອັບນີ້ຢູ່ <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"ອະນຸຍາດການຕັ້ງຄ່າທີ່ຈຳກັດ"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ການຕັ້ງຄ່າທີ່ຈຳກັດ"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ເພື່ອຄວາມປອດໄພຂອງທ່ານ, ຕອນນີ້ຈຶ່ງບໍ່ສາມາດໃຊ້ການຕັ້ງຄ່ານີ້ໄດ້."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ການດຳເນີນການບໍ່ພ້ອມນຳໃຊ້ໃນຂະນະທີ່ກຳລັງໂທລະສັບ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ສະແກມເມີມັກຈະຮ້ອງຂໍການດຳເນີນການປະເພດນີ້ໃນລະຫວ່າງການສົນທະນາທາງໂທລະສັບ, ດັ່ງນັ້ນລະບົບຈຶ່ງບລັອກໄວ້ເພື່ອປົກປ້ອງທ່ານ. ຫາກມີຄົນທີ່ທ່ານບໍ່ຮູ້ຈັກບອກໃຫ້ທ່ານດຳເນີນການດັ່ງກ່າວ, ນັ້ນອາດເປັນສະແກມ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ບໍ່ອະນຸຍາດໃຫ້ແອັບຕິດຕັ້ງແອັບອື່ນໆໃນລະຫວ່າງການໂທລະສັບ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ບໍ່ອະນຸຍາດໃຫ້ແອັບມີສິດເຂົ້າເຖິງການຊ່ວຍເຂົ້າເຖິງໃນລະຫວ່າງການໂທລະສັບ."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ບໍ່ອະນຸຍາດການເປີດການນຳໃຊ້ການຕັ້ງຄ່ານີ້ໃນລະຫວ່າງການໂທລະສັບ."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"ແອັບຖືກປະຕິເສດສິດເຂົ້າເຖິງຫາ <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ແອັບໄດ້ຮ້ອງຂໍການສິດເຖິງການອະນຸຍາດທີ່ລະອຽດອ່ອນ ເຊິ່ງສາມາດເຮັດໃຫ້ຂໍ້ມູນສ່ວນຕົວ ແລະ ຂໍ້ມູນການເງິນຂອງທ່ານມີຄວາມສ່ຽງ.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ມັນເປັນໄປໄດ້ວ່າແອັບດັ່ງກ່າວຈະບໍ່ເຮັດວຽກຢ່າງຖືກຕ້ອງໂດຍບໍ່ມີການອະນຸຍາດທີ່ຖືກຈຳກັດໄວ້ນີ້. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ສຶກສາວິທີອະນຸຍາດສິດເຂົ້າເຖິງ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ແອັບຖືກປະຕິເສດສິດເຂົ້າເຖິງໃຫ້ເປັນ <xliff:g id="ROLE_NAME">%1$s</xliff:g> ຄ່າເລີ່ມຕົ້ນ"</string>
diff --git a/PermissionController/res/values-lt/strings.xml b/PermissionController/res/values-lt/strings.xml
index f2891bf01..e18714cae 100644
--- a/PermissionController/res/values-lt/strings.xml
+++ b/PermissionController/res/values-lt/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g> prieiga šiai programai „<xliff:g id="DEVICE_NAME">%2$s</xliff:g>“"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Žr. visus „<xliff:g id="APP">%1$s</xliff:g>“ leidimus"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Žr. visas programas, kurioms suteiktas šis leidimas"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informacija"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Nustatymai"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Rodyti Padėjėjo mikrofono naudojimą"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nenaudojamos programos nustatymai"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Pašalinti leidimus, jei programa nenaudojama"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Leisti apribotus nustatymus"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Apribotas nustatymas"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Šis nustatymas šiuo metu nepasiekiamas dėl jūsų saugumo."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Veiksmas nepasiekiamas vykstant pokalbiui telefonu"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Aferistai dažnai prašo atlikti tokio tipo veiksmus vykstant telefono skambučiui, todėl šis veiksmas blokuojamas siekiant jus apsaugoti. Jei nepažįstamas asmuo prašo atlikti šį veiksmą, tai gali būti sukčiavimas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Vykstant telefono skambučiui programoms neleidžiama suteikti leidimo įdiegti kitas programas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Vykstant telefono skambučiui programai neleidžiama suteikti prieigos prie pritaikomumo paslaugos."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Vykstant telefono skambučiui neleidžiama įgalinti šio nustatymo."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Programai prieiga nesuteikta:<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Programa pateikė leidimo pasiekti neskelbtiną informaciją, dėl kurio gali kilti pavojus jūsų asmens ir finansinei informacijai, užklausą.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Gali būti, kad be šio apriboto leidimo programa neveiks tinkamai. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Sužinokite, kaip suteikti prieigą&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Programai nesuteikta prieiga kaip numatytojo šio vaidmens: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-lv/strings.xml b/PermissionController/res/values-lv/strings.xml
index 06ebde19f..cbf2e24df 100644
--- a/PermissionController/res/values-lv/strings.xml
+++ b/PermissionController/res/values-lv/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Šai lietotnei ir piešķirta piekļuves atļauja “<xliff:g id="PERM">%1$s</xliff:g>” šajā ierīcē: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Skatīt visas lietotnei <xliff:g id="APP">%1$s</xliff:g> piešķirtās atļaujas"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Skatīt visas lietotnes, kam ir šī atļauja"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Rādīt Asistenta mikrofona lietojumu"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Neizmantoto lietotņu iestatījumi"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Noņemt atļaujas, ja lietotne netiek izmantota"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Atļaut ierobežotos iestatījumus"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ierobežots iestatījums"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Drošības apsvērumu dēļ šis iestatījums pašlaik nav pieejams."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Darbība nav pieejama tālruņa zvana laikā"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Šāda veida darbību tālruņa zvana laikā bieži pieprasa krāpnieki, tāpēc šī iespēja ir bloķēta, lai jūs aizsargātu. Ja jums nepazīstama persona jums iesaka veikt šo darbību, tas var būt krāpniecības mēģinājums."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Tālruņa zvana laikā lietotnēm nav atļauts instalēt citas lietotnes."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Tālruņa zvana laikā nav atļauts piešķirt lietotnei piekļuvi pieejamības funkcijām."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Tālruņa zvana laikā nav atļauts iespējot šo iestatījumu."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Lietotnes piekļuve atļaujai “<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>” tika liegta"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Lietotne ir pieprasījusi piekļuvi sensitīvai atļaujai, kas var apdraudēt jūsu personas un finanšu informāciju.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Iespējams, lietotne nedarbosies pareizi bez šīs ierobežotās atļaujas. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Uzziniet, kā piešķirt piekļuvi.&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Lietotnes piekļuve noklusējuma lomai “<xliff:g id="ROLE_NAME">%1$s</xliff:g>” tika liegta"</string>
diff --git a/PermissionController/res/values-mk/strings.xml b/PermissionController/res/values-mk/strings.xml
index 59a3949b4..b2f27372d 100644
--- a/PermissionController/res/values-mk/strings.xml
+++ b/PermissionController/res/values-mk/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Пристап до <xliff:g id="PERM">%1$s</xliff:g> за апликацијава на <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Дозволете ограничени поставки"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ограничена поставка"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"За ваша безбедност, поставкава е недостапна во моментов."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Дејството не е достапно при телефонски повик"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Измамниците често бараат ваков тип дејства при телефонските разговори, па блокирано е за да ве заштити. Ако некој што не го познавате ве води да го преземете дејствово, тоа може да биде измама."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Дозволувањето апликациите да инсталираат други апликации е оневозможено при телефонски повик."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Не е дозволено давање пристап до пристапноста на апликацијата при телефонски повик."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Овозможувањето на поставкава не е дозволено при телефонски повик."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Барањето за пристап на апликацијата до <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> е одбиено"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Апликацијата побара пристап до дозвола за чувствителни податоци што може да ја загрози безбедноста на вашите лични и финансиски податоци.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Можно е апликацијата да не функционира правилно без ограниченава дозвола. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Дознајте како да дозволите пристап&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Барањето на апликацијата да биде стандарднa <xliff:g id="ROLE_NAME">%1$s</xliff:g> е одбиено"</string>
diff --git a/PermissionController/res/values-ml/strings.xml b/PermissionController/res/values-ml/strings.xml
index 39bfbf8ea..bc7160839 100644
--- a/PermissionController/res/values-ml/strings.xml
+++ b/PermissionController/res/values-ml/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> എന്നതിലെ ഈ ആപ്പിനുള്ള <xliff:g id="PERM">%1$s</xliff:g> ആക്സസ്"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"വിവരങ്ങൾ"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"ക്രമീകരണം"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"നിയന്ത്രിത ക്രമീകരണം അനുവദിക്കുക"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"നിയന്ത്രിത ക്രമീകരണം"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"നിങ്ങളുടെ സുരക്ഷയ്ക്ക്, ഈ ക്രമീകരണം നിലവിൽ ലഭ്യമല്ല."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ഫോൺ കോളിനിടെ പ്രവർത്തനം ലഭ്യമല്ല"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ഫോൺ കോൾ സംഭാഷണത്തിനിടെ സ്‌കാമർമാർ പലപ്പോഴും ഇത്തരത്തിലുള്ള പ്രവർത്തനം അഭ്യർത്ഥിക്കാറുണ്ട്, അതിനാൽ നിങ്ങളെ പരിരക്ഷിക്കുന്നതിനായി ഇത് ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു. പരിചയമില്ലാത്ത ആരെങ്കിലുമാണ് ഈ പ്രവർത്തനം നിങ്ങളോട് നിർദ്ദേശിക്കുന്നതെങ്കിൽ, അതൊരു സ്കാം ആയേക്കാം."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ഫോൺ കോളിനിടെ മറ്റ് ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യാനുള്ള അനുവാദം ആപ്പുകൾക്കില്ല."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ഒരു ഫോൺ കോളിനിടെ ആപ്പിന് ഉപയോഗസഹായിലേക്ക് ആക്‌സസ് നൽകുന്നത് അനുവദനീയമല്ല."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ഫോൺ കോളിനിടെ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നത് അനുവദനീയമല്ല."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"ആപ്പിന് <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> എന്നതിലേക്കുള്ള ആക്‌സസ് നിരസിച്ചു"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ആപ്പ് സെൻസിറ്റീവ് വിവരങ്ങൾക്കുള്ള അനുമതിയിലേക്ക് ആക്‌സസ് അഭ്യർത്ഥിച്ചു, ഇത് നിങ്ങളുടെ വ്യക്തിപരവും സാമ്പത്തികവുമായ വിവരങ്ങളെ അപകടത്തിലാക്കിയേക്കാം.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ഈ നിയന്ത്രിത അനുമതിയില്ലാതെ ആപ്പ് ശരിയായി പ്രവർത്തിച്ചേക്കില്ല. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ആക്സസ് എങ്ങനെ അനുവദിക്കുന്നുവെന്നറിയുക&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ആപ്പിന് ഡിഫോൾട്ട് <xliff:g id="ROLE_NAME">%1$s</xliff:g> ആകാനുള്ള ആക്‌സസ് നിരസിച്ചു"</string>
diff --git a/PermissionController/res/values-mn/strings.xml b/PermissionController/res/values-mn/strings.xml
index 8904d9a44..9a3f01681 100644
--- a/PermissionController/res/values-mn/strings.xml
+++ b/PermissionController/res/values-mn/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> дээрх энэ аппын <xliff:g id="PERM">%1$s</xliff:g>-д хандах эрх"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Хязгаарлагдсан тохиргоог зөвшөөрөх"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Хязгаарлагдсан тохиргоо"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Таны аюулгүй байдлын үүднээс энэ тохиргоо одоогоор боломжгүй байна."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Утасны дуудлага хийж байхад үйлдэл хийх боломжгүй"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Залилагчид утасны дуудлагын харилцан ярианы үеэр ийм төрлийн үйлдлийг ихэвчлэн хүсдэг тул таныг хамгаалахаар уг үйлдлийг блоклосон. Хэрэв таны танихгүй хүн ийм үйлдэл хийлгэхээр таныг чиглүүлж байгаа бол энэ нь заль мэх байж болно."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Утасны дуудлагын үеэр аппуудад бусад апп суулгахыг зөвшөөрдөггүй."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Утасны дуудлагын үеэр аппад хандалтад хандах эрх өгөхийг зөвшөөрдөггүй."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Утасны дуудлагын үеэр энэ тохиргоог идэвхжүүлэхийг зөвшөөрдөггүй."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Аппад <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>-д хандах эрх олгохоос татгалзсан"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Апп нь таны хувийн болон санхүүгийн мэдээллийг эрсдэлд оруулж болох эмзэг зөвшөөрөлд хандах эрх хүссэн.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Энэ хязгаарлагдмал зөвшөөрөлгүйгээр уг апп зохих ёсоор ажиллахгүй байх боломжтой. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Хандах эрхийг хэрхэн зөвшөөрөх талаар мэдэж авах&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Аппад өгөгдмөл <xliff:g id="ROLE_NAME">%1$s</xliff:g> болох эрх олгохоос татгалзсан"</string>
diff --git a/PermissionController/res/values-mr/strings.xml b/PermissionController/res/values-mr/strings.xml
index 983078ba8..ca8cb6410 100644
--- a/PermissionController/res/values-mr/strings.xml
+++ b/PermissionController/res/values-mr/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"या अ‍ॅपसाठी <xliff:g id="DEVICE_NAME">%2$s</xliff:g> वरील <xliff:g id="PERM">%1$s</xliff:g> चा अ‍ॅक्सेस"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant ने मायक्रोफोनचा केलेला वापर दाखवा"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"न वापरलेली ॲप सेटिंग्ज"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"अ‍ॅप वापरले नसल्यास, परवानग्या काढून टाका"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"प्रतिबंधित सेटिंग्जना अनुमती द्या"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"प्रतिबंधित सेटिंग"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"तुमच्या सुरक्षेसाठी, हे सेटिंग सध्या उपलब्ध नाही."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"फोन कॉलवर असताना कृती उपलब्ध नाही"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n फोन कॉल संभाषणांदरम्यान घोटाळेबाज व्यक्ती या प्रकारच्या कृतीची विनंती करतात, यामुळे तुमचे संरक्षण करण्यासाठी ती ब्लॉक केली आहे. तुम्ही ओळखत नसलेल्या एखाद्या व्यक्तीद्वारे तुम्हाला ही कृती करण्यास सांगितले जात असल्यास, तो घोटाळा असू शकतो."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"फोन कॉलदरम्यान ॲप्सना इतर ॲप्स इंस्टॉल करण्याची अनुमती नाही."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"फोन कॉलदरम्यान अ‍ॅपला अ‍ॅक्सेसिबिलिटीचा अ‍ॅक्सेस देण्याची अनुमती नाही."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"फोन कॉलदरम्यान ही सेटिंग सुरू करण्याची अनुमती नाही."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"अ‍ॅपचा <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> साठीचा अ‍ॅक्सेस नाकारला गेला आहे"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ॲपने संवेदनशील परवानगीसाठी अ‍ॅक्सेसची विनंती केली आहे, ज्यामुळे तुमची वैयक्तिक आणि आर्थिक माहिती धोक्यात येऊ शकते.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>या प्रतिबंधित परवानगीशिवाय ॲप कदाचित योग्यरीत्या काम करणार नाही. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;अ‍ॅक्सेसला अनुमती कशी द्यावी हे जाणून घ्या&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"अ‍ॅपचा डीफॉल्ट <xliff:g id="ROLE_NAME">%1$s</xliff:g> असण्यासाठीचा अ‍ॅक्सेस नाकारला गेला आहे"</string>
diff --git a/PermissionController/res/values-ms/strings.xml b/PermissionController/res/values-ms/strings.xml
index e08a44e24..9f218383d 100644
--- a/PermissionController/res/values-ms/strings.xml
+++ b/PermissionController/res/values-ms/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"akses <xliff:g id="PERM">%1$s</xliff:g> untuk apl ini pada <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Lihat semua kebenaran <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Lihat semua apl dengan kebenaran ini"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Maklumat"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Tetapan"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Tunjukkan penggunaan mikrofon pembantu"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Tetapan apl yang tidak digunakan"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Alih keluar kebenaran jika apl tidak digunakan"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Benarkan tetapan terhad"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Tetapan terhad"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Untuk keselamatan anda, tetapan ini tidak tersedia pada masa ini."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Tindakan tidak tersedia semasa panggilan telefon"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Penipu sering meminta jenis tindakan ini semasa perbualan panggilan telefon, maka tindakan ini disekat untuk melindungi anda. Jika anda dibimbing untuk mengambil tindakan ini oleh seseorang yang anda tidak kenali, perkara ini mungkin merupakan komplot."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Tindakan membenarkan apl memasang apl lain adalah tidak dibenarkan semasa panggilan telefon."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Tindakan memberikan apl akses kepada kebolehaksesan tidak dibenarkan semasa membuat panggilan telefon."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Tindakan mendayakan tetapan ini tidak dibenarkan semasa membuat panggilan telefon."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Akses apl kepada <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> telah ditolak"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Apl meminta akses kepada kebenaran sensitif yang boleh mengakibatkan risiko terhadap maklumat peribadi dan kewangan anda.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Apl tersebut mungkin tidak dapat berfungsi dengan betul tanpa kebenaran terhad ini. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ketahui cara membenarkan akses&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Akses apl untuk menjadi <xliff:g id="ROLE_NAME">%1$s</xliff:g> lalai telah ditolak"</string>
diff --git a/PermissionController/res/values-my-v33/strings.xml b/PermissionController/res/values-my-v33/strings.xml
index faafbd0d1..6487f5647 100644
--- a/PermissionController/res/values-my-v33/strings.xml
+++ b/PermissionController/res/values-my-v33/strings.xml
@@ -30,8 +30,7 @@
<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{ချဲ့ပြီး သတိပေးချက်နောက်တစ်ခု ကြည့်ရန်}other{ချဲ့ပြီး သတိပေးချက်နောက် # ခု ကြည့်ရန်}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"လျှော့ပြပါ"</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>
diff --git a/PermissionController/res/values-my/strings.xml b/PermissionController/res/values-my/strings.xml
index f01caa774..fd1b31b32 100644
--- a/PermissionController/res/values-my/strings.xml
+++ b/PermissionController/res/values-my/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> တွင် ဤအက်ပ်အတွက် <xliff:g id="PERM">%1$s</xliff:g> သုံးခွင့်"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant မိုက်ကရိုဖုန်း အသုံးပြုမှုကို ပြပါ"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"အသုံးမပြုသော အက်ပ်ဆက်တင်များ"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"အက်ပ်ကိုအသုံးမပြုလျှင် ခွင့်ပြုချက်များ ဖယ်ရှားရန်"</string>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"ကန့်သတ်ဆက်တင်များ ခွင့်ပြုရန်"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ကန့်သတ်ဆက်တင်"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"သင့်လုံခြုံရေးအတွက် ဤဆက်တင်ကို လောလောဆယ် မရနိုင်ပါ။"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ဖုန်းခေါ်နေစဉ်အတွင်း လုပ်ဆောင်ချက်များ မရနိုင်ပါ"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"အက်ပ်ကို <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> သုံးခွင့် ငြင်းပယ်ထားသည်"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"အက်ပ်သည် သင်၏ ပုဂ္ဂိုလ်ရေးနှင့် ငွေကြေးဆိုင်ရာ အချက်အလက်များကို အန္တရာယ်ဖြစ်စေနိုင်သော သတိထားရမည့် ခွင့်ပြုချက်သုံးရန် တောင်းဆိုထားသည်။<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>အက်ပ်သည် ဤကန့်သတ်ထားသော ခွင့်ပြုချက်မရှိပါက ကောင်းစွာမလုပ်ဆောင်ခြင်း ဖြစ်နိုင်သည်။ &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;သုံးခွင့်ပြုနည်းကို လေ့လာရန်&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-nb-v33/strings.xml b/PermissionController/res/values-nb-v33/strings.xml
index a5f067d71..9f4910da2 100644
--- a/PermissionController/res/values-nb-v33/strings.xml
+++ b/PermissionController/res/values-nb-v33/strings.xml
@@ -33,7 +33,7 @@
<string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Skjul"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Varsel. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"Handlingen er fullført"</string>
- <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Sjekk innstillinger som kan øke beskyttelsen til enheten"</string>
+ <string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Sjekk innstillinger som kan gi enheten bedre beskyttelse"</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"Hurtiginnstillinger for sikkerhet og personvern"</string>
<string name="safety_center_qs_close_button" msgid="1352313308176244599">"Lukk"</string>
<string name="safety_center_qs_expand_action" msgid="2193190557696484169">"Vis alternativer"</string>
diff --git a/PermissionController/res/values-nb/strings.xml b/PermissionController/res/values-nb/strings.xml
index 2e64a1ae6..bf361da0e 100644
--- a/PermissionController/res/values-nb/strings.xml
+++ b/PermissionController/res/values-nb/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g>-tilgang for denne appen på <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Se alle tillatelsene <xliff:g id="APP">%1$s</xliff:g> har"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Se alle apper med denne tillatelsen"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Vis bruk av assistentmikrofonen"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Innstillinger for ubrukte apper"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Fjern tillatelser hvis appen ikke brukes"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Tillat begrensede innstillinger"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Begrenset innstilling"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Av sikkerhetshensyn er denne innstillingen utilgjengelig for øyeblikket."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Handlingen er utilgjengelig under telefonsamtaler"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Svindlere ber ofte om slike handlinger under telefonsamtaler, så det er blokkert for å beskytte deg. Hvis noen du ikke kjenner, ber deg om å gjøre dette, kan det være svindel."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Det er ikke tillatt å la apper installere andre apper under telefonsamtaler."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Det er ikke tillatt å gi apper tilgang til tilgjengelighetsfunksjoner under telefonsamtaler."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Du kan ikke slå på denne innstillingen under telefonsamtaler."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Appens tilgang til <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> ble avvist"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Appen ba om tilgang til en sensitiv tillatelse som kan utsette den personlige og økonomiske informasjonen din for fare.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Det kan hende at appen ikke fungerer skikkelig uten denne begrensede tillatelsen. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Finn ut hvordan du gir tilgang&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Appen fikk ikke tillatelse til å være standard <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-ne-v33/strings.xml b/PermissionController/res/values-ne-v33/strings.xml
index 59de5b71b..b41931d2a 100644
--- a/PermissionController/res/values-ne-v33/strings.xml
+++ b/PermissionController/res/values-ne-v33/strings.xml
@@ -33,7 +33,7 @@
<string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"कोल्याप्स गर्नुहोस्"</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_status_summary" msgid="5193925895830451177">"तपाईंको डिभाइसलाई थप सुरक्षित राख्न सक्ने सेटिङ जाँच्नुहोस्"</string>
<string name="safety_center_qs_page_landing" msgid="1717368301679228128">"सुरक्षा तथा गोपनीयतासम्बन्धी द्रुत सेटिङ"</string>
<string name="safety_center_qs_close_button" msgid="1352313308176244599">"बन्द गर्नुहोस्"</string>
<string name="safety_center_qs_expand_action" msgid="2193190557696484169">"एक्स्पान्ड गर्नुहोस् र विकल्पहरू देखाउनुहोस्"</string>
diff --git a/PermissionController/res/values-ne/strings.xml b/PermissionController/res/values-ne/strings.xml
index 8f9152c8a..bb78d4e95 100644
--- a/PermissionController/res/values-ne/strings.xml
+++ b/PermissionController/res/values-ne/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"यो एपलाई <xliff:g id="DEVICE_NAME">%2$s</xliff:g> को <xliff:g id="PERM">%1$s</xliff:g> प्रयोग गर्ने अनुमति"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -583,7 +587,7 @@
<string name="safety_privacy_qs_tile_subtitle" msgid="3621544532041936749">"स्थिति जाँच गर्नुहोस्"</string>
<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="camera_toggle_label_qs" msgid="3880261453066157285">"क्यामेरा एक्सेस"</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>
@@ -625,7 +629,7 @@
<string name="safety_center_background_location_access_revoked" msgid="6972274943343442213">"अनुमति बदलियो"</string>
<string name="safety_center_view_recent_location_access" msgid="3524391299490678243">"हालसालै कहिले लोकेसनसम्बन्धी प्रयोग गरिएको थियो हेर्नुहोस्"</string>
<string name="privacy_controls_title" msgid="7605929972256835199">"गोपनीयतासम्बन्धी सेटिङ"</string>
- <string name="camera_toggle_title" msgid="1251201397431837666">"क्यामेरा प्रयोग गर्ने अनुमति"</string>
+ <string name="camera_toggle_title" msgid="1251201397431837666">"क्यामेरा एक्सेस"</string>
<string name="mic_toggle_title" msgid="2649991093496110162">"माइक्रोफोन प्रयोग गर्ने अनुमति"</string>
<string name="perm_toggle_description" msgid="7801326363741451379">"एप तथा सेवाहरूका हकमा"</string>
<string name="mic_toggle_description" msgid="9163104307990677157">"एप तथा सेवाहरूका हकमा। यो सेटिङ अफ गरिएको अवस्थामा तपाईंले आपत्‍कालीन नम्बरमा कल गर्नुभयो भने माइक्रोफोनसम्बन्धी डेटा अझै पनि सेयर गरिन सक्छ।"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"प्रतिबन्ध लगाइएका सेटिङ अनलक गर्नुहोस्"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"प्रतिबन्ध लगाइएका सेटिङ"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"तपाईंको खाताको सुरक्षार्थ यो सेटिङ हाल उपलब्ध छैन।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"फोन कल चलिरहेका बेला यो कारबाही गर्न मिल्दैन"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n स्क्याम गर्ने व्यक्तिले फोन कल चलिरहेका बेला प्रायः यस प्रकारको कारबाही गर्न अनुरोध गर्ने भएकाले तपाईंको सुरक्षार्थ यो कारबाही गर्न रोक लगाइएको हो। तपाईंलाई कुनै अपरिचित व्यक्तिले यो कारबाही गर्ने मार्गदर्शन गर्दै छ भने त्यो जालसाजी हुन सक्छ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"फोन कल चलिरहेका बेला एपहरूलाई अन्य एप इन्स्टल गर्ने अनुमति दिन मिल्दैन।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"फोन कल चलिरहेका बेला एपलाई सर्वसुलभतासम्बन्धी सेवा एक्सेस गर्ने अनुमति दिन मिल्दैन।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"फोन कल चलिरहेका बेला यो सेटिङ अन गर्ने अनुमति दिन मिल्दैन।"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"एपले <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> प्रयोग गर्न मागेको अनुमति अस्वीकार गरिएको छ"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"यो एपले तपाईंको व्यक्तिगत तथा वित्तीय जानकारी जोखिममा पार्न सक्ने खालको संवेदनशील अनुमति मागेको छ।<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>तपाईले उक्त प्रतिबन्धित अनुमति नदिएका खण्डमा यो एपले राम्रोसँग काम नगर्न सक्छ। &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;अनुमति दिने तरिका सिक्नुहोस्&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"यो एपले डिफल्ट <xliff:g id="ROLE_NAME">%1$s</xliff:g> का रूपमा काम गर्न मागेको अनुमति अस्वीकार गरिएको छ"</string>
diff --git a/PermissionController/res/values-nl/strings.xml b/PermissionController/res/values-nl/strings.xml
index 9a646f357..8ce828e5f 100644
--- a/PermissionController/res/values-nl/strings.xml
+++ b/PermissionController/res/values-nl/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Toegang tot <xliff:g id="PERM">%1$s</xliff:g> voor deze app op <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Alle rechten van <xliff:g id="APP">%1$s</xliff:g> bekijken"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Alle apps met dit recht bekijken"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informatie"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Instellingen"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Gebruik van Assistent-microfoon tonen"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Niet-gebruikte app-instellingen"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Rechten intrekken als app niet wordt gebruikt"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Beperkte instellingen toestaan"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Beperkte instelling"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ter beveiliging is deze instelling op dit moment niet beschikbaar."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Actie niet beschikbaar tijdens een telefoongesprek"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Scammers vragen vaak om dit soort acties tijdens telefoongesprekken. Daarom is deze actie geblokkeerd om je te beschermen. Als iemand die je niet kent je aanspoort om deze actie uit te voeren, kan dit een scam zijn."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Apps toestaan om andere apps te installeren is niet toegestaan tijdens een telefoongesprek."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Een app toegang geven tot toegankelijkheid is niet toegestaan tijdens een telefoongesprek."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Deze instelling aanzetten is niet toegestaan tijdens een telefoongesprek."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"App heeft geen toegang gekregen tot <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"De app heeft toegang gevraagd tot een gevoelig recht, waardoor je persoonlijke en financiële informatie risico kunnen lopen.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Het is mogelijk dat de app niet goed werkt zonder dit beperkte recht. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Meer informatie over hoe je toegang geeft&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"App heeft geen toegang gekregen om de standaard <xliff:g id="ROLE_NAME">%1$s</xliff:g> te worden"</string>
diff --git a/PermissionController/res/values-or/strings.xml b/PermissionController/res/values-or/strings.xml
index 4703749b8..4e2cbbdb8 100644
--- a/PermissionController/res/values-or/strings.xml
+++ b/PermissionController/res/values-or/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>ରେ ଏହି ଆପ ପାଇଁ <xliff:g id="PERM">%1$s</xliff:g> ଆକ୍ସେସ ଅଛି"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର ଦେଖାନ୍ତୁ"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"ଅବ୍ୟବହୃତ ଆପ ସେଟିଂସ"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"ଯଦି ଆପ୍ ବ୍ୟବହାର କରାଯାଇନାହିଁ, ତେବେ ଅନୁମତିଗୁଡ଼ିକୁ କାଢ଼ି ଦିଅନ୍ତୁ"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂସକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ପ୍ରତିବନ୍ଧିତ ସେଟିଂ"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ଆପଣଙ୍କ ସୁରକ୍ଷା ପାଇଁ ଏହି ସେଟିଂ ବର୍ତ୍ତମାନ ଅନୁପଲବ୍ଧ ଅଟେ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"କୌଣସି ଫୋନ କଲରେ ଥିବା ସମୟରେ କାର୍ଯ୍ୟ ଉପଲବ୍ଧ ନାହିଁ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ଫୋନ କଲ ବାର୍ତ୍ତାଳାପ ସମୟରେ ସ୍କାମରମାନେ ପ୍ରାୟତଃ ଏହି ପ୍ରକାରର କାର୍ଯ୍ୟ ପାଇଁ ଅନୁରୋଧ କରନ୍ତି, ତେଣୁ ଆପଣଙ୍କୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ ଏହାକୁ ବ୍ଲକ କରାଯାଏ। ଯଦି ଆପଣଙ୍କୁ ଏହି ପଦକ୍ଷେପ ନେବାକୁ ଆପଣ ଜାଣିନଥିବା ବ୍ୟକ୍ତିଙ୍କ ଦ୍ୱାରା ମାର୍ଗଦର୍ଶନ କରାଯାଉଛି, ତେବେ ଏହା ଏକ ସ୍କାମ ହୋଇପାରେ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"କୌଣସି ଫୋନ କଲ ସମୟରେ ଅନ୍ୟ ଆପ୍ସକୁ ଇନଷ୍ଟଲ କରିବା ପାଇଁ ଆପ୍ସକୁ ଅନୁମତି ଦିଆଯାଏ ନାହିଁ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ଏକ ଫୋନ କଲ ସମୟରେ ଆକ୍ସେସିବିଲିଟୀ ପାଇଁ ଏକ ଆପ ଆକ୍ସେସ ଦେବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ଏକ ଫୋନ କଲ ସମୟରେ ଏହି ସେଟିଂ ସକ୍ଷମ କରିବାକୁ ଅନୁମତି ଦିଆଯାଏ ନାହିଁ।"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>କୁ ଆପର ଆକ୍ସେସକୁ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ଆପଣଙ୍କ ବ୍ୟକ୍ତିଗତ ଏବଂ ଆର୍ଥିକ ସୂଚନାକୁ ବିପଦରେ ପକାଇପାରୁଥିବା ଏକ ସମ୍ବେଦନଶୀଳ ଅନୁମତିକୁ ଆକ୍ସେସ କରିବା ପାଇଁ ଏହି ଆପଟି ଅନୁରୋଧ କରିଛି।<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ଏହା ସମ୍ଭବ ଯେ ଏହି ପ୍ରତିବନ୍ଧିତ ଅନୁମତି ବିନା ଆପ ସଠିକ ଭାବେ କାର୍ଯ୍ୟ କରିବ ନାହିଁ। &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ଆକ୍ସେସକୁ କିପରି ଅନୁମତି ଦେବେ ତାହା ଜାଣନ୍ତୁ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ଡିଫଲ୍ଟ <xliff:g id="ROLE_NAME">%1$s</xliff:g> ହେବା ପାଇଁ ଆପର ଆକ୍ସେସକୁ ଅଗ୍ରାହ୍ୟ କରାଯାଇଛି"</string>
diff --git a/PermissionController/res/values-pa/strings.xml b/PermissionController/res/values-pa/strings.xml
index b7585b0b0..09b87741b 100644
--- a/PermissionController/res/values-pa/strings.xml
+++ b/PermissionController/res/values-pa/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> \'ਤੇ ਇਸ ਐਪ ਲਈ <xliff:g id="PERM">%1$s</xliff:g> ਦੀ ਪਹੁੰਚ"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"ਜਾਣਕਾਰੀ"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"ਸੈਟਿੰਗਾਂ"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistant ਦੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ ਦਿਖਾਓ"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"ਅਣਵਰਤੀ ਐਪ ਦੀਆਂ ਸੈਟਿੰਗਾਂ"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"ਐਪ ਨੂੰ ਨਾ ਵਰਤੇ ਜਾਣ \'ਤੇ ਇਸ ਲਈ ਦਿੱਤੀਆਂ ਇਜਾਜ਼ਤਾਂ ਨੂੰ ਹਟਾ ਦਿਓ"</string>
@@ -251,7 +253,7 @@
<string name="app_permission_never_accessed_summary" msgid="401346181461975090">"ਕਦੇ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ"</string>
<string name="app_permission_never_accessed_denied_summary" msgid="6596000497490905146">"ਮਨ੍ਹਾ ਕੀਤਾ ਗਿਆ / ਕਦੇ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ"</string>
<string name="allowed_header" msgid="7769277978004790414">"ਮਨਜ਼ੂਰਸ਼ੁਦਾ"</string>
- <string name="allowed_always_header" msgid="6455903312589013545">"ਹਰ ਵੇਲੇ ਪਹੁੰਚ ਵਾਲੀਆਂ"</string>
+ <string name="allowed_always_header" msgid="6455903312589013545">"ਹਰ ਵੇਲੇ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਹੈ"</string>
<string name="allowed_foreground_header" msgid="6845655788447833353">"ਸਿਰਫ਼ ਐਪ ਵਰਤੋਂ ਵੇਲੇ ਪਹੁੰਚ ਵਾਲੀਆਂ"</string>
<string name="allowed_storage_scoped" msgid="5383645873719086975">"ਸਿਰਫ਼ ਮੀਡੀਆ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦਿੱਤੀ ਗਈ"</string>
<string name="allowed_storage_full" msgid="5356699280625693530">"ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦਿੱਤਾ ਗਿਆ"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"ਪ੍ਰਤਿਬੰਧਿਤ ਸੈਟਿੰਗਾਂ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"ਪ੍ਰਤਿਬੰਧਿਤ ਸੈਟਿੰਗਾਂ"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਲਈ, ਫ਼ਿਲਹਾਲ ਇਹ ਸੈਟਿੰਗ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ਫ਼ੋਨ ਕਾਲ \'ਤੇ ਹੋਣ ਦੌਰਾਨ ਕਾਰਵਾਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ਘਪਲੇਬਾਜ਼ ਅਕਸਰ ਫ਼ੋਨ ਕਾਲ ਦੀਆਂ ਗੱਲਾਂਬਾਤਾਂ ਦੌਰਾਨ ਇਸ ਕਿਸਮ ਦੀ ਕਾਰਵਾਈ ਦੀ ਬੇਨਤੀ ਕਰਦੇ ਹਨ, ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ ਇਸਨੂੰ ਬਲਾਕ ਕੀਤਾ ਹੁੰਦਾ ਹੈ। ਜੇ ਤੁਹਾਨੂੰ ਕਿਸੇ ਅਨਜਾਣ ਵਿਅਕਤੀ ਵੱਲੋਂ ਇਹ ਕਾਰਵਾਈ ਕਰਨ ਲਈ ਸੇਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਇੱਕ ਘਪਲਾ ਹੋਵੇ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ਫ਼ੋਨ ਕਾਲ ਦੌਰਾਨ ਐਪਾਂ ਨੂੰ ਹੋਰ ਐਪਾਂ ਸਥਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ਫ਼ੋਨ ਕਾਲ ਦੌਰਾਨ ਐਪ ਨੂੰ ਪਹੁੰਚਯੋਗਤਾ ਤੱਕ ਪਹੁੰਚ ਦੇਣ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ।"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ਫ਼ੋਨ ਕਾਲ ਦੌਰਾਨ ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਜਾਂਦੀ।"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"ਐਪ ਨੂੰ <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਗਈ"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"ਐਪ ਨੇ ਸੰਵੇਦਨਸ਼ੀਲ ਇਜਾਜ਼ਤ ਤੱਕ ਪਹੁੰਚ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਹਾਡੀ ਨਿੱਜੀ ਅਤੇ ਵਿੱਤੀ ਜਾਣਕਾਰੀ ਜੋਖਮ ਵਿੱਚ ਪੈ ਸਕਦੀ ਹੈ।<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ਇਹ ਸੰਭਵ ਹੈ, ਕਿ ਐਪ ਇਸ ਪ੍ਰਤਿਬੰਧਿਤ ਇਜਾਜ਼ਤ ਤੋਂ ਬਿਨਾਂ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ। &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਦੇਣ ਦੇ ਤਰੀਕੇ ਬਾਰੇ ਜਾਣੋ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ਐਪ ਨੂੰ ਪੂਰਵ-ਨਿਰਧਾਰਿਤ <xliff:g id="ROLE_NAME">%1$s</xliff:g> ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਆਗਿਆ ਨਹੀਂ ਦਿੱਤੀ ਗਈ"</string>
diff --git a/PermissionController/res/values-pl/strings.xml b/PermissionController/res/values-pl/strings.xml
index 966c0fd4e..83cd5c287 100644
--- a/PermissionController/res/values-pl/strings.xml
+++ b/PermissionController/res/values-pl/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Aplikacja ma przyznane uprawnienie <xliff:g id="PERM">%1$s</xliff:g> na tym urządzeniu: <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Zobacz wszystkie uprawnienia aplikacji <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Wyświetl wszystkie aplikacje z tym uprawnieniem"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Pokaż użycie mikrofonu w Asystencie"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ustawienia nieużywanych aplikacji"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Usuń uprawnienia, jeśli aplikacja jest nieużywana"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Zezwól na ustawienia z ograniczonym dostępem"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ustawienie z ograniczonym dostępem"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ze względów bezpieczeństwa to ustawienie jest obecnie niedostępne."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Działanie niedostępne podczas rozmowy telefonicznej"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Oszuści często proszą o takie działania podczas rozmów telefonicznych, dlatego blokujemy je, aby Cię chronić. Jeśli ktoś, kogo nie znasz, prosi Cię o podjęcie takiego działania, może to być oszustwo."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Podczas rozmowy telefonicznej nie można zezwolić aplikacjom na instalowanie innych aplikacji."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Podczas rozmowy telefonicznej nie można zezwolić na korzystanie z ułatwień dostępu w aplikacji."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Podczas rozmowy telefonicznej nie można włączyć tego ustawienia."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikacja nie otrzymała dostępu do uprawnień <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacja wymaga dostępu do uprawnień newralgicznych, co może zagrażać Twoim danym osobowym i informacjom finansowym.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Możliwe, że bez tego uprawnienia z ograniczeniami aplikacja nie będzie działać poprawnie. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Jak zezwolić na dostęp&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikacja nie otrzymała dostępu jako domyślna <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-pt-rBR/strings.xml b/PermissionController/res/values-pt-rBR/strings.xml
index 156ff9162..9d66648c1 100644
--- a/PermissionController/res/values-pt-rBR/strings.xml
+++ b/PermissionController/res/values-pt-rBR/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acesso de <xliff:g id="PERM">%1$s</xliff:g> para esse app no <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todas as permissões do app <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Mostrar todos os apps que têm esta permissão"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informações"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Configurações"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar uso de microfone pelo Assistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Configurações de apps não usados"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover permissões se o app não for usado"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir configurações restritas"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Configuração restrita"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Para sua segurança, essa configuração está indisponível no momento."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Ação indisponível durante uma ligação"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Golpistas costumam pedir esse tipo de ação durante ligações, então ela fica bloqueada para sua proteção. Se você está recebendo instruções de uma pessoa desconhecida para realizar essa ação, isso pode ser um golpe."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Não é possível permitir que apps instalem outros apps durante uma ligação."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Não é possível dar a um app acesso aos recursos de acessibilidade durante uma ligação."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Não é permitido ativar essa configuração durante uma ligação."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"O app não recebeu a seguinte permissão de acesso: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"O app solicitou acesso a uma permissão sensível que pode colocar suas informações pessoais e financeiras em risco.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>É possível que o app não funcione corretamente sem essa permissão restrita. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Aprenda a conceder acesso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"O app não recebeu o acesso para ser a escolha padrão de: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml
index 34aff66b1..2bd6c8745 100644
--- a/PermissionController/res/values-pt-rPT/strings.xml
+++ b/PermissionController/res/values-pt-rPT/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acesso a <xliff:g id="PERM">%1$s</xliff:g> para esta app no dispositivo <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todas as autorizações da app <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ver todas as apps com esta autorização"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informações"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Definições"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar utilização do microfone do assistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Definições de apps não usadas"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover autorizações se a app não for utilizada"</string>
@@ -362,13 +364,13 @@
<string name="role_browser_request_title" msgid="2895200507835937192">"Quer definir o <xliff:g id="APP_NAME">%1$s</xliff:g> como a app de navegador predefinida?"</string>
<string name="role_browser_request_description" msgid="5888803407905985941">"Não são necessárias autorizações."</string>
<string name="role_dialer_label" msgid="1100224146343237968">"App de telefone predefinida"</string>
- <string name="role_dialer_short_label" msgid="7186888549465352489">"App Telefone"</string>
+ <string name="role_dialer_short_label" msgid="7186888549465352489">"App de telefone"</string>
<string name="role_dialer_description" msgid="8768708633696539612">"Apps que permitem fazer e receber chamadas no seu dispositivo"</string>
<string name="role_dialer_request_title" msgid="5959618560705912058">"Quer definir o <xliff:g id="APP_NAME">%1$s</xliff:g> como a app de telefone predefinida?"</string>
<string name="role_dialer_request_description" msgid="6288839625724909320">"Esta app fica com acesso à sua Câmara, Contactos, Microfone, Telefone e SMS"</string>
<string name="role_dialer_search_keywords" msgid="3324448983559188087">"telefone"</string>
<string name="role_sms_label" msgid="8456999857547686640">"App de SMS predefinida"</string>
- <string name="role_sms_short_label" msgid="4371444488034692243">"app de SMS"</string>
+ <string name="role_sms_short_label" msgid="4371444488034692243">"App de SMS"</string>
<string name="role_sms_description" msgid="3424020199148153513">"Apps que permitem usar o seu número de telefone para enviar e receber mensagens de texto, fotos, vídeos e muito mais."</string>
<string name="role_sms_request_title" msgid="7953552109601185602">"Quer definir o <xliff:g id="APP_NAME">%1$s</xliff:g> como app SMS predefinida?"</string>
<string name="role_sms_request_description" msgid="2691004766132144886">"Esta app fica com acesso à sua Câmara, Contactos, Ficheiros e multimédia, Microfone, Telefone e SMS"</string>
@@ -380,7 +382,7 @@
<string name="role_emergency_request_description" msgid="131645948770262850">"Não são necessárias autorizações."</string>
<string name="role_emergency_search_keywords" msgid="1920007722599213358">"em caso de emergência"</string>
<string name="role_home_label" msgid="3871847846649769412">"App página inicial predefinida"</string>
- <string name="role_home_short_label" msgid="8544733747952272337">"App Página inicial"</string>
+ <string name="role_home_short_label" msgid="8544733747952272337">"App de página inicial"</string>
<string name="role_home_description" msgid="7997371519626556675">"Também conhecidas por \"launcher\" são apps que substituem os ecrãs principais no Android e dão acesso aos conteúdos e às funcionalidades do seu dispositivo"</string>
<string name="role_home_request_title" msgid="738136983453341081">"Quer definir o <xliff:g id="APP_NAME">%1$s</xliff:g> como a app Página inicial predefinida?"</string>
<string name="role_home_request_description" msgid="2658833966716057673">"Não são necessárias autorizações."</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir definições restritas"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Definição restrita"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Para sua segurança, esta definição está indisponível atualmente."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Ação não disponível durante uma chamada"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Os autores de esquemas pedem frequentemente este tipo de ação durante as conversas telefónicas, por isso, a opção é bloqueada para sua proteção. Se alguém que não conhece lhe pedir para realizar esta ação, pode tratar-se de um esquema."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Não é permitido autorizar que as apps instalem outras apps durante uma chamada telefónica."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Não é permitido conceder a uma app acesso à acessibilidade durante uma chamada telefónica."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Não é permitido ativar esta definição durante uma chamada telefónica."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"O acesso a <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> foi negado à app"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"A app pediu acesso a uma autorização confidencial que pode pôr em risco as suas informações pessoais e financeiras.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>É possível que a app não funcione corretamente sem esta autorização restrita. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Saiba como permitir o acesso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"O acesso à função predefinida <xliff:g id="ROLE_NAME">%1$s</xliff:g> foi negado à app"</string>
diff --git a/PermissionController/res/values-pt/strings.xml b/PermissionController/res/values-pt/strings.xml
index 156ff9162..9d66648c1 100644
--- a/PermissionController/res/values-pt/strings.xml
+++ b/PermissionController/res/values-pt/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acesso de <xliff:g id="PERM">%1$s</xliff:g> para esse app no <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ver todas as permissões do app <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Mostrar todos os apps que têm esta permissão"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informações"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Configurações"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Mostrar uso de microfone pelo Assistente"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Configurações de apps não usados"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Remover permissões se o app não for usado"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permitir configurações restritas"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Configuração restrita"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Para sua segurança, essa configuração está indisponível no momento."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Ação indisponível durante uma ligação"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Golpistas costumam pedir esse tipo de ação durante ligações, então ela fica bloqueada para sua proteção. Se você está recebendo instruções de uma pessoa desconhecida para realizar essa ação, isso pode ser um golpe."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Não é possível permitir que apps instalem outros apps durante uma ligação."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Não é possível dar a um app acesso aos recursos de acessibilidade durante uma ligação."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Não é permitido ativar essa configuração durante uma ligação."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"O app não recebeu a seguinte permissão de acesso: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"O app solicitou acesso a uma permissão sensível que pode colocar suas informações pessoais e financeiras em risco.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>É possível que o app não funcione corretamente sem essa permissão restrita. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Aprenda a conceder acesso&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"O app não recebeu o acesso para ser a escolha padrão de: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-ro/strings.xml b/PermissionController/res/values-ro/strings.xml
index 6a0325811..288c25d46 100644
--- a/PermissionController/res/values-ro/strings.xml
+++ b/PermissionController/res/values-ro/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Acces de <xliff:g id="PERM">%1$s</xliff:g> pentru această aplicație pe <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Vezi toate permisiunile aplicației <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Vezi toate aplicațiile cu această permisiune"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Afișează datele de utilizare a microfonului cu Asistentul"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Setările aplicațiilor nefolosite"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Elimină permisiunile dacă aplicația nu este folosită"</string>
@@ -525,7 +529,7 @@
<string name="permgroupupgraderequestdetail_camera" msgid="6642747548010962597">"Aplicația dorește să fotografieze și să înregistreze videoclipuri permanent, chiar și când nu o folosești. "<annotation id="link">"Acordă această permisiune din setări."</annotation></string>
<string name="permgrouprequest_calllog" msgid="2065327180175371397">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să-ți acceseze jurnalele de apeluri?"</string>
<string name="permgrouprequest_device_aware_calllog" msgid="8220927190376843309">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să-ți acceseze jurnalele de apeluri telefonice de pe &lt;b&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/b&gt;?"</string>
- <string name="permgrouprequest_phone" msgid="1829234136997316752">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să dea și să gestioneze apeluri telefonice?"</string>
+ <string name="permgrouprequest_phone" msgid="1829234136997316752">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să și să gestioneze apeluri telefonice?"</string>
<string name="permgrouprequest_device_aware_phone" msgid="590399263670349955">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să inițieze și să gestioneze apeluri telefonice pe &lt;b&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/b&gt;?"</string>
<string name="permgrouprequest_sensors" msgid="4397358316850652235">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele vitale?"</string>
<string name="permgrouprequest_device_aware_sensors" msgid="3874451050573615157">"Permiți ca &lt;b&gt;<xliff:g id="APP_NAME">%1$s</xliff:g>&lt;/b&gt; să acceseze datele de la senzori despre semnele tale vitale de pe &lt;b&gt;<xliff:g id="DEVICE_NAME">%2$s</xliff:g>&lt;/b&gt;?"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Permite setările restricționate"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Setare restricționată"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Pentru securitatea ta, setarea este momentan indisponibilă."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Acțiune indisponibilă în timpul apelului telefonic"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Escrocii solicită adesea acest tip de acțiune în timpul conversațiilor telefonice, astfel că opțiunea este blocată pentru a te proteja. Dacă o persoană necunoscută te îndrumă să faci această acțiune, este posibil să fie o escrocherie."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Nu este permisă instalarea altor aplicații în timpul unui apel telefonic."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Nu este permisă acordarea accesului la accesibilitate pentru o aplicație în timpul unui apel telefonic."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Activarea acestei setări nu este permisă în timpul unui apel telefonic."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Accesul aplicației la <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> a fost refuzat"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplicația a solicitat acces la o permisiune de accesare a informațiilor sensibile care îți poate pune în pericol informațiile financiare și cu caracter personal.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Este posibil ca aplicația să nu funcționeze corect fără această permisiune restricționată. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Află cum să permiți accesul&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Accesul aplicației pentru a deveni <xliff:g id="ROLE_NAME">%1$s</xliff:g> prestabilită a fost refuzat"</string>
diff --git a/PermissionController/res/values-ru/strings.xml b/PermissionController/res/values-ru/strings.xml
index 2fe75db49..4bdd16369 100644
--- a/PermissionController/res/values-ru/strings.xml
+++ b/PermissionController/res/values-ru/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Разрешение \"<xliff:g id="PERM">%1$s</xliff:g>\" для этого приложения на устройстве \"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>\""</string>
<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="app_permission_info_button" msgid="8973692370208562556">"Информация"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Настройки"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Разрешить доступ к настройкам"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Настройки с ограниченным доступом"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"В целях безопасности эти настройки пока недоступны."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Действие недоступно во время звонка."</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Об этом часто просят телефонные мошенники. Мы заблокировали эту функцию, чтобы защитить вас. Если незнакомый человек предлагает вам использовать ее, возможно это мошенник."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Во время звонка нельзя дать приложениям разрешение на установку приложений."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Во время звонка нельзя дать приложению доступ к специальным возможностям."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Этот параметр нельзя включить во время звонка."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Для приложения заблокировано разрешение \"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>\""</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Приложение запрашивает разрешение на доступ к конфиденциальной информации. Если вы предоставите его, ваши личные и финансовые данные могут оказаться под угрозой.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без такого разрешения приложение может работать неправильно. Узнайте, &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;как предоставить доступ к данным&lt;/a&gt;."</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Запрос на использование в качестве приложения по умолчанию (<xliff:g id="ROLE_NAME">%1$s</xliff:g>) отклонен"</string>
diff --git a/PermissionController/res/values-si/strings.xml b/PermissionController/res/values-si/strings.xml
index 7fcc23787..bb9ddd07e 100644
--- a/PermissionController/res/values-si/strings.xml
+++ b/PermissionController/res/values-si/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> මත මෙම යෙදුම සඳහා <xliff:g id="PERM">%1$s</xliff:g> ප්‍රවේශය"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"තොරතුරු"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"සැකසීම්"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"සීමා කළ සැකසීම්වලට ඉඩ දෙන්න"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"සීමා කළ සැකසීම"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"ඔබේ ආරක්ෂාව සඳහා, මෙම සැකසීම දැනට නොමැත."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"දුරකථන ඇමතුමක සිටින අතරතුර ක්‍රියාව ලබා ගත නොහැක."</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n වංචාකරුවන් බොහෝ විට දුරකථන ඇමතුම් සංවාද අතරතුර මෙවැනි ක්‍රියාමාර්ග ඉල්ලා සිටින බැවින්, ඔබව ආරක්ෂා කිරීමට එය අවහිර කර ඇත. ඔබ නොදන්නා කෙනෙකු විසින් මෙම ක්‍රියාමාර්ගය ගැනීමට ඔබට මඟ පෙන්වනු ලැබුවහොත්, එය වංචාවක් විය හැක."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"දුරකථන ඇමතුමක් අතරතුර යෙදුම් වලට වෙනත් යෙදුම් ස්ථාපනය කිරීමට ඉඩ නොදෙයි."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"දුරකථන ඇමතුමක් අතරතුර යෙදුමකට ප්‍රවේශ්‍යතාවයට ප්‍රවේශය ලබා දීමට ඉඩ දී නැත."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"දුරකථන ඇමතුමක් අතරතුර මෙම සැකසීම සබල කිරීමට ඉඩ දී නැත."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"යෙදුම <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> වෙත ප්‍රවේශය ප්‍රතික්ෂේප කරන ලදි"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"යෙදුම ඔබේ පුද්ගලික සහ මූල්‍ය තොරතුරු අවදානමට ලක් කළ හැකි සංවේදී අවසරයකට ප්‍රවේශය ඉල්ලා ඇත.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>මෙම සීමා කළ අවසරය නොමැතිව යෙදුම නිසි ලෙස ක්‍රියා නොකරනු ඇත. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ප්‍රවේශයට ඉඩ දෙන ආකාරය දැන ගන්න&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"යෙදුම පෙරනිමි <xliff:g id="ROLE_NAME">%1$s</xliff:g> වීමට ප්‍රවේශය ප්‍රතික්ෂේප කරන ලදි"</string>
diff --git a/PermissionController/res/values-sk-watch/strings.xml b/PermissionController/res/values-sk-watch/strings.xml
index 1a7e89701..52503904f 100644
--- a/PermissionController/res/values-sk-watch/strings.xml
+++ b/PermissionController/res/values-sk-watch/strings.xml
@@ -23,10 +23,10 @@
<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="permission_access_only_foreground" msgid="4412115020089923986">"Pri používaní aplikácie"</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="app_permission_button_allow_foreground" msgid="7186980598244864830">"Pri používaní aplikácie"</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_foreground" msgid="8917595344037255090">"Pri používaní aplikácie"</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 a1680e4d7..8ecfc180a 100644
--- a/PermissionController/res/values-sk/strings.xml
+++ b/PermissionController/res/values-sk/strings.xml
@@ -74,7 +74,7 @@
<string name="days_ago" msgid="6650359081551335629">"{count,plural, =0{Dnes}=1{Pred 1 dňom}few{Pred # dňami}many{Pred # dňa}other{Pred # dňami}}"</string>
<string name="app_disable_dlg_positive" msgid="7418444149981904940">"Deaktivovať aplikáciu"</string>
<string name="app_disable_dlg_text" msgid="3126943217146120240">"Ak aplikáciu deaktivujete, systém a ďalšie aplikácie už nemusia fungovať podľa očakávaní. Upozorňujeme, že túto aplikáciu nemôžete odstrániť, pretože bola vo vašom zariadení predinštalovaná. Deaktiváciou ju vypnete a skryjete v zariadení."</string>
- <string name="app_permission_manager" msgid="3903811137630909550">"Správca povolení"</string>
+ <string name="app_permission_manager" msgid="3903811137630909550">"Správa povolení"</string>
<string name="never_ask_again" msgid="4728762438198560329">"Nabudúce sa nepýtať"</string>
<string name="no_permissions" msgid="3881676756371148563">"Žiadne povolenia"</string>
<string name="additional_permissions" msgid="5801285469338873430">"Ďalšie povolenia"</string>
@@ -86,7 +86,7 @@
<string name="default_permission_description" msgid="4624464917726285203">"umožňuje vykonať neznámu akciu"</string>
<string name="app_permissions_group_summary" msgid="8788419008958284002">"Povolené pri <xliff:g id="COUNT_0">%1$d</xliff:g> z(o) <xliff:g id="COUNT_1">%2$d</xliff:g> aplik."</string>
<string name="app_permissions_group_summary2" msgid="4329922444840521150">"Počet povolených aplikácií: <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">"Zobraziť systémové"</string>
+ <string name="menu_show_system" msgid="4254021607027872504">"Zobraziť systémové aplikácie"</string>
<string name="menu_hide_system" msgid="3855390843744028465">"Skryť systémové aplikácie"</string>
<string name="menu_show_7_days_data" msgid="8979611198508523706">"Zobraziť 7 dní"</string>
<string name="menu_show_24_hours_data" msgid="8228054833323380780">"Zobraziť 24 hodín"</string>
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Prístup k položke <xliff:g id="PERM">%1$s</xliff:g> pre túto aplikáciu v zariadení <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Zobraziť všetky povolenia aplikácie <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Zobraziť všetky aplikácie s týmto povolením"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informácia"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Nastavenia"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Zobraziť používanie mikrofónu Asistentom"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nastavenia nepoužívaných aplikácií"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Odstrániť povolenia, ak sa aplikácia nepoužíva"</string>
@@ -438,7 +440,7 @@
<string name="default_apps_manage_domain_urls" msgid="6775566451561036069">"Otváranie odkazov"</string>
<string name="default_apps_for_work" msgid="4970308943596201811">"Predvolené na prácu"</string>
<string name="default_apps_for_private_profile" msgid="2022024112144880785">"Predvolené pre súkromný priestor"</string>
- <string name="default_app_none" msgid="9084592086808194457">"Žiadna"</string>
+ <string name="default_app_none" msgid="9084592086808194457">"Žiadna aplikácia"</string>
<string name="default_app_system_default" msgid="6218386768175513760">"(Predvolené systémom)"</string>
<string name="default_app_no_apps" msgid="115720991680586885">"Žiadne aplikácie"</string>
<string name="default_payment_app_other_nfc_services" msgid="5957633798695758917">"Ďalšie služby NFC"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Povoliť obmedzené nastavenia"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Obmedzené nastavenie"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Z bezpečnostných dôvodov nie je toto nastavenie momentálne k dispozícii."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Akcia nie je počas telefonovania k dispozícii"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Podvodníci často žiadajú o tento typ akcie počas telefonických hovorov, preto je daná akcia z dôvodu vašej ochrany blokovaná. Ak vás o túto akciu žiada niekto, koho nepoznáte, môže ísť o podvod."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Počas telefonického hovoru nie je povolená inštalácia aplikácií inými aplikáciami."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Počas telefonického hovoru nie je povolené udeliť aplikácii prístup k službe dostupnosti."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Počas telefonického hovoru nie je povolené zapnúť toto nastavenie."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikácii bol prístup k povoleniu <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> zamietnutý"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Táto aplikácia vyžaduje prístup k citlivému povoleniu, čo môže ohroziť vaše osobné údaje a finančné informácie.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Je možné, že bez tohto obmedzeného povolenia nebude aplikácia správne fungovať. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Ako povoliť prístup&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikácii bol zamietnutý prístup a predvolene nemôže byť <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sl/strings.xml b/PermissionController/res/values-sl/strings.xml
index 92e698b0e..1c43301c2 100644
--- a/PermissionController/res/values-sl/strings.xml
+++ b/PermissionController/res/values-sl/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Dostop do dovoljenja »<xliff:g id="PERM">%1$s</xliff:g>« za to aplikacijo v napravi <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Ogled vseh dovoljenj za aplikacijo <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Ogled vseh aplikacij s tem dovoljenjem"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Informacije"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Nastavitve"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Prikaz uporabe pomožnega mikrofona"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Nastavitve neuporabljenih aplikacij"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Odstrani dovoljenja, če aplikacija ni v uporabi"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Dovoli omejene nastavitve"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Omejena nastavitev"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Zaradi vaše varnosti ta nastavitev trenutno ni na voljo."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Dejanje ni na voljo med telefonskim klicem"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Goljufi med pogovori v telefonskih klicih pogosto zahtevajo to vrsto dejanja, zato je to dejanje blokirano zaradi vaše zaščite. Če vas k temu dejanju napeljuje nekdo, ki ga ne poznate, gre morda za poskus goljufije."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Med telefonskim klicem ni dovoljeno omogočati aplikacijam nameščanja drugih aplikacij."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Med telefonskim klicem ni dovoljeno omogočiti aplikaciji dostopa do dostopnosti."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Med telefonskim klicem ni dovoljeno omogočiti te nastavitve."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikaciji je bil zavrnjen dostop do dovoljenja »<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>«"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacija je zahtevala dostop do občutljivega dovoljenja, ki lahko ogrozi vaše osebne in finančne podatke.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Aplikacija morda ne bo pravilno delovala brez tega omejenega dovoljenja. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Preberite, kako omogočite dostop&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikaciji je bil zavrnjen dostop do privzete vloge »<xliff:g id="ROLE_NAME">%1$s</xliff:g>«"</string>
diff --git a/PermissionController/res/values-sq/strings.xml b/PermissionController/res/values-sq/strings.xml
index 33c1f8066..42dc0beb5 100644
--- a/PermissionController/res/values-sq/strings.xml
+++ b/PermissionController/res/values-sq/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Qasja te <xliff:g id="PERM">%1$s</xliff:g> për këtë aplikacion në <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Shiko të gjitha lejet e aplikacionit \"<xliff:g id="APP">%1$s</xliff:g>\""</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Shiko të gjitha aplikacionet me këtë leje"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Shfaq përdorimin e mikrofonit të \"Asistentit\""</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Cilësimet e aplikacioneve të papërdorura"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Hiq lejet nëse aplikacioni nuk është përdorur"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Lejo cilësimet e kufizuara"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Cilësim i kufizuar"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Për sigurinë tënde, ky cilësim nuk ofrohet për momentin."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Veprimi nuk ofrohet kur je në një telefonatë"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Mashtruesit e kërkojnë shpesh këtë lloj veprimi gjatë bisedave të telefonatave, prandaj kjo është bllokuar për të të mbrojtur ty. Nëse po udhëzohesh ta kryesh këtë veprim nga dikush që nuk e njeh, mund të jetë një mashtrim."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Nuk lejohet që aplikacionet të lejohen të instalojnë aplikacione të tjera gjatë një telefonate."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Nuk lejohet t\'i japësh një aplikacioni qasje te qasshmëria gjatë një telefonate."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Aktivizimi i këtij cilësimi nuk lejohet gjatë një telefonate."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Aplikacionit iu refuzua qasja te: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Aplikacioni kërkoi qasje në një leje delikate që mund t\'i vendosë në rrezik informacionet e tua personale dhe financiare.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Ka mundësi që aplikacioni të mos funksionojë si duhet pa këtë leje të kufizuar. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Mëso se si të lejosh qasjen&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Aplikacionit iu refuzua qasja për të qenë parazgjedhja për: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sr/strings.xml b/PermissionController/res/values-sr/strings.xml
index 925baa7bb..d6ca9b01f 100644
--- a/PermissionController/res/values-sr/strings.xml
+++ b/PermissionController/res/values-sr/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Ова апликација има приступ за: <xliff:g id="PERM">%1$s</xliff:g> на уређају <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"Информације"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Подешавања"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Дозволи ограничена подешавања"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Ограничено подешавање"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ово подешавање је тренутно недоступно ради ваше безбедности."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Радња није доступна током телефонског позива"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Преваранти често траже овај тип радње током телефонског позива, па смо је блокирали да бисмо вас заштитили. Ако вас неко кога не познајете упућује на ову радњу, то би могла да буде превара."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Није дозвољено да апликације инсталирају друге апликације током телефонског позива."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Није дозвољено да апликација добије приступ услузи приступачности током телефонског позива."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Омогућавање овог подешавања није дозвољено током телефонског позива."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Апликацији није дозвољен приступ дозволи: <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Апликација је затражила приступ осетљивој дозволи, што може да угрози безбедност личних и финансијских података.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Апликација можда неће радити исправно без ове ограничене дозволе. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Сазнајте како да дозволите приступ&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Апликацији није дозвољен приступ да постане подразумевана: <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sv/strings.xml b/PermissionController/res/values-sv/strings.xml
index bd57656e8..0b70185c8 100644
--- a/PermissionController/res/values-sv/strings.xml
+++ b/PermissionController/res/values-sv/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Åtkomst till <xliff:g id="PERM">%1$s</xliff:g> för den här appen på <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Visa alla behörigheter för <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Visa alla appar med den här behörigheten"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Visa mikrofonanvändning för assistenten"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Inställningar för appar som inte används"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ta bort behörigheter om en app inte används"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Tillåt blockerade inställningar"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Begränsad inställning"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Av säkerhetsskäl är den här inställningen inte tillgänglig för närvarande."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Åtgärden är inte tillgänglig under pågående samtal"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Bedragare vill ofta att man gör sådana här saker under telefonsamtalet, så vi har blockerat den möjligheten för att skydda dig. Om du blir tillsagd att göra detta av någon du inte känner kan det vara ett bedrägeri."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Det går inte att tillåta att appar installerar andra appar under ett telefonsamtal."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Det går inte att ge en app åtkomst till tillgänglighetsfunktioner under ett telefonsamtal."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Det går inte att aktivera den här inställningen under ett telefonsamtal."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Appen nekades åtkomst till <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Appen begärde åtkomstbehörighet till känsliga uppgifter, vilket kan utsätta din personliga och finansiella information för risk.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Appen kanske inte fungerar som den ska utan denna begränsade behörighet. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&amp;gtLäs mer om hur du tillåter åtkomst&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Appen nekades åtkomst till standardrollen för <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-sw/strings.xml b/PermissionController/res/values-sw/strings.xml
index 918a4c864..eeb1cea6b 100644
--- a/PermissionController/res/values-sw/strings.xml
+++ b/PermissionController/res/values-sw/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Ufikaiji wa <xliff:g id="PERM">%1$s</xliff:g> katika programu hii kwenye <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Angalia ruhusa zote za <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Angalia programu zote zenye ruhusa hii"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Onyesha matumizi ya maikrofoni ya mratibu"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Mipangilio ya programu zisizotumika"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ondoa ruhusa ikiwa programu haitumiki"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Ruhusu mipangilio yenye mipaka"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Mipangilio imezuiwa"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ili kulinda usalama wako, mipangilio hii haipatikani kwa sasa."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Kitendo hiki hakipatikani unapopiga simu"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Mara nyingi, walaghai hukuomba utekeleze kitendo cha aina hii wakati wa mazungumzo ya simu, kwa hivyo kimezuiwa ili kukulinda. Iwapo unaelekezwa utekeleze kitendo hiki na mtu usiyemjua, huenda ikawa ni ulaghai."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Programu haziruhusiwi kuweka programu nyingine kwenye kifaa wakati unapiga simu."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Huruhusiwi kuwasha huduma ya ufikivu kwenye programu wakati unapiga simu."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Huruhusiwi kuwasha mipangilio hii wakati unapiga simu."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Programu haijapewa idhini ya kufikia <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Programu imeomba kufikia ruhusa nyeti, hali ambayo inaweza kuhatarisha maelezo yako ya kifedha na ya binafsi.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Kuna uwezekano kuwa programu haitafanya kazi vizuri bila ruhusa hii inayodhibitiwa. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Pata maelezo kuhusu jinsi ya kuruhusu ufikiaji&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Programu haijapewa idhini ya kuwa <xliff:g id="ROLE_NAME">%1$s</xliff:g> chaguomsingi"</string>
diff --git a/PermissionController/res/values-ta/strings.xml b/PermissionController/res/values-ta/strings.xml
index 61ec88213..ceeb08ff6 100644
--- a/PermissionController/res/values-ta/strings.xml
+++ b/PermissionController/res/values-ta/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> சாதனத்தில் இந்த ஆப்ஸுக்கான <xliff:g id="PERM">%1$s</xliff:g> அணுகல்"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"கட்டுப்படுத்தப்பட்ட அமைப்பை அனுமதி"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"கட்டுப்படுத்தப்பட்ட அமைப்பு"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"உங்கள் பாதுகாப்பிற்காக, இந்த அமைப்பு தற்போது இல்லை."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"மொபைல் அழைப்பின்போது இந்தச் செயலைச் செய்ய முடியாது"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n மொபைல் அழைப்பு உரையாடல்களின்போது, மோசடி செய்பவர்கள் அடிக்கடி இதுபோன்ற செயலைச் செய்யுமாறு கேட்கின்றனர், எனவே இவற்றிலிருந்து உங்களைப் பாதுகாக்கவே அனுமதி தடுக்கப்பட்டுள்ளது. உங்களுக்குத் தெரியாத ஒருவரால் இந்தச் செயலைச் செய்வதற்கு நீங்கள் வழிகாட்டப்பட்டால் அது மோசடியாக இருக்கலாம்."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"மொபைல் அழைப்பின்போது ஓர் ஆப்ஸ் பிற ஆப்ஸை நிறுவ அனுமதிப்பது அனுமதிக்கப்படாது."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"மொபைல் அழைப்பின்போது ஓர் ஆப்ஸுக்கு மாற்றுத்திறன் வசதிக்கான அணுகலை வழங்குவது அனுமதிக்கப்படாது."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"மொபைல் அழைப்பின்போது இந்த அமைப்பை இயக்குவது அனுமதிக்கப்படாது."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>க்கான ஆப்ஸ் அணுகல் நிராகரிக்கப்பட்டது"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"பாதுகாக்க வேண்டிய தகவல்களுக்கான அனுமதியை வழங்க ஆப்ஸ் கேட்டுள்ளது, இது உங்கள் தனிப்பட்ட மற்றும் நிதித் தகவல்களை ஆபத்துக்குள்ளாக்கலாம்.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>இந்தக் கட்டுப்படுத்தப்பட்ட அனுமதி இல்லாமல் ஆப்ஸ் சரியாக வேலை செய்யாமல் போகக்கூடும். &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;எப்படி அணுகல் வழங்குவதென அறிக&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"இயல்புநிலை <xliff:g id="ROLE_NAME">%1$s</xliff:g>க்கான ஆப்ஸ் அணுகல் நிராகரிக்கப்பட்டது"</string>
diff --git a/PermissionController/res/values-te/strings.xml b/PermissionController/res/values-te/strings.xml
index d1b689674..1fcccc13f 100644
--- a/PermissionController/res/values-te/strings.xml
+++ b/PermissionController/res/values-te/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> పరికరంలో ఈ యాప్‌నకు <xliff:g id="PERM">%1$s</xliff:g> యాక్సెస్"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"సమాచారం"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"సెట్టింగ్‌లు"</string>
<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>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"పరిమితం చేసిన సెట్టింగ్‌లను అనుమతించండి"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"పరిమితం చేయబడిన సెట్టింగ్"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"మీ సెక్యూరిటీ కోసం, ఈ సెట్టింగ్ ప్రస్తుతం అందుబాటులో లేదు."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"ఫోన్ కాల్‌లో ఉండగా ఈ చర్య అందుబాటులో ఉండదు"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n ఫోన్ కాల్ సంభాషణల సమయంలో స్కామర్‌లు తరచుగా ఈ రకమైన చర్యను రిక్వెస్ట్ చేస్తారు, కాబట్టి మిమ్మల్ని రక్షించడానికి ఈ ఫీచర్ బ్లాక్ చేయబడుతుంది. మీకు తెలియని వారు ఈ చర్య తీసుకోవాల్సిందిగా మిమ్మల్ని గైడ్ చేస్తే, అది స్కామ్ కావచ్చు."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ఫోన్ కాల్ మాట్లాడే సమయంలో ఇతర యాప్‌లను ఇన్‌స్టాల్ చేయడానికి యాప్‌లను అనుమతించడానికి వీలు లేదు."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ఫోన్ కాల్ మాట్లాడే సమయంలో యాప్‌నకు యాక్సెసిబిలిటీ యాక్సెస్ ఇవ్వడం అనుమతించబడదు."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ఫోన్ కాల్ మాట్లాడే సమయంలో ఈ సెట్టింగ్‌ను ఎనేబుల్ చేయడం అనుమతించడబడదు."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"యాప్ <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>‌కు యాక్సెస్ తిరస్కరించబడింది"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"మీ వ్యక్తిగత, ఆర్థిక సమాచారాన్ని ప్రమాదంలో పడేసే గోప్యమైన సమాచార యాక్సెస్ అనుమతికి యాప్ యాక్సెస్‌ను రిక్వెస్ట్ చేయడం జరిగింది.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>ఈ అదనపు అవసరాలు గల అనుమతి లేకుండా యాప్ సరిగ్గా పని చేయకపోయే అవకాశం ఉంది. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;యాక్సెస్‌ను అనుమతించడం ఎలాగో తెలుసుకోండి&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ఆటోమేటిక్ <xliff:g id="ROLE_NAME">%1$s</xliff:g>‌గా ఉండటానికి యాప్‌నకు యాక్సెస్ నిరాకరించబడింది"</string>
diff --git a/PermissionController/res/values-th/strings.xml b/PermissionController/res/values-th/strings.xml
index d7db6cf53..0cc301b05 100644
--- a/PermissionController/res/values-th/strings.xml
+++ b/PermissionController/res/values-th/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"สิทธิ์เข้าถึง<xliff:g id="PERM">%1$s</xliff:g>สำหรับแอปนี้บน <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<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="app_permission_info_button" msgid="8973692370208562556">"ข้อมูล"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"การตั้งค่า"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"แสดงการใช้ไมโครโฟนของ Assistant"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"การตั้งค่าแอปที่ไม่ได้ใช้"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"นำสิทธิ์ออกหากไม่ได้ใช้งานแอป"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"อนุญาตการตั้งค่าที่จำกัด"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"การตั้งค่าที่จำกัด"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"การตั้งค่านี้ใช้ไม่ได้ในตอนนี้เพื่อความปลอดภัยของคุณ"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"การดำเนินการไม่พร้อมใช้งานขณะกำลังโทรศัพท์"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n สแกมเมอร์มักขอการดำเนินการประเภทนี้ระหว่างการสนทนาทางโทรศัพท์ ดังนั้นระบบจึงบล็อกไว้เพื่อปกป้องคุณ หากมีคนที่คุณไม่รู้จักบอกให้คุณดำเนินการดังกล่าว นั่นอาจเป็นการหลอกลวง"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"ไม่อนุญาตให้แอปติดตั้งแอปอื่นๆ ระหว่างการโทร"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"ไม่อนุญาตให้แอปเข้าถึงการช่วยเหลือพิเศษระหว่างการโทร"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"ไม่อนุญาตให้เปิดใช้การตั้งค่านี้ระหว่างการโทร"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"แอปถูกปฏิเสธไม่ให้เข้าถึง <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"แอปขอเข้าถึงสิทธิ์ที่มีความละเอียดอ่อนซึ่งอาจทำให้ข้อมูลส่วนบุคคลและข้อมูลทางการเงินของคุณมีความเสี่ยง<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>แอปอาจทำงานได้ไม่ถูกต้องหากไม่มีสิทธิ์ที่จำกัดนี้ &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;ดูวิธีอนุญาตให้เข้าถึง&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"แอปถูกปฏิเสธไม่ให้เข้าถึงเพื่อเป็น<xliff:g id="ROLE_NAME">%1$s</xliff:g> เริ่มต้น"</string>
diff --git a/PermissionController/res/values-tl/strings.xml b/PermissionController/res/values-tl/strings.xml
index e5526ddc8..d914495b9 100644
--- a/PermissionController/res/values-tl/strings.xml
+++ b/PermissionController/res/values-tl/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"access sa <xliff:g id="PERM">%1$s</xliff:g> para sa app na ito sa <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Tingnan ang lahat ng pahintulot ng <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Tingnan ang lahat ng app na may ganitong pahintulot"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Impormasyon"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Mga Setting"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Ipakita ang paggamit ng mikropono ng assistant"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Mga setting ng hindi ginagamit na app"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Alisin ang mga pahintulot kung hindi ginagamit ang app"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Payagan ang mga pinaghihigpitang setting"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Pinaghihigpitang setting"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Para sa iyong seguridad, hindi available ang setting na ito sa ngayon."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Hindi available ang pagkilos habang may tumatawag"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Madalas na humihiling ng ganitong uri ng pagkilos ang mga scammer habang tumatawag sa telepono, kaya na-block ito para protektahan ka. Kung ginagabayan kang gawin ang pagkilos na ito ng taong hindi mo kilala, posibleng scam ito."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Hindi pinapayagan ang pagpayag sa pag-install ng mga app ng iba pang app habang may tawag sa telepono."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Hindi pinapayagan ang pagbibigay ng access sa accessibility sa app habang may tawag sa telepono."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Hindi pinapayagan ang pag-enable sa setting na ito habang may tawag sa telepono."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Tinanggihan ang access ng appp sa <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Humiling ang app ng access sa pahintulot sa sensitibong impormasyon na posibleng maglagay ng iyong personal at pinansyal na impormasyon sa panganib.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Posibleng hindi gumana nang maayos ang app kung wala ang pinaghihigpitang pahintulot na ito. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Alamin kung paano payagan ang pag-access&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Tinanggihan ang access ng app na maging default na <xliff:g id="ROLE_NAME">%1$s</xliff:g>"</string>
diff --git a/PermissionController/res/values-tr-v33/strings.xml b/PermissionController/res/values-tr-v33/strings.xml
index 9bab1071a..ee3827f93 100644
--- a/PermissionController/res/values-tr-v33/strings.xml
+++ b/PermissionController/res/values-tr-v33/strings.xml
@@ -30,8 +30,7 @@
<string name="safety_center_more_issues_card_title" msgid="7425844746197493312">"Diğer uyarılar"</string>
<string name="safety_center_dismissed_issues_card_title" msgid="2340129842725145733">"Reddedilen uyarılar"</string>
<string name="safety_center_more_issues_card_expand_action" msgid="7109451851052272946">"{count,plural, =1{Genişletip bir uyarıyı daha görün}other{Genişletip # uyarıyı daha görün}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Daralt"</string>
<string name="safety_center_issue_card_prefix_content_description" msgid="1447445289637043544">"Uyarı. <xliff:g id="ISSUE_CARD_TITLE">%1$s</xliff:g>"</string>
<string name="safety_center_resolved_issue_fallback" msgid="8548932070610766651">"İşlem tamamlandı"</string>
<string name="safety_center_qs_status_summary" msgid="5193925895830451177">"Cihazınızın korumasını artırabilecek ayarlara göz atın"</string>
diff --git a/PermissionController/res/values-tr/strings.xml b/PermissionController/res/values-tr/strings.xml
index 41598409e..f535165e2 100644
--- a/PermissionController/res/values-tr/strings.xml
+++ b/PermissionController/res/values-tr/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> adlı cihazda bu uygulamanın <xliff:g id="PERM">%1$s</xliff:g> erişimi"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Tüm <xliff:g id="APP">%1$s</xliff:g> izinlerini göster"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Bu izne sahip tüm uygulamaları göster"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Yardımcı mikrofon kullanımını göster"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Kullanılmayan uygulama ayarları"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Uygulama kullanılmıyorsa izinleri kaldır"</string>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Kısıtlanmış ayarlara izin verme"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Kısıtlanmış ayar"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Güvenliğiniz için bu ayar şu anda kullanılamıyor."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"İşlem, telefon görüşmesi sırasında yapılamaz"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Uygulamanın <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> iznine erişimi reddedildi"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Uygulama, kişisel ve finansal bilgilerinizi riske atabilecek hassas bir izne erişim istedi.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Bu kısıtlı izin olmadan uygulama düzgün çalışmayabilir. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Erişime nasıl izin vereceğinizi öğrenin&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-uk-v33/strings.xml b/PermissionController/res/values-uk-v33/strings.xml
index 1368408ff..24571a6d7 100644
--- a/PermissionController/res/values-uk-v33/strings.xml
+++ b/PermissionController/res/values-uk-v33/strings.xml
@@ -30,8 +30,7 @@
<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{Розгорніть і перегляньте ще # сповіщення}few{Розгорніть і перегляньте ще # сповіщення}many{Розгорніть і перегляньте ще # сповіщень}other{Розгорніть і перегляньте ще # сповіщення}}"</string>
- <!-- no translation found for safety_center_more_issues_card_collapse_action (7485597582198474637) -->
- <skip />
+ <string name="safety_center_more_issues_card_collapse_action" msgid="7485597582198474637">"Згорнути"</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>
diff --git a/PermissionController/res/values-uk/strings.xml b/PermissionController/res/values-uk/strings.xml
index 55ba545e2..b348f8097 100644
--- a/PermissionController/res/values-uk/strings.xml
+++ b/PermissionController/res/values-uk/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="PERM">%1$s</xliff:g>: доступ для цього додатка (<xliff:g id="DEVICE_NAME">%2$s</xliff:g>)"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,14 +678,15 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Дозволити налаштування з обмеженнями"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Налаштування з обмеженнями"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"З міркувань безпеки це налаштування наразі недоступне."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Дія недоступна під час телефонного виклику"</string>
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (8861786545031902839) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (2832355924914011814) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (5336417371950046729) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
<skip />
- <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (4453183594330342865) -->
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
<skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Додатку не надано дозвіл \"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>\""</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Додаток запитав дозвіл на доступ до чутливих даних, що може поставити під загрозу вашу особисту й фінансову інформацію.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Без цього обмеженого дозволу додаток може не працювати належним чином. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Як надати доступ&lt;/a&gt;"</string>
diff --git a/PermissionController/res/values-ur/strings.xml b/PermissionController/res/values-ur/strings.xml
index 01a32f16b..0d86cce7d 100644
--- a/PermissionController/res/values-ur/strings.xml
+++ b/PermissionController/res/values-ur/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g> پر اس ایپ تک رسائی حاصل کریں<xliff:g id="PERM">%1$s</xliff:g>"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<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>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"پابندی والی ترتیبات کی اجازت دیں"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"محدود ترتیب"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"آپ کی سیکیورٹی کیلئے، یہ ترتیب فی الحال دستیاب نہیں ہے۔"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"فون کال کے دوران کارروائی دستیاب نہیں ہے"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n دھوکے باز اکثر فون کال گفتگوؤں کے دوران اس قسم کی کارروائی کی درخواست کرتے ہیں، اس لیے اسے آپ کی حفاظت کے لیے مسدود کر دیا جاتا ہے۔ اگر آپ کو کسی ایسے شخص کے ذریعے سے یہ کارروائی کرنے کے لیے رہنمائی کی جا رہی ہے جس کو آپ نہیں جانتے ہیں تو یہ ایک فریب کاری ہو سکتی ہے۔"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"فون کال کے دوران ایپس کو دوسری ایپس انسٹال کرنے کی اجازت نہیں ہے۔"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"فون کال کے دوران کسی ایپ کو ایکسیسبیلٹی تک رسائی دینے کی اجازت نہیں ہے۔"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"فون کال کے دوران اس ترتیب کو فعال کرنے کی اجازت ہے۔"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"<xliff:g id="PERMISSION_NAME">%1$s</xliff:g> تک ایپ کی رسائی کو مسترد کر دیا گیا"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"‏ایپ نے ایک حساس اجازت تک رسائی کی درخواست کی ہے جو آپ کی ذاتی اور مالی معلومات کو خطرے میں ڈال سکتی ہے۔<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>یہ ممکن ہے کہ اس محدود اجازت کے بغیر ایپ ٹھیک سے کام نہ کرے۔ &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;رسائی کی اجازت دینے کا طریقہ جانیں&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"ڈیفالٹ <xliff:g id="ROLE_NAME">%1$s</xliff:g> ہونے کے لیے ایپ کی رسائی کو مسترد کر دیا گیا"</string>
diff --git a/PermissionController/res/values-uz/strings.xml b/PermissionController/res/values-uz/strings.xml
index 9d12cb873..f7fa19cfa 100644
--- a/PermissionController/res/values-uz/strings.xml
+++ b/PermissionController/res/values-uz/strings.xml
@@ -202,6 +202,8 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"<xliff:g id="DEVICE_NAME">%2$s</xliff:g>da bu ilova uchun <xliff:g id="PERM">%1$s</xliff:g> kirish ruxsati"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"<xliff:g id="APP">%1$s</xliff:g> uchun berilgan barcha ruxsatlar"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Bu ruxsatga ega barcha ilovalar"</string>
+ <string name="app_permission_info_button" msgid="8973692370208562556">"Axborot"</string>
+ <string name="app_permission_settings_button" msgid="4582916817451973752">"Sozlamalar"</string>
<string name="assistant_mic_label" msgid="1011432357152323896">"Assistent uchun mikrofondan foydalanishni koʻrsatish"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Ishlatilmagan ilova sozlamalari"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Ishlatilmayotgan ilovalardan ruxsatlarni olib tashlash"</string>
@@ -674,11 +676,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Cheklangan sozlamalarga ruxsat berish"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Cheklangan sozlama"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Xavfsizlik maqsadida bu sozlama hozir ishlamaydi."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Telefon chaqiruvi paytida amal ishlamaydi"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Tovlamachilar koʻpincha telefon chaqiruvi orqali suhbatlar paytida shu turdagi amalni bajarishni soʻraydi, shu bois u sizni himoyalash uchun bloklanadi. Sizga notanish biror kishi shu amalni bajarishga undasa, bu tovlamachilik boʻlishi mumkin."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Telefon chaqiruvi paytida ilovalarga boshqa ilovalarni oʻrnatishga ruxsat berish mumkin emas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Telefon chaqiruvi vaqtida ilovaga qulaylik ruxsatini berish mumkin emas."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Bu sozlamani telefon chaqiruvi davomida yoqish mumkin emas."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Ilovaga <xliff:g id="PERMISSION_NAME">%1$s</xliff:g> ruxsati berilmadi"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Ilova maxfiy maʼlumotlarga kirish uchun ruxsat soʻramoqda. Ruxsat bersangiz, shaxsiy va moliyaviy maʼlumotlaringiz xavf ostida qolishi mumkin.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g> Bu cheklangan ruxsatsiz ilova toʻgʻri ishlamasligi mumkin. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Qanday ruxsat berish haqida batafsil&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Ilovadan <xliff:g id="ROLE_NAME">%1$s</xliff:g> turkumidagi standart sifatida foydalanish taqiqlangan"</string>
diff --git a/PermissionController/res/values-vi/strings.xml b/PermissionController/res/values-vi/strings.xml
index b9afdcb56..cc7d986fc 100644
--- a/PermissionController/res/values-vi/strings.xml
+++ b/PermissionController/res/values-vi/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Quyền truy cập <xliff:g id="PERM">%1$s</xliff:g> cho ứng dụng này trên <xliff:g id="DEVICE_NAME">%2$s</xliff:g>"</string>
<string name="app_permission_footer_app_permissions_link" msgid="4926890342636587393">"Xem tất cả các quyền của <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="app_permission_footer_permission_apps_link" msgid="3941988129992794327">"Xem tất cả ứng dụng có quyền này"</string>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Hiển thị việc sử dụng micrô của Trợ lý"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Chế độ cài đặt cho ứng dụng không dùng đến"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Thu hồi quyền nếu bạn không dùng ứng dụng"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Cho phép các chế độ cài đặt bị hạn chế"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Chế độ cài đặt bị hạn chế"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Để đảm bảo an toàn cho bạn, chế độ cài đặt này hiện không dùng được."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Không thao tác được khi đang gọi điện"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Kẻ lừa đảo thường yêu cầu bạn cài đặt ứng dụng trong khi gọi điện, vì vậy, hành động này bị chặn để bảo vệ bạn. Nếu người mà bạn không quen biết hướng dẫn bạn cài đặt ứng dụng, thì đó có thể là thủ đoạn lừa đảo."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Không cho phép ứng dụng cài đặt các ứng dụng khác trong khi bạn gọi điện."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Không được cấp cho một ứng dụng quyền truy cập vào tính năng hỗ trợ tiếp cận trong khi gọi điện."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Không được bật chế độ cài đặt này trong khi gọi điện."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"Ứng dụng đã bị từ chối cấp quyền truy cập vào <xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"Ứng dụng này yêu cầu quyền truy cập vào thông tin nhạy cảm. Việc đó có thể khiến thông tin cá nhân và thông tin tài chính của bạn gặp rủi ro.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Có thể ứng dụng sẽ hoạt động không đúng cách nếu không được cấp quyền bị hạn chế này. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Tìm hiểu cách cấp quyền&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"Ứng dụng đã bị từ chối cấp quyền để làm <xliff:g id="ROLE_NAME">%1$s</xliff:g> mặc định"</string>
diff --git a/PermissionController/res/values-zh-rCN/strings.xml b/PermissionController/res/values-zh-rCN/strings.xml
index cc28b5085..fa861d271 100644
--- a/PermissionController/res/values-zh-rCN/strings.xml
+++ b/PermissionController/res/values-zh-rCN/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"此应用在<xliff:g id="DEVICE_NAME">%2$s</xliff:g>上的<xliff:g id="PERM">%1$s</xliff:g>访问权限"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"显示 Google 助理麦克风使用情况"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"闲置应用设置"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"如果未使用此应用,则移除相关权限"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"允许受限制的设置"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"受限制的设置"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"出于安全考虑,此设置目前不可用。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"通话期间无法执行此类操作"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n诈骗者经常会在通话过程中要求执行此类操作,所以系统阻止了此类操作来保障您的安全。如果您正在陌生人的指引下执行此类操作,要当心,这可能是骗局。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"在通话期间,不允许应用安装其他应用。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"在通话期间,不允许授予应用无障碍服务访问权限。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"在通话期间,不允许启用此设置。"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"系统已拒绝向此应用授予<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>访问权限"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"该应用请求获得敏感权限,授予这项权限可能会导致您的个人信息和财务信息面临风险。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如果不授予这项受限权限,该应用可能无法正常运行。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;了解如何授予访问权限&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"系统已拒绝向此应用授予作为默认<xliff:g id="ROLE_NAME">%1$s</xliff:g>的访问权限"</string>
diff --git a/PermissionController/res/values-zh-rHK/strings.xml b/PermissionController/res/values-zh-rHK/strings.xml
index 301fddbe1..ebc59bffa 100644
--- a/PermissionController/res/values-zh-rHK/strings.xml
+++ b/PermissionController/res/values-zh-rHK/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"此應用程式在<xliff:g id="DEVICE_NAME">%2$s</xliff:g>上的<xliff:g id="PERM">%1$s</xliff:g>存取權"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"顯示「Google 助理」麥克風使用情況"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"不使用的應用程式設定"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"如不使用應用程式,即移除權限"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"允許受限設定"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"受限設定"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"為安全起見,系統目前不提供此設定。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"通話期間無法執行此操作"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n由於騙徒經常在電話對話中要求這類操作,因此我們封鎖此功能以保障你的安全。如果有陌生人引導你執行此操作,那可能是詐騙。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"通話期間,應用程式不可安裝其他應用程式。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"通話期間,不可授予應用程式無障礙功能存取權。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"通話期間,不可啟用此設定。"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"系統已拒絕授予應用程式「<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>」存取權"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"應用程式要求存取敏感資料權限,授予此權限可能會危害你的個人和財務資料。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如沒有此受限制權限,應用程式可能無法正常運作。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;進一步瞭解如何授予存取權&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"系統已拒絕授予應用程式作為預設<xliff:g id="ROLE_NAME">%1$s</xliff:g>的存取權"</string>
diff --git a/PermissionController/res/values-zh-rTW/strings.xml b/PermissionController/res/values-zh-rTW/strings.xml
index a7aad3d3c..4a29e52c5 100644
--- a/PermissionController/res/values-zh-rTW/strings.xml
+++ b/PermissionController/res/values-zh-rTW/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"這個應用程式在<xliff:g id="DEVICE_NAME">%2$s</xliff:g>上的<xliff:g id="PERM">%1$s</xliff:g>存取權"</string>
<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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"顯示 Google 助理的麥克風使用狀況"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"未使用的應用程式設定"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"如果應用程式未使用,讓系統移除相關權限"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"解除受限制的設定"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"受限制的設定"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"為了安全起見,目前無法使用這項設定。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"無法在通話期間執行這項操作"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n詐騙者經常會在電話對話中要求這類操作,因此系統加以封鎖來保護你的安全。如果有陌生人引導你採取這類操作,請提高警覺,這可能是詐騙行為。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"通話期間不允許應用程式安裝其他應用程式。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"通話期間不允許授予應用程式無障礙服務存取權。"</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"通話期間不允許啟用這項設定。"</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"系統已拒絕授予應用程式「<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>」存取權"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"這個應用程式要求取得私密資訊權限,授予這項權限可能導致你的個人資訊和財務資訊面臨風險。<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>如果未取得這項受限制權限,應用程式可能無法正常運作。&lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;瞭解如何授予權限&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"系統已拒絕授予應用程式做為預設「<xliff:g id="ROLE_NAME">%1$s</xliff:g>」的存取權"</string>
diff --git a/PermissionController/res/values-zu/strings.xml b/PermissionController/res/values-zu/strings.xml
index ee9e92985..558e02fbc 100644
--- a/PermissionController/res/values-zu/strings.xml
+++ b/PermissionController/res/values-zu/strings.xml
@@ -202,6 +202,10 @@
<string name="app_permission_header_with_device_name" msgid="7193042925656173271">"Ukufinyelela kwe-<xliff:g id="PERM">%1$s</xliff:g> kwale app kuvuliwe ku-<xliff:g id="DEVICE_NAME">%2$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>
+ <!-- no translation found for app_permission_info_button (8973692370208562556) -->
+ <skip />
+ <!-- no translation found for app_permission_settings_button (4582916817451973752) -->
+ <skip />
<string name="assistant_mic_label" msgid="1011432357152323896">"Bonisa ukusetshenziswa kwe-microphone kamsizi"</string>
<string name="unused_apps_category_title" msgid="2988455616845243901">"Amasethingi we-app engasetshenziswanga"</string>
<string name="auto_revoke_label" msgid="5068393642936571656">"Susa izimvume uma uhlelo lokusebenza lungasetshenziswa"</string>
@@ -674,11 +678,16 @@
<string name="allow_restricted_settings" msgid="8073000189478396881">"Vumela amasethingi akhawulelwe"</string>
<string name="enhanced_confirmation_dialog_title" msgid="7562437438040966351">"Amasethingi akhawulelwe"</string>
<string name="enhanced_confirmation_dialog_desc" msgid="5921240234843839219">"Ukuze uphephe, leli sethingi okwamanje alitholakali."</string>
- <string name="enhanced_confirmation_phone_state_dialog_title" msgid="5230100829862738467">"Isenzo asitholakali ngenkathi ufona"</string>
- <string name="enhanced_confirmation_phone_state_dialog_desc" msgid="8861786545031902839">"<xliff:g id="SETTING_DESCRIPTION">%1$s</xliff:g>\n\n Amaqola ngokuvamile acela lolu hlobo lwesenzo phakathi nezingxoxo zekholi, ngakho-ke kuvinjiwe ukuze uvikeleke. Uma uqondiswa ukuthi wenze lesi senzo ngumuntu ongamazi, kungase kube umkhonyovu."</string>
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix" msgid="2832355924914011814">"Ukuvumela ama-app ukuthi afake amanye ama-app akuvunyelwe phakathi nekholi yefoni."</string>
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix" msgid="5336417371950046729">"Ukunikeza i-app ukufinyelela ekufinyelelekeni akuvunyelwe ngesikhathi sekholi yefoni."</string>
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix" msgid="4453183594330342865">"Ukunika amandla leli sethingi akuvunyelwe ngesikhathi sekholi yefoni."</string>
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_title (5054064107559019689) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_desc (5049619986796367451) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_install_desc_prefix (7153600694011441796) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_a11y_desc_prefix (1086282331085551407) -->
+ <skip />
+ <!-- no translation found for enhanced_confirmation_phone_state_dialog_generic_desc_prefix (8141411486179553156) -->
+ <skip />
<string name="enhanced_confirmation_dialog_title_permission" msgid="2149144789394238266">"I-app inqatshelwe ukufinyelela ku-<xliff:g id="PERMISSION_NAME">%1$s</xliff:g>"</string>
<string name="enhanced_confirmation_dialog_desc_permission" msgid="3150778951946468945">"I-app icele ukufinyelela emvumweni ezwelayo okungabeka imininingwane yakho siqu neyezimali engozini.<xliff:g id="ID_1">&lt;br&gt;&lt;br&gt;</xliff:g>Kungenzeka ukuthi i-app ingasebenzi kahle ngaphandle kwemvume enomkhawulo. &lt;a href=<xliff:g id="LEARN_MORE_LINK">%1$s</xliff:g>&gt;Funda ukuthi ungakuvumela kanjani ukufinyelela&lt;/a&gt;"</string>
<string name="enhanced_confirmation_dialog_title_role" msgid="1737023798483772780">"I-app iye yanqatshelwa ukufinyelela ukuze ibe yi-<xliff:g id="ROLE_NAME">%1$s</xliff:g> ezenzakalelayo"</string>
diff --git a/PermissionController/res/values/config.xml b/PermissionController/res/values/config.xml
index 675368cba..657dc07dd 100644
--- a/PermissionController/res/values/config.xml
+++ b/PermissionController/res/values/config.xml
@@ -19,6 +19,15 @@
<bool name="config_showBrowserRole">true</bool>
<bool name="config_showDialerRole">true</bool>
<bool name="config_showSmsRole">true</bool>
+ <!--
+ ~ Semicolon separated list of packages that are recommended for the assistant role.
+ ~ <p>
+ ~ This follows the same format as config_defaultAssistant and also requires a signing
+ ~ certificate digest (separated by a colon from the package name) if the app is not a system
+ ~ app.
+ -->
+ <string name="config_recommendedAssistants"></string>
+
<bool name="config_useAlternativePermGroupSummary">false</bool>
<bool name="config_useWindowBlur">false</bool>
<bool name="config_useMaterial3PermissionGrantDialog">false</bool>
diff --git a/PermissionController/res/values/overlayable.xml b/PermissionController/res/values/overlayable.xml
index ea7929746..72896fcdb 100644
--- a/PermissionController/res/values/overlayable.xml
+++ b/PermissionController/res/values/overlayable.xml
@@ -371,14 +371,15 @@
<item type="style" name="ThemeOverlay.PermissionSettings" />
<!-- END THEMES -->
- <!-- START VISIBILITY CONFIGS -->
- <!-- Assistant role uses: config_showDefaultAssistant -->
- <!-- Home role uses: config_showDefaultHome -->
- <!-- Emergency role uses: config_showDefaultEmergency -->
+ <!-- START ROLE CONFIGS -->
+ <!-- Assistant role uses android:bool/config_showDefaultAssistant -->
+ <!-- Home role uses android:bool/config_showDefaultHome -->
+ <!-- Emergency role uses android:bool/config_showDefaultEmergency -->
<item type="bool" name="config_showBrowserRole" />
<item type="bool" name="config_showDialerRole" />
<item type="bool" name="config_showSmsRole" />
- <!-- END VISIBILITY CONFIGS -->
+ <item type="string" name="config_recommendedAssistants" />
+ <!-- END ROLE CONFIGS -->
<!-- START CAR DIMENS -->
<item type="dimen" name="car_action_bar_height" />
@@ -461,89 +462,6 @@
<item type="style" name="AppDataSharingUpdateSettingsIcon" />
<!-- END SAFETY LABELS STYLE -->
- <!--START WEAR SPECIFIC MATERIAL2 FONT STRINGS -->
- <item type="string" name="wear_material_compose_display_1_font_family" />
- <item type="string" name="wear_material_compose_display_2_font_family" />
- <item type="string" name="wear_material_compose_display_3_font_family" />
- <item type="string" name="wear_material_compose_title_1_font_family" />
- <item type="string" name="wear_material_compose_title_2_font_family" />
- <item type="string" name="wear_material_compose_title_3_font_family" />
- <item type="string" name="wear_material_compose_body_1_font_family" />
- <item type="string" name="wear_material_compose_body_2_font_family" />
- <item type="string" name="wear_material_compose_button_font_family" />
- <item type="string" name="wear_material_compose_caption_1_font_family" />
- <item type="string" name="wear_material_compose_caption_2_font_family" />
- <item type="string" name="wear_material_compose_caption_3_font_family" />
- <!--END WEAR SPECIFIC MATERIAL2 FONT STRINGS -->
-
- <!--START WEAR SPECIFIC MATERIAL3 FONT FACE TOKENS-->
- <item type="string" name="wear_compose_material3_arc_small_font_family" />
- <item type="string" name="wear_compose_material3_arc_medium_font_family" />
- <item type="string" name="wear_compose_material3_arc_large_font_family" />
-
- <item type="string" name="wear_compose_material3_body_extra_small_font_family" />
- <item type="string" name="wear_compose_material3_body_small_font_family" />
- <item type="string" name="wear_compose_material3_body_medium_font_family" />
- <item type="string" name="wear_compose_material3_body_large_font_family" />
-
- <item type="string" name="wear_compose_material3_display_small_font_family" />
- <item type="string" name="wear_compose_material3_display_medium_font_family" />
- <item type="string" name="wear_compose_material3_display_large_font_family" />
-
- <item type="string" name="wear_compose_material3_label_small_font_family" />
- <item type="string" name="wear_compose_material3_label_medium_font_family" />
- <item type="string" name="wear_compose_material3_label_large_font_family" />
-
- <item type="string" name="wear_compose_material3_numeral_extra_small_font_family" />
- <item type="string" name="wear_compose_material3_numeral_small_font_family" />
- <item type="string" name="wear_compose_material3_numeral_medium_font_family" />
- <item type="string" name="wear_compose_material3_numeral_large_font_family" />
- <item type="string" name="wear_compose_material3_numeral_extra_large_font_family" />
-
- <item type="string" name="wear_compose_material3_title_small_font_family" />
- <item type="string" name="wear_compose_material3_title_medium_font_family" />
- <item type="string" name="wear_compose_material3_title_large_font_family" />
- <!--END WEAR SPECIFIC MATERIAL3 FONT FACE TOKENS-->
-
-
- <!--START WEAR SPECIFIC MATERIAL3 FONT SIZE TOKENS-->
- <item type="dimen" name="wear_compose_material3_arc_small_font_size" />
- <item type="dimen" name="wear_compose_material3_arc_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_arc_large_font_size" />
-
- <item type="dimen" name="wear_compose_material3_body_extra_small_font_size" />
- <item type="dimen" name="wear_compose_material3_body_small_font_size" />
- <item type="dimen" name="wear_compose_material3_body_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_body_large_font_size" />
-
- <item type="dimen" name="wear_compose_material3_display_small_font_size" />
- <item type="dimen" name="wear_compose_material3_display_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_display_large_font_size" />
-
- <item type="dimen" name="wear_compose_material3_label_small_font_size" />
- <item type="dimen" name="wear_compose_material3_label_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_label_large_font_size" />
-
- <item type="dimen" name="wear_compose_material3_numeral_extra_small_font_size" />
- <item type="dimen" name="wear_compose_material3_numeral_small_font_size" />
- <item type="dimen" name="wear_compose_material3_numeral_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_numeral_large_font_size" />
- <item type="dimen" name="wear_compose_material3_numeral_extra_large_font_size" />
-
- <item type="dimen" name="wear_compose_material3_title_small_font_size" />
- <item type="dimen" name="wear_compose_material3_title_medium_font_size" />
- <item type="dimen" name="wear_compose_material3_title_large_font_size" />
- <!--END WEAR SPECIFIC MATERIAL3 FONT SIZE TOKENS-->
-
- <!--START WEAR SPECIFIC MATERIAL3 SHAPE TOKENS-->
- <item type="dimen" name="wear_compose_material3_shape_corner_extra_small_size" />
- <item type="dimen" name="wear_compose_material3_shape_corner_small_size" />
- <item type="dimen" name="wear_compose_material3_shape_corner_medium_size" />
- <item type="dimen" name="wear_compose_material3_shape_corner_large_size" />
- <item type="dimen" name="wear_compose_material3_shape_corner_extra_large_size" />
- <!--END WEAR SPECIFIC MATERIAL3 SHAPE TOKENS-->
-
-
<!-- START ENHANCED CONFIRMATION DIALOG -->
<item type="style" name="Theme.EnhancedConfirmationDialog" />
<item type="style" name="Theme.EnhancedConfirmationDialogFragment" />
diff --git a/PermissionController/res/values/strings.xml b/PermissionController/res/values/strings.xml
index b28fbcef2..5714a2460 100644
--- a/PermissionController/res/values/strings.xml
+++ b/PermissionController/res/values/strings.xml
@@ -1337,6 +1337,12 @@
<!-- Title for category of default apps for private profile [CHAR LIMIT=50] -->
<string name="default_apps_for_private_profile">Default for private space</string>
+ <!-- Title for category of apps that are optimized for the device [CHAR LIMIT=50] -->
+ <string name="default_app_recommended">Optimized for device</string>
+
+ <!-- Title for category of other apps [CHAR LIMIT=50] -->
+ <string name="default_app_others">Others</string>
+
<!-- Summary of a default app when there is no app set [CHAR LIMIT=60] -->
<string name="default_app_none">None</string>
@@ -2023,20 +2029,19 @@ Allow <xliff:g id="app_name" example="Gmail">%4$s</xliff:g> to upload a bug repo
<string name="enhanced_confirmation_dialog_desc">For your security, this setting is currently unavailable.</string>
<!--Title for dialog displayed to tell user that settings are blocked due to the phone state (such as being in a call with an unknown number) [CHAR LIMIT=50] -->
- <string name="enhanced_confirmation_phone_state_dialog_title">Action not available while on a phone call</string>
+ <string name="enhanced_confirmation_phone_state_dialog_title">Can\u2019t complete action during call</string>
<!--Content for dialog displayed to tell user that settings are blocked due to the phone state (such as being in a call with an unknown number) [CHAR LIMIT=NONE] -->
<string name="enhanced_confirmation_phone_state_dialog_desc"><xliff:g id="setting_description" example="allowing apps to install other apps">%1$s</xliff:g>\n\n
- Scammers often request this type of action during phone call conversations, so it\u2019s blocked to protect you. If you are being guided to take this action
- by someone you don\u2019t know, it might be a scam.</string>
+ This setting is blocked to protect your device and data</string>
<!--Content explaining that the "install other apps" setting is blocked due to the phone state in a dialog displayed to the user [CHAR LIMIT=NONE] -->
- <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix">Allowing apps to install other apps is not allowed during a phone call.</string>
+ <string name="enhanced_confirmation_phone_state_dialog_install_desc_prefix">Scammers may try to install harmful apps by asking you to install unknown apps from a new source.</string>
<!--Content explaining that the "enable accessibility service" setting is blocked due to the phone state in a dialog displayed to the user [CHAR LIMIT=NONE] -->
- <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix">Giving an app access to accessibility is not allowed during a phone call.</string>
+ <string name="enhanced_confirmation_phone_state_dialog_a11y_desc_prefix">Scammers may try to take control of your device by asking you to allow accessibility access for an app.</string>
<!--Content explaining that a generic setting is blocked due to the phone state in a dialog displayed to the user [CHAR LIMIT=NONE] -->
- <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix">Enabling this setting is not allowed during a phone call.</string>
+ <string name="enhanced_confirmation_phone_state_dialog_generic_desc_prefix">Scammers may attempt to harm your device with this setting.</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">App was denied access to <xliff:g id="permission_name" example="contacts">%1$s</xliff:g></string>
diff --git a/PermissionController/res/xml/roles.xml b/PermissionController/res/xml/roles.xml
index 7963e7026..72e1d9654 100644
--- a/PermissionController/res/xml/roles.xml
+++ b/PermissionController/res/xml/roles.xml
@@ -1931,7 +1931,6 @@
<permission name="android.permission.ACCESS_FINE_LOCATION" />
<permission name="android.permission.READ_MEDIA_IMAGES" />
<permission name="android.permission.READ_MEDIA_VIDEO" />
- <permission name="android.permission.READ_GLOBAL_APP_SEARCH_DATA" />
</permissions>
</role>
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 672d8a3ec..f0df97acc 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
@@ -51,6 +51,7 @@ import com.android.role.controller.util.IntentCompat;
import com.android.role.controller.util.PackageUtils;
import com.android.role.controller.util.RoleFlags;
import com.android.role.controller.util.RoleManagerCompat;
+import com.android.role.controller.util.SignedPackageUtils;
import com.android.role.controller.util.UserUtils;
import java.lang.annotation.Retention;
@@ -85,10 +86,6 @@ public class Role {
private static final String PACKAGE_NAME_ANDROID_SYSTEM = "android";
- private static final String DEFAULT_HOLDER_SEPARATOR = ";";
-
- private static final String CERTIFICATE_SEPARATOR = ":";
-
@Retention(RetentionPolicy.SOURCE)
@IntDef({
EXCLUSIVITY_NONE,
@@ -561,69 +558,11 @@ public class Role {
}
if (isExclusive()) {
- String packageName = getQualifiedDefaultHolderPackageNameAsUser(defaultHolders, user,
- context);
- if (packageName == null) {
- return Collections.emptyList();
- }
- return Collections.singletonList(packageName);
- } else {
- List<String> packageNames = new ArrayList<>();
- for (String defaultHolder : defaultHolders.split(DEFAULT_HOLDER_SEPARATOR)) {
- String packageName = getQualifiedDefaultHolderPackageNameAsUser(defaultHolder,
- user, context);
- if (packageName != null) {
- packageNames.add(packageName);
- }
- }
- return packageNames;
- }
- }
-
- @Nullable
- private String getQualifiedDefaultHolderPackageNameAsUser(@NonNull String defaultHolder,
- @NonNull UserHandle user, @NonNull Context context) {
- String packageName;
- byte[] certificate;
- int certificateSeparatorIndex = defaultHolder.indexOf(CERTIFICATE_SEPARATOR);
- if (certificateSeparatorIndex != -1) {
- packageName = defaultHolder.substring(0, certificateSeparatorIndex);
- String certificateString = defaultHolder.substring(certificateSeparatorIndex + 1);
- try {
- certificate = new Signature(certificateString).toByteArray();
- } catch (IllegalArgumentException e) {
- Log.w(LOG_TAG, "Cannot parse signing certificate: " + defaultHolder, e);
- return null;
- }
- } else {
- packageName = defaultHolder;
- certificate = null;
- }
-
- if (certificate != null) {
- Context userContext = UserUtils.getUserContext(context, user);
- PackageManager userPackageManager = userContext.getPackageManager();
- if (!userPackageManager.hasSigningCertificate(packageName, certificate,
- PackageManager.CERT_INPUT_SHA256)) {
- Log.w(LOG_TAG, "Default holder doesn't have required signing certificate: "
- + defaultHolder);
- return null;
- }
+ return CollectionUtils.singletonOrEmpty(
+ SignedPackageUtils.getPackageNameAsUser(defaultHolders, user, context));
} else {
- ApplicationInfo applicationInfo = PackageUtils.getApplicationInfoAsUser(packageName,
- user, context);
- if (applicationInfo == null) {
- Log.w(LOG_TAG, "Cannot get ApplicationInfo for default holder: " + packageName);
- return null;
- }
- if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
- Log.w(LOG_TAG, "Default holder didn't specify a signing certificate and isn't a"
- + " system app: " + packageName);
- return null;
- }
+ return SignedPackageUtils.getPackageNamesAsUser(defaultHolders, user, context);
}
-
- return packageName;
}
/**
diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/PackageUtils.java b/PermissionController/role-controller/java/com/android/role/controller/util/PackageUtils.java
index cbffd451a..512015972 100644
--- a/PermissionController/role-controller/java/com/android/role/controller/util/PackageUtils.java
+++ b/PermissionController/role-controller/java/com/android/role/controller/util/PackageUtils.java
@@ -57,7 +57,7 @@ public final class PackageUtils {
}
/**
- * Retrieve if a package is a system package.
+ * Check whether a package is a system package.
*
* @param packageName the name of the package
* @param user the user of the package
@@ -93,4 +93,22 @@ public final class PackageUtils {
return null;
}
}
+
+ /**
+ * Check whether a package has a signing certificate.
+ *
+ * @param packageName the name of the package
+ * @param certificate the signing certificate
+ * @param user the user of the package
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return whether the package has the signing certificate.
+ */
+ public static boolean hasSigningCertificateAsUser(@NonNull String packageName,
+ @NonNull byte[] certificate, @NonNull UserHandle user, @NonNull Context context) {
+ Context userContext = UserUtils.getUserContext(context, user);
+ PackageManager userPackageManager = userContext.getPackageManager();
+ return userPackageManager.hasSigningCertificate(packageName, certificate,
+ PackageManager.CERT_INPUT_SHA256);
+ }
}
diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackage.java b/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackage.java
new file mode 100644
index 000000000..b13ac3731
--- /dev/null
+++ b/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackage.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2025 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.util;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.Signature;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * A package name with an optional signing certificate.
+ */
+public class SignedPackage {
+
+ private static final String LOG_TAG = SignedPackage.class.getSimpleName();
+
+ private static final String SIGNED_PACKAGE_SEPARATOR = ";";
+ private static final String CERTIFICATE_SEPARATOR = ":";
+
+ /**
+ * The name of the package.
+ */
+ @NonNull
+ private final String mPackageName;
+
+ /**
+ * The signing certificate of the package.
+ */
+ @Nullable
+ private final byte[] mCertificate;
+
+ public SignedPackage(@NonNull String packageName, @Nullable byte[] certificate) {
+ mPackageName = packageName;
+ mCertificate = certificate;
+ }
+
+ @NonNull
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ @Nullable
+ public byte[] getCertificate() {
+ return mCertificate;
+ }
+
+ /**
+ * Parse a {@link SignedPackage} from a string input.
+ *
+ * @param input the package name, optionally followed by a colon and a signing certificate
+ * digest if it's not a system app
+ *
+ * @return the parsed {@link SignedPackage}, or {@code null} if the input is invalid
+ */
+ @Nullable
+ public static SignedPackage parse(@NonNull String input) {
+ String packageName;
+ byte[] certificate;
+ int certificateSeparatorIndex = input.indexOf(CERTIFICATE_SEPARATOR);
+ if (certificateSeparatorIndex != -1) {
+ packageName = input.substring(0, certificateSeparatorIndex);
+ String certificateString = input.substring(certificateSeparatorIndex + 1);
+ try {
+ certificate = new Signature(certificateString).toByteArray();
+ } catch (IllegalArgumentException e) {
+ Log.w(LOG_TAG, "Cannot parse signing certificate: " + input, e);
+ return null;
+ }
+ } else {
+ packageName = input;
+ certificate = null;
+ }
+ return new SignedPackage(packageName, certificate);
+ }
+
+ /**
+ * Parse a list of {@link SignedPackage}s from a string input.
+ *
+ * @param input the package names, each optionally followed by a colon and a signing certificate
+ * digest if it's not a system app
+ *
+ * @return the parsed list of valid {@link SignedPackage}s
+ */
+ @NonNull
+ public static List<SignedPackage> parseList(@NonNull String input) {
+ if (TextUtils.isEmpty(input)) {
+ return Collections.emptyList();
+ }
+ List<SignedPackage> signedPackages = new ArrayList<>();
+ for (String signedPackageInput : input.split(SIGNED_PACKAGE_SEPARATOR)) {
+ SignedPackage signedPackage = parse(signedPackageInput);
+ if (signedPackage != null) {
+ signedPackages.add(signedPackage);
+ }
+ }
+ return signedPackages;
+ }
+
+ /**
+ * Checks whether this signed package is available, i.e. it is installed, and either has the
+ * specified signing certificate or is a system app if no signing certificate is specified.
+ *
+ * @param user the user of the package
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return whether this signed package is available
+ */
+ public boolean isAvailableAsUser(@NonNull UserHandle user, @NonNull Context context) {
+ if (mCertificate != null) {
+ if (!PackageUtils.hasSigningCertificateAsUser(mPackageName, mCertificate, user,
+ context)) {
+ Log.w(LOG_TAG, "Package doesn't have required signing certificate: "
+ + mPackageName);
+ return false;
+ }
+ } else {
+ ApplicationInfo applicationInfo =
+ PackageUtils.getApplicationInfoAsUser(mPackageName, user, context);
+ if (applicationInfo == null) {
+ Log.w(LOG_TAG, "Cannot get ApplicationInfo for package: " + mPackageName);
+ return false;
+ }
+ if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ Log.w(LOG_TAG, "Package didn't specify a signing certificate and isn't a" +
+ " system app: " + mPackageName);
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Checks whether an {@link ApplicationInfo} matches this signed package, i.e. it has the same
+ * package name, and either has the specified signing certificate or is a system app if no
+ * signing certificate is specified.
+ *
+ * @param applicationInfo the {@link ApplicationInfo} to check for
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return whether the {@link ApplicationInfo} matches this signed package
+ */
+ public boolean matches(@NonNull ApplicationInfo applicationInfo, @NonNull Context context) {
+ if (!Objects.equals(applicationInfo.packageName, mPackageName)) {
+ return false;
+ }
+ if (mCertificate != null) {
+ UserHandle user = UserHandle.getUserHandleForUid(applicationInfo.uid);
+ if (!PackageUtils.hasSigningCertificateAsUser(mPackageName, mCertificate, user,
+ context)) {
+ Log.w(LOG_TAG, "Package doesn't have required signing certificate: "
+ + mPackageName);
+ return false;
+ }
+ } else {
+ if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ Log.w(LOG_TAG, "Package didn't specify a signing certificate and isn't a" +
+ " system app: " + mPackageName);
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackageUtils.java b/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackageUtils.java
new file mode 100644
index 000000000..169bed347
--- /dev/null
+++ b/PermissionController/role-controller/java/com/android/role/controller/util/SignedPackageUtils.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2025 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.util;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Utility methods about {@link SignedPackage}.
+ */
+public final class SignedPackageUtils {
+
+ private SignedPackageUtils() {}
+
+ /**
+ * Get a list of package names from a string input for {@link SignedPackage}s.
+ * <p>
+ * This method only returns packages that are
+ * {@link SignedPackage#isAvailableAsUser(UserHandle, Context) available}.
+ *
+ * @param input the string input
+ * @param user the user of the packages
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return the package names
+ */
+ @NonNull
+ public static List<String> getPackageNamesAsUser(@NonNull String input,
+ @NonNull UserHandle user, @NonNull Context context) {
+ List<SignedPackage> signedPackages = SignedPackage.parseList(input);
+ List<String> packageNames = new ArrayList<>();
+ int signedPackagesSize = signedPackages.size();
+ for (int i = 0; i < signedPackagesSize; i++) {
+ SignedPackage signedPackage = signedPackages.get(i);
+ if (signedPackage.isAvailableAsUser(user, context)) {
+ packageNames.add(signedPackage.getPackageName());
+ }
+ }
+ return packageNames;
+ }
+
+ /**
+ * Get a package name from a string input for a {@link SignedPackage}.
+ * <p>
+ * This method only returns a package if it is
+ * {@link SignedPackage#isAvailableAsUser(UserHandle, Context) available}.
+ *
+ * @param input the string input
+ * @param user the user of the package
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return the package name, or {@code null} otherwise
+ */
+ @Nullable
+ public static String getPackageNameAsUser(@NonNull String input, @NonNull UserHandle user,
+ @NonNull Context context) {
+ SignedPackage signedPackage = SignedPackage.parse(input);
+ if (signedPackage == null || !signedPackage.isAvailableAsUser(user, context)) {
+ return null;
+ }
+ return signedPackage.getPackageName();
+ }
+
+ /**
+ * Check whether an {@link ApplicationInfo} matches any of the {@link SignedPackage}s.
+ *
+ * @param applicationInfo the {@link ApplicationInfo} to check for
+ * @param signedPackages the list of {@link SignedPackage}s to check against
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return whether the {@link ApplicationInfo} matches any of the {@link SignedPackage}s
+ */
+ public static boolean matchesAny(@NonNull ApplicationInfo applicationInfo,
+ @NonNull List<SignedPackage> signedPackages, @NonNull Context context) {
+ int signedPackagesSize = signedPackages.size();
+ for (int i = 0; i < signedPackagesSize; i++) {
+ SignedPackage signedPackage = signedPackages.get(i);
+ if (signedPackage.matches(applicationInfo, context)) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/appops/data/repository/v31/AppOpRepository.kt b/PermissionController/src/com/android/permissioncontroller/appops/data/repository/v31/AppOpRepository.kt
index 3057f05e9..21ced3b28 100644
--- a/PermissionController/src/com/android/permissioncontroller/appops/data/repository/v31/AppOpRepository.kt
+++ b/PermissionController/src/com/android/permissioncontroller/appops/data/repository/v31/AppOpRepository.kt
@@ -112,7 +112,9 @@ class AppOpRepositoryImpl(
fun sendUpdate() {
if (job == null || job?.isActive == false) {
- job = coroutineScope.launch { trySend(getDiscreteOps(opNames)) }
+ job = coroutineScope.launch(dispatcher) {
+ trySend(getDiscreteOps(opNames))
+ }
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt b/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
index 4c698cda3..2428abb4a 100644
--- a/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/incident/wear/WearConfirmationScreen.kt
@@ -30,10 +30,10 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.wear.compose.material.CircularProgressIndicator
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionConfirmationDialog
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionConfirmationDialog
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
@Composable
fun WearConfirmationScreen(viewModel: WearConfirmationActivityViewModel) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
index 394cb3eb7..ad356d5f7 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/AppPermGroupUiInfoLiveData.kt
@@ -18,6 +18,7 @@ package com.android.permissioncontroller.permission.data
import android.Manifest
import android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED
+import android.Manifest.permission_group.READ_MEDIA_VISUAL
import android.Manifest.permission_group.STORAGE
import android.app.AppOpsManager
import android.app.Application
@@ -66,13 +67,8 @@ private constructor(
private val isHealth = Utils.isHealthPermissionGroup(permGroupName)
init {
- isSpecialLocation =
- LocationUtils.isLocationGroupAndProvider(app, permGroupName, packageName) ||
- LocationUtils.isLocationGroupAndControllerExtraPackage(
- app,
- permGroupName,
- packageName
- )
+ isSpecialLocation = LightAppPermGroupLiveData
+ .isSpecialLocationGranted(app, packageName, permGroupName, user) != null
addSource(packageInfoLiveData) { update() }
@@ -258,9 +254,14 @@ private constructor(
allPermInfos: Map<String, LightPermInfo>,
pkg: LightPackageInfo
): PermGrantState {
- val specialLocationState = getIsSpecialLocationState()
+ val specialLocationState = LightAppPermGroupLiveData
+ .isSpecialLocationGranted(app, packageName, permGroupName, user)
+ val specialFixedStorage = LightAppPermGroupLiveData
+ .isSpecialFixedStorageGranted(app, packageName, permGroupName, pkg.uid)
if (isStorage && isFullFilesAccessGranted(pkg)) {
return PermGrantState.PERMS_ALLOWED
+ } else if (permGroupName == READ_MEDIA_VISUAL && specialFixedStorage) {
+ return PermGrantState.PERMS_ALLOWED
}
var hasPermWithBackground = false
@@ -332,29 +333,6 @@ private constructor(
return PermGrantState.PERMS_DENIED
}
- private fun getIsSpecialLocationState(): Boolean? {
- if (!isSpecialLocation) {
- return null
- }
-
- val userContext = Utils.getUserContext(app, user)
- if (LocationUtils.isLocationGroupAndProvider(userContext, permGroupName, packageName)) {
- return LocationUtils.isLocationEnabled(userContext)
- }
- // The permission of the extra location controller package is determined by the
- // status of the controller package itself.
- if (
- LocationUtils.isLocationGroupAndControllerExtraPackage(
- userContext,
- permGroupName,
- packageName
- )
- ) {
- return LocationUtils.isExtraLocationControllerPackageEnabled(userContext)
- }
- return null
- }
-
private fun isFullFilesAccessGranted(pkg: LightPackageInfo): Boolean {
val packageState =
if (!FullStoragePermissionAppsLiveData.isStale) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/LightAppPermGroupLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/LightAppPermGroupLiveData.kt
index 67b765097..d66d6ec6c 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/LightAppPermGroupLiveData.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/data/LightAppPermGroupLiveData.kt
@@ -16,7 +16,13 @@
package com.android.permissioncontroller.permission.data
+import android.Manifest.permission_group.READ_MEDIA_VISUAL
+import android.Manifest.permission_group.STORAGE
+import android.app.AppOpsManager
+import android.app.AppOpsManager.MODE_ALLOWED
+import android.app.AppOpsManager.OPSTR_WRITE_MEDIA_IMAGES
import android.app.Application
+import android.app.role.RoleManager
import android.content.pm.PackageManager
import android.content.pm.PermissionInfo
import android.os.Build
@@ -121,19 +127,6 @@ private constructor(
LightPermission(packageInfo, permInfo, permState, foregroundPerms)
}
- // Determine if this app permission group is a special location package or provider
- var specialLocationGrant: Boolean? = null
- val userContext = Utils.getUserContext(app, user)
- if (LocationUtils.isLocationGroupAndProvider(userContext, permGroupName, packageName)) {
- specialLocationGrant = LocationUtils.isLocationEnabled(userContext)
- } else if (
- LocationUtils.isLocationGroupAndControllerExtraPackage(app, permGroupName, packageName)
- ) {
- // The permission of the extra location controller package is determined by the status
- // of the controller package itself.
- specialLocationGrant =
- LocationUtils.isExtraLocationControllerPackageEnabled(userContext)
- }
val hasInstallToRuntimeSplit = hasInstallToRuntimeSplit(packageInfo, permissionMap)
value =
@@ -142,7 +135,8 @@ private constructor(
permGroup.groupInfo,
permissionMap,
hasInstallToRuntimeSplit,
- specialLocationGrant
+ isSpecialLocationGranted(app, packageName, permGroupName, user),
+ isSpecialFixedStorageGranted(app, packageName, permGroupName, packageInfo.uid)
)
}
@@ -234,5 +228,56 @@ private constructor(
deviceId
)
}
+
+ private const val SYSTEM_GALLERY_ROLE_NAME = "android.app.role.SYSTEM_GALLERY"
+
+ // Returns true if this app is the location provider or location extra package, and location
+ // access is granted, false if it is the provider/extra, and location is not granted, and
+ // null if it is not a special package
+ fun isSpecialLocationGranted(
+ app: Application,
+ packageName: String,
+ permGroupName: String,
+ user: UserHandle
+ ): Boolean? {
+ val userContext = Utils.getUserContext(app, user)
+ return if (
+ LocationUtils.isLocationGroupAndProvider(userContext, permGroupName, packageName)
+ ) {
+ LocationUtils.isLocationEnabled(userContext)
+ } else if (
+ LocationUtils.isLocationGroupAndControllerExtraPackage(app, permGroupName, packageName)
+ ) {
+ // The permission of the extra location controller package is determined by the status
+ // of the controller package itself.
+ LocationUtils.isExtraLocationControllerPackageEnabled(userContext)
+ } else {
+ null
+ }
+ }
+
+ // Gallery role is static, so we only need to get the set gallery app once
+ private val systemGalleryApps: List<String> by lazy {
+ val roleManager = PermissionControllerApplication.get()
+ .getSystemService(RoleManager::class.java) ?: return@lazy emptyList()
+ roleManager.getRoleHolders(SYSTEM_GALLERY_ROLE_NAME)
+ }
+
+ fun isSpecialFixedStorageGranted(
+ app: Application,
+ packageName: String,
+ permGroupName: String,
+ uid: Int
+ ): Boolean {
+ if (permGroupName != READ_MEDIA_VISUAL && permGroupName != STORAGE) {
+ return false
+ }
+ if (packageName !in systemGalleryApps) {
+ return false
+ }
+ // This is the storage group, and the gallery app. Check the write media app op
+ val appOps = app.getSystemService(AppOpsManager::class.java)
+ return appOps.checkOpNoThrow(OPSTR_WRITE_MEDIA_IMAGES, uid, packageName) == MODE_ALLOWED
+ }
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt b/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt
deleted file mode 100644
index a3fc40232..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/data/v31/AllLightHistoricalPackageOpsLiveData.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2022 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.data.v31
-
-import android.app.AppOpsManager
-import android.app.AppOpsManager.HISTORY_FLAG_DISCRETE
-import android.app.AppOpsManager.HISTORY_FLAG_GET_ATTRIBUTION_CHAINS
-import android.app.AppOpsManager.HistoricalOps
-import android.app.AppOpsManager.HistoricalOpsRequest
-import android.app.AppOpsManager.OP_FLAG_SELF
-import android.app.AppOpsManager.OP_FLAG_TRUSTED_PROXIED
-import android.app.Application
-import android.os.UserHandle
-import android.os.UserManager
-import com.android.modules.utils.build.SdkLevel
-import com.android.permissioncontroller.permission.data.SmartAsyncMediatorLiveData
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps
-import java.util.concurrent.TimeUnit
-import kotlin.coroutines.suspendCoroutine
-import kotlinx.coroutines.Job
-
-/**
- * LiveData class tracking [LightHistoricalPackageOps] for all packages on the device and for the
- * provided app ops.
- *
- * App ops data is retrieved from [AppOpsManager] and is updated whenever app ops data changes are
- * heard.
- */
-class AllLightHistoricalPackageOpsLiveData(app: Application, val opNames: Set<String>) :
- SmartAsyncMediatorLiveData<Map<Pair<String, UserHandle>, LightHistoricalPackageOps>>(),
- AppOpsManager.OnOpActiveChangedListener,
- AppOpsManager.OnOpNotedListener,
- AppOpsManager.OnOpChangedListener {
-
- private val appOpsManager = app.getSystemService(AppOpsManager::class.java)!!
- private val userManager = app.getSystemService(UserManager::class.java)!!
-
- override fun onActive() {
- super.onActive()
-
- opNames.forEach { opName ->
- // TODO(b/262035952): We watch each active op individually as startWatchingActive only
- // registers the callback if all ops are valid. Fix this behavior so if one op is
- // invalid it doesn't affect the other ops.
- try {
- appOpsManager.startWatchingActive(arrayOf(opName), { it.run() }, this)
- } catch (ignored: IllegalArgumentException) {
- // Older builds may not support all requested app ops.
- }
-
- try {
- appOpsManager.startWatchingMode(opName, /* all packages */ null, this)
- } catch (ignored: IllegalArgumentException) {
- // Older builds may not support all requested app ops.
- }
-
- if (SdkLevel.isAtLeastU()) {
- try {
- appOpsManager.startWatchingNoted(arrayOf(opName), this)
- } catch (ignored: IllegalArgumentException) {
- // Older builds may not support all requested app ops.
- }
- }
- }
- }
-
- override fun onInactive() {
- super.onInactive()
-
- appOpsManager.stopWatchingActive(this)
- appOpsManager.stopWatchingMode(this)
- }
-
- override suspend fun loadDataAndPostValue(job: Job) {
- if (job.isCancelled) {
- return
- }
-
- val allLightHistoricalPackageOps =
- mutableMapOf<Pair<String, UserHandle>, LightHistoricalPackageOps>()
-
- val endTimeMillis = System.currentTimeMillis()
- val beginTimeMillis = endTimeMillis - TimeUnit.DAYS.toMillis(7)
-
- val allProfilesInCurrentUser = userManager.userProfiles
-
- val request =
- HistoricalOpsRequest.Builder(beginTimeMillis, endTimeMillis)
- .setFlags(OP_FLAG_SELF or OP_FLAG_TRUSTED_PROXIED)
- .setHistoryFlags(HISTORY_FLAG_DISCRETE or HISTORY_FLAG_GET_ATTRIBUTION_CHAINS)
- .build()
-
- val historicalOps = suspendCoroutine {
- appOpsManager.getHistoricalOps(request, { it.run() }) { ops: HistoricalOps ->
- it.resumeWith(Result.success(ops))
- }
- }
-
- for (i in 0 until historicalOps.uidCount) {
- val historicalUidOps = historicalOps.getUidOpsAt(i)
- val userHandle = UserHandle.getUserHandleForUid(historicalUidOps.uid)
- if (userHandle !in allProfilesInCurrentUser) {
- continue
- }
- for (j in 0 until historicalUidOps.packageCount) {
- val historicalPackageOps = historicalUidOps.getPackageOpsAt(j)
- allLightHistoricalPackageOps[Pair(historicalPackageOps.packageName, userHandle)] =
- LightHistoricalPackageOps(historicalPackageOps, userHandle, opNames)
- }
- }
-
- postValue(allLightHistoricalPackageOps)
- }
-
- override fun onOpChanged(op: String?, packageName: String?) {
- update()
- }
-
- override fun onOpActiveChanged(op: String, uid: Int, packageName: String, active: Boolean) {
- update()
- }
-
- override fun onOpNoted(
- code: String,
- uid: Int,
- packageName: String,
- attributionTag: String?,
- flags: Int,
- result: Int
- ) {
- update()
- }
-}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt b/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt
index 61a604de8..18f4ce203 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/model/livedatatypes/LightAppPermGroup.kt
@@ -35,19 +35,24 @@ import com.android.permissioncontroller.permission.utils.Utils
* @param specialLocationGrant If this package is the location provider, or the extra location
* package, then the grant state of the group is not determined by the grant state of individual
* permissions, but by other system properties
+ * @param specialFixedStorageGrant If this package holds the SYSTEM_GALLERY role, and has the
+ * WRITE_MEDIA_IMAGES app op granted, then we should show the grant state of the storage
+ * permissions as system fixed and granted.
+ *
*/
data class LightAppPermGroup(
val packageInfo: LightPackageInfo,
val permGroupInfo: LightPermGroupInfo,
val allPermissions: Map<String, LightPermission>,
val hasInstallToRuntimeSplit: Boolean,
- val specialLocationGrant: Boolean?
+ val specialLocationGrant: Boolean?,
+ val specialFixedStorageGrant: Boolean,
) {
constructor(
pI: LightPackageInfo,
pGI: LightPermGroupInfo,
perms: Map<String, LightPermission>
- ) : this(pI, pGI, perms, false, null)
+ ) : this(pI, pGI, perms, false, null, false)
/** All unrestricted permissions. Usually restricted permissions are ignored */
val permissions: Map<String, LightPermission> =
@@ -83,7 +88,8 @@ data class LightAppPermGroup(
permissions.filter { it.key in foregroundPermNames },
packageInfo,
isPlatformPermissionGroup,
- specialLocationGrant
+ specialLocationGrant,
+ specialFixedStorageGrant
)
val background =
@@ -91,7 +97,8 @@ data class LightAppPermGroup(
permissions.filter { it.key in backgroundPermNames },
packageInfo,
isPlatformPermissionGroup,
- specialLocationGrant
+ specialLocationGrant,
+ specialFixedStorageGrant
)
/** Whether or not this App Permission Group has a permission which has a background mode */
@@ -167,18 +174,20 @@ data class LightAppPermGroup(
* contained in the full group
* @param isPlatformPermissionGroup Whether this is a platform permission group
* @param specialLocationGrant Whether this is a special location package
+ * @param specialFixedStorageGrant Whether this is a special storage grant
*/
data class AppPermSubGroup
internal constructor(
private val permissions: Map<String, LightPermission>,
private val packageInfo: LightPackageInfo,
private val isPlatformPermissionGroup: Boolean,
- private val specialLocationGrant: Boolean?
+ private val specialLocationGrant: Boolean?,
+ private val specialFixedStorageGrant: Boolean
) {
/** Whether any of this App Permission SubGroup's permissions are granted */
val isGranted =
specialLocationGrant
- ?: permissions.any {
+ ?: specialFixedStorageGrant || permissions.any {
val mayGrantByPlatformOrSystem =
!isPlatformPermissionGroup || it.value.isPlatformOrSystem
it.value.isGranted && mayGrantByPlatformOrSystem
@@ -216,7 +225,7 @@ data class LightAppPermGroup(
val isPolicyFixed = permissions.any { it.value.isPolicyFixed }
/** Whether any of this App Permission Subgroup's permissions are fixed by the system */
- val isSystemFixed = permissions.any { it.value.isSystemFixed }
+ val isSystemFixed = permissions.any { it.value.isSystemFixed } || specialFixedStorageGrant
/** Whether any of this App Permission Subgroup's permissions are fixed by the user */
val isUserFixed = permissions.any { it.value.isUserFixed }
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt b/PermissionController/src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt
index 85145f346..184c37921 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/service/RuntimePermissionsUpgradeController.kt
@@ -503,7 +503,8 @@ object RuntimePermissionsUpgradeController {
bgApp.permGroupInfo,
allPermissionsWithxemption,
bgApp.hasInstallToRuntimeSplit,
- bgApp.specialLocationGrant
+ bgApp.specialLocationGrant,
+ bgApp.specialFixedStorageGrant,
)
}
@@ -683,7 +684,8 @@ object RuntimePermissionsUpgradeController {
bgSensorsGroup.permGroupInfo,
allPermissionsWithExemption,
bgSensorsGroup.hasInstallToRuntimeSplit,
- bgSensorsGroup.specialLocationGrant
+ bgSensorsGroup.specialLocationGrant,
+ bgSensorsGroup.specialFixedStorageGrant,
)
// Grant the background permission only if foreground permission is granted.
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
index 36917fbf1..0af7cf2ec 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/ManagePermissionsActivity.java
@@ -42,6 +42,7 @@ import android.os.Bundle;
import android.os.Process;
import android.os.UserHandle;
import android.permission.PermissionManager;
+import android.permission.flags.Flags;
import android.provider.Settings;
import android.safetycenter.SafetyCenterManager;
import android.safetycenter.SafetyEvent;
@@ -450,7 +451,15 @@ public final class ManagePermissionsActivity extends SettingsActivity {
if (Utils.isHealthPermissionUiEnabled() && permissionGroupName
.equals(HEALTH_PERMISSION_GROUP)) {
- Utils.navigateToHealthConnectSettings(this);
+ // On Handheld, PrivacyDashboard and PermissionManager have the same UI.
+ // On Wear, PrivacyDashboard and PermissionManager have different UI,
+ // PermissionController needs to add an extra in the intent to instruct
+ // HealthConnect how to differentiate.
+ if (DeviceUtils.isWear(this) && Flags.replaceBodySensorPermissionEnabled()) {
+ Utils.navigateToWearHealthConnectSettingsPrivacyDashboard(this);
+ } else {
+ Utils.navigateToHealthConnectSettings(this);
+ }
finishAfterTransition();
return;
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
index 8edd39913..2ecf40ce2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/auto/dashboard/AutoPermissionUsageDetailsFragment.kt
@@ -35,7 +35,6 @@ import com.android.permissioncontroller.R
import com.android.permissioncontroller.auto.AutoSettingsFrameFragment
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
import com.android.permissioncontroller.permission.ui.auto.AutoDividerPreference
-import com.android.permissioncontroller.permission.ui.model.v31.BasePermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
@@ -80,7 +79,7 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment() {
private val SESSION_ID_KEY = (AutoPermissionUsageFragment::class.java.name + KEY_SESSION_ID)
- private lateinit var usageViewModel: BasePermissionUsageDetailsViewModel
+ private lateinit var usageViewModel: PermissionUsageDetailsViewModel
private lateinit var filterGroup: String
private var showSystem = false
@@ -119,11 +118,10 @@ class AutoPermissionUsageDetailsFragment : AutoSettingsFrameFragment() {
val factory =
PermissionUsageDetailsViewModel.PermissionUsageDetailsViewModelFactory(
PermissionControllerApplication.get(),
- this,
filterGroup,
)
usageViewModel =
- ViewModelProvider(this, factory)[BasePermissionUsageDetailsViewModel::class.java]
+ ViewModelProvider(this, factory)[PermissionUsageDetailsViewModel::class.java]
usageViewModel.getPermissionUsagesDetailsInfoUiLiveData().observe(this, this::updateUI)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java
index 3a904c466..9078f1a0a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/handheld/v31/PermissionUsageDetailsFragment.java
@@ -54,7 +54,7 @@ import com.android.permissioncontroller.PermissionControllerApplication;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity;
import com.android.permissioncontroller.permission.ui.handheld.SettingsWithLargeHeader;
-import com.android.permissioncontroller.permission.ui.model.v31.BasePermissionUsageDetailsViewModel;
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel;
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo;
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState;
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsViewModelFactory;
@@ -89,7 +89,7 @@ public class PermissionUsageDetailsFragment extends SettingsWithLargeHeader {
private MenuItem mShow7DaysDataMenu;
private MenuItem mShow24HoursDataMenu;
- private BasePermissionUsageDetailsViewModel mViewModel;
+ private PermissionUsageDetailsViewModel mViewModel;
private long mSessionId;
@@ -103,9 +103,9 @@ public class PermissionUsageDetailsFragment extends SettingsWithLargeHeader {
}
PermissionUsageDetailsViewModelFactory factory =
new PermissionUsageDetailsViewModelFactory(
- PermissionControllerApplication.get(), this, mPermissionGroup);
+ PermissionControllerApplication.get(), mPermissionGroup);
mViewModel =
- new ViewModelProvider(this, factory).get(BasePermissionUsageDetailsViewModel.class);
+ new ViewModelProvider(this, factory).get(PermissionUsageDetailsViewModel.class);
if (savedInstanceState != null) {
mSessionId = savedInstanceState.getLong(SESSION_ID_KEY);
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/BasePermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/BasePermissionUsageDetailsViewModel.kt
deleted file mode 100644
index 64c5c6927..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/BasePermissionUsageDetailsViewModel.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * 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.model.v31
-
-import android.app.Application
-import android.graphics.drawable.Drawable
-import android.os.UserHandle
-import androidx.lifecycle.AndroidViewModel
-import androidx.lifecycle.LiveData
-import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.handheld.v31.getDurationUsedStr
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.CLUSTER_SPACING_MINUTES
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState
-import com.android.permissioncontroller.permission.utils.KotlinUtils
-import java.util.concurrent.TimeUnit
-
-abstract class BasePermissionUsageDetailsViewModel(val app: Application) : AndroidViewModel(app) {
- abstract fun getPermissionUsagesDetailsInfoUiLiveData(): LiveData<PermissionUsageDetailsUiState>
-
- abstract fun getShowSystem(): Boolean
-
- abstract val showSystemLiveData: LiveData<Boolean>
-
- abstract fun getShow7Days(): Boolean
-
- abstract fun updateShowSystemAppsToggle(showSystem: Boolean)
-
- abstract fun updateShow7DaysToggle(show7Days: Boolean)
-
- private val packageIconCache: MutableMap<Pair<String, UserHandle>, Drawable> = mutableMapOf()
- private val packageLabelCache: MutableMap<String, String> = mutableMapOf()
-
- /**
- * Returns the label for the provided package name, by first searching the cache otherwise
- * retrieving it from the app's [android.content.pm.ApplicationInfo].
- */
- fun getPackageLabel(packageName: String, user: UserHandle): String {
- if (packageLabelCache.containsKey(packageName)) {
- return requireNotNull(packageLabelCache[packageName])
- }
- val packageLabel = getPackageLabel(app, packageName, user)
- packageLabelCache[packageName] = packageLabel
- return packageLabel
- }
-
- open fun getPackageLabel(app: Application, packageName: String, user: UserHandle): String {
- return KotlinUtils.getPackageLabel(app, packageName, user)
- }
-
- /**
- * Returns the icon for the provided package name and user, by first searching the cache
- * otherwise retrieving it from the app's [android.content.pm.ApplicationInfo].
- */
- fun getBadgedPackageIcon(packageName: String, userHandle: UserHandle): Drawable? {
- val packageNameWithUser: Pair<String, UserHandle> = Pair(packageName, userHandle)
- if (packageIconCache.containsKey(packageNameWithUser)) {
- return requireNotNull(packageIconCache[packageNameWithUser])
- }
- val packageIcon = getBadgedPackageIcon(app, packageName, userHandle)
- if (packageIcon != null) packageIconCache[packageNameWithUser] = packageIcon
-
- return packageIcon
- }
-
- open fun getBadgedPackageIcon(
- app: Application,
- packageName: String,
- user: UserHandle
- ): Drawable? {
- return KotlinUtils.getBadgedPackageIcon(app, packageName, user)
- }
-
- fun getDurationSummary(durationMs: Long): String? {
- // Only show the duration summary if it is at least (CLUSTER_SPACING_MINUTES + 1) minutes.
- // Displaying a time that is shorter than the cluster granularity
- // (CLUSTER_SPACING_MINUTES) will not convey useful information.
- if (durationMs >= TimeUnit.MINUTES.toMillis(CLUSTER_SPACING_MINUTES + 1)) {
- return getDurationUsedStr(app, durationMs)
- }
- return null
- }
-
- fun buildUsageSummary(
- subAttributionLabel: String?,
- proxyPackageLabel: String?,
- durationSummary: String?
- ): String? {
- val subTextStrings: MutableList<String> = mutableListOf()
- subAttributionLabel?.let { subTextStrings.add(subAttributionLabel) }
- proxyPackageLabel?.let { subTextStrings.add(it) }
- durationSummary?.let { subTextStrings.add(it) }
- return when (subTextStrings.size) {
- 3 ->
- app.getString(
- R.string.history_preference_subtext_3,
- subTextStrings[0],
- subTextStrings[1],
- subTextStrings[2]
- )
- 2 ->
- app.getString(
- R.string.history_preference_subtext_2,
- subTextStrings[0],
- subTextStrings[1]
- )
- 1 -> subTextStrings[0]
- else -> null
- }
- }
-}
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 497e5cc35..ad21ab220 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
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 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.
@@ -13,677 +13,288 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@file:Suppress("DEPRECATION")
package com.android.permissioncontroller.permission.ui.model.v31
import android.Manifest
import android.app.AppOpsManager
+import android.app.AppOpsManager.OPSTR_EMERGENCY_LOCATION
import android.app.AppOpsManager.OPSTR_PHONE_CALL_CAMERA
import android.app.AppOpsManager.OPSTR_PHONE_CALL_MICROPHONE
import android.app.Application
-import android.app.role.RoleManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
-import android.content.res.Resources
import android.graphics.drawable.Drawable
import android.location.LocationManager
import android.os.Build
-import android.os.Bundle
import android.os.UserHandle
-import android.os.UserManager
import android.permission.flags.Flags
-import android.util.Log
import androidx.annotation.RequiresApi
-import androidx.lifecycle.AbstractSavedStateViewModelFactory
+import androidx.annotation.VisibleForTesting
+import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
-import androidx.savedstate.SavedStateRegistryOwner
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.application
+import androidx.lifecycle.asLiveData
+import androidx.lifecycle.createSavedStateHandle
+import androidx.lifecycle.viewModelScope
+import androidx.lifecycle.viewmodel.CreationExtras
import com.android.modules.utils.build.SdkLevel
import com.android.permissioncontroller.DeviceUtils
import com.android.permissioncontroller.R
+import com.android.permissioncontroller.appops.data.repository.v31.AppOpRepository
import com.android.permissioncontroller.permission.compat.IntentCompat
-import com.android.permissioncontroller.permission.data.AppPermGroupUiInfoLiveData
-import com.android.permissioncontroller.permission.data.LightPackageInfoLiveData
-import com.android.permissioncontroller.permission.data.SmartUpdateMediatorLiveData
-import com.android.permissioncontroller.permission.data.get
-import com.android.permissioncontroller.permission.data.v31.AllLightHistoricalPackageOpsLiveData
-import com.android.permissioncontroller.permission.model.livedatatypes.LightPackageInfo
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.AppPermissionId
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps.AppPermissionDiscreteAccesses
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps.AttributedAppPermissionDiscreteAccesses
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps.Companion.NO_ATTRIBUTION_TAG
-import com.android.permissioncontroller.permission.model.livedatatypes.v31.LightHistoricalPackageOps.DiscreteAccess
+import com.android.permissioncontroller.permission.data.repository.v31.PermissionRepository
+import com.android.permissioncontroller.permission.domain.model.v31.PermissionTimelineUsageModel
+import com.android.permissioncontroller.permission.domain.model.v31.PermissionTimelineUsageModelWrapper
+import com.android.permissioncontroller.permission.domain.usecase.v31.GetPermissionGroupUsageDetailsUseCase
import com.android.permissioncontroller.permission.ui.handheld.v31.getDurationUsedStr
-import com.android.permissioncontroller.permission.ui.handheld.v31.shouldShowSubattributionInPermissionsDashboard
import com.android.permissioncontroller.permission.utils.PermissionMapping
-import com.android.permissioncontroller.permission.utils.Utils
-import com.android.permissioncontroller.permission.utils.v31.SubattributionUtils
+import com.android.permissioncontroller.pm.data.repository.v31.PackageRepository
+import com.android.permissioncontroller.role.data.repository.v31.RoleRepository
+import com.android.permissioncontroller.user.data.repository.v31.UserRepository
import java.time.Instant
import java.util.Objects
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeUnit.DAYS
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.StateFlow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flowOn
+import kotlinx.coroutines.flow.stateIn
-/** [ViewModel] for the Permission Usage Details page. */
-@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageDetailsViewModel(
- private val application: Application,
+ app: Application,
+ private val getPermissionUsageDetailsUseCase: GetPermissionGroupUsageDetailsUseCase,
private val state: SavedStateHandle,
private val permissionGroup: String,
-) : BasePermissionUsageDetailsViewModel(application) {
-
- val allLightHistoricalPackageOpsLiveData =
- AllLightHistoricalPackageOpsLiveData(application, opNames)
- private val appPermGroupUiInfoLiveDataList =
- mutableMapOf<AppPermissionId, AppPermGroupUiInfoLiveData>()
- private val lightPackageInfoLiveDataMap =
- mutableMapOf<Pair<String, UserHandle>, LightPackageInfoLiveData>()
-
- override val showSystemLiveData = state.getLiveData(SHOULD_SHOW_SYSTEM_KEY, false)
- val show7DaysLiveData = state.getLiveData(SHOULD_SHOW_7_DAYS_KEY, false)
-
- private val roleManager =
- Utils.getSystemServiceSafe(application.applicationContext, RoleManager::class.java)
- private val userManager =
- Utils.getSystemServiceSafe(application.applicationContext, UserManager::class.java)
+ scope: CoroutineScope? = null,
+ private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default,
+ private val packageRepository: PackageRepository = PackageRepository.getInstance(app),
+) : AndroidViewModel(app) {
+ private val coroutineScope = scope ?: viewModelScope
+ private val context = app
+
+ private val packageIconCache: MutableMap<Pair<String, UserHandle>, Drawable> = mutableMapOf()
+ private val packageLabelCache: MutableMap<String, String> = mutableMapOf()
+
+ private val showSystemFlow = MutableStateFlow(state[SHOULD_SHOW_SYSTEM_KEY] ?: false)
+ private val show7DaysFlow = MutableStateFlow(state[SHOULD_SHOW_7_DAYS_KEY] ?: false)
+
+ private val permissionTimelineUsagesFlow:
+ StateFlow<PermissionTimelineUsageModelWrapper> by lazy {
+ getPermissionUsageDetailsUseCase(coroutineScope)
+ .flowOn(defaultDispatcher)
+ .stateIn(
+ coroutineScope,
+ SharingStarted.WhileSubscribed(5000),
+ PermissionTimelineUsageModelWrapper.Loading,
+ )
+ }
- /** Updates whether system app permissions usage should be displayed in the UI. */
- override fun updateShowSystemAppsToggle(showSystem: Boolean) {
- if (showSystem != state[SHOULD_SHOW_SYSTEM_KEY]) {
- state[SHOULD_SHOW_SYSTEM_KEY] = showSystem
- }
+ @VisibleForTesting
+ val permissionUsageDetailsUiStateFlow: Flow<PermissionUsageDetailsUiState> by lazy {
+ combine(permissionTimelineUsagesFlow, showSystemFlow, show7DaysFlow) {
+ permissionTimelineUsages,
+ showSystem,
+ show7Days ->
+ permissionTimelineUsages.buildPermissionUsageDetailsUiInfo(showSystem, show7Days)
+ }
+ .flowOn(defaultDispatcher)
}
- /** Updates whether 7 days usage or 1 day usage should be displayed in the UI. */
- override fun updateShow7DaysToggle(show7Days: Boolean) {
- if (show7Days != state[SHOULD_SHOW_7_DAYS_KEY]) {
- state[SHOULD_SHOW_7_DAYS_KEY] = show7Days
- }
+ fun getPermissionUsagesDetailsInfoUiLiveData(): LiveData<PermissionUsageDetailsUiState> {
+ return permissionUsageDetailsUiStateFlow.asLiveData(
+ context = coroutineScope.coroutineContext
+ )
}
- /** Creates a [PermissionUsageDetailsUiState] containing all information to render the UI. */
- fun buildPermissionUsageDetailsUiInfo(): PermissionUsageDetailsUiState {
- val showSystem: Boolean = state[SHOULD_SHOW_SYSTEM_KEY] ?: false
- val show7Days: Boolean = state[SHOULD_SHOW_7_DAYS_KEY] ?: false
- val showPermissionUsagesDuration =
- if (show7Days && DeviceUtils.isHandheld()) {
- TIME_7_DAYS_DURATION
- } else {
- TIME_24_HOURS_DURATION
- }
+ private fun PermissionTimelineUsageModelWrapper.buildPermissionUsageDetailsUiInfo(
+ showSystem: Boolean,
+ show7Days: Boolean,
+ ): PermissionUsageDetailsUiState {
+ if (this is PermissionTimelineUsageModelWrapper.Loading) {
+ return PermissionUsageDetailsUiState.Loading
+ }
+ val timelineUsageModels =
+ (this as PermissionTimelineUsageModelWrapper.Success).timelineUsageModels
val startTime =
- (System.currentTimeMillis() - showPermissionUsagesDuration).coerceAtLeast(
+ (System.currentTimeMillis() - getUsageDuration(show7Days)).coerceAtLeast(
Instant.EPOCH.toEpochMilli()
)
+ val permissionTimelineUsageModels =
+ timelineUsageModels.filter { it.accessEndMillis > startTime }
+ val containsSystemUsages = permissionTimelineUsageModels.any { !it.isUserSensitive }
+ val result =
+ permissionTimelineUsageModels
+ .filter { showSystem || it.isUserSensitive }
+ .map { clusterOps ->
+ val durationSummaryLabel =
+ if (clusterOps.durationMillis > 0) {
+ getDurationSummary(clusterOps.durationMillis)
+ } else {
+ null
+ }
+ val proxyLabel = getProxyPackageLabel(clusterOps)
+ val isEmergencyLocationAccess =
+ isLocationByPassEnabled() &&
+ clusterOps.opNames.any { it == OPSTR_EMERGENCY_LOCATION }
+ val subAttributionLabel =
+ if (isEmergencyLocationAccess) {
+ emergencyLocationAttributionLabel
+ } else {
+ clusterOps.attributionLabel
+ }
+ val showingSubAttribution = !subAttributionLabel.isNullOrEmpty()
+ val summary =
+ buildUsageSummary(subAttributionLabel, proxyLabel, durationSummaryLabel)
+ PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo(
+ UserHandle.of(clusterOps.userId),
+ clusterOps.packageName,
+ getPackageLabel(clusterOps.packageName, UserHandle.of(clusterOps.userId)),
+ permissionGroup,
+ clusterOps.accessStartMillis,
+ clusterOps.accessEndMillis,
+ summary,
+ showingSubAttribution,
+ clusterOps.attributionTags ?: emptySet(),
+ getBadgedPackageIcon(
+ clusterOps.packageName,
+ UserHandle.of(clusterOps.userId),
+ ),
+ isEmergencyLocationAccess,
+ )
+ }
+ .sortedBy { -1 * it.accessStartTime }
return PermissionUsageDetailsUiState.Success(
- buildAppPermissionAccessUiInfoList(
- allLightHistoricalPackageOpsLiveData,
- startTime,
- showSystem
- ),
- containsSystemAppUsages(allLightHistoricalPackageOpsLiveData, startTime),
+ result,
+ containsSystemUsages,
showSystem,
- show7Days
+ show7Days,
)
}
- /**
- * Returns whether the "show/hide system" toggle should be displayed in the UI for the provided
- * [AllLightHistoricalPackageOpsLiveData].
- */
- private fun containsSystemAppUsages(
- allLightHistoricalPackageOpsLiveData: AllLightHistoricalPackageOpsLiveData,
- startTime: Long
- ): Boolean {
- return allLightHistoricalPackageOpsLiveData
- .getLightHistoricalPackageOps()
- ?.flatMap {
- it.appPermissionDiscreteAccesses
- .map { it.withLabel() }
- .filterOutExemptAppPermissions(true)
- .filterAccessesLaterThan(startTime)
- }
- ?.any { isAppPermissionSystem(it.appPermissionId) } ?: false
+ private val emergencyLocationAttributionLabel: String by lazy {
+ context.getString(R.string.privacy_dashboard_emergency_location_enforced_attribution_label)
}
- private fun isPermissionRequestedByApp(appPermissionId: AppPermissionId): Boolean {
- val appRequestedPermissions =
- lightPackageInfoLiveDataMap[
- Pair(appPermissionId.packageName, appPermissionId.userHandle)]
- ?.value
- ?.requestedPermissions ?: listOf()
-
- if (
- appPermissionId.permissionGroup == Manifest.permission_group.LOCATION &&
- appRequestedPermissions.contains(Manifest.permission.LOCATION_BYPASS)
- ) {
- return true
- }
+ fun getShowSystem(): Boolean = showSystemFlow.value
- return appRequestedPermissions.any {
- PermissionMapping.getGroupOfPlatformPermission(it) == appPermissionId.permissionGroup
- }
- }
+ val showSystemLiveData = showSystemFlow.asLiveData(context = coroutineScope.coroutineContext)
- private fun isAppPermissionSystem(appPermissionId: AppPermissionId): Boolean {
- val appPermGroupUiInfo = appPermGroupUiInfoLiveDataList[appPermissionId]?.value
-
- if (appPermGroupUiInfo != null) {
- return appPermGroupUiInfo.isSystem
- } else
- // The AppPermGroupUiInfo may be null if it has either not loaded yet or if the app has not
- // requested any permissions from the permission group in question.
- // The Telecom doesn't request microphone or camera permissions. However, telecom app may
- // use these permissions and they are considered system app permissions, so we return true
- // even if the AppPermGroupUiInfo is unavailable.
- if (
- appPermissionId.packageName == TELECOM_PACKAGE &&
- (appPermissionId.permissionGroup == Manifest.permission_group.CAMERA ||
- appPermissionId.permissionGroup == Manifest.permission_group.MICROPHONE)
- ) {
- return true
+ fun getShow7Days(): Boolean = show7DaysFlow.value
+
+ private fun getUsageDuration(show7Days: Boolean): Long {
+ return if (show7Days && DeviceUtils.isHandheld()) {
+ TIME_7_DAYS_DURATION
+ } else {
+ TIME_24_HOURS_DURATION
}
- return false
}
- /**
- * Extracts access data from [AllLightHistoricalPackageOpsLiveData] and composes
- * [AppPermissionAccessUiInfo]s to be displayed in the UI.
- */
- private fun buildAppPermissionAccessUiInfoList(
- allLightHistoricalPackageOpsLiveData: AllLightHistoricalPackageOpsLiveData,
- startTime: Long,
- showSystem: Boolean
- ): List<AppPermissionAccessUiInfo> {
- return allLightHistoricalPackageOpsLiveData
- .getLightHistoricalPackageOps()
- ?.filter { Utils.shouldShowInSettings(it.userHandle, userManager) }
- ?.flatMap { it.clusterAccesses(startTime, showSystem) }
- ?.map { it.buildAppPermissionAccessUiInfo() }
- ?.sortedBy { -it.accessStartTime } ?: listOf()
- }
+ private fun getProxyPackageLabel(accessCluster: PermissionTimelineUsageModel): String? =
+ accessCluster.proxyPackageName?.let { proxyPackageName ->
+ if (accessCluster.proxyUserId != null) {
+ getPackageLabel(proxyPackageName, UserHandle.of(accessCluster.proxyUserId))
+ } else null
+ }
- private fun LightHistoricalPackageOps.clusterAccesses(
- startTime: Long,
- showSystem: Boolean
- ): List<AppPermissionDiscreteAccessCluster> {
- return if (!shouldShowSubAttributionForApp(getLightPackageInfo(packageName, userHandle)))
- this.clusterAccessesWithoutAttribution(startTime, showSystem)
- else {
- this.clusterAccessesWithAttribution(startTime, showSystem)
+ fun updateShowSystemAppsToggle(showSystem: Boolean) {
+ if (showSystem != state[SHOULD_SHOW_SYSTEM_KEY]) {
+ state[SHOULD_SHOW_SYSTEM_KEY] = showSystem
}
+ showSystemFlow.compareAndSet(!showSystem, showSystem)
}
- /**
- * Clusters accesses that are close enough together in time such that they can be displayed as a
- * single access to the user.
- *
- * Accesses are clustered taking into account any app subattribution, so each cluster will
- * pertain a particular attribution label.
- */
- private fun LightHistoricalPackageOps.clusterAccessesWithAttribution(
- startTime: Long,
- showSystem: Boolean
- ): List<AppPermissionDiscreteAccessCluster> =
- this.attributedAppPermissionDiscreteAccesses
- .flatMap { it.groupAccessesByLabel(getLightPackageInfo(packageName, userHandle)) }
- .filterOutExemptAppPermissions(showSystem)
- .filterAccessesLaterThan(startTime)
- .flatMap { createAccessClusters(it) }
-
- /**
- * Clusters accesses that are close enough together in time such that they can be displayed as a
- * single access to the user.
- *
- * Accesses are clustered disregarding any app subattribution.
- */
- private fun LightHistoricalPackageOps.clusterAccessesWithoutAttribution(
- startTime: Long,
- showSystem: Boolean
- ): List<AppPermissionDiscreteAccessCluster> =
- this.appPermissionDiscreteAccesses
- .map { it.withLabel() }
- .filterOutExemptAppPermissions(showSystem)
- .filterAccessesLaterThan(startTime)
- .flatMap { createAccessClusters(it) }
-
- /** Filters out accesses earlier than the provided start time. */
- private fun List<AppPermissionDiscreteAccessesWithLabel>.filterAccessesLaterThan(
- startTime: Long,
- ): List<AppPermissionDiscreteAccessesWithLabel> =
- this.mapNotNull {
- val updatedDiscreteAccesses =
- it.discreteAccesses.filter { access -> access.accessTimeMs > startTime }
- if (updatedDiscreteAccesses.isEmpty()) null
- else
- AppPermissionDiscreteAccessesWithLabel(
- it.appPermissionId,
- it.attributionLabel,
- it.attributionTags,
- updatedDiscreteAccesses
- )
+ fun updateShow7DaysToggle(show7Days: Boolean) {
+ if (show7Days != state[SHOULD_SHOW_7_DAYS_KEY]) {
+ state[SHOULD_SHOW_7_DAYS_KEY] = show7Days
}
-
- /** Filters out data for apps and permissions that don't need to be displayed in the UI. */
- private fun List<AppPermissionDiscreteAccessesWithLabel>.filterOutExemptAppPermissions(
- showSystem: Boolean
- ): List<AppPermissionDiscreteAccessesWithLabel> {
- val exemptedPackages = Utils.getExemptedPackages(roleManager)
- return filter { !exemptedPackages.contains(it.appPermissionId.packageName) }
- .filter { it.appPermissionId.permissionGroup == permissionGroup }
- .filter { isPermissionRequestedByApp(it.appPermissionId) }
- .filter { showSystem || !isAppPermissionSystem(it.appPermissionId) }
+ show7DaysFlow.compareAndSet(!show7Days, show7Days)
}
/**
- * Converts the provided [AppPermissionDiscreteAccesses] to a
- * [AppPermissionDiscreteAccessesWithLabel] by adding a label.
+ * Returns the label for the provided package name, by first searching the cache otherwise
+ * retrieving it from the app's [android.content.pm.ApplicationInfo].
*/
- private fun AppPermissionDiscreteAccesses.withLabel(): AppPermissionDiscreteAccessesWithLabel =
- AppPermissionDiscreteAccessesWithLabel(
- this.appPermissionId,
- Resources.ID_NULL,
- attributionTags = emptyList(),
- this.discreteAccesses
- )
-
- /** Groups tag-attributed accesses for the provided app and permission by attribution label. */
- private fun AttributedAppPermissionDiscreteAccesses.groupAccessesByLabel(
- lightPackageInfo: LightPackageInfo?
- ): List<AppPermissionDiscreteAccessesWithLabel> {
- if (lightPackageInfo == null) return emptyList()
-
- val appPermissionId = this.appPermissionId
- val labelsToDiscreteAccesses = mutableMapOf<Int, MutableList<DiscreteAccess>>()
- val labelsToTags = mutableMapOf<Int, MutableList<String>>()
-
- val appPermissionDiscreteAccessWithLabels =
- mutableListOf<AppPermissionDiscreteAccessesWithLabel>()
-
- for ((tag, discreteAccesses) in this.attributedDiscreteAccesses) {
- val label: Int =
- if (tag == NO_ATTRIBUTION_TAG) Resources.ID_NULL
- else lightPackageInfo.attributionTagsToLabels[tag] ?: Resources.ID_NULL
-
- if (!labelsToDiscreteAccesses.containsKey(label)) {
- labelsToDiscreteAccesses[label] = mutableListOf()
- }
- labelsToDiscreteAccesses[label]?.addAll(discreteAccesses)
-
- if (!labelsToTags.containsKey(label)) {
- labelsToTags[label] = mutableListOf()
- }
- labelsToTags[label]?.add(tag)
- }
-
- for ((label, discreteAccesses) in labelsToDiscreteAccesses.entries) {
- val tags = labelsToTags[label]?.toList() ?: listOf()
-
- appPermissionDiscreteAccessWithLabels.add(
- AppPermissionDiscreteAccessesWithLabel(
- appPermissionId,
- label,
- tags,
- discreteAccesses.sortedBy { -1 * it.accessTimeMs }
- )
- )
+ fun getPackageLabel(packageName: String, user: UserHandle): String {
+ if (packageLabelCache.containsKey(packageName)) {
+ return requireNotNull(packageLabelCache[packageName])
}
-
- return appPermissionDiscreteAccessWithLabels
+ val packageLabel = packageRepository.getPackageLabel(packageName, user)
+ packageLabelCache[packageName] = packageLabel
+ return packageLabel
}
/**
- * Clusters [DiscreteAccess]es represented by a [AppPermissionDiscreteAccessesWithLabel] into
- * smaller groups to form a list of [AppPermissionDiscreteAccessCluster] instances.
- *
- * [DiscreteAccess]es which have accesses sufficiently close together in time will be places in
- * the same cluster.
+ * Returns the icon for the provided package name and user, by first searching the cache
+ * otherwise retrieving it from the app's [android.content.pm.ApplicationInfo].
*/
- private fun createAccessClusters(
- appPermAccesses: AppPermissionDiscreteAccessesWithLabel,
- ): List<AppPermissionDiscreteAccessCluster> {
- val clusters = mutableListOf<AppPermissionDiscreteAccessCluster>()
- val currentDiscreteAccesses = mutableListOf<DiscreteAccess>()
- // Iterate entries in asc order based on access timestamp.
- for (index in appPermAccesses.discreteAccesses.size - 1 downTo 0) {
- val discreteAccess = appPermAccesses.discreteAccesses[index]
- if (currentDiscreteAccesses.isEmpty()) {
- currentDiscreteAccesses.add(discreteAccess)
- } else if (!canAccessBeAddedToCluster(discreteAccess, currentDiscreteAccesses)) {
- clusters.add(
- AppPermissionDiscreteAccessCluster(
- appPermAccesses.appPermissionId,
- appPermAccesses.attributionLabel,
- appPermAccesses.attributionTags,
- currentDiscreteAccesses.toMutableList(),
- if (isOpClusteredByItself(discreteAccess.opName)) discreteAccess.opName
- else null
- )
- )
- currentDiscreteAccesses.clear()
- currentDiscreteAccesses.add(discreteAccess)
- } else {
- currentDiscreteAccesses.add(discreteAccess)
- }
+ fun getBadgedPackageIcon(packageName: String, userHandle: UserHandle): Drawable? {
+ val packageNameWithUser: Pair<String, UserHandle> = Pair(packageName, userHandle)
+ if (packageIconCache.containsKey(packageNameWithUser)) {
+ return requireNotNull(packageIconCache[packageNameWithUser])
}
-
- if (currentDiscreteAccesses.isNotEmpty()) {
- val opName = currentDiscreteAccesses.last().opName
- clusters.add(
- AppPermissionDiscreteAccessCluster(
- appPermAccesses.appPermissionId,
- appPermAccesses.attributionLabel,
- appPermAccesses.attributionTags,
- currentDiscreteAccesses.toMutableList(),
- if (isOpClusteredByItself(opName)) opName else null
- )
- )
+ val packageIcon = packageRepository.getBadgedPackageIcon(packageName, userHandle)
+ if (packageIcon != null) {
+ packageIconCache[packageNameWithUser] = packageIcon
}
- return clusters
- }
- /**
- * Returns whether the provided [DiscreteAccess] occurred close enough to those in the clustered
- * list that it can be added to the cluster.
- */
- private fun canAccessBeAddedToCluster(
- currentAccess: DiscreteAccess,
- clusteredAccesses: List<DiscreteAccess>
- ): Boolean {
- val clusterOp = clusteredAccesses.last().opName
- if (
- (isOpClusteredByItself(currentAccess.opName) || isOpClusteredByItself(clusterOp)) &&
- currentAccess.opName != clusteredAccesses.last().opName
- ) {
- return false
- }
- val currentAccessMinute = currentAccess.accessTimeMs / ONE_MINUTE_MS
- val prevMostRecentAccessMillis =
- clusteredAccesses.maxOf { discreteAccess ->
- if (discreteAccess.accessDurationMs > 0)
- discreteAccess.accessTimeMs + discreteAccess.accessDurationMs - ONE_MINUTE_MS
- else discreteAccess.accessTimeMs
- }
- val prevMostRecentAccessMinute = prevMostRecentAccessMillis / ONE_MINUTE_MS
- return (currentAccessMinute - prevMostRecentAccessMinute) <= CLUSTER_SPACING_MINUTES
+ return packageIcon
}
- /**
- * Determine if an op should be in its own cluster and hence display as an individual entry in
- * the privacy timeline
- */
- private fun isOpClusteredByItself(opName: String): Boolean {
- if (isLocationByPassEnabled()) {
- return opName == AppOpsManager.OPSTR_EMERGENCY_LOCATION
+ private fun getDurationSummary(durationMs: Long): String? {
+ // Only show the duration summary if it is at least (CLUSTER_SPACING_MINUTES + 1) minutes.
+ // Displaying a time that is shorter than the cluster granularity
+ // (CLUSTER_SPACING_MINUTES) will not convey useful information.
+ if (durationMs >= TimeUnit.MINUTES.toMillis(CLUSTER_SPACING_MINUTES + 1)) {
+ return getDurationUsedStr(application, durationMs)
}
- return false
+ return null
}
- /**
- * Composes all UI information from a [AppPermissionDiscreteAccessCluster] into a
- * [AppPermissionAccessUiInfo].
- */
- private fun AppPermissionDiscreteAccessCluster.buildAppPermissionAccessUiInfo():
- AppPermissionAccessUiInfo {
- val context = application
- // The end minute is exclusive here in terms of access, i.e. [1..5) as the private data
- // was not accessed at minute 5, it helps calculate the duration correctly.
- val accessEndTimeMillis =
- discreteAccesses.maxOf { appOpEvent ->
- if (appOpEvent.accessDurationMs > 0)
- appOpEvent.accessTimeMs + appOpEvent.accessDurationMs
- else appOpEvent.accessTimeMs + ONE_MINUTE_MS
- }
- val accessStartTimeMillis = discreteAccesses.minOf { it.accessTimeMs }
- val durationMs = accessEndTimeMillis - accessStartTimeMillis
- val durationSummaryLabel =
- if (durationMs >= TimeUnit.MINUTES.toMillis(CLUSTER_SPACING_MINUTES + 1)) {
- getDurationUsedStr(context, durationMs)
- } else null
-
- val proxyLabel = getProxyPackageLabel(this)
- val subAttributionLabel = getSubAttributionLabel(this)
- val showingSubAttribution = !subAttributionLabel.isNullOrEmpty()
- val summary =
- buildUsageSummary(context, subAttributionLabel, proxyLabel, durationSummaryLabel)
- val isEmergencyLocationAccess =
- isLocationByPassEnabled() && clusteredOp == AppOpsManager.OPSTR_EMERGENCY_LOCATION
-
- return AppPermissionAccessUiInfo(
- this.appPermissionId.userHandle,
- this.appPermissionId.packageName,
- getPackageLabel(this.appPermissionId.packageName, this.appPermissionId.userHandle),
- permissionGroup,
- accessStartTimeMillis,
- // Make the end time inclusive i.e. [1..4]
- accessEndTimeMillis - ONE_MINUTE_MS,
- summary,
- showingSubAttribution,
- this.attributionTags.toSet(),
- getBadgedPackageIcon(this.appPermissionId.packageName, this.appPermissionId.userHandle),
- isEmergencyLocationAccess
- )
- }
-
- /** Builds a summary of the permission access. */
private fun buildUsageSummary(
- context: Context,
subAttributionLabel: String?,
proxyPackageLabel: String?,
- durationSummary: String?
+ durationSummary: String?,
): String? {
val subTextStrings: MutableList<String> = mutableListOf()
-
subAttributionLabel?.let { subTextStrings.add(subAttributionLabel) }
proxyPackageLabel?.let { subTextStrings.add(it) }
durationSummary?.let { subTextStrings.add(it) }
return when (subTextStrings.size) {
3 ->
- context.getString(
+ application.getString(
R.string.history_preference_subtext_3,
subTextStrings[0],
subTextStrings[1],
- subTextStrings[2]
+ subTextStrings[2],
)
2 ->
- context.getString(
+ application.getString(
R.string.history_preference_subtext_2,
subTextStrings[0],
- subTextStrings[1]
+ subTextStrings[1],
)
1 -> subTextStrings[0]
else -> null
}
}
- /** Returns whether app subattribution should be shown. */
- private fun shouldShowSubAttributionForApp(lightPackageInfo: LightPackageInfo?): Boolean {
- return lightPackageInfo != null &&
- shouldShowSubattributionInPermissionsDashboard() &&
- SubattributionUtils.isSubattributionSupported(lightPackageInfo)
- }
-
- /** Returns the proxied package label if the permission access was proxied. */
- private fun getProxyPackageLabel(accessCluster: AppPermissionDiscreteAccessCluster): String? =
- accessCluster.discreteAccesses
- .firstOrNull { it.proxy?.packageName != null }
- ?.let {
- getPackageLabel(
- it.proxy!!.packageName!!,
- UserHandle.getUserHandleForUid(it.proxy.uid)
- )
- }
-
- /** Returns the attribution label for the permission access, if any. */
- private fun getSubAttributionLabel(accessCluster: AppPermissionDiscreteAccessCluster): String? {
- // Special case for EMERGENCY_LOCATION app op. Show enforced attribution label in the
- // Privacy Dashboard
- if (
- isLocationByPassEnabled() &&
- accessCluster.clusteredOp == AppOpsManager.OPSTR_EMERGENCY_LOCATION
- ) {
- return application.getString(
- R.string.privacy_dashboard_emergency_location_enforced_attribution_label
- )
- }
-
- return if (accessCluster.attributionLabel == Resources.ID_NULL) null
- else {
- val lightPackageInfo = getLightPackageInfo(accessCluster.appPermissionId)
- getSubAttributionLabels(lightPackageInfo)?.get(accessCluster.attributionLabel)
- }
- }
-
- private fun getSubAttributionLabels(lightPackageInfo: LightPackageInfo?): Map<Int, String>? =
- if (lightPackageInfo == null) null
- else SubattributionUtils.getAttributionLabels(application, lightPackageInfo)
-
- private fun getLightPackageInfo(appPermissionId: AppPermissionId) =
- lightPackageInfoLiveDataMap[Pair(appPermissionId.packageName, appPermissionId.userHandle)]
- ?.value
-
- private fun getLightPackageInfo(packageName: String, userHandle: UserHandle) =
- lightPackageInfoLiveDataMap[Pair(packageName, userHandle)]?.value
-
- private fun AllLightHistoricalPackageOpsLiveData.getLightHistoricalPackageOps() =
- this.value?.values
-
- /** Data used to create a preference for an app's permission usage. */
- data class AppPermissionAccessUiInfo(
- val userHandle: UserHandle,
- val packageName: String,
- val packageLabel: String,
- val permissionGroup: String,
- val accessStartTime: Long,
- val accessEndTime: Long,
- val summaryText: CharSequence?,
- val showingAttribution: Boolean,
- val attributionTags: Set<String>,
- val badgedPackageIcon: Drawable?,
- val isEmergencyLocationAccess: Boolean
- )
-
- sealed class PermissionUsageDetailsUiState {
- data object Loading : PermissionUsageDetailsUiState()
-
- data class Success(
- val appPermissionAccessUiInfoList: List<AppPermissionAccessUiInfo>,
- val containsSystemAppUsage: Boolean,
- val showSystem: Boolean,
- val show7Days: Boolean,
- ) : PermissionUsageDetailsUiState()
- }
-
- /**
- * Data class representing a cluster of permission accesses close enough together to be
- * displayed as a single access in the UI.
- */
- private data class AppPermissionDiscreteAccessCluster(
- val appPermissionId: AppPermissionId,
- val attributionLabel: Int,
- val attributionTags: List<String>,
- val discreteAccesses: List<DiscreteAccess>,
- val clusteredOp: String?
- )
-
- /**
- * Data class representing all permission accesses for a particular package, user, permission
- * and attribution label.
- */
- private data class AppPermissionDiscreteAccessesWithLabel(
- val appPermissionId: AppPermissionId,
- val attributionLabel: Int,
- val attributionTags: List<String>,
- val discreteAccesses: List<DiscreteAccess>
- )
-
- /** [LiveData] object for [PermissionUsageDetailsUiState]. */
- private val _permissionUsagesDetailsInfoUiLiveData =
- object :
- SmartUpdateMediatorLiveData<@JvmSuppressWildcards PermissionUsageDetailsUiState>() {
- private val getAppPermGroupUiInfoLiveData = { appPermissionId: AppPermissionId ->
- AppPermGroupUiInfoLiveData[
- Triple(
- appPermissionId.packageName,
- appPermissionId.permissionGroup,
- appPermissionId.userHandle,
- )]
- }
- private val getLightPackageInfoLiveData =
- { packageWithUserHandle: Pair<String, UserHandle> ->
- LightPackageInfoLiveData[packageWithUserHandle]
- }
-
- init {
- addSource(allLightHistoricalPackageOpsLiveData) { update() }
- addSource(showSystemLiveData) { update() }
- addSource(show7DaysLiveData) { update() }
- }
-
- override fun onUpdate() {
- if (!allLightHistoricalPackageOpsLiveData.isInitialized) {
- return
- }
-
- val appPermissionIds = mutableSetOf<AppPermissionId>()
- val allPackages: Set<Pair<String, UserHandle>> =
- allLightHistoricalPackageOpsLiveData.value?.keys ?: setOf()
- for (packageWithUserHandle: Pair<String, UserHandle> in allPackages) {
- val appPermGroupIds =
- allLightHistoricalPackageOpsLiveData.value
- ?.get(packageWithUserHandle)
- ?.appPermissionDiscreteAccesses
- ?.map { it.appPermissionId }
- ?.toSet() ?: setOf()
-
- appPermissionIds.addAll(appPermGroupIds)
- }
-
- setSourcesToDifference(
- appPermissionIds,
- appPermGroupUiInfoLiveDataList,
- getAppPermGroupUiInfoLiveData
- ) {
- update()
- }
- setSourcesToDifference(
- allPackages,
- lightPackageInfoLiveDataMap,
- getLightPackageInfoLiveData
- ) {
- update()
- }
-
- if (appPermGroupUiInfoLiveDataList.any { it.value.isStale }) {
- return
- }
-
- if (lightPackageInfoLiveDataMap.any { it.value.isStale }) {
- return
- }
-
- value = buildPermissionUsageDetailsUiInfo()
- }
- }
-
- override fun getPermissionUsagesDetailsInfoUiLiveData():
- LiveData<PermissionUsageDetailsUiState> = _permissionUsagesDetailsInfoUiLiveData
-
- override fun getShowSystem(): Boolean = showSystemLiveData.value ?: false
-
- override fun getShow7Days(): Boolean = show7DaysLiveData.value ?: false
-
/** Companion object for [PermissionUsageDetailsViewModel]. */
companion object {
- const val ONE_HOUR_MS = 3_600_000
const val ONE_MINUTE_MS = 60_000
const val CLUSTER_SPACING_MINUTES: Long = 1L
- private const val TELECOM_PACKAGE = "com.android.server.telecom"
val TIME_7_DAYS_DURATION: Long = DAYS.toMillis(7)
val TIME_24_HOURS_DURATION: Long = DAYS.toMillis(1)
internal const val SHOULD_SHOW_SYSTEM_KEY = "showSystem"
@@ -694,7 +305,7 @@ class PermissionUsageDetailsViewModel(
listOf(
Manifest.permission_group.CAMERA,
Manifest.permission_group.LOCATION,
- Manifest.permission_group.MICROPHONE
+ Manifest.permission_group.MICROPHONE,
)
.flatMap { group -> PermissionMapping.getPlatformPermissionNamesOfGroup(group) }
.mapNotNull { permName -> AppOpsManager.permissionToOp(permName) }
@@ -719,7 +330,7 @@ class PermissionUsageDetailsViewModel(
accessStartTime: Long,
accessEndTime: Long,
showingAttribution: Boolean,
- attributionTags: Set<String>
+ attributionTags: Set<String>,
): Intent {
return getManagePermissionUsageIntent(
context,
@@ -728,7 +339,7 @@ class PermissionUsageDetailsViewModel(
accessStartTime,
accessEndTime,
showingAttribution,
- attributionTags
+ attributionTags,
) ?: getDefaultManageAppPermissionsIntent(packageName, userHandle)
}
@@ -736,6 +347,7 @@ class PermissionUsageDetailsViewModel(
* Gets an [Intent.ACTION_MANAGE_PERMISSION_USAGE] intent, or null if attribution shouldn't
* be shown or the intent can't be handled.
*/
+ @Suppress("DEPRECATION")
private fun getManagePermissionUsageIntent(
context: Context,
packageName: String,
@@ -743,7 +355,7 @@ class PermissionUsageDetailsViewModel(
accessStartTime: Long,
accessEndTime: Long,
showingAttribution: Boolean,
- attributionTags: Set<String>
+ attributionTags: Set<String>,
): Intent? {
if (
!showingAttribution ||
@@ -768,13 +380,13 @@ class PermissionUsageDetailsViewModel(
val resolveInfo =
context.packageManager.resolveActivity(
intent,
- PackageManager.ResolveInfoFlags.of(0)
+ PackageManager.ResolveInfoFlags.of(0),
)
if (
resolveInfo?.activityInfo == null ||
!Objects.equals(
resolveInfo.activityInfo.permission,
- Manifest.permission.START_VIEW_PERMISSION_USAGE
+ Manifest.permission.START_VIEW_PERMISSION_USAGE,
)
) {
return null
@@ -785,8 +397,9 @@ class PermissionUsageDetailsViewModel(
private fun getDefaultManageAppPermissionsIntent(
packageName: String,
- userHandle: UserHandle
+ userHandle: UserHandle,
): Intent {
+ @Suppress("DEPRECATION")
return Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS).apply {
putExtra(Intent.EXTRA_USER, userHandle)
putExtra(Intent.EXTRA_PACKAGE_NAME, packageName)
@@ -795,29 +408,65 @@ class PermissionUsageDetailsViewModel(
private fun isLocationByPassEnabled(): Boolean =
SdkLevel.isAtLeastV() && Flags.locationBypassPrivacyDashboardEnabled()
+
+ fun create(
+ app: Application,
+ handle: SavedStateHandle,
+ permissionGroup: String,
+ ): PermissionUsageDetailsViewModel {
+ val permissionRepository = PermissionRepository.getInstance(app)
+ val packageRepository = PackageRepository.getInstance(app)
+ val appOpRepository = AppOpRepository.getInstance(app, permissionRepository)
+ val roleRepository = RoleRepository.getInstance(app)
+ val userRepository = UserRepository.getInstance(app)
+ val useCase =
+ GetPermissionGroupUsageDetailsUseCase(
+ permissionGroup,
+ packageRepository,
+ permissionRepository,
+ appOpRepository,
+ roleRepository,
+ userRepository,
+ )
+ return PermissionUsageDetailsViewModel(app, useCase, handle, permissionGroup)
+ }
+ }
+
+ /** Data used to create a preference for an app's permission usage. */
+ data class AppPermissionAccessUiInfo(
+ val userHandle: UserHandle,
+ val packageName: String,
+ val packageLabel: String,
+ val permissionGroup: String,
+ val accessStartTime: Long,
+ val accessEndTime: Long,
+ val summaryText: CharSequence?,
+ val showingAttribution: Boolean,
+ val attributionTags: Set<String>,
+ val badgedPackageIcon: Drawable?,
+ val isEmergencyLocationAccess: Boolean,
+ )
+
+ sealed class PermissionUsageDetailsUiState {
+ data object Loading : PermissionUsageDetailsUiState()
+
+ data class Success(
+ val appPermissionAccessUiInfoList: List<AppPermissionAccessUiInfo>,
+ val containsSystemAppUsage: Boolean,
+ val showSystem: Boolean,
+ val show7Days: Boolean,
+ ) : PermissionUsageDetailsUiState()
}
/** Factory for [PermissionUsageDetailsViewModel]. */
@RequiresApi(Build.VERSION_CODES.S)
class PermissionUsageDetailsViewModelFactory(
val app: Application,
- owner: SavedStateRegistryOwner,
private val permissionGroup: String,
- ) : AbstractSavedStateViewModelFactory(owner, Bundle()) {
- override fun <T : ViewModel> create(
- key: String,
- modelClass: Class<T>,
- handle: SavedStateHandle,
- ): T {
+ ) : ViewModelProvider.Factory {
+ override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
@Suppress("UNCHECKED_CAST")
- return if (
- com.android.permission.flags.Flags.livedataRefactorPermissionTimelineEnabled()
- ) {
- Log.d("PermissionTimeline", "timeline refactor flag enabled..")
- PermissionUsageDetailsViewModelV2.create(app, handle, permissionGroup) as T
- } else {
- PermissionUsageDetailsViewModel(app, handle, permissionGroup) as T
- }
+ return create(app, extras.createSavedStateHandle(), permissionGroup) as T
}
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt
deleted file mode 100644
index 312a7ee20..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModelV2.kt
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * 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.model.v31
-
-import android.app.AppOpsManager.OPSTR_EMERGENCY_LOCATION
-import android.app.Application
-import android.graphics.drawable.Drawable
-import android.os.UserHandle
-import androidx.annotation.VisibleForTesting
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.SavedStateHandle
-import androidx.lifecycle.asLiveData
-import androidx.lifecycle.viewModelScope
-import com.android.permissioncontroller.DeviceUtils
-import com.android.permissioncontroller.R
-import com.android.permissioncontroller.appops.data.repository.v31.AppOpRepository
-import com.android.permissioncontroller.permission.data.repository.v31.PermissionRepository
-import com.android.permissioncontroller.permission.domain.model.v31.PermissionTimelineUsageModel
-import com.android.permissioncontroller.permission.domain.model.v31.PermissionTimelineUsageModelWrapper
-import com.android.permissioncontroller.permission.domain.usecase.v31.GetPermissionGroupUsageDetailsUseCase
-import com.android.permissioncontroller.permission.domain.usecase.v31.isLocationByPassEnabled
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.SHOULD_SHOW_7_DAYS_KEY
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.SHOULD_SHOW_SYSTEM_KEY
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.TIME_24_HOURS_DURATION
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.Companion.TIME_7_DAYS_DURATION
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState
-import com.android.permissioncontroller.pm.data.repository.v31.PackageRepository
-import com.android.permissioncontroller.role.data.repository.v31.RoleRepository
-import com.android.permissioncontroller.user.data.repository.v31.UserRepository
-import java.time.Instant
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.StateFlow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.stateIn
-
-class PermissionUsageDetailsViewModelV2(
- app: Application,
- private val getPermissionUsageDetailsUseCase: GetPermissionGroupUsageDetailsUseCase,
- private val state: SavedStateHandle,
- private val permissionGroup: String,
- scope: CoroutineScope? = null,
- private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default,
- private val packageRepository: PackageRepository = PackageRepository.getInstance(app)
-) : BasePermissionUsageDetailsViewModel(app) {
- private val coroutineScope = scope ?: viewModelScope
- private val context = app
-
- private val showSystemFlow = MutableStateFlow(state[SHOULD_SHOW_SYSTEM_KEY] ?: false)
- private val show7DaysFlow = MutableStateFlow(state[SHOULD_SHOW_7_DAYS_KEY] ?: false)
-
- private val permissionTimelineUsagesFlow:
- StateFlow<PermissionTimelineUsageModelWrapper> by lazy {
- getPermissionUsageDetailsUseCase(coroutineScope)
- .flowOn(defaultDispatcher)
- .stateIn(
- coroutineScope,
- SharingStarted.WhileSubscribed(5000),
- PermissionTimelineUsageModelWrapper.Loading
- )
- }
-
- @VisibleForTesting
- val permissionUsageDetailsUiStateFlow: Flow<PermissionUsageDetailsUiState> by lazy {
- combine(permissionTimelineUsagesFlow, showSystemFlow, show7DaysFlow) {
- permissionTimelineUsages,
- showSystem,
- show7Days ->
- permissionTimelineUsages.buildPermissionUsageDetailsUiInfo(showSystem, show7Days)
- }
- .flowOn(defaultDispatcher)
- }
-
- override fun getPermissionUsagesDetailsInfoUiLiveData():
- LiveData<PermissionUsageDetailsUiState> {
- return permissionUsageDetailsUiStateFlow.asLiveData(
- context = coroutineScope.coroutineContext
- )
- }
-
- private fun PermissionTimelineUsageModelWrapper.buildPermissionUsageDetailsUiInfo(
- showSystem: Boolean,
- show7Days: Boolean
- ): PermissionUsageDetailsUiState {
- if (this is PermissionTimelineUsageModelWrapper.Loading) {
- return PermissionUsageDetailsUiState.Loading
- }
- val timelineUsageModels =
- (this as PermissionTimelineUsageModelWrapper.Success).timelineUsageModels
- val startTime =
- (System.currentTimeMillis() - getUsageDuration(show7Days)).coerceAtLeast(
- Instant.EPOCH.toEpochMilli()
- )
-
- val permissionTimelineUsageModels =
- timelineUsageModels.filter { it.accessEndMillis > startTime }
- val containsSystemUsages = permissionTimelineUsageModels.any { !it.isUserSensitive }
- val result =
- permissionTimelineUsageModels
- .filter { showSystem || it.isUserSensitive }
- .map { clusterOps ->
- val durationSummaryLabel =
- if (clusterOps.durationMillis > 0) {
- getDurationSummary(clusterOps.durationMillis)
- } else {
- null
- }
- val proxyLabel = getProxyPackageLabel(clusterOps)
- val isEmergencyLocationAccess =
- isLocationByPassEnabled() &&
- clusterOps.opNames.any { it == OPSTR_EMERGENCY_LOCATION }
- val subAttributionLabel =
- if (isEmergencyLocationAccess) {
- emergencyLocationAttributionLabel
- } else {
- clusterOps.attributionLabel
- }
- val showingSubAttribution = !subAttributionLabel.isNullOrEmpty()
- val summary =
- buildUsageSummary(subAttributionLabel, proxyLabel, durationSummaryLabel)
- PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo(
- UserHandle.of(clusterOps.userId),
- clusterOps.packageName,
- getPackageLabel(clusterOps.packageName, UserHandle.of(clusterOps.userId)),
- permissionGroup,
- clusterOps.accessStartMillis,
- clusterOps.accessEndMillis,
- summary,
- showingSubAttribution,
- clusterOps.attributionTags ?: emptySet(),
- getBadgedPackageIcon(
- clusterOps.packageName,
- UserHandle.of(clusterOps.userId)
- ),
- isEmergencyLocationAccess
- )
- }
- .sortedBy { -1 * it.accessStartTime }
- return PermissionUsageDetailsUiState.Success(
- result,
- containsSystemUsages,
- showSystem,
- show7Days
- )
- }
-
- private val emergencyLocationAttributionLabel: String by lazy {
- context.getString(R.string.privacy_dashboard_emergency_location_enforced_attribution_label)
- }
-
- override fun getShowSystem(): Boolean = showSystemFlow.value
-
- override val showSystemLiveData =
- showSystemFlow.asLiveData(context = coroutineScope.coroutineContext)
-
- override fun getShow7Days(): Boolean = show7DaysFlow.value
-
- private fun getUsageDuration(show7Days: Boolean): Long {
- return if (show7Days && DeviceUtils.isHandheld()) {
- TIME_7_DAYS_DURATION
- } else {
- TIME_24_HOURS_DURATION
- }
- }
-
- private fun getProxyPackageLabel(accessCluster: PermissionTimelineUsageModel): String? =
- accessCluster.proxyPackageName?.let { proxyPackageName ->
- if (accessCluster.proxyUserId != null) {
- getPackageLabel(proxyPackageName, UserHandle.of(accessCluster.proxyUserId))
- } else null
- }
-
- override fun updateShowSystemAppsToggle(showSystem: Boolean) {
- if (showSystem != state[SHOULD_SHOW_SYSTEM_KEY]) {
- state[SHOULD_SHOW_SYSTEM_KEY] = showSystem
- }
- showSystemFlow.compareAndSet(!showSystem, showSystem)
- }
-
- override fun updateShow7DaysToggle(show7Days: Boolean) {
- if (show7Days != state[SHOULD_SHOW_7_DAYS_KEY]) {
- state[SHOULD_SHOW_7_DAYS_KEY] = show7Days
- }
- show7DaysFlow.compareAndSet(!show7Days, show7Days)
- }
-
- // TODO review these methods when old impl is removed, suspend function??
- override fun getPackageLabel(app: Application, packageName: String, user: UserHandle): String {
- return packageRepository.getPackageLabel(packageName, user)
- }
-
- override fun getBadgedPackageIcon(
- app: Application,
- packageName: String,
- user: UserHandle
- ): Drawable? {
- return packageRepository.getBadgedPackageIcon(packageName, user)
- }
-
- companion object {
- fun create(
- app: Application,
- handle: SavedStateHandle,
- permissionGroup: String
- ): PermissionUsageDetailsViewModelV2 {
- val permissionRepository = PermissionRepository.getInstance(app)
- val packageRepository = PackageRepository.getInstance(app)
- val appOpRepository = AppOpRepository.getInstance(app, permissionRepository)
- val roleRepository = RoleRepository.getInstance(app)
- val userRepository = UserRepository.getInstance(app)
- val useCase =
- GetPermissionGroupUsageDetailsUseCase(
- permissionGroup,
- packageRepository,
- permissionRepository,
- appOpRepository,
- roleRepository,
- userRepository
- )
- return PermissionUsageDetailsViewModelV2(app, useCase, handle, permissionGroup)
- }
- }
-}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/LocationProviderDialogScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/LocationProviderDialogScreen.kt
index ff3c2cbc1..54ed66f0c 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/LocationProviderDialogScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/LocationProviderDialogScreen.kt
@@ -21,10 +21,10 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.wear.compose.material3.Dialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionScaffold
import com.android.permissioncontroller.permission.ui.wear.model.LocationProviderInterceptDialogArgs
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionScaffold
@Composable
fun LocationProviderDialogScreen(
@@ -32,7 +32,7 @@ fun LocationProviderDialogScreen(
onDismissRequest: () -> Unit,
args: LocationProviderInterceptDialogArgs?,
) {
- Dialog(show = showDialog, onDismissRequest = onDismissRequest) {
+ Dialog(visible = showDialog, onDismissRequest = onDismissRequest) {
args?.run {
WearPermissionScaffold(
showTimeText = false,
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 959dc9137..15d0fbe5f 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionFragment.kt
@@ -58,8 +58,8 @@ 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.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
import com.android.settingslib.RestrictedLockUtils
/**
@@ -98,7 +98,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
userHandle: UserHandle?,
caller: String?,
sessionId: Long,
- grantCategory: String?
+ grantCategory: String?,
): Bundle {
val arguments = Bundle()
arguments.putString(Intent.EXTRA_PACKAGE_NAME, packageName)
@@ -118,7 +118,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val activity = requireActivity()
val packageName =
@@ -145,7 +145,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
packageName,
permGroupName,
user,
- sessionId
+ sessionId,
)
val viewModel = ViewModelProvider(this, factory).get(AppPermissionViewModel::class.java)
confirmDialogViewModel =
@@ -182,14 +182,14 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
this,
this,
param.request,
- param.buttonClickAction
+ param.buttonClickAction,
)
} else {
showConfirmDialog(
ChangeRequest.GRANT_ALL_FILE_ACCESS,
R.string.special_file_access_dialog,
-1,
- false
+ false,
)
}
setResult(param.result, permGroupName)
@@ -207,7 +207,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
this,
this,
ChangeRequest.GRANT_BOTH,
- APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ALLOW
+ APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ALLOW,
)
} else {
viewModel.onDenyAnyWay(args.changeRequest, args.buttonPressed, args.oneTime)
@@ -225,7 +225,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
this,
this,
args.changeRequest!!,
- args.buttonClicked!!
+ args.buttonClicked!!,
)
confirmDialogViewModel.showAdvancedConfirmDialogLiveData.value = false
}
@@ -250,7 +250,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
onConfirmDialogCancelButtonClick,
onAdvancedConfirmDialogOkButtonClick,
onAdvancedConfirmDialogCancelButtonClick,
- onDisabledAllowButtonTap
+ onDisabledAllowButtonTap,
)
}
}
@@ -261,14 +261,14 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
changeRequest: ChangeRequest,
@StringRes messageId: Int,
buttonPressed: Int,
- oneTime: Boolean
+ oneTime: Boolean,
) {
confirmDialogViewModel.confirmDialogArgs =
ConfirmDialogArgs(
messageId = messageId,
changeRequest = changeRequest,
buttonPressed = buttonPressed,
- oneTime = oneTime
+ oneTime = oneTime,
)
confirmDialogViewModel.showConfirmDialogLiveData.value = true
}
@@ -284,7 +284,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
Intent()
.putExtra(
ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_INTERACTED,
- permGroupName
+ permGroupName,
)
.putExtra(ManagePermissionsActivity.EXTRA_RESULT_PERMISSION_RESULT, result)
requireActivity().setResult(Activity.RESULT_OK, intent)
@@ -298,7 +298,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.GRANT_FOREGROUND,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ALLOW,
GRANTED_ALWAYS,
- false
+ false,
)
ButtonType.ALLOW_ALWAYS ->
GrantedStateChangeParam(
@@ -306,7 +306,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.GRANT_BOTH,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ALLOW_ALWAYS,
GRANTED_ALWAYS,
- true
+ true,
)
ButtonType.ALLOW_FOREGROUND ->
GrantedStateChangeParam(
@@ -314,7 +314,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.GRANT_FOREGROUND_ONLY,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ALLOW_FOREGROUND,
GRANTED_FOREGROUND_ONLY,
- true
+ true,
)
ButtonType.ASK ->
GrantedStateChangeParam(
@@ -322,7 +322,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.REVOKE_BOTH,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__ASK_EVERY_TIME,
DENIED,
- false
+ false,
)
ButtonType.DENY ->
GrantedStateChangeParam(
@@ -330,7 +330,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.REVOKE_BOTH,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__DENY,
DENIED_DO_NOT_ASK_AGAIN,
- false
+ false,
)
ButtonType.DENY_FOREGROUND ->
GrantedStateChangeParam(
@@ -338,7 +338,7 @@ class WearAppPermissionFragment : Fragment(), ConfirmDialogShowingFragment {
ChangeRequest.REVOKE_FOREGROUND,
APP_PERMISSION_FRAGMENT_ACTION_REPORTED__BUTTON_PRESSED__DENY_FOREGROUND,
DENIED_DO_NOT_ASK_AGAIN,
- false
+ false,
)
else -> throw RuntimeException("Wrong button type: $buttonType")
}
@@ -349,5 +349,5 @@ data class GrantedStateChangeParam(
val request: ChangeRequest,
val buttonClickAction: Int,
val result: Int,
- val requiresCustomStorageBehavior: Boolean
+ val requiresCustomStorageBehavior: Boolean,
)
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 552876b7d..06d14cc14 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsFragment.kt
@@ -48,7 +48,7 @@ import com.android.permissioncontroller.permission.ui.wear.model.WearAppPermissi
import com.android.permissioncontroller.permission.ui.wear.model.WearAppPermissionUsagesViewModelFactory
import com.android.permissioncontroller.permission.ui.wear.model.WearLocationProviderInterceptDialogViewModel
import com.android.permissioncontroller.permission.ui.wear.model.WearLocationProviderInterceptDialogViewModelFactory
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
import java.time.Instant
import java.util.concurrent.TimeUnit
@@ -63,7 +63,7 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val packageName = arguments?.getString(Intent.EXTRA_PACKAGE_NAME) ?: ""
val user =
@@ -93,7 +93,7 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
val viewModel =
ViewModelProvider(
owner = this,
- factory = AppPermissionGroupsViewModelFactory(packageName, user, sessionId)
+ factory = AppPermissionGroupsViewModelFactory(packageName, user, sessionId),
)[AppPermissionGroupsViewModel::class.java]
wearViewModel =
@@ -103,13 +103,13 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
val revokeDialogViewModel =
ViewModelProvider(
owner = this,
- factory = AppPermissionGroupsRevokeDialogViewModelFactory()
+ factory = AppPermissionGroupsRevokeDialogViewModelFactory(),
)[AppPermissionGroupsRevokeDialogViewModel::class.java]
val locationProviderInterceptDialogViewModel =
ViewModelProvider(
owner = this,
- factory = WearLocationProviderInterceptDialogViewModelFactory()
+ factory = WearLocationProviderInterceptDialogViewModelFactory(),
)[WearLocationProviderInterceptDialogViewModel::class.java]
val context = requireContext()
@@ -125,7 +125,7 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
maxOf(
System.currentTimeMillis() -
TimeUnit.DAYS.toMillis(aggregateDataFilterBeginDays),
- Instant.EPOCH.toEpochMilli()
+ Instant.EPOCH.toEpochMilli(),
)
permissionUsages.load(
null,
@@ -137,7 +137,7 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
false,
false,
this,
- false
+ false,
)
}
helper =
@@ -151,7 +151,7 @@ class WearAppPermissionGroupsFragment : Fragment(), PermissionsUsagesChangeCallb
viewModel = viewModel,
wearViewModel = wearViewModel,
revokeDialogViewModel = revokeDialogViewModel,
- locationProviderInterceptDialogViewModel = locationProviderInterceptDialogViewModel
+ locationProviderInterceptDialogViewModel = locationProviderInterceptDialogViewModel,
)
return ComposeView(activity).apply {
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 5919fad0d..e375910ae 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionGroupsScreen.kt
@@ -25,15 +25,15 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionConfirmationDialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControl
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
import com.android.permissioncontroller.permission.ui.wear.model.RevokeDialogArgs
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionConfirmationDialog
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControl
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
@Composable
fun WearAppPermissionGroupsScreen(helper: WearAppPermissionGroupsHelper) {
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 8815e7905..588f5a4da 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearAppPermissionScreen.kt
@@ -30,20 +30,20 @@ import com.android.permissioncontroller.permission.ui.model.AppPermissionViewMod
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonState
import com.android.permissioncontroller.permission.ui.model.AppPermissionViewModel.ButtonType
import com.android.permissioncontroller.permission.ui.v33.AdvancedConfirmDialogArgs
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.ListFooter
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.ToggleChip
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.toggleChipDisabledColors
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionConfirmationDialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.defaultAlertConfirmIcon
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.defaultAlertDismissIcon
import com.android.permissioncontroller.permission.ui.wear.model.AppPermissionConfirmDialogViewModel
import com.android.permissioncontroller.permission.ui.wear.model.ConfirmDialogArgs
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material2.ListFooter
+import com.android.permissioncontroller.wear.permission.components.material2.ToggleChip
+import com.android.permissioncontroller.wear.permission.components.material2.toggleChipDisabledColors
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionConfirmationDialog
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.material3.defaultAlertConfirmIcon
+import com.android.permissioncontroller.wear.permission.components.material3.defaultAlertDismissIcon
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
import com.android.settingslib.RestrictedLockUtils
@Composable
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationDialogFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationDialogFragment.kt
index e81fd948d..088531a52 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationDialogFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationDialogFragment.kt
@@ -27,7 +27,7 @@ import androidx.fragment.app.DialogFragment
import androidx.fragment.app.viewModels
import com.android.permissioncontroller.ecm.EnhancedConfirmationDialogActivity
import com.android.permissioncontroller.permission.ui.wear.model.WearEnhancedConfirmationViewModel
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
class WearEnhancedConfirmationDialogFragment : DialogFragment() {
private lateinit var enhancedConfirmationDialogActivity: EnhancedConfirmationDialogActivity
@@ -42,7 +42,7 @@ class WearEnhancedConfirmationDialogFragment : DialogFragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View {
val title =
arguments?.getString(KEY_TITLE) ?: throw RuntimeException("ECM Title can't be null")
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationScreen.kt
index ab19a9665..1e1f8ba5a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearEnhancedConfirmationScreen.kt
@@ -39,20 +39,20 @@ import androidx.wear.compose.material.CircularProgressIndicator
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.SwipeToDismissBox
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.CheckYourPhoneScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.CheckYourPhoneState
-import com.android.permissioncontroller.permission.ui.wear.elements.CheckYourPhoneState.InProgress
-import com.android.permissioncontroller.permission.ui.wear.elements.CheckYourPhoneState.Success
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.dismiss
-import com.android.permissioncontroller.permission.ui.wear.elements.findActivity
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.Chip
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionConfirmationDialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.permission.ui.wear.model.WearEnhancedConfirmationViewModel
import com.android.permissioncontroller.permission.ui.wear.model.WearEnhancedConfirmationViewModel.ScreenState
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.CheckYourPhoneScreen
+import com.android.permissioncontroller.wear.permission.components.CheckYourPhoneState
+import com.android.permissioncontroller.wear.permission.components.CheckYourPhoneState.InProgress
+import com.android.permissioncontroller.wear.permission.components.CheckYourPhoneState.Success
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.dismiss
+import com.android.permissioncontroller.wear.permission.components.findActivity
+import com.android.permissioncontroller.wear.permission.components.material2.Chip
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionConfirmationDialog
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
@Composable
fun WearEnhancedConfirmationScreen(
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
index 20c010781..3ed58cf4a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearGrantPermissionsScreen.kt
@@ -22,6 +22,7 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
+import androidx.core.util.size
import androidx.wear.compose.material3.Dialog
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.ALLOW_ALWAYS_BUTTON
@@ -38,13 +39,13 @@ import com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.N
import com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_OT_AND_DONT_ASK_AGAIN_BUTTON
import com.android.permissioncontroller.permission.ui.GrantPermissionsActivity.NO_UPGRADE_OT_BUTTON
import com.android.permissioncontroller.permission.ui.wear.GrantPermissionsWearViewHandler.BUTTON_RES_ID_TO_NUM
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControl
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
import com.android.permissioncontroller.permission.ui.wear.model.WearGrantPermissionsViewModel
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion.MATERIAL3
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControl
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion.MATERIAL3
@Composable
fun WearGrantPermissionsScreen(
@@ -84,7 +85,7 @@ fun WearGrantPermissionsScreen(
)
}
}
- for (i in 0 until BUTTON_RES_ID_TO_NUM.size()) {
+ for (i in 0 until BUTTON_RES_ID_TO_NUM.size) {
val pos: Int = BUTTON_RES_ID_TO_NUM.valueAt(i)
if (buttonVisibilities.value.size <= pos) {
// initial value of buttonVisibilities is empty
@@ -135,7 +136,7 @@ private fun AsDialog(
content: @Composable () -> Unit,
) {
val showDialog = viewModel.showDialog.observeAsState(false)
- Dialog(show = showDialog.value, onDismissRequest = onDismissRequest, content = content)
+ Dialog(visible = showDialog.value, onDismissRequest = onDismissRequest, content = content)
}
@Composable
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionScreen.kt
index d826e501e..72c3d2054 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionScreen.kt
@@ -25,9 +25,9 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.res.stringResource
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.model.ManageCustomPermissionsViewModel
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
@Composable
fun WearManageCustomPermissionScreen(
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 a9e83919f..96da37b9b 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageCustomPermissionsFragment.kt
@@ -26,13 +26,13 @@ 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
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
class WearManageCustomPermissionsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val activity = requireActivity()
val application = activity.getApplication()
@@ -41,14 +41,14 @@ class WearManageCustomPermissionsFragment : Fragment() {
val viewModel =
ViewModelProvider(
this,
- ViewModelProvider.AndroidViewModelFactory.getInstance(application)
+ ViewModelProvider.AndroidViewModelFactory.getInstance(application),
)
.get(ManageCustomPermissionsViewModel::class.java)
val onPermGroupClick: (String) -> Unit = { permGroupName ->
viewModel.showPermissionApps(
this,
- PermissionAppsFragment.createArgs(permGroupName, sessionId)
+ PermissionAppsFragment.createArgs(permGroupName, sessionId),
)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionScreen.kt
index 3e347e19c..2fdf33130 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionScreen.kt
@@ -29,13 +29,13 @@ import androidx.compose.ui.res.stringResource
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.model.livedatatypes.PermGroupPackagesUiInfo
import com.android.permissioncontroller.permission.ui.model.ManageStandardPermissionsViewModel
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupIcon
import com.android.permissioncontroller.permission.utils.KotlinUtils.getPermGroupLabel
import com.android.permissioncontroller.permission.utils.StringUtils
import com.android.permissioncontroller.permission.utils.Utils
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
import java.text.Collator
@Composable
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 16ed1f067..d88554562 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearManageStandardPermissionsFragment.kt
@@ -27,13 +27,13 @@ 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
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
class WearManageStandardPermissionsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val activity = requireActivity()
val application = activity.getApplication()
@@ -42,20 +42,20 @@ class WearManageStandardPermissionsFragment : Fragment() {
val viewModel: ManageStandardPermissionsViewModel =
ViewModelProvider(
this,
- ViewModelProvider.AndroidViewModelFactory.getInstance(application)
+ ViewModelProvider.AndroidViewModelFactory.getInstance(application),
)
.get(ManageStandardPermissionsViewModel::class.java)
val onPermGroupClick: (String) -> Unit = { permGroupName ->
viewModel.showPermissionApps(
this,
- PermissionAppsFragment.createArgs(permGroupName, sessionId)
+ PermissionAppsFragment.createArgs(permGroupName, sessionId),
)
}
val onCustomPermGroupClick = {
viewModel.showCustomPermissions(
this,
- ManageCustomPermissionsFragment.createArgs(sessionId)
+ ManageCustomPermissionsFragment.createArgs(sessionId),
)
}
val onAutoRevokeClick = {
@@ -69,7 +69,7 @@ class WearManageStandardPermissionsFragment : Fragment() {
viewModel,
onPermGroupClick,
onCustomPermGroupClick,
- onAutoRevokeClick
+ onAutoRevokeClick,
)
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsScreen.kt
index 2fa6aa7f3..6f0d94d02 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionAppsScreen.kt
@@ -30,10 +30,10 @@ import androidx.compose.ui.res.stringResource
import androidx.wear.compose.material.Text
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.Category
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionListSubHeader
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionListSubHeader
/** Compose the screen associated to a [WearPermissionAppsFragment]. */
@Composable
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt
index 2ade4863a..2d302c2b4 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsFragment.kt
@@ -29,7 +29,7 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.android.permissioncontroller.PermissionControllerApplication
import com.android.permissioncontroller.permission.ui.ManagePermissionsActivity
-import com.android.permissioncontroller.permission.ui.model.v31.BasePermissionUsageDetailsViewModel
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsViewModelFactory
/**
@@ -42,7 +42,7 @@ class WearPermissionUsageDetailsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val permissionGroup =
arguments?.getString(Intent.EXTRA_PERMISSION_GROUP_NAME)
@@ -56,11 +56,10 @@ class WearPermissionUsageDetailsFragment : Fragment() {
val factory =
PermissionUsageDetailsViewModelFactory(
PermissionControllerApplication.get(),
- this,
- permissionGroup
+ permissionGroup,
)
val viewModel =
- ViewModelProvider(this, factory).get(BasePermissionUsageDetailsViewModel::class.java)
+ ViewModelProvider(this, factory).get(PermissionUsageDetailsViewModel::class.java)
viewModel.updateShowSystemAppsToggle(showSystem)
return ComposeView(requireContext()).apply {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt
index 279eaa8cc..bea10483b 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageDetailsScreen.kt
@@ -31,21 +31,20 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.model.v31.BasePermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.AppPermissionAccessUiInfo
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.permission.utils.KotlinUtils
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
@RequiresApi(Build.VERSION_CODES.S)
@Composable
fun WearPermissionUsageDetailsScreen(
permissionGroup: String,
- viewModel: BasePermissionUsageDetailsViewModel,
+ viewModel: PermissionUsageDetailsViewModel,
) {
val context = LocalContext.current
val uiData = viewModel.getPermissionUsagesDetailsInfoUiLiveData().observeAsState(null)
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt
index 889caba3b..8631d8b20 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearPermissionUsageScreen.kt
@@ -17,6 +17,7 @@
package com.android.permissioncontroller.permission.ui.wear
import android.os.Build
+import android.permission.flags.Flags
import androidx.annotation.RequiresApi
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
@@ -32,10 +33,10 @@ import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.ui.handheld.v31.PermissionUsageControlPreference
import com.android.permissioncontroller.permission.ui.viewmodel.v31.PermissionUsageViewModel
import com.android.permissioncontroller.permission.ui.viewmodel.v31.PermissionUsagesUiState
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.permission.utils.Utils
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
import java.text.Collator
@RequiresApi(Build.VERSION_CODES.S)
@@ -70,7 +71,13 @@ fun WearPermissionUsageScreen(sessionId: Long, viewModel: PermissionUsageViewMod
val permissionGroupPreferences =
permissionGroupWithUsageCountsEntries
// Removing Health Connect from the list of permissions to fix b/331260850
- .filterNot { Utils.isHealthPermissionGroup(it.key) }
+ .let {
+ if (Flags.replaceBodySensorPermissionEnabled()) {
+ it
+ } else {
+ it.filterNot { Utils.isHealthPermissionGroup(it.key) }
+ }
+ }
.map {
PermissionUsageControlPreference(
context,
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 64acfdd96..d454cc566 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsFragment.kt
@@ -41,14 +41,14 @@ 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.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
import com.android.settingslib.utils.applications.AppUtils
import java.text.Collator
/**
* This is a condensed version of
- * [com.android.permissioncontroller.permission.ui.UnusedAppsFragment.kt], tailored for Wear.
+ * [com.android.permissioncontroller.permission.ui.UnusedAppsFragment], tailored for Wear.
*
* A fragment displaying all applications that are unused as well as the option to remove them and
* to open them.
@@ -62,7 +62,7 @@ class WearUnusedAppsFragment : Fragment() {
private var sessionId: Long = 0L
private var isFirstLoad = false
private var categoryVisibilities: MutableList<Boolean> =
- MutableList(UnusedPeriod.values().size) { false }
+ MutableList(UnusedPeriod.entries.size) { false }
private var unusedAppsMap: MutableMap<UnusedPeriod, MutableMap<String, UnusedAppChip>> =
initUnusedAppsMap()
@@ -87,7 +87,7 @@ class WearUnusedAppsFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
isFirstLoad = true
context = requireContext()
@@ -101,7 +101,7 @@ class WearUnusedAppsFragment : Fragment() {
wearViewModel =
ViewModelProvider(
this,
- ViewModelProvider.AndroidViewModelFactory.getInstance(application)
+ ViewModelProvider.AndroidViewModelFactory.getInstance(application),
)
.get(WearUnusedAppsViewModel::class.java)
viewModel.unusedPackageCategoriesLiveData.observe(
@@ -111,7 +111,7 @@ class WearUnusedAppsFragment : Fragment() {
updatePackages(pkgs)
updateWearViewModel(false)
}
- }
+ },
)
if (!viewModel.unusedPackageCategoriesLiveData.isInitialized) {
@@ -125,7 +125,7 @@ class WearUnusedAppsFragment : Fragment() {
updateWearViewModel(false)
}
},
- SHOW_LOAD_DELAY_MS
+ SHOW_LOAD_DELAY_MS,
)
} else {
updatePackages(viewModel.unusedPackageCategoriesLiveData.value!!)
@@ -192,14 +192,14 @@ class WearUnusedAppsFragment : Fragment() {
getString(
R.string.auto_revoked_app_summary_two,
importantLabel,
- otherLabel
+ otherLabel,
)
}
else ->
getString(
R.string.auto_revoked_app_summary_many,
importantLabel,
- "${revokedPerms.size - 1}"
+ "${revokedPerms.size - 1}",
)
}
@@ -215,9 +215,9 @@ class WearUnusedAppsFragment : Fragment() {
AppUtils.getAppContentDescription(
context,
pkgName,
- user.getIdentifier()
+ user.getIdentifier(),
),
- onChipClicked
+ onChipClicked,
)
unusedAppsMap[period]!!.put(key, chip)
}
@@ -242,7 +242,7 @@ class WearUnusedAppsFragment : Fragment() {
for (period in allPeriods) {
Log.i(
LOG_TAG,
- "sessionId: $sessionId $period unused: " + "${categorizedPackages[period]}"
+ "sessionId: $sessionId $period unused: " + "${categorizedPackages[period]}",
)
for (revokedPackageInfo in categorizedPackages[period]!!) {
for (groupName in revokedPackageInfo.revokedGroups) {
@@ -251,7 +251,7 @@ class WearUnusedAppsFragment : Fragment() {
revokedPackageInfo.packageName,
revokedPackageInfo.user,
groupName,
- isNewlyRevoked
+ isNewlyRevoked,
)
}
}
@@ -292,7 +292,7 @@ class WearUnusedAppsFragment : Fragment() {
private fun compareUnusedApps(
lhs: Pair<String, UnusedAppChip>,
- rhs: Pair<String, UnusedAppChip>
+ rhs: Pair<String, UnusedAppChip>,
): Int {
var result = collator.compare(lhs.second.label, rhs.second.label)
if (result == 0) {
@@ -303,7 +303,7 @@ class WearUnusedAppsFragment : Fragment() {
private fun updateWearViewModel(isLoading: Boolean) {
wearViewModel.loadingLiveData.value = isLoading
- wearViewModel.unusedPeriodCategoryVisibilitiesLiveData.setValue(categoryVisibilities)
+ wearViewModel.unusedPeriodCategoryVisibilitiesLiveData.value = categoryVisibilities
// Need to copy to non mutable maps or compose will not update correctly
val map = mutableMapOf<UnusedPeriod, Map<String, UnusedAppChip>>()
@@ -311,6 +311,6 @@ class WearUnusedAppsFragment : Fragment() {
map.put(period, unusedAppsMap[period]!!.toMap())
}
- wearViewModel.unusedAppChipsLiveData.setValue(map.toMap())
+ wearViewModel.unusedAppChipsLiveData.value = 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 0bde97f81..c5eef53f2 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUnusedAppsScreen.kt
@@ -25,10 +25,10 @@ import com.android.permissioncontroller.R
import com.android.permissioncontroller.hibernation.isHibernationEnabled
import com.android.permissioncontroller.permission.ui.model.UnusedAppsViewModel.UnusedPeriod
import com.android.permissioncontroller.permission.ui.model.UnusedAppsViewModel.UnusedPeriod.Companion.allPeriods
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.permission.ui.wear.model.WearUnusedAppsViewModel
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
@Composable
fun WearUnusedAppsScreen(viewModel: WearUnusedAppsViewModel) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt
index 7e4e939b9..6cdf47cec 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/WearUtils.kt
@@ -22,7 +22,6 @@ import androidx.annotation.IntDef
import com.android.permissioncontroller.R
import java.time.ZonedDateTime
import java.time.temporal.ChronoUnit
-import java.util.Locale
object WearUtils {
@Retention(AnnotationRetention.SOURCE)
@@ -48,7 +47,7 @@ object WearUtils {
res.getString(
R.string.wear_app_perms_7d_access,
summaryTimestamp.third,
- summaryTimestamp.first
+ summaryTimestamp.first,
)
else -> ""
}
@@ -57,7 +56,7 @@ object WearUtils {
@JvmStatic
private fun getPermissionLastAccessSummaryTimestamp(
lastAccessTime: Long?,
- context: Context
+ context: Context,
): Triple<String, Int, String> {
val midnightToday =
(ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS).toEpochSecond() * 1000L)
@@ -78,8 +77,4 @@ object WearUtils {
}
return Triple(lastAccessTimeFormatted, lastAccessType, lastAccessDateFormatted)
}
-
- fun String.capitalize(): String = replaceFirstChar {
- if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
- }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/RemoteConnectionProgressIndicator.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/RemoteConnectionProgressIndicator.kt
deleted file mode 100644
index 244e7e3fd..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/RemoteConnectionProgressIndicator.kt
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright 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
- *
- * https://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
-
-import androidx.compose.foundation.background
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.size
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.draw.clip
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.unit.dp
-import androidx.wear.compose.material.CircularProgressIndicator
-import androidx.wear.compose.material.Icon
-import androidx.wear.compose.material.MaterialTheme
-
-@Composable
-fun RemoteConnectionProgressIndicator(iconRes: Int, modifier: Modifier) {
- val indicatorPadding = 8.dp
- val iconSize = 48.dp
- val progressBarStrokeWidth = 4.dp
- Box(
- modifier = modifier.size(iconSize).clip(CircleShape),
- ) {
- CircularProgressIndicator(
- modifier = Modifier.size(iconSize - progressBarStrokeWidth + indicatorPadding),
- strokeWidth = progressBarStrokeWidth,
- )
- Icon(
- painter = painterResource(iconRes),
- contentDescription = null,
- modifier =
- Modifier.align(Alignment.Center)
- .size(iconSize - indicatorPadding - 8.dp)
- .clip(CircleShape),
- )
- }
-}
-
-@Composable
-fun RemoteConnectionSuccess(iconRes: Int, modifier: Modifier) {
- val indicatorPadding = 8.dp
- val iconSize = 48.dp
- val backgroundColor = MaterialTheme.colors.onSurface
- val contentColor = MaterialTheme.colors.surface
- Box(
- modifier = modifier.size(iconSize).clip(CircleShape).background(backgroundColor),
- ) {
- Icon(
- painter = painterResource(iconRes),
- contentDescription = null,
- tint = contentColor,
- modifier =
- Modifier.align(Alignment.Center)
- .size(iconSize - indicatorPadding - 8.dp)
- .clip(CircleShape),
- )
- }
-}
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
deleted file mode 100644
index 736d543a3..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTheme.kt
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * 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.theme
-
-import android.content.Context
-import android.os.Build
-import androidx.annotation.RequiresApi
-import androidx.annotation.StringRes
-import androidx.annotation.VisibleForTesting
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.text.font.DeviceFontFamilyName
-import androidx.compose.ui.text.font.Font
-import androidx.compose.ui.text.font.FontFamily
-import androidx.wear.compose.material.Colors
-import androidx.wear.compose.material.MaterialTheme
-import androidx.wear.compose.material.Typography
-import androidx.wear.compose.material3.MaterialTheme as Material3Theme
-import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion.MATERIAL2_5
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion.MATERIAL3
-
-/** This enum is used to specify the material version used for a specific screen */
-enum class WearPermissionMaterialUIVersion {
- MATERIAL2_5,
- MATERIAL3,
-}
-
-/**
- * Supports both Material 3 and Material 2_5 theme. default version for permission theme will be 2_5
- * until we migrate enough screens to 3. 2_5 version will use material 3 overlay resources if we
- * enable material3 for even one screen (Permission screens will be migrated in phases).
- */
-@Composable
-fun WearPermissionTheme(
- version: WearPermissionMaterialUIVersion = MATERIAL2_5,
- content: @Composable () -> Unit,
-) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
- WearPermissionLegacyTheme(content)
- } else {
- // Material3 UI controls are still being used in the screen that the theme is applied
- if (version == MATERIAL3) {
- val material3Theme = WearOverlayableMaterial3Theme(LocalContext.current)
- Material3Theme(
- colorScheme = material3Theme.colorScheme,
- typography = material3Theme.typography,
- shapes = material3Theme.shapes,
- content = content,
- )
- }
- // Material2_5 UI controls are still being used in the screen that the theme is applied,
- // But some in-app screens(like permission grant screen) are migrated to material3.
- // To avoid having two set of overlay resources, we will use material3 overlay resources to
- // support material2_5 UI controls as well.
- else if (version == MATERIAL2_5 && ResourceHelper.materialUIVersionInApp == MATERIAL3) {
- val material3Theme = WearOverlayableMaterial3Theme(LocalContext.current)
- val bridgedLegacyTheme = WearMaterialBridgedLegacyTheme.createFrom(material3Theme)
- MaterialTheme(
- colors = bridgedLegacyTheme.colors,
- typography = bridgedLegacyTheme.typography,
- shapes = bridgedLegacyTheme.shapes,
- content = content,
- )
- }
- // We are not ready for material3 yet in any screens.
- else {
- WearPermissionLegacyTheme(content)
- }
- }
-}
-
-/**
- * The Material 2.5 Theme Wrapper for Supporting RRO with legacy resources. This theme is kept here
- * for backward compatibility. When grant screen is updated to material3 will clean up legacy
- * resources.
- */
-@Composable
-fun WearPermissionLegacyTheme(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, typography = deviceDefaultTypography(context), 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,
- )
-}
-
-private fun fontFamily(context: Context, @StringRes id: Int): FontFamily {
- val typefaceName = context.resources.getString(id)
- val font = Font(familyName = DeviceFontFamilyName(typefaceName))
- return FontFamily(font)
-}
-
-/*
- Only customizes font family. The material 3 roles to 2.5 are mapped to the best case matching of
- google3/java/com/google/android/wearable/libraries/compose/theme/GoogleMaterialTheme.kt
-*/
-internal fun deviceDefaultTypography(context: Context): Typography {
- val defaultTypography = Typography()
- return Typography(
- display1 =
- defaultTypography.display1.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_display_1_font_family)
- ),
- display2 =
- defaultTypography.display2.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_display_2_font_family)
- ),
- display3 =
- defaultTypography.display3.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_display_3_font_family)
- ),
- title1 =
- defaultTypography.title1.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_title_1_font_family)
- ),
- title2 =
- defaultTypography.title2.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_title_2_font_family)
- ),
- title3 =
- defaultTypography.title3.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_title_3_font_family)
- ),
- body1 =
- defaultTypography.body1.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_body_1_font_family)
- ),
- body2 =
- defaultTypography.body2.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_body_2_font_family)
- ),
- button =
- defaultTypography.button.copy(
- fontFamily = fontFamily(context, R.string.wear_material_compose_button_font_family)
- ),
- caption1 =
- defaultTypography.caption1.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_caption_1_font_family)
- ),
- caption2 =
- defaultTypography.caption2.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_caption_2_font_family)
- ),
- caption3 =
- defaultTypography.caption3.copy(
- fontFamily =
- fontFamily(context, R.string.wear_material_compose_caption_3_font_family)
- ),
- )
-}
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
deleted file mode 100644
index a86af8b3d..000000000
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearPermissionTonalPalette.kt
+++ /dev/null
@@ -1,191 +0,0 @@
-@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/KotlinUtils.kt b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
index 0701045f5..51f098371 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/KotlinUtils.kt
@@ -737,6 +737,7 @@ object KotlinUtils {
newPerms,
group.hasInstallToRuntimeSplit,
group.specialLocationGrant,
+ group.specialFixedStorageGrant,
)
}
@@ -857,6 +858,7 @@ object KotlinUtils {
newPerms,
group.hasInstallToRuntimeSplit,
group.specialLocationGrant,
+ group.specialFixedStorageGrant,
)
// If any permission in the group is one time granted, start one time permission session.
if (newGroup.permissions.any { it.value.isOneTime && it.value.isGranted }) {
@@ -1139,6 +1141,7 @@ object KotlinUtils {
newPerms,
group.hasInstallToRuntimeSplit,
group.specialLocationGrant,
+ group.specialFixedStorageGrant,
)
if (wasOneTime && !anyPermsOfPackageOneTimeGranted(app, newGroup.packageInfo, newGroup)) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
index aae5cb82c..327142896 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
+++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java
@@ -35,9 +35,11 @@ import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.OPSTR_LEGACY_STORAGE;
import static android.content.Context.MODE_PRIVATE;
import static android.content.Intent.EXTRA_PACKAGE_NAME;
+import static android.content.Intent.EXTRA_REASON;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT;
import static android.content.pm.PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT;
+import static android.content.pm.PackageManager.FLAG_PERMISSION_REVOKE_WHEN_REQUESTED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED;
import static android.content.pm.PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
@@ -77,6 +79,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.SensorPrivacyManager;
import android.health.connect.HealthConnectManager;
+import android.health.connect.HealthPermissions;
import android.os.Binder;
import android.os.Build;
import android.os.Parcelable;
@@ -1106,17 +1109,31 @@ public final class Utils {
return false;
}
+ // Always show Fitness&Wellness chip on Wear.
+ if (Flags.replaceBodySensorPermissionEnabled()
+ && pm.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
+ return true;
+ }
+
// Check in permission is already granted as we should not hide it in the UX at that point.
List<String> grantedPermissions = packageInfo.getGrantedPermissions();
for (PermissionInfo permission : permissions) {
boolean isCurrentlyGranted = grantedPermissions.contains(permission.name);
if (isCurrentlyGranted) {
- Log.d(LOG_TAG, "At least one Health permission group permission is granted, "
+ Log.d(
+ LOG_TAG,
+ "At least one Health permission group permission is granted, "
+ "show permission group entry");
return true;
}
}
+ // When none health permission is granted, exempt health permission view usage intent filter
+ // if all the requested health permissions are from permission splits.
+ if (isRequestFromSplitHealthPermission(packageInfo)) {
+ return true;
+ }
+
Intent viewUsageIntent = new Intent(Intent.ACTION_VIEW_PERMISSION_USAGE);
viewUsageIntent.addCategory(HealthConnectManager.CATEGORY_HEALTH_PERMISSIONS);
viewUsageIntent.setPackage(packageInfo.getPackageName());
@@ -1131,6 +1148,71 @@ public final class Utils {
}
/**
+ * Returns true if the request is being made as the result of a split health permission from
+ * BODY_SENSORS call.
+ */
+ @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ private static boolean isRequestFromSplitHealthPermission(LightPackageInfo packageInfo) {
+ // Sdk check to make sure HealthConnectManager.isHealthPermission() is supported.
+ if (!SdkLevel.isAtLeastU() || !Flags.replaceBodySensorPermissionEnabled()) {
+ return false;
+ }
+
+ PermissionControllerApplication app = PermissionControllerApplication.get();
+ PackageManager pm = app.getPackageManager();
+ String packageName = packageInfo.getPackageName();
+ UserHandle user = UserHandle.getUserHandleForUid(packageInfo.getUid());
+ Context context = Utils.getUserContext(app, user);
+
+ List<String> requestedHealthPermissions = new ArrayList<>();
+ for (String permission : packageInfo.getRequestedPermissions()) {
+ if (HealthConnectManager.isHealthPermission(context, permission)) {
+ requestedHealthPermissions.add(permission);
+ }
+ }
+
+ // Split permission only applies to READ_HEART_RATE.
+ if (!requestedHealthPermissions.contains(HealthPermissions.READ_HEART_RATE)) {
+ return false;
+ }
+
+ // If there are other health permissions (other than READ_HEALTH_DATA_IN_BACKGROUND)
+ // don't consider this a pure split-permission request.
+ if (requestedHealthPermissions.size() > 2) {
+ return false;
+ }
+
+ boolean isBackgroundPermissionRequested =
+ requestedHealthPermissions.contains(
+ HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND);
+ // If there are two health permissions declared, make sure the other is
+ // READ_HEALTH_DATA_IN_BACKGROUND.
+ if (requestedHealthPermissions.size() == 2 && !isBackgroundPermissionRequested) {
+ return false;
+ }
+
+ // If READ_HEALTH_DATA_IN_BACKGROUND is requested, check permission flag to see if is from
+ // split permission.
+ if (isBackgroundPermissionRequested) {
+ int readHealthDataInBackgroundFlag =
+ pm.getPermissionFlags(
+ HealthPermissions.READ_HEALTH_DATA_IN_BACKGROUND, packageName, user);
+ if (!isFromSplitPermission(readHealthDataInBackgroundFlag)) {
+ return false;
+ }
+ }
+
+ // Check READ_HEART_RATE permission flag to see if is from split permission.
+ int readHeartRateFlag =
+ pm.getPermissionFlags(HealthPermissions.READ_HEART_RATE, packageName, user);
+ return isFromSplitPermission(readHeartRateFlag);
+ }
+
+ private static boolean isFromSplitPermission(int permissionFlag) {
+ return (permissionFlag & FLAG_PERMISSION_REVOKE_WHEN_REQUESTED) != 0;
+ }
+
+ /**
* Get a device protected storage based shared preferences. Avoid storing sensitive data in it.
*
* @param context the context to get the shared preferences
@@ -1502,6 +1584,19 @@ public final class Utils {
context.startActivity(healthConnectIntent);
}
+
+ /**
+ * Navigate to health connect settings Wear privacy dashboard.
+ *
+ * @param context The current Context
+ */
+ public static void navigateToWearHealthConnectSettingsPrivacyDashboard(
+ @NonNull Context context) {
+ Intent privacyDashboardHealthConnectIntent = new Intent(ACTION_MANAGE_HEALTH_PERMISSIONS);
+ privacyDashboardHealthConnectIntent.putExtra(EXTRA_REASON, "privacy_dashboard");
+ context.startActivity(privacyDashboardHealthConnectIntent);
+ }
+
/**
* Navigate to health connect settings for an app
* @param context The current Context
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
index 61e33d10b..268633c4f 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppChildFragment.java
@@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.ArrayMap;
-import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -33,12 +32,15 @@ import androidx.appcompat.content.res.AppCompatResources;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
import com.android.modules.utils.build.SdkLevel;
+import com.android.permission.flags.Flags;
import com.android.permissioncontroller.R;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.permissioncontroller.role.utils.PackageUtils;
@@ -63,6 +65,10 @@ public class DefaultAppChildFragment<PF extends PreferenceFragmentCompat
implements DefaultAppConfirmationDialogFragment.Listener,
Preference.OnPreferenceClickListener {
+ private static final String PREFERENCE_KEY_RECOMMENDED_CATEGORY =
+ DefaultAppChildFragment.class.getName() + ".preference.RECOMMENDED_CATEGORY";
+ private static final String PREFERENCE_KEY_OTHERS_CATEGORY =
+ DefaultAppChildFragment.class.getName() + ".preference.OTHERS_CATEGORY";
private static final String PREFERENCE_KEY_NONE = DefaultAppChildFragment.class.getName()
+ ".preference.NONE";
private static final String PREFERENCE_KEY_DESCRIPTION = DefaultAppChildFragment.class.getName()
@@ -125,53 +131,65 @@ public class DefaultAppChildFragment<PF extends PreferenceFragmentCompat
ViewModelProvider.Factory viewModelFactory = new DefaultAppViewModel.Factory(mRole, mUser,
activity.getApplication());
mViewModel = new ViewModelProvider(this, viewModelFactory).get(DefaultAppViewModel.class);
- mViewModel.getRoleLiveData().observe(this, this::onRoleChanged);
+ mViewModel.getRecommendedLiveData().observe(this,
+ applicationItems -> onApplicationListChanged());
+ mViewModel.getLiveData().observe(this, applicationItems -> onApplicationListChanged());
mViewModel.getManageRoleHolderStateLiveData().observe(this,
this::onManageRoleHolderStateChanged);
}
- private void onRoleChanged(
- @NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
+ private void onApplicationListChanged() {
+ List<RoleApplicationItem> recommendedApplicationItems =
+ mViewModel.getRecommendedLiveData().getValue();
+ if (recommendedApplicationItems == null) {
+ return;
+ }
+ List<RoleApplicationItem> otherApplicationItems = mViewModel.getLiveData().getValue();
+ if (otherApplicationItems == null) {
+ return;
+ }
+
PF preferenceFragment = requirePreferenceFragment();
PreferenceManager preferenceManager = preferenceFragment.getPreferenceManager();
Context context = preferenceManager.getContext();
PreferenceScreen preferenceScreen = preferenceFragment.getPreferenceScreen();
+ PreferenceCategory oldRecommendedPreferenceCategory = null;
+ PreferenceCategory oldOthersPreferenceCategory = null;
ArrayMap<String, Preference> oldPreferences = new ArrayMap<>();
if (preferenceScreen == null) {
preferenceScreen = preferenceManager.createPreferenceScreen(context);
preferenceFragment.setPreferenceScreen(preferenceScreen);
} else {
- for (int i = preferenceScreen.getPreferenceCount() - 1; i >= 0; --i) {
- Preference preference = preferenceScreen.getPreference(i);
-
- preferenceScreen.removePreference(preference);
- preference.setOrder(Preference.DEFAULT_ORDER);
- oldPreferences.put(preference.getKey(), preference);
+ if (Flags.defaultAppsRecommendationEnabled()) {
+ oldRecommendedPreferenceCategory =
+ preferenceScreen.findPreference(PREFERENCE_KEY_RECOMMENDED_CATEGORY);
+ clearPreferenceCategory(oldRecommendedPreferenceCategory, oldPreferences);
+ oldOthersPreferenceCategory =
+ preferenceScreen.findPreference(PREFERENCE_KEY_OTHERS_CATEGORY);
+ clearPreferenceCategory(oldOthersPreferenceCategory, oldPreferences);
}
+ clearPreferences(preferenceScreen, oldPreferences);
}
- if (mRole.shouldShowNone()) {
- Drawable icon = AppCompatResources.getDrawable(context, R.drawable.ic_remove_circle);
- String title = getString(R.string.default_app_none);
- boolean noHolderApplication = !hasHolderApplication(qualifyingApplications);
- addPreference(PREFERENCE_KEY_NONE, icon, title, noHolderApplication, null,
- oldPreferences, preferenceScreen, context);
- }
-
- int qualifyingApplicationsSize = qualifyingApplications.size();
- for (int i = 0; i < qualifyingApplicationsSize; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = qualifyingApplications.get(i);
- ApplicationInfo qualifyingApplicationInfo = qualifyingApplication.first;
- boolean isHolderApplication = qualifyingApplication.second;
-
- int userId =
- UserHandle.getUserHandleForUid(qualifyingApplicationInfo.uid).getIdentifier();
- String key = qualifyingApplicationInfo.packageName + "@" + userId;
- Drawable icon = Utils.getBadgedIcon(context, qualifyingApplicationInfo);
- String title = Utils.getFullAppLabel(qualifyingApplicationInfo, context);
- addPreference(key, icon, title, isHolderApplication, qualifyingApplicationInfo,
- oldPreferences, preferenceScreen, context);
+ if (Flags.defaultAppsRecommendationEnabled() && !recommendedApplicationItems.isEmpty()) {
+ addApplicationPreferenceCategory(oldRecommendedPreferenceCategory,
+ PREFERENCE_KEY_RECOMMENDED_CATEGORY,
+ getString(R.string.default_app_recommended), preferenceScreen, false, false,
+ recommendedApplicationItems, oldPreferences, context);
+ if (mRole.shouldShowNone() || !otherApplicationItems.isEmpty()) {
+ boolean noneChecked = !(hasHolderApplication(recommendedApplicationItems)
+ || hasHolderApplication(otherApplicationItems));
+ addApplicationPreferenceCategory(oldOthersPreferenceCategory,
+ PREFERENCE_KEY_OTHERS_CATEGORY, getString(R.string.default_app_others),
+ preferenceScreen, true, noneChecked, otherApplicationItems, oldPreferences,
+ context);
+ }
+ } else {
+ boolean noneChecked = !hasHolderApplication(otherApplicationItems);
+ addNonePreferenceIfNeeded(preferenceScreen, noneChecked, oldPreferences, context);
+ addApplicationPreferences(preferenceScreen, otherApplicationItems, oldPreferences,
+ context);
}
addNonPaymentNfcServicesPreference(preferenceScreen, oldPreferences, context);
@@ -180,24 +198,93 @@ public class DefaultAppChildFragment<PF extends PreferenceFragmentCompat
preferenceFragment.onPreferenceScreenChanged();
}
- 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;
+ private static void clearPreferenceCategory(@Nullable PreferenceCategory preferenceCategory,
+ @NonNull ArrayMap<String, Preference> oldPreferences) {
+ if (preferenceCategory == null) {
+ return;
+ }
+ clearPreferences(preferenceCategory, oldPreferences);
+ preferenceCategory.getParent().removePreference(preferenceCategory);
+ preferenceCategory.setOrder(Preference.DEFAULT_ORDER);
+ }
- if (isHolderApplication) {
+ private static void clearPreferences(@NonNull PreferenceGroup preferenceGroup,
+ @NonNull ArrayMap<String, Preference> oldPreferences) {
+ for (int i = preferenceGroup.getPreferenceCount() - 1; i >= 0; --i) {
+ Preference preference = preferenceGroup.getPreference(i);
+
+ preferenceGroup.removePreference(preference);
+ preference.setOrder(Preference.DEFAULT_ORDER);
+ oldPreferences.put(preference.getKey(), preference);
+ }
+ }
+
+ private void addApplicationPreferenceCategory(
+ @Nullable PreferenceCategory oldPreferenceCategory, @NonNull String key,
+ @Nullable String title, @NonNull PreferenceScreen preferenceScreen,
+ boolean addNonePreferenceIfNeeded, boolean noneChecked,
+ @NonNull List<RoleApplicationItem> applicationItems,
+ @NonNull ArrayMap<String, Preference> oldPreferences, @NonNull Context context) {
+ PreferenceCategory preferenceCategory = oldPreferenceCategory;
+ if (preferenceCategory == null) {
+ preferenceCategory = new PreferenceCategory(context);
+ preferenceCategory.setKey(key);
+ preferenceCategory.setTitle(title);
+ }
+ preferenceScreen.addPreference(preferenceCategory);
+ if (addNonePreferenceIfNeeded) {
+ addNonePreferenceIfNeeded(preferenceCategory, noneChecked, oldPreferences, context);
+ }
+ addApplicationPreferences(preferenceCategory, applicationItems, oldPreferences, context);
+ }
+
+ private static boolean hasHolderApplication(
+ @NonNull List<RoleApplicationItem> applicationItems) {
+ int applicationItemsSize = applicationItems.size();
+ for (int i = 0; i < applicationItemsSize; i++) {
+ RoleApplicationItem applicationItem = applicationItems.get(i);
+ if (applicationItem.isHolderApplication()) {
return true;
}
}
return false;
}
- private void addPreference(@NonNull String key, @NonNull Drawable icon,
- @NonNull CharSequence title, boolean checked, @Nullable ApplicationInfo applicationInfo,
- @NonNull ArrayMap<String, Preference> oldPreferences,
- @NonNull PreferenceScreen preferenceScreen, @NonNull Context context) {
+ private void addNonePreferenceIfNeeded(@NonNull PreferenceGroup preferenceGroup,
+ boolean checked, @NonNull ArrayMap<String, Preference> oldPreferences,
+ @NonNull Context context) {
+ if (!mRole.shouldShowNone()) {
+ return;
+ }
+
+ Drawable icon = AppCompatResources.getDrawable(context, R.drawable.ic_remove_circle);
+ String title = getString(R.string.default_app_none);
+ addApplicationPreference(preferenceGroup, PREFERENCE_KEY_NONE, icon, title, checked, null,
+ oldPreferences, context);
+ }
+
+ private void addApplicationPreferences(@NonNull PreferenceGroup preferenceGroup,
+ @NonNull List<RoleApplicationItem> applicationItems,
+ @NonNull ArrayMap<String, Preference> oldPreferences, @NonNull Context context) {
+ int applicationItemsSize = applicationItems.size();
+ for (int i = 0; i < applicationItemsSize; i++) {
+ RoleApplicationItem applicationItem = applicationItems.get(i);
+ ApplicationInfo applicationInfo = applicationItem.getApplicationInfo();
+ int userId = UserHandle.getUserHandleForUid(applicationInfo.uid).getIdentifier();
+ String key = applicationInfo.packageName + "@" + userId;
+ Drawable icon = Utils.getBadgedIcon(context, applicationInfo);
+ String title = Utils.getFullAppLabel(applicationInfo, context);
+ boolean isHolderApplication = applicationItem.isHolderApplication();
+
+ addApplicationPreference(preferenceGroup, key, icon, title, isHolderApplication,
+ applicationInfo, oldPreferences, context);
+ }
+ }
+
+ private void addApplicationPreference(@NonNull PreferenceGroup preferenceGroup,
+ @NonNull String key, @NonNull Drawable icon, @NonNull CharSequence title,
+ boolean checked, @Nullable ApplicationInfo applicationInfo,
+ @NonNull ArrayMap<String, Preference> oldPreferences, @NonNull Context context) {
RoleApplicationPreference roleApplicationPreference =
(RoleApplicationPreference) oldPreferences.get(key);
TwoStatePreference preference;
@@ -233,7 +320,7 @@ public class DefaultAppChildFragment<PF extends PreferenceFragmentCompat
applicationInfo, user, context);
}
- preferenceScreen.addPreference(preference);
+ preferenceGroup.addPreference(preference);
}
private void onManageRoleHolderStateChanged(int state) {
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
index 48472bc5e..2a987167e 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListChildFragment.java
@@ -131,18 +131,16 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
} else {
oldWorkPreferenceCategory =
preferenceScreen.findPreference(PREFERENCE_KEY_WORK_CATEGORY);
- clearPreferenceCategory(
- oldWorkPreferenceCategory, preferenceScreen, oldWorkPreferences);
+ clearPreferenceCategory(oldWorkPreferenceCategory, oldWorkPreferences);
oldPrivatePreferenceCategory =
preferenceScreen.findPreference(PREFERENCE_KEY_PRIVATE_CATEGORY);
- clearPreferenceCategory(
- oldPrivatePreferenceCategory, preferenceScreen, oldPrivatePreferences);
+ clearPreferenceCategory(oldPrivatePreferenceCategory, oldPrivatePreferences);
clearPreferences(preferenceScreen, oldPreferences);
}
- addPreferences(preferenceScreen, roleItems, oldPreferences, this, mViewModel.getUser(),
+ addRolePreferences(preferenceScreen, roleItems, oldPreferences, this, mViewModel.getUser(),
context);
addMoreDefaultAppsPreference(preferenceScreen, oldPreferences, context);
addManageDomainUrlsPreference(preferenceScreen, oldPreferences, context);
@@ -155,7 +153,7 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
}
String workTitle = Utils.getEnterpriseString(context,
DefaultAppSettings.WORK_PROFILE_DEFAULT_APPS_TITLE, defaultWorkTitle);
- addPreferenceCategory(oldWorkPreferenceCategory, PREFERENCE_KEY_WORK_CATEGORY,
+ addRolePreferenceCategory(oldWorkPreferenceCategory, PREFERENCE_KEY_WORK_CATEGORY,
workTitle, preferenceScreen, workRoleItems, oldWorkPreferences, this,
mViewModel.getWorkProfile(), context);
}
@@ -166,22 +164,22 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
} else {
privateTitle = context.getString(R.string.default_apps_for_private_profile);
}
- addPreferenceCategory(oldPrivatePreferenceCategory, PREFERENCE_KEY_PRIVATE_CATEGORY,
- privateTitle, preferenceScreen, privateRoleItems, oldPrivatePreferences, this,
- mViewModel.getPrivateProfile(), context);
+ addRolePreferenceCategory(oldPrivatePreferenceCategory,
+ PREFERENCE_KEY_PRIVATE_CATEGORY, privateTitle, preferenceScreen,
+ privateRoleItems, oldPrivatePreferences, this, mViewModel.getPrivateProfile(),
+ context);
}
preferenceFragment.onPreferenceScreenChanged();
}
private static void clearPreferenceCategory(@Nullable PreferenceCategory preferenceCategory,
- @NonNull PreferenceScreen preferenceScreen,
@NonNull ArrayMap<String, Preference> oldPreferences) {
if (preferenceCategory == null) {
return;
}
clearPreferences(preferenceCategory, oldPreferences);
- preferenceScreen.removePreference(preferenceCategory);
+ preferenceCategory.getParent().removePreference(preferenceCategory);
preferenceCategory.setOrder(Preference.DEFAULT_ORDER);
}
@@ -197,7 +195,7 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
}
@NonNull
- private void addPreferenceCategory(
+ private void addRolePreferenceCategory(
@Nullable PreferenceCategory oldPreferenceCategory, @NonNull String key,
@Nullable String title, @NonNull PreferenceScreen preferenceScreen,
@NonNull List<RoleItem> roleItems, @NonNull ArrayMap<String, Preference> oldPreferences,
@@ -210,11 +208,10 @@ public class DefaultAppListChildFragment<PF extends PreferenceFragmentCompat
preferenceCategory.setTitle(title);
}
preferenceScreen.addPreference(preferenceCategory);
- addPreferences(preferenceCategory, roleItems, oldPreferences, listener,
- user, context);
+ addRolePreferences(preferenceCategory, roleItems, oldPreferences, listener, user, context);
}
- private void addPreferences(@NonNull PreferenceGroup preferenceGroup,
+ private void addRolePreferences(@NonNull PreferenceGroup preferenceGroup,
@NonNull List<RoleItem> roleItems, @NonNull ArrayMap<String, Preference> oldPreferences,
@NonNull Preference.OnPreferenceClickListener listener, @NonNull UserHandle user,
@NonNull Context context) {
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListViewModel.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListViewModel.java
index 718af090e..4a280bd58 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListViewModel.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppListViewModel.java
@@ -78,11 +78,11 @@ public class DefaultAppListViewModel extends AndroidViewModel {
mLiveData = Transformations.map(
new MergeRoleListLiveData(liveData,
Transformations.map(workLiveData,
- new RoleListFilterFunction(exclusivityPredicate))),
+ new ListLiveDataFilterFunction<>(exclusivityPredicate))),
sortFunction);
mWorkLiveData = Transformations.map(
Transformations.map(workLiveData,
- new RoleListFilterFunction(exclusivityPredicate.negate())),
+ new ListLiveDataFilterFunction<>(exclusivityPredicate.negate())),
sortFunction);
} else if (Flags.crossUserRoleUxBugfixEnabled() && isWorkProfile) {
// Show profile group exclusive roles from the profile parent (full user) in primary
@@ -92,7 +92,7 @@ public class DefaultAppListViewModel extends AndroidViewModel {
mLiveData = Transformations.map(
new MergeRoleListLiveData(liveData,
Transformations.map(profileParentLiveData,
- new RoleListFilterFunction(exclusivityPredicate))),
+ new ListLiveDataFilterFunction<>(exclusivityPredicate))),
sortFunction);
mWorkLiveData = null;
} else {
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppViewModel.java b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppViewModel.java
index cdee94b13..f4ba94f1d 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppViewModel.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/DefaultAppViewModel.java
@@ -18,10 +18,8 @@ package com.android.permissioncontroller.role.ui;
import android.app.Application;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.os.UserHandle;
import android.util.Log;
-import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
@@ -30,10 +28,12 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
+import com.android.permissioncontroller.role.utils.RoleUiBehaviorUtils;
import com.android.permissioncontroller.role.utils.UserUtils;
import com.android.role.controller.model.Role;
import java.util.List;
+import java.util.function.Predicate;
/**
* {@link ViewModel} for a default app.
@@ -48,7 +48,10 @@ public class DefaultAppViewModel extends AndroidViewModel {
private final UserHandle mUser;
@NonNull
- private final LiveData<List<Pair<ApplicationInfo, Boolean>>> mRoleLiveData;
+ private final LiveData<List<RoleApplicationItem>> mRecommendedLiveData;
+
+ @NonNull
+ private final LiveData<List<RoleApplicationItem>> mLiveData;
@NonNull
private final ManageRoleHolderStateLiveData mManageRoleHolderStateLiveData =
@@ -60,30 +63,42 @@ public class DefaultAppViewModel extends AndroidViewModel {
mRole = role;
// If EXCLUSIVITY_PROFILE_GROUP this user should be profile parent
- mUser = mRole.getExclusivity() == Role.EXCLUSIVITY_PROFILE_GROUP
+ mUser = role.getExclusivity() == Role.EXCLUSIVITY_PROFILE_GROUP
? UserUtils.getProfileParentOrSelf(user, application)
: user;
- RoleLiveData liveData = new RoleLiveData(mRole, mUser, application);
+ RoleLiveData userLiveData = new RoleLiveData(role, mUser, application);
RoleSortFunction sortFunction = new RoleSortFunction(application);
- if (mRole.getExclusivity() == Role.EXCLUSIVITY_PROFILE_GROUP) {
+ LiveData<List<RoleApplicationItem>> liveData;
+ if (role.getExclusivity() == Role.EXCLUSIVITY_PROFILE_GROUP) {
// Context user might be work profile, ensure we get a non-null UserHandle if work
// profile exists. getWorkProfile returns null if context user is work profile.
UserHandle workProfile = UserUtils.getWorkProfileOrSelf(application);
if (workProfile != null) {
RoleLiveData workLiveData = new RoleLiveData(role, workProfile, application);
- mRoleLiveData = Transformations.map(new MergeRoleLiveData(liveData, workLiveData),
+ liveData = Transformations.map(new MergeRoleLiveData(userLiveData, workLiveData),
sortFunction);
} else {
- mRoleLiveData = Transformations.map(liveData, sortFunction);
+ liveData = Transformations.map(userLiveData, sortFunction);
}
} else {
- mRoleLiveData = Transformations.map(liveData, sortFunction);
+ liveData = Transformations.map(userLiveData, sortFunction);
}
+ Predicate<RoleApplicationItem> recommendedApplicationFilter =
+ RoleUiBehaviorUtils.getRecommendedApplicationFilter(role, application);
+ mRecommendedLiveData = Transformations.map(liveData,
+ new ListLiveDataFilterFunction<>(recommendedApplicationFilter));
+ mLiveData = Transformations.map(liveData,
+ new ListLiveDataFilterFunction<>(recommendedApplicationFilter.negate()));
+ }
+
+ @NonNull
+ public LiveData<List<RoleApplicationItem>> getRecommendedLiveData() {
+ return mRecommendedLiveData;
}
@NonNull
- public LiveData<List<Pair<ApplicationInfo, Boolean>>> getRoleLiveData() {
- return mRoleLiveData;
+ public LiveData<List<RoleApplicationItem>> getLiveData() {
+ return mLiveData;
}
@NonNull
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListFilterFunction.java b/PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataFilterFunction.java
index b84fa80b9..8657db0ab 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListFilterFunction.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataFilterFunction.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package com.android.permissioncontroller.role.ui;
import androidx.annotation.NonNull;
@@ -25,29 +26,32 @@ import java.util.List;
import java.util.function.Predicate;
/**
- * A function for {@link androidx.lifecycle#map(androidx.lifecycle.LiveData, Function1)}
- * that filters a live data for role list.
+ * A function for
+ * {@link androidx.lifecycle.Transformations#map(androidx.lifecycle.LiveData, Function1)}
+ * that filters a live data for a list.
+ *
+ * @param <T> the type of the list elements
*/
-public class RoleListFilterFunction implements Function1<List<RoleItem>, List<RoleItem>> {
- private final Predicate<RoleItem> mPredicate;
+public class ListLiveDataFilterFunction<T> implements Function1<List<T>, List<T>> {
+ private final Predicate<T> mPredicate;
- public RoleListFilterFunction(@NonNull Predicate<RoleItem> predicate) {
+ public ListLiveDataFilterFunction(@NonNull Predicate<T> predicate) {
mPredicate = predicate;
}
@NonNull
@Override
- public List<RoleItem> invoke(@Nullable List<RoleItem> roleItems) {
- List<RoleItem> filteredRoleItems = new ArrayList<>();
- if (roleItems != null) {
- int roleItemsSize = roleItems.size();
- for (int i = 0; i < roleItemsSize; i++) {
- RoleItem roleItem = roleItems.get(i);
- if (mPredicate.test(roleItem)) {
- filteredRoleItems.add(roleItem);
+ public List<T> invoke(@Nullable List<T> items) {
+ List<T> filteredItems = new ArrayList<>();
+ if (items != null) {
+ int itemsSize = items.size();
+ for (int i = 0; i < itemsSize; i++) {
+ T item = items.get(i);
+ if (mPredicate.test(item)) {
+ filteredItems.add(item);
}
}
}
- return filteredRoleItems;
+ return filteredItems;
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataSortFunction.java b/PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataSortFunction.java
new file mode 100644
index 000000000..36e7afcc8
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/ListLiveDataSortFunction.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2025 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 androidx.annotation.NonNull;
+
+import kotlin.jvm.functions.Function1;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * A function for
+ * {@link androidx.lifecycle.Transformations#map(androidx.lifecycle.LiveData, Function1)}
+ * that sorts a live data for a list.
+ *
+ * @param <T> the type of the list elements
+ */
+public class ListLiveDataSortFunction<T> implements Function1<List<T>, List<T>> {
+
+ @NonNull
+ private final Comparator<T> mComparator;
+
+ public ListLiveDataSortFunction(@NonNull Comparator<T> comparator) {
+ mComparator = comparator;
+ }
+
+ @Override
+ public List<T> invoke(List<T> items) {
+ List<T> sortedItems = new ArrayList<>(items);
+ sortedItems.sort(mComparator);
+ return sortedItems;
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/MergeRoleLiveData.java b/PermissionController/src/com/android/permissioncontroller/role/ui/MergeRoleLiveData.java
index 31a02729a..72c2264ce 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/MergeRoleLiveData.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/MergeRoleLiveData.java
@@ -16,9 +16,6 @@
package com.android.permissioncontroller.role.ui;
-import android.content.pm.ApplicationInfo;
-import android.util.Pair;
-
import androidx.annotation.NonNull;
import androidx.lifecycle.MediatorLiveData;
@@ -28,7 +25,7 @@ import java.util.List;
/**
* {@link MediatorLiveData} that merges multiple {@link RoleLiveData} instances.
*/
-public class MergeRoleLiveData extends MediatorLiveData<List<Pair<ApplicationInfo, Boolean>>> {
+public class MergeRoleLiveData extends MediatorLiveData<List<RoleApplicationItem>> {
@NonNull
private final RoleLiveData[] mLiveDatas;
@@ -40,23 +37,23 @@ public class MergeRoleLiveData extends MediatorLiveData<List<Pair<ApplicationInf
for (int i = 0; i < liveDatasLength; i++) {
RoleLiveData liveData = mLiveDatas[i];
- addSource(liveData, roleItems -> onRoleChanged());
+ addSource(liveData, items -> onRoleChanged());
}
}
private void onRoleChanged() {
- List<Pair<ApplicationInfo, Boolean>> mergedQualifyingApplications = new ArrayList<>();
+ List<RoleApplicationItem> mergedItems = new ArrayList<>();
int liveDatasLength = mLiveDatas.length;
for (int i = 0; i < liveDatasLength; i++) {
RoleLiveData liveData = mLiveDatas[i];
- List<Pair<ApplicationInfo, Boolean>> qualifyingApplications = liveData.getValue();
- if (qualifyingApplications == null) {
+ List<RoleApplicationItem> items = liveData.getValue();
+ if (items == null) {
return;
}
- mergedQualifyingApplications.addAll(qualifyingApplications);
+ mergedItems.addAll(items);
}
- setValue(mergedQualifyingApplications);
+ setValue(mergedItems);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
index 60139f0c8..f411b0cd0 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RequestRoleFragment.java
@@ -30,7 +30,6 @@ import android.os.Process;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -236,7 +235,7 @@ public class RequestRoleFragment extends DialogFragment {
ViewModelProvider.Factory viewModelFactory = new RequestRoleViewModel.Factory(mRole,
requireActivity().getApplication());
mViewModel = new ViewModelProvider(this, viewModelFactory).get(RequestRoleViewModel.class);
- mViewModel.getRoleLiveData().observe(this, this::onRoleDataChanged);
+ mViewModel.getLiveData().observe(this, this::onApplicationListChanged);
mViewModel.getManageRoleHolderStateLiveData().observe(this,
this::onManageRoleHolderStateChanged);
}
@@ -272,9 +271,9 @@ public class RequestRoleFragment extends DialogFragment {
setDeniedOnceAndFinish();
}
- private void onRoleDataChanged(
- @NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
- mAdapter.replace(qualifyingApplications);
+ private void onApplicationListChanged(
+ @NonNull List<RoleApplicationItem> applicationItems) {
+ mAdapter.replace(applicationItems);
updateUi();
}
@@ -364,8 +363,8 @@ public class RequestRoleFragment extends DialogFragment {
boolean dontAskAgain = mDontAskAgainCheck != null && mDontAskAgainCheck.isChecked();
mAdapter.setDontAskAgain(dontAskAgain);
AlertDialog dialog = getDialog();
- boolean hasRoleData = mViewModel.getRoleLiveData().getValue() != null;
- dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(enabled && hasRoleData
+ boolean hasApplicationList = mViewModel.getLiveData().getValue() != null;
+ dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(enabled && hasApplicationList
&& (dontAskAgain || !mAdapter.isHolderApplicationChecked()));
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setEnabled(enabled);
}
@@ -420,12 +419,12 @@ public class RequestRoleFragment extends DialogFragment {
}
int count = mAdapter.getCount();
for (int i = 0; i < count; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = mAdapter.getItem(i);
- if (qualifyingApplication == null) {
+ RoleApplicationItem applicationItem = mAdapter.getItem(i);
+ if (applicationItem == null) {
// Skip the "None" item.
continue;
}
- ApplicationInfo applicationInfo = qualifyingApplication.first;
+ ApplicationInfo applicationInfo = applicationItem.getApplicationInfo();
if (Objects.equals(UserPackage.from(applicationInfo), userPackage)) {
return applicationInfo.uid;
}
@@ -493,8 +492,7 @@ public class RequestRoleFragment extends DialogFragment {
// We'll use a null to represent the "None" item.
@NonNull
- private final List<Pair<ApplicationInfo, Boolean>> mQualifyingApplications =
- new ArrayList<>();
+ private final List<RoleApplicationItem> mApplicationItems = new ArrayList<>();
@Nullable
private UserPackage mHolderUserPackage;
@@ -546,12 +544,12 @@ public class RequestRoleFragment extends DialogFragment {
}
public void onItemClicked(int position) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
- if (qualifyingApplication == null) {
+ RoleApplicationItem applicationItem = getItem(position);
+ if (applicationItem == null) {
mUserChecked = true;
mCheckedUserPackage = null;
} else {
- ApplicationInfo applicationInfo = qualifyingApplication.first;
+ ApplicationInfo applicationInfo = applicationItem.getApplicationInfo();
UserHandle user = UserHandle.getUserHandleForUid(applicationInfo.uid);
Intent restrictionIntent = mRole.getApplicationRestrictionIntentAsUser(
applicationInfo, user, mListView.getContext());
@@ -566,24 +564,24 @@ public class RequestRoleFragment extends DialogFragment {
notifyDataSetChanged();
}
- public void replace(@NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
- mQualifyingApplications.clear();
+ public void replace(@NonNull List<RoleApplicationItem> applicationItems) {
+ mApplicationItems.clear();
if (mRole.shouldShowNone()) {
- mQualifyingApplications.add(0, null);
+ mApplicationItems.add(0, null);
}
- mQualifyingApplications.addAll(qualifyingApplications);
- mHolderUserPackage = getHolderUserPackage(qualifyingApplications);
+ mApplicationItems.addAll(applicationItems);
+ mHolderUserPackage = getHolderUserPackage(applicationItems);
if (mUserChecked && mCheckedUserPackage != null) {
boolean isCheckedPackageNameFound = false;
int count = getCount();
for (int i = 0; i < count; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(i);
- if (qualifyingApplication == null) {
+ RoleApplicationItem applicationItem = getItem(i);
+ if (applicationItem == null) {
continue;
}
- ApplicationInfo applicationInfo = qualifyingApplication.first;
- UserPackage userPackage = UserPackage.from(applicationInfo);
+ UserPackage userPackage =
+ UserPackage.from(applicationItem.getApplicationInfo());
if (Objects.equals(userPackage, mCheckedUserPackage)) {
mUserChecked = true;
@@ -606,19 +604,15 @@ public class RequestRoleFragment extends DialogFragment {
@Nullable
private static UserPackage getHolderUserPackage(
- @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) {
+ @NonNull List<RoleApplicationItem> applicationItems) {
+ int applicationItemSize = applicationItems.size();
+ for (int i = 0; i < applicationItemSize; i++) {
+ RoleApplicationItem applicationItem = applicationItems.get(i);
+ if (applicationItem == null) {
continue;
}
- ApplicationInfo applicationInfo = qualifyingApplication.first;
- boolean isHolderApplication = qualifyingApplication.second;
-
- if (isHolderApplication) {
- return UserPackage.from(applicationInfo);
+ if (applicationItem.isHolderApplication()) {
+ return UserPackage.from(applicationItem.getApplicationInfo());
}
}
return null;
@@ -645,13 +639,13 @@ public class RequestRoleFragment extends DialogFragment {
@Override
public int getCount() {
- return mQualifyingApplications.size();
+ return mApplicationItems.size();
}
@Nullable
@Override
- public Pair<ApplicationInfo, Boolean> getItem(int position) {
- return mQualifyingApplications.get(position);
+ public RoleApplicationItem getItem(int position) {
+ return mApplicationItems.get(position);
}
@Override
@@ -660,9 +654,9 @@ public class RequestRoleFragment extends DialogFragment {
// Work around AbsListView.confirmCheckedPositionsById() not respecting our count.
return ListView.INVALID_ROW_ID;
}
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
- return qualifyingApplication == null ? 0
- : qualifyingApplication.first.packageName.hashCode();
+ RoleApplicationItem applicationItem = getItem(position);
+ return applicationItem == null ? 0
+ : applicationItem.getApplicationInfo().packageName.hashCode();
}
@Override
@@ -670,12 +664,11 @@ public class RequestRoleFragment extends DialogFragment {
if (!mDontAskAgain) {
return true;
}
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
- if (qualifyingApplication == null) {
+ RoleApplicationItem applicationItem = getItem(position);
+ if (applicationItem == null) {
return mHolderUserPackage == null;
} else {
- boolean isHolderApplication = qualifyingApplication.second;
- return isHolderApplication;
+ return applicationItem.isHolderApplication();
}
}
@@ -697,14 +690,14 @@ public class RequestRoleFragment extends DialogFragment {
LAYOUT_TRANSITION_DURATION_MILLIS);
}
- Pair<ApplicationInfo, Boolean> qualifyingApplication = getItem(position);
+ RoleApplicationItem applicationItem = getItem(position);
ApplicationInfo applicationInfo;
boolean restricted;
boolean checked;
Drawable icon;
String title;
String subtitle;
- if (qualifyingApplication == null) {
+ if (applicationItem == null) {
applicationInfo = null;
restricted = false;
checked = mCheckedUserPackage == null;
@@ -713,15 +706,14 @@ public class RequestRoleFragment extends DialogFragment {
subtitle = mHolderUserPackage == null ? context.getString(
R.string.request_role_current_default) : null;
} else {
- applicationInfo = qualifyingApplication.first;
+ applicationInfo = applicationItem.getApplicationInfo();
UserPackage userPackage = UserPackage.from(applicationInfo);
restricted = mRole.getApplicationRestrictionIntentAsUser(applicationInfo,
userPackage.user, context) != null;
checked = Objects.equals(userPackage, mCheckedUserPackage);
icon = Utils.getBadgedIcon(context, applicationInfo);
title = Utils.getAppLabel(applicationInfo, context);
- boolean isHolderApplication = qualifyingApplication.second;
- subtitle = isHolderApplication
+ subtitle = applicationItem.isHolderApplication()
? context.getString(R.string.request_role_current_default)
: checked ? context.getString(mRole.getRequestDescriptionResource()) : null;
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationItem.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationItem.java
new file mode 100644
index 000000000..b6c489ea1
--- /dev/null
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleApplicationItem.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2025 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.content.pm.ApplicationInfo;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Information about an application to be displayed in a list of applications qualifying for a role.
+ */
+public class RoleApplicationItem {
+
+ /**
+ * The {@link ApplicationInfo} for this application.
+ */
+ @NonNull
+ private final ApplicationInfo mApplicationInfo;
+
+ /**
+ * Whether this application is holding the role.
+ */
+ private final boolean mIsHolderApplication;
+
+ public RoleApplicationItem(@NonNull ApplicationInfo applicationInfo,
+ boolean isHolderApplication) {
+ mApplicationInfo = applicationInfo;
+ mIsHolderApplication = isHolderApplication;
+ }
+
+ @NonNull
+ public ApplicationInfo getApplicationInfo() {
+ return mApplicationInfo;
+ }
+
+ public boolean isHolderApplication() {
+ return mIsHolderApplication;
+ }
+}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListSortFunction.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListSortFunction.java
index ca059aa32..07b4db1f4 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListSortFunction.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleListSortFunction.java
@@ -23,30 +23,23 @@ import androidx.annotation.NonNull;
import kotlin.jvm.functions.Function1;
-import java.util.ArrayList;
import java.util.Comparator;
-import java.util.List;
/**
- * A function for {@link androidx.lifecycle#map(androidx.lifecycle.LiveData, Function1)}
+ * A function for
+ * {@link androidx.lifecycle.Transformations#map(androidx.lifecycle.LiveData, Function1)}
* that sorts a live data for role list.
*/
-public class RoleListSortFunction implements Function1<List<RoleItem>, List<RoleItem>> {
-
- @NonNull
- private final Comparator<RoleItem> mComparator;
+public class RoleListSortFunction extends ListLiveDataSortFunction<RoleItem> {
public RoleListSortFunction(@NonNull Context context) {
- Collator collator = Collator.getInstance(context.getResources().getConfiguration()
- .getLocales().get(0));
- mComparator = Comparator.comparing(roleItem -> context.getString(
- roleItem.getRole().getShortLabelResource()), collator);
+ super(createComparator(context));
}
- @Override
- public List<RoleItem> invoke(List<RoleItem> p1) {
- List<RoleItem> sorted = new ArrayList<>(p1);
- sorted.sort(mComparator);
- return sorted;
+ private static Comparator<RoleItem> createComparator(@NonNull Context context) {
+ Collator collator = Collator.getInstance(context.getResources().getConfiguration()
+ .getLocales().get(0));
+ return Comparator.comparing(item -> context.getString(
+ item.getRole().getShortLabelResource()), collator);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleLiveData.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleLiveData.java
index bb492f76d..1b6d42934 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleLiveData.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleLiveData.java
@@ -22,7 +22,6 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.os.UserHandle;
import android.util.Log;
-import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
@@ -38,7 +37,7 @@ import java.util.List;
/**
* {@link LiveData} for a role.
*/
-public class RoleLiveData extends AsyncTaskLiveData<List<Pair<ApplicationInfo, Boolean>>>
+public class RoleLiveData extends AsyncTaskLiveData<List<RoleApplicationItem>>
implements OnRoleHoldersChangedListener {
private static final String LOG_TAG = RoleLiveData.class.getSimpleName();
@@ -77,12 +76,12 @@ public class RoleLiveData extends AsyncTaskLiveData<List<Pair<ApplicationInfo, B
@Override
@WorkerThread
- protected List<Pair<ApplicationInfo, Boolean>> loadValueInBackground() {
+ protected List<RoleApplicationItem> loadValueInBackground() {
RoleManager roleManager = mContext.getSystemService(RoleManager.class);
List<String> holderPackageNames = roleManager.getRoleHoldersAsUser(mRole.getName(), mUser);
List<String> qualifyingPackageNames = mRole.getQualifyingPackagesAsUser(mUser, mContext);
- List<Pair<ApplicationInfo, Boolean>> qualifyingApplications = new ArrayList<>();
+ List<RoleApplicationItem> applicationItems = new ArrayList<>();
int qualifyingPackageNamesSize = qualifyingPackageNames.size();
for (int i = 0; i < qualifyingPackageNamesSize; i++) {
String qualifyingPackageName = qualifyingPackageNames.get(i);
@@ -98,9 +97,10 @@ public class RoleLiveData extends AsyncTaskLiveData<List<Pair<ApplicationInfo, B
continue;
}
boolean isHolderApplication = holderPackageNames.contains(qualifyingPackageName);
- qualifyingApplications.add(new Pair<>(qualifyingApplicationInfo, isHolderApplication));
+ applicationItems.add(
+ new RoleApplicationItem(qualifyingApplicationInfo, isHolderApplication));
}
- return qualifyingApplications;
+ return applicationItems;
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleSortFunction.java b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleSortFunction.java
index 10db9dbcd..9a06a6b01 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/RoleSortFunction.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/RoleSortFunction.java
@@ -17,10 +17,8 @@
package com.android.permissioncontroller.role.ui;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.icu.text.Collator;
import android.os.UserHandle;
-import android.util.Pair;
import androidx.annotation.NonNull;
@@ -28,34 +26,26 @@ import com.android.permissioncontroller.permission.utils.Utils;
import kotlin.jvm.functions.Function1;
-import java.util.ArrayList;
import java.util.Comparator;
-import java.util.List;
/**
- * A function for {@link androidx.lifecycle#map(androidx.lifecycle.LiveData, Function1)}
+ * A function for
+ * {@link androidx.lifecycle.Transformations#map(androidx.lifecycle.LiveData, Function1)}
* that sorts a live data for role.
*/
-public class RoleSortFunction implements Function1<List<Pair<ApplicationInfo, Boolean>>,
- List<Pair<ApplicationInfo, Boolean>>> {
-
- @NonNull
- private final Comparator<Pair<ApplicationInfo, Boolean>> mComparator;
+public class RoleSortFunction extends ListLiveDataSortFunction<RoleApplicationItem> {
public RoleSortFunction(@NonNull Context context) {
- Collator collator = Collator.getInstance(context.getResources().getConfiguration()
- .getLocales().get(0));
- Comparator<Pair<ApplicationInfo, Boolean>> labelComparator = Comparator.comparing(role ->
- Utils.getAppLabel(role.first, context), collator);
- Comparator<Pair<ApplicationInfo, Boolean>> userIdComparator = Comparator.comparingInt(role
- -> UserHandle.getUserHandleForUid(role.first.uid).getIdentifier());
- mComparator = labelComparator.thenComparing(userIdComparator);
+ super(createComparator(context));
}
- @Override
- public List<Pair<ApplicationInfo, Boolean>> invoke(List<Pair<ApplicationInfo, Boolean>> p1) {
- List<Pair<ApplicationInfo, Boolean>> sorted = new ArrayList<>(p1);
- sorted.sort(mComparator);
- return sorted;
+ private static Comparator<RoleApplicationItem> createComparator(@NonNull Context context) {
+ Collator collator = Collator.getInstance(context.getResources().getConfiguration()
+ .getLocales().get(0));
+ Comparator<RoleApplicationItem> labelComparator = Comparator.comparing(item ->
+ Utils.getAppLabel(item.getApplicationInfo(), context), collator);
+ Comparator<RoleApplicationItem> userIdComparator = Comparator.comparingInt(item
+ -> UserHandle.getUserHandleForUid(item.getApplicationInfo().uid).getIdentifier());
+ return labelComparator.thenComparing(userIdComparator);
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/AssistantRoleUiBehavior.java b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/AssistantRoleUiBehavior.java
index 4df3ccf99..c74c3d519 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/AssistantRoleUiBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/AssistantRoleUiBehavior.java
@@ -25,8 +25,15 @@ import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.permission.flags.Flags;
import com.android.permissioncontroller.R;
+import com.android.permissioncontroller.role.ui.RoleApplicationItem;
import com.android.role.controller.model.Role;
+import com.android.role.controller.util.SignedPackage;
+import com.android.role.controller.util.SignedPackageUtils;
+
+import java.util.List;
+import java.util.function.Predicate;
/***
* Class for UI behavior of Assistant role
@@ -39,14 +46,26 @@ public class AssistantRoleUiBehavior implements RoleUiBehavior {
@NonNull Context context) {
boolean isAutomotive =
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE);
-
if (isAutomotive) {
return null;
}
-
return new Intent(Settings.ACTION_VOICE_INPUT_SETTINGS);
}
+ @NonNull
+ @Override
+ public Predicate<RoleApplicationItem> getRecommendedApplicationFilter(
+ @NonNull Role role, @NonNull Context context) {
+ if (Flags.defaultAppsRecommendationEnabled()) {
+ List<SignedPackage> signedPackages = SignedPackage.parseList(
+ context.getResources().getString(R.string.config_recommendedAssistants));
+ return applicationItem -> SignedPackageUtils.matchesAny(
+ applicationItem.getApplicationInfo(), signedPackages, context);
+ } else {
+ return RoleUiBehavior.super.getRecommendedApplicationFilter(role, context);
+ }
+ }
+
@Nullable
@Override
public CharSequence getConfirmationMessage(@NonNull Role role, @NonNull String packageName,
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 ae5c03676..e1bf213a0 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/behavior/RoleUiBehavior.java
@@ -26,10 +26,12 @@ import androidx.annotation.Nullable;
import androidx.preference.Preference;
import com.android.permissioncontroller.role.ui.RequestRoleItemView;
+import com.android.permissioncontroller.role.ui.RoleApplicationItem;
import com.android.permissioncontroller.role.ui.TwoTargetPreference;
import com.android.role.controller.model.Role;
import java.util.List;
+import java.util.function.Predicate;
/***
* Interface for UI behavior for roles
@@ -92,6 +94,20 @@ public interface RoleUiBehavior {
@NonNull UserHandle user, @NonNull Context context) {}
/**
+ * Get the filter for recommended applications of this role.
+ *
+ * @param role the role to get the recommended application filter for
+ * @param context the {@code Context} to retrieve system services
+ *
+ * @return the filter for recommended applications
+ */
+ @NonNull
+ default Predicate<RoleApplicationItem> getRecommendedApplicationFilter(
+ @NonNull Role role, @NonNull Context context) {
+ return applicationItem -> false;
+ }
+
+ /**
* Get the confirmation message for adding an application as a holder of this role.
*
* @param role the role to get confirmation message for
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 0963635e7..7a13eb2b5 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessChildFragment.java
@@ -23,7 +23,6 @@ import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.ArrayMap;
-import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -37,6 +36,7 @@ import androidx.preference.TwoStatePreference;
import com.android.permissioncontroller.permission.utils.Utils;
import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData;
+import com.android.permissioncontroller.role.ui.RoleApplicationItem;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
import com.android.permissioncontroller.role.utils.RoleUiBehaviorUtils;
import com.android.role.controller.model.Role;
@@ -107,12 +107,12 @@ public class SpecialAppAccessChildFragment<PF extends PreferenceFragmentCompat
activity.getApplication());
mViewModel = new ViewModelProvider(this, viewModelFactory)
.get(SpecialAppAccessViewModel.class);
- mViewModel.getRoleLiveData().observe(this, this::onRoleChanged);
+ mViewModel.getLiveData().observe(this, this::onApplicationListChanged);
mViewModel.observeManageRoleHolderState(this, this::onManageRoleHolderStateChanged);
}
- private void onRoleChanged(
- @NonNull List<Pair<ApplicationInfo, Boolean>> qualifyingApplications) {
+ private void onApplicationListChanged(
+ @NonNull List<RoleApplicationItem> applicationItems) {
PF preferenceFragment = requirePreferenceFragment();
PreferenceManager preferenceManager = preferenceFragment.getPreferenceManager();
Context context = preferenceManager.getContext();
@@ -138,14 +138,12 @@ public class SpecialAppAccessChildFragment<PF extends PreferenceFragmentCompat
}
}
- int qualifyingApplicationsSize = qualifyingApplications.size();
- for (int i = 0; i < qualifyingApplicationsSize; i++) {
- Pair<ApplicationInfo, Boolean> qualifyingApplication = qualifyingApplications.get(i);
- ApplicationInfo qualifyingApplicationInfo = qualifyingApplication.first;
- boolean isHolderPackage = qualifyingApplication.second;
-
- String key = qualifyingApplicationInfo.packageName + '_'
- + qualifyingApplicationInfo.uid;
+ int applicationItemsSize = applicationItems.size();
+ for (int i = 0; i < applicationItemsSize; i++) {
+ RoleApplicationItem applicationItem = applicationItems.get(i);
+ ApplicationInfo applicationInfo = applicationItem.getApplicationInfo();
+ String key = applicationInfo.packageName + '_'
+ + applicationInfo.uid;
RoleApplicationPreference roleApplicationPreference =
(RoleApplicationPreference) oldPreferences.get(key);
TwoStatePreference preference;
@@ -153,24 +151,23 @@ public class SpecialAppAccessChildFragment<PF extends PreferenceFragmentCompat
roleApplicationPreference = preferenceFragment.createApplicationPreference();
preference = roleApplicationPreference.asTwoStatePreference();
preference.setKey(key);
- preference.setIcon(Utils.getBadgedIcon(context, qualifyingApplicationInfo));
- preference.setTitle(Utils.getFullAppLabel(qualifyingApplicationInfo, context));
+ preference.setIcon(Utils.getBadgedIcon(context, applicationInfo));
+ preference.setTitle(Utils.getFullAppLabel(applicationInfo, context));
preference.setPersistent(false);
preference.setOnPreferenceChangeListener((preference2, newValue) -> false);
preference.setOnPreferenceClickListener(this);
preference.getExtras().putParcelable(PREFERENCE_EXTRA_APPLICATION_INFO,
- qualifyingApplicationInfo);
+ applicationInfo);
} else {
preference = roleApplicationPreference.asTwoStatePreference();
}
- preference.setChecked(isHolderPackage);
- UserHandle user = UserHandle.getUserHandleForUid(qualifyingApplicationInfo.uid);
+ preference.setChecked(applicationItem.isHolderApplication());
+ UserHandle user = UserHandle.getUserHandleForUid(applicationInfo.uid);
roleApplicationPreference.setRestrictionIntent(
- mRole.getApplicationRestrictionIntentAsUser(qualifyingApplicationInfo, user,
- context));
+ mRole.getApplicationRestrictionIntentAsUser(applicationInfo, user, context));
RoleUiBehaviorUtils.prepareApplicationPreferenceAsUser(mRole, roleApplicationPreference,
- qualifyingApplicationInfo, user, context);
+ applicationInfo, user, context);
preferenceScreen.addPreference(preference);
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessViewModel.java b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessViewModel.java
index c12265d43..f4abc0db1 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessViewModel.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/specialappaccess/SpecialAppAccessViewModel.java
@@ -17,12 +17,10 @@
package com.android.permissioncontroller.role.ui.specialappaccess;
import android.app.Application;
-import android.content.pm.ApplicationInfo;
import android.os.Process;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
-import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
@@ -34,6 +32,7 @@ import androidx.lifecycle.ViewModelProvider;
import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData;
import com.android.permissioncontroller.role.ui.MergeRoleLiveData;
+import com.android.permissioncontroller.role.ui.RoleApplicationItem;
import com.android.permissioncontroller.role.ui.RoleLiveData;
import com.android.permissioncontroller.role.ui.RoleSortFunction;
import com.android.permissioncontroller.role.utils.UserUtils;
@@ -52,7 +51,7 @@ public class SpecialAppAccessViewModel extends AndroidViewModel {
private final Role mRole;
@NonNull
- private final LiveData<List<Pair<ApplicationInfo, Boolean>>> mRoleLiveData;
+ private final LiveData<List<RoleApplicationItem>> mLiveData;
@NonNull
private final ArrayMap<String, ManageRoleHolderStateLiveData> mManageRoleHolderStateLiveDatas =
@@ -68,17 +67,17 @@ public class SpecialAppAccessViewModel extends AndroidViewModel {
UserHandle workProfile = UserUtils.getWorkProfile(application);
RoleSortFunction sortFunction = new RoleSortFunction(application);
if (workProfile == null) {
- mRoleLiveData = Transformations.map(roleLiveData, sortFunction);
+ mLiveData = Transformations.map(roleLiveData, sortFunction);
} else {
RoleLiveData workRoleLiveData = new RoleLiveData(role, workProfile, application);
- mRoleLiveData = Transformations.map(new MergeRoleLiveData(roleLiveData,
+ mLiveData = Transformations.map(new MergeRoleLiveData(roleLiveData,
workRoleLiveData), sortFunction);
}
}
@NonNull
- public LiveData<List<Pair<ApplicationInfo, Boolean>>> getRoleLiveData() {
- return mRoleLiveData;
+ public LiveData<List<RoleApplicationItem>> getLiveData() {
+ return mLiveData;
}
/**
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 156656e33..dc8f3bf88 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppFragment.kt
@@ -27,11 +27,11 @@ 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.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
import com.android.permissioncontroller.role.ui.wear.model.DefaultAppConfirmDialogViewModelFactory
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
import com.android.role.controller.model.Role
import com.android.role.controller.model.Roles
@@ -46,14 +46,13 @@ class WearDefaultAppFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
- savedInstanceState: Bundle?
+ savedInstanceState: Bundle?,
): View? {
val roleName = arguments?.getString(Intent.EXTRA_ROLE_NAME) ?: ""
val user =
arguments?.let {
BundleCompat.getParcelable(it, Intent.EXTRA_USER, UserHandle::class.java)!!
- }
- ?: UserHandle.SYSTEM
+ } ?: UserHandle.SYSTEM
val activity = requireActivity()
role =
@@ -82,7 +81,7 @@ class WearDefaultAppFragment : Fragment() {
user,
role,
viewModel,
- confirmDialogViewModel
+ confirmDialogViewModel,
)
)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppHelper.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppHelper.kt
index 9e93f33c7..65548d9a1 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppHelper.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppHelper.kt
@@ -17,12 +17,11 @@
package com.android.permissioncontroller.role.ui.wear
import android.content.Context
-import android.content.pm.ApplicationInfo
import android.os.UserHandle
-import android.util.Pair
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.role.ui.DefaultAppViewModel
+import com.android.permissioncontroller.role.ui.RoleApplicationItem
import com.android.permissioncontroller.role.ui.wear.model.ConfirmDialogArgs
import com.android.permissioncontroller.role.ui.wear.model.DefaultAppConfirmDialogViewModel
import com.android.permissioncontroller.role.utils.RoleUiBehaviorUtils
@@ -39,13 +38,13 @@ class WearDefaultAppHelper(
fun getTitle() = context.getString(role.labelResource)
fun getNonePreference(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>
+ applicationItems: List<RoleApplicationItem>
): WearRoleApplicationPreference? =
if (role.shouldShowNone()) {
WearRoleApplicationPreference(
context = context,
defaultLabel = context.getString(R.string.default_app_none),
- checked = !hasHolderApplication(qualifyingApplications),
+ checked = !hasHolderApplication(applicationItems),
onDefaultCheckChanged = { _ -> viewModel.setNoneDefaultApp() },
)
.apply { icon = context.getDrawable(R.drawable.ic_remove_circle) }
@@ -54,12 +53,12 @@ class WearDefaultAppHelper(
}
fun getPreferences(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>
+ applicationItems: List<RoleApplicationItem>
): List<WearRoleApplicationPreference> {
- return qualifyingApplications
- .map { pair ->
- val appInfo = pair.first
- val selected = pair.second
+ return applicationItems
+ .map { applicationItem ->
+ val appInfo = applicationItem.applicationInfo
+ val selected = applicationItem.isHolderApplication
val user = UserHandle.getUserHandleForUid(appInfo.uid)
WearRoleApplicationPreference(
context = context,
@@ -127,7 +126,6 @@ class WearDefaultAppHelper(
fun getDescription() = context.getString(role.descriptionResource)
- private fun hasHolderApplication(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>
- ): Boolean = qualifyingApplications.map { it.second }.contains(true)
+ private fun hasHolderApplication(applicationItems: List<RoleApplicationItem>): Boolean =
+ applicationItems.map { it.isHolderApplication }.contains(true)
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListScreen.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListScreen.kt
index d5b93e318..131897fb9 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppListScreen.kt
@@ -29,11 +29,11 @@ import androidx.compose.ui.res.stringResource
import androidx.lifecycle.LiveData
import androidx.wear.compose.material.Text
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
import com.android.permissioncontroller.role.ui.RoleItem
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
@Composable
fun WearDefaultAppListScreen(
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppScreen.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppScreen.kt
index 60cfcda47..c3cbe4670 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearDefaultAppScreen.kt
@@ -16,8 +16,6 @@
package com.android.permissioncontroller.role.ui.wear
-import android.content.pm.ApplicationInfo
-import android.util.Pair
import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
@@ -25,21 +23,22 @@ import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionConfirmationDialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionListFooter
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControl
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.role.ui.RoleApplicationItem
import com.android.permissioncontroller.role.ui.wear.model.ConfirmDialogArgs
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionConfirmationDialog
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionListFooter
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControl
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
@Composable
fun WearDefaultAppScreen(helper: WearDefaultAppHelper) {
- val roleLiveData = helper.viewModel.roleLiveData.observeAsState(emptyList())
+ val roleLiveData = helper.viewModel.liveData.observeAsState(emptyList())
val showConfirmDialog =
helper.confirmDialogViewModel.showConfirmDialogLiveData.observeAsState(false)
var isLoading by remember { mutableStateOf(true) }
@@ -60,11 +59,11 @@ fun WearDefaultAppScreen(helper: WearDefaultAppHelper) {
@Composable
private fun WearDefaultAppContent(
isLoading: Boolean,
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>,
+ applicationItems: List<RoleApplicationItem>,
helper: WearDefaultAppHelper,
) {
ScrollableScreen(title = helper.getTitle(), isLoading = isLoading) {
- helper.getNonePreference(qualifyingApplications)?.let {
+ helper.getNonePreference(applicationItems)?.let {
item {
WearPermissionToggleControl(
label = it.title.toString(),
@@ -76,7 +75,7 @@ private fun WearDefaultAppContent(
)
}
}
- for (pref in helper.getPreferences(qualifyingApplications)) {
+ for (pref in helper.getPreferences(applicationItems)) {
item {
WearPermissionToggleControl(
label = pref.title.toString(),
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleFragment.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleFragment.kt
index af8dc5e92..99f2fe36f 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleFragment.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleFragment.kt
@@ -231,11 +231,11 @@ class WearRequestRoleFragment : Fragment() {
if (userPackage == null) {
return -1
}
- viewModel.roleLiveData.value?.let { qualifyingApplications ->
- for (qualifyingApplication in qualifyingApplications) {
- val qualifyingApplicationInfo = qualifyingApplication.first
- val qualifyingAppUserPackage = UserPackage.from(qualifyingApplicationInfo)
- if (Objects.equals(qualifyingAppUserPackage, userPackage)) {
+ viewModel.liveData.value?.let { applicationItems ->
+ for (applicationItem in applicationItems) {
+ val qualifyingApplicationInfo = applicationItem.applicationInfo
+ val qualifyingUserPackage = UserPackage.from(qualifyingApplicationInfo)
+ if (Objects.equals(qualifyingUserPackage, userPackage)) {
return qualifyingApplicationInfo.uid
}
}
@@ -244,12 +244,10 @@ class WearRequestRoleFragment : Fragment() {
}
private fun getHolderUserPackage(): UserPackage? {
- viewModel.roleLiveData.value?.let { qualifyingApplications ->
+ viewModel.liveData.value?.let { qualifyingApplications ->
for (qualifyingApplication in qualifyingApplications) {
- val isHolderApplication = qualifyingApplication.second
- if (isHolderApplication) {
- val applicationInfo = qualifyingApplication.first
- return UserPackage.from(applicationInfo)
+ if (qualifyingApplication.isHolderApplication) {
+ return UserPackage.from(qualifyingApplication.applicationInfo)
}
}
}
@@ -257,7 +255,7 @@ class WearRequestRoleFragment : Fragment() {
}
private fun getQualifyingApplicationCount(): Int {
- return viewModel.roleLiveData.value?.size ?: -1
+ return viewModel.liveData.value?.size ?: -1
}
private fun setDeniedAlwaysAndFinish() {
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleHelper.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleHelper.kt
index f8a1b1ee8..f95f1ee90 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleHelper.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleHelper.kt
@@ -20,12 +20,12 @@ import android.content.Context
import android.content.pm.ApplicationInfo
import android.graphics.drawable.Drawable
import android.os.Process
-import android.util.Pair
import com.android.permissioncontroller.R
import com.android.permissioncontroller.permission.utils.Utils
import com.android.permissioncontroller.role.UserPackage
import com.android.permissioncontroller.role.model.UserDeniedManager
import com.android.permissioncontroller.role.ui.RequestRoleViewModel
+import com.android.permissioncontroller.role.ui.RoleApplicationItem
import com.android.permissioncontroller.role.ui.wear.model.WearRequestRoleViewModel
import com.android.role.controller.model.Role
import java.util.Objects
@@ -50,11 +50,11 @@ class WearRequestRoleHelper(
UserDeniedManager.getInstance(context).isDeniedOnce(roleName, packageName)
fun getNonePreference(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>,
+ applicationItems: List<RoleApplicationItem>,
selectedPackage: UserPackage?,
): RequestRolePreference? =
if (role.shouldShowNone()) {
- val hasHolderApplication = hasHolderApplication(qualifyingApplications)
+ val hasHolderApplication = hasHolderApplication(applicationItems)
RequestRolePreference(
userPackage = null,
label = context.getString(R.string.default_app_none),
@@ -79,48 +79,47 @@ class WearRequestRoleHelper(
}
fun getPreferences(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>,
+ applicationItems: List<RoleApplicationItem>,
selectedPackage: UserPackage?,
): List<RequestRolePreference> {
- return qualifyingApplications
- .map { qualifyingApplication ->
- val userPackage = UserPackage.from(qualifyingApplication.first)
+ return applicationItems
+ .map { applicationItem ->
+ val userPackage = UserPackage.from(applicationItem.applicationInfo)
RequestRolePreference(
userPackage = userPackage,
- label = Utils.getAppLabel(qualifyingApplication.first, context),
+ label = Utils.getAppLabel(applicationItem.applicationInfo, context),
subTitle =
- if (qualifyingApplication.second) {
+ if (applicationItem.isHolderApplication) {
context.getString(R.string.request_role_current_default)
} else {
context.getString(role.requestDescriptionResource)
},
- icon = Utils.getBadgedIcon(context, qualifyingApplication.first),
+ icon = Utils.getBadgedIcon(context, applicationItem.applicationInfo),
checked = Objects.equals(userPackage, selectedPackage),
enabled =
if (!wearViewModel.dontAskAgain()) {
true
} else {
- qualifyingApplication.second
+ applicationItem.isHolderApplication
},
- isHolder = qualifyingApplication.second,
+ isHolder = applicationItem.isHolderApplication,
)
}
.toList()
}
- private fun hasHolderApplication(
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>
- ): Boolean = qualifyingApplications.map { it.second }.contains(true)
+ private fun hasHolderApplication(applicationItems: List<RoleApplicationItem>): Boolean =
+ applicationItems.map { it.isHolderApplication }.contains(true)
fun shouldSetAsDefaultEnabled(enabled: Boolean): Boolean {
return enabled && (wearViewModel.dontAskAgain() || !wearViewModel.isHolderChecked)
}
- fun initializeHolderPackage(qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>) {
+ fun initializeHolderPackage(applicationItems: List<RoleApplicationItem>) {
wearViewModel.holderPackage =
- qualifyingApplications
- .find { it.second }
- ?.first
+ applicationItems
+ .find { it.isHolderApplication }
+ ?.applicationInfo
?.let { appInfo -> UserPackage.from(appInfo) }
}
diff --git a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleScreen.kt b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleScreen.kt
index b4758c88b..1367f4c3c 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleScreen.kt
+++ b/PermissionController/src/com/android/permissioncontroller/role/ui/wear/WearRequestRoleScreen.kt
@@ -16,8 +16,6 @@
package com.android.permissioncontroller.role.ui.wear
-import android.content.pm.ApplicationInfo
-import android.util.Pair
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
@@ -31,18 +29,19 @@ import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.ScrollableScreen
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButton
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionListFooter
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControl
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlStyle
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
import com.android.permissioncontroller.role.UserPackage
import com.android.permissioncontroller.role.ui.ManageRoleHolderStateLiveData
+import com.android.permissioncontroller.role.ui.RoleApplicationItem
+import com.android.permissioncontroller.wear.permission.components.ScrollableScreen
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButton
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionListFooter
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControl
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlStyle
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
@Composable
fun WearRequestRoleScreen(
@@ -50,7 +49,7 @@ fun WearRequestRoleScreen(
onSetAsDefault: (Boolean, UserPackage?) -> Unit,
onCanceled: () -> Unit,
) {
- val roleLiveData = helper.viewModel.roleLiveData.observeAsState(emptyList())
+ val roleLiveData = helper.viewModel.liveData.observeAsState(emptyList())
val manageRoleHolderState =
helper.viewModel.manageRoleHolderStateLiveData.observeAsState(
ManageRoleHolderStateLiveData.STATE_WORKING
@@ -102,7 +101,7 @@ internal fun WearRequestRoleContent(
materialUIVersion: WearPermissionMaterialUIVersion,
isLoading: Boolean,
helper: WearRequestRoleHelper,
- qualifyingApplications: List<Pair<ApplicationInfo, Boolean>>,
+ applicationItems: List<RoleApplicationItem>,
enabled: Boolean,
dontAskAgain: Boolean,
selectedPackage: UserPackage?,
@@ -118,7 +117,7 @@ internal fun WearRequestRoleContent(
showTimeText = false,
isLoading = isLoading,
) {
- helper.getNonePreference(qualifyingApplications, selectedPackage)?.let { pref ->
+ helper.getNonePreference(applicationItems, selectedPackage)?.let { pref ->
item {
WearPermissionToggleControl(
materialUIVersion = materialUIVersion,
@@ -143,7 +142,7 @@ internal fun WearRequestRoleContent(
}
}
- for (pref in helper.getPreferences(qualifyingApplications, selectedPackage)) {
+ for (pref in helper.getPreferences(applicationItems, selectedPackage)) {
item {
WearPermissionToggleControl(
materialUIVersion = materialUIVersion,
diff --git a/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java b/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
index c11a74259..255d88ff0 100644
--- a/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
+++ b/PermissionController/src/com/android/permissioncontroller/role/utils/RoleUiBehaviorUtils.java
@@ -26,12 +26,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.permissioncontroller.role.ui.RequestRoleItemView;
+import com.android.permissioncontroller.role.ui.RoleApplicationItem;
import com.android.permissioncontroller.role.ui.RoleApplicationPreference;
import com.android.permissioncontroller.role.ui.RolePreference;
import com.android.permissioncontroller.role.ui.behavior.RoleUiBehavior;
import com.android.role.controller.model.Role;
import java.util.List;
+import java.util.function.Predicate;
/**
* Utility methods for Role UI behavior
@@ -117,6 +119,19 @@ public final class RoleUiBehaviorUtils {
}
/**
+ * @see RoleUiBehavior#getRecommendedApplicationFilter
+ */
+ @NonNull
+ public static Predicate<RoleApplicationItem> getRecommendedApplicationFilter(
+ @NonNull Role role, @NonNull Context context) {
+ RoleUiBehavior uiBehavior = getUiBehavior(role);
+ if (uiBehavior == null) {
+ return applicationItem -> false;
+ }
+ return uiBehavior.getRecommendedApplicationFilter(role, context);
+ }
+
+ /**
* @see RoleUiBehavior#getConfirmationMessage
*/
@Nullable
diff --git a/PermissionController/tests/inprocess/src/com/android/permissioncontroller/permission/ui/model/PermissionUsageDetailsViewModelTest.kt b/PermissionController/tests/inprocess/src/com/android/permissioncontroller/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
index eb5fdefdb..644bdfd15 100644
--- a/PermissionController/tests/inprocess/src/com/android/permissioncontroller/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
+++ b/PermissionController/tests/inprocess/src/com/android/permissioncontroller/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
@@ -16,16 +16,14 @@
package com.android.permissioncontroller.permission.ui.model
-import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.DeviceFlagsValueProvider
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.SavedStateHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.modules.utils.build.SdkLevel
-import com.android.permission.flags.Flags
import com.android.permissioncontroller.PermissionControllerApplication
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModelV2
import com.google.common.truth.Truth
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
@@ -42,15 +40,14 @@ class PermissionUsageDetailsViewModelTest {
@JvmField @Rule val instantTaskExecutorRule = InstantTaskExecutorRule()
@Test
- @RequiresFlagsEnabled(Flags.FLAG_LIVEDATA_REFACTOR_PERMISSION_TIMELINE_ENABLED)
fun verifyUiStateIsGeneratedSuccessfully() {
Assume.assumeTrue(SdkLevel.isAtLeastS())
lateinit var uiState: PermissionUsageDetailsUiState.Success
val viewModel =
- PermissionUsageDetailsViewModelV2.create(
+ PermissionUsageDetailsViewModel.create(
PermissionControllerApplication.get(),
SavedStateHandle(mapOf("show7Days" to true, "showSystem" to true)),
- LOCATION_PERMISSION_GROUP
+ LOCATION_PERMISSION_GROUP,
)
val countDownLatch = CountDownLatch(1)
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
index edaea9aba..4334026c3 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/ui/model/PermissionUsageDetailsViewModelTest.kt
@@ -30,8 +30,8 @@ import com.android.permissioncontroller.PermissionControllerApplication
import com.android.permissioncontroller.appops.data.model.v31.DiscretePackageOpsModel
import com.android.permissioncontroller.appops.data.model.v31.DiscretePackageOpsModel.DiscreteOpModel
import com.android.permissioncontroller.permission.domain.usecase.v31.GetPermissionGroupUsageDetailsUseCase
+import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel
import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModel.PermissionUsageDetailsUiState
-import com.android.permissioncontroller.permission.ui.model.v31.PermissionUsageDetailsViewModelV2
import com.android.permissioncontroller.permission.utils.LocationUtils
import com.android.permissioncontroller.permission.utils.StringUtils
import com.android.permissioncontroller.permission.utils.Utils
@@ -67,7 +67,7 @@ import org.mockito.quality.Strictness
/**
* These unit tests are for new permission timeline implementation, the new view model class is
- * [PermissionUsageDetailsViewModelV2]
+ * [PermissionUsageDetailsViewModel]
*/
@RunWith(AndroidJUnit4::class)
class PermissionUsageDetailsViewModelTest {
@@ -107,7 +107,7 @@ class PermissionUsageDetailsViewModelTest {
any(),
anyInt(),
anyInt(),
- any(Array<String>::class.java)
+ any(Array<String>::class.java),
)
)
.thenReturn("Duration Summary")
@@ -119,7 +119,7 @@ class PermissionUsageDetailsViewModelTest {
systemPackageName to
getPackageInfoModel(
systemPackageName,
- applicationFlags = ApplicationInfo.FLAG_SYSTEM
+ applicationFlags = ApplicationInfo.FLAG_SYSTEM,
),
)
.toMutableMap()
@@ -127,7 +127,7 @@ class PermissionUsageDetailsViewModelTest {
packageRepository =
FakePackageRepository(
packageInfos,
- packagesAndLabels = mapOf(testPackageName to testPackageLabel)
+ packagesAndLabels = mapOf(testPackageName to testPackageLabel),
)
}
@@ -140,9 +140,7 @@ class PermissionUsageDetailsViewModelTest {
fun verifyOnlyNonSystemAppsAreShown() = runTest {
val accessTimeMillis = (getCurrentTime() - TimeUnit.HOURS.toMillis(5))
val appOpEvents =
- listOf(
- DiscreteOpModel(AppOpsManager.OPSTR_COARSE_LOCATION, accessTimeMillis, -1),
- )
+ listOf(DiscreteOpModel(AppOpsManager.OPSTR_COARSE_LOCATION, accessTimeMillis, -1))
val discretePackageOps = flow {
emit(
listOf(
@@ -176,8 +174,8 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_COARSE_LOCATION,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val discretePackageOps = flow {
emit(
@@ -192,7 +190,7 @@ class PermissionUsageDetailsViewModelTest {
getViewModel(
LOCATION_PERMISSION_GROUP,
discretePackageOps,
- savedStateMap = mapOf("show7Days" to false, "showSystem" to true)
+ savedStateMap = mapOf("show7Days" to false, "showSystem" to true),
)
val uiState = getPermissionUsageDetailsUiState(underTest)
@@ -210,13 +208,13 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_COARSE_LOCATION,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -225,7 +223,7 @@ class PermissionUsageDetailsViewModelTest {
getViewModel(
LOCATION_PERMISSION_GROUP,
discretePackageOps,
- savedStateMap = mapOf("show7Days" to false, "showSystem" to false)
+ savedStateMap = mapOf("show7Days" to false, "showSystem" to false),
)
val uiState = getPermissionUsageDetailsUiState(underTest)
@@ -240,13 +238,13 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_COARSE_LOCATION,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(systemPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(systemPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -255,7 +253,7 @@ class PermissionUsageDetailsViewModelTest {
getViewModel(
LOCATION_PERMISSION_GROUP,
discretePackageOps,
- savedStateMap = mapOf("show7Days" to false, "showSystem" to false)
+ savedStateMap = mapOf("show7Days" to false, "showSystem" to false),
)
val uiState = getPermissionUsageDetailsUiState(underTest)
@@ -271,18 +269,18 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessStartWithIn24Hours,
- TimeUnit.MINUTES.toMillis(5)
+ TimeUnit.MINUTES.toMillis(5),
),
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessStartBefore24Hours,
- TimeUnit.MINUTES.toMillis(7)
+ TimeUnit.MINUTES.toMillis(7),
),
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -304,18 +302,18 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessTimeWithIn24Hours,
- TimeUnit.MINUTES.toMillis(5)
+ TimeUnit.MINUTES.toMillis(5),
),
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessTimeBefore24Hours,
- TimeUnit.MINUTES.toMillis(7)
+ TimeUnit.MINUTES.toMillis(7),
),
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -344,13 +342,13 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(5)
- ),
+ TimeUnit.MINUTES.toMillis(5),
+ )
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -371,13 +369,13 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_CAMERA,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
@@ -397,22 +395,16 @@ class PermissionUsageDetailsViewModelTest {
whenever(application.getString(anyInt())).thenReturn("emergency attr label")
val accessTimeMillis = (getCurrentTime() - TimeUnit.HOURS.toMillis(5))
val appOpEvents =
- listOf(
- DiscreteOpModel(AppOpsManager.OPSTR_EMERGENCY_LOCATION, accessTimeMillis, -1),
- )
+ listOf(DiscreteOpModel(AppOpsManager.OPSTR_EMERGENCY_LOCATION, accessTimeMillis, -1))
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
- val underTest =
- getViewModel(
- LOCATION_PERMISSION_GROUP,
- discretePackageOps,
- )
+ val underTest = getViewModel(LOCATION_PERMISSION_GROUP, discretePackageOps)
val uiState = getPermissionUsageDetailsUiState(underTest)
assertThat(uiState.appPermissionAccessUiInfoList.size).isEqualTo(1)
val timelineRow = uiState.appPermissionAccessUiInfoList.first()
@@ -429,21 +421,15 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_COARSE_LOCATION,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val actualData =
- listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
- )
+ listOf(DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents))
val discretePackageOps = MutableStateFlow(emptyList<DiscretePackageOpsModel>())
discretePackageOps.emit(emptyList())
- val underTest =
- getViewModel(
- LOCATION_PERMISSION_GROUP,
- discretePackageOps,
- )
+ val underTest = getViewModel(LOCATION_PERMISSION_GROUP, discretePackageOps)
val result by collectLastValue(underTest.permissionUsageDetailsUiStateFlow)
var uiState = result as PermissionUsageDetailsUiState.Success
assertThat(uiState.appPermissionAccessUiInfoList).isEmpty()
@@ -463,22 +449,18 @@ class PermissionUsageDetailsViewModelTest {
DiscreteOpModel(
AppOpsManager.OPSTR_COARSE_LOCATION,
accessTimeMillis,
- TimeUnit.MINUTES.toMillis(1)
- ),
+ TimeUnit.MINUTES.toMillis(1),
+ )
)
val discretePackageOps = flow {
emit(
listOf(
- DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents),
+ DiscretePackageOpsModel(testPackageName, currentUser.identifier, appOpEvents)
)
)
}
- val underTest =
- getViewModel(
- LOCATION_PERMISSION_GROUP,
- discretePackageOps,
- )
+ val underTest = getViewModel(LOCATION_PERMISSION_GROUP, discretePackageOps)
val uiState = getPermissionUsageDetailsUiState(underTest)
assertThat(uiState.show7Days).isFalse()
@@ -517,20 +499,20 @@ class PermissionUsageDetailsViewModelTest {
permissionGroup: String,
discretePackageOps: Flow<List<DiscretePackageOpsModel>>,
savedStateMap: Map<String, Boolean> = mapOf("show7Days" to false, "showSystem" to false),
- pkgRepository: PackageRepository = packageRepository
+ pkgRepository: PackageRepository = packageRepository,
) =
- PermissionUsageDetailsViewModelV2(
+ PermissionUsageDetailsViewModel(
application,
getPermissionGroupUsageDetailsUseCase(permissionGroup, discretePackageOps),
SavedStateHandle(savedStateMap),
permissionGroup,
scope = backgroundScope,
StandardTestDispatcher(testScheduler),
- packageRepository = pkgRepository
+ packageRepository = pkgRepository,
)
private fun TestScope.getPermissionUsageDetailsUiState(
- viewModel: PermissionUsageDetailsViewModelV2
+ viewModel: PermissionUsageDetailsViewModel
): PermissionUsageDetailsUiState.Success {
val result by collectLastValue(viewModel.permissionUsageDetailsUiStateFlow)
return result as PermissionUsageDetailsUiState.Success
@@ -542,7 +524,7 @@ class PermissionUsageDetailsViewModelTest {
permissionsFlags: List<Int> =
listOf(
PackageInfo.REQUESTED_PERMISSION_GRANTED,
- PackageInfo.REQUESTED_PERMISSION_GRANTED
+ PackageInfo.REQUESTED_PERMISSION_GRANTED,
),
applicationFlags: Int = 0,
) = PackageInfoModel(packageName, requestedPermissions, permissionsFlags, applicationFlags)
diff --git a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/utils/GrantRevokeTests.kt b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/utils/GrantRevokeTests.kt
index 28f69b136..593061a83 100644
--- a/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/utils/GrantRevokeTests.kt
+++ b/PermissionController/tests/mocking/src/com/android/permissioncontroller/tests/mocking/permission/utils/GrantRevokeTests.kt
@@ -241,7 +241,7 @@ class GrantRevokeTests {
perms: Map<String, LightPermission> = emptyMap()
): LightAppPermGroup {
val pGi = LightPermGroupInfo(PERM_GROUP_NAME, TEST_PACKAGE_NAME, 0, 0, 0, false)
- return LightAppPermGroup(pkgInfo, pGi, perms, false, false)
+ return LightAppPermGroup(pkgInfo, pGi, perms, false, false, false)
}
/**
diff --git a/PermissionController/tests/permissionui/Android.bp b/PermissionController/tests/permissionui/Android.bp
index e0e8fed10..8cc91bd99 100644
--- a/PermissionController/tests/permissionui/Android.bp
+++ b/PermissionController/tests/permissionui/Android.bp
@@ -72,6 +72,8 @@ android_test {
":PermissionUiUseAdditionalPermissionApp",
":PermissionUiUseTwoAdditionalPermissionsApp",
":PermissionUiReadCalendarPermissionApp",
+ ":PermissionUiUseLegacyBodySensorsPermissionApp",
+ ":PermissionUiUseReadHeartRatePermissionApp",
],
per_testcase_directory: true,
}
diff --git a/PermissionController/tests/permissionui/AndroidTest.xml b/PermissionController/tests/permissionui/AndroidTest.xml
index a4aa03abe..9cadbd12f 100644
--- a/PermissionController/tests/permissionui/AndroidTest.xml
+++ b/PermissionController/tests/permissionui/AndroidTest.xml
@@ -57,6 +57,10 @@
value="/data/local/tmp/pc-permissionui/PermissionUiUseTwoAdditionalPermissionsApp.apk" />
<option name="push-file" key="PermissionUiReadCalendarPermissionApp.apk"
value="/data/local/tmp/pc-permissionui/PermissionUiReadCalendarPermissionApp.apk" />
+ <option name="push-file" key="PermissionUiUseLegacyBodySensorsPermissionApp.apk"
+ value="/data/local/tmp/pc-permissionui/PermissionUiUseLegacyBodySensorsPermissionApp.apk" />
+ <option name="push-file" key="PermissionUiUseReadHeartRatePermissionApp.apk"
+ value="/data/local/tmp/pc-permissionui/PermissionUiUseReadHeartRatePermissionApp.apk" />
</target_preparer>
<!-- Uninstall test-apps -->
diff --git a/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/Android.bp b/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/Android.bp
new file mode 100644
index 000000000..eb0e2d0fc
--- /dev/null
+++ b/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/Android.bp
@@ -0,0 +1,34 @@
+//
+// Copyright (C) 2025 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "packages_modules_Permission_PermissionController_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "packages_modules_Permission_PermissionController_license",
+ ],
+}
+
+android_test_helper_app {
+ name: "PermissionUiUseLegacyBodySensorsPermissionApp",
+
+ srcs: ["src/**/*.kt"],
+
+ sdk_version: "34",
+}
diff --git a/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/AndroidManifest.xml b/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/AndroidManifest.xml
new file mode 100644
index 000000000..fac299b3e
--- /dev/null
+++ b/PermissionController/tests/permissionui/PermissionUiUseLegacyBodySensorsPermissionApp/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.permissioncontroller.tests.appthatrequestpermission">
+
+ <uses-permission android:name="android.permission.BODY_SENSORS" />
+ <uses-permission android:name="android.permission.BODY_SENSORS_BACKGROUND" />
+
+ <application />
+</manifest>
diff --git a/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/Android.bp b/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/Android.bp
new file mode 100644
index 000000000..ccc9c9636
--- /dev/null
+++ b/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/Android.bp
@@ -0,0 +1,34 @@
+//
+// Copyright (C) 2025 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 {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "packages_modules_Permission_PermissionController_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: [
+ "packages_modules_Permission_PermissionController_license",
+ ],
+}
+
+android_test_helper_app {
+ name: "PermissionUiUseReadHeartRatePermissionApp",
+
+ srcs: ["src/**/*.kt"],
+
+ sdk_version: "34",
+}
diff --git a/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/AndroidManifest.xml b/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/AndroidManifest.xml
new file mode 100644
index 000000000..278af1987
--- /dev/null
+++ b/PermissionController/tests/permissionui/PermissionUiUseReadHeartRatePermissionApp/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2020 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.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.permissioncontroller.tests.appthatrequestpermission">
+
+ <uses-permission android:name="android.permission.health.READ_HEART_RATE" />
+ <uses-permission android:name="android.permission.health.READ_HEALTH_DATA_IN_BACKGROUND" />
+
+ <application />
+</manifest>
diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
index b2d47a7d7..d4d4be6ec 100644
--- a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
+++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/HealthConnectAppPermissionFragmentTest.kt
@@ -16,10 +16,16 @@
package com.android.permissioncontroller.permissionui.ui
+import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
import android.os.Build
+import android.permission.flags.Flags.FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED
+import android.platform.test.annotations.RequiresFlagsEnabled
+import android.platform.test.flag.junit.DeviceFlagsValueProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
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
@@ -28,7 +34,9 @@ import com.android.compatibility.common.util.UiAutomatorUtils2.waitUntilObjectGo
import com.android.permissioncontroller.permissionui.wakeUpScreen
import org.junit.After
import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeTrue
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,10 +49,17 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
+
+ @Rule @JvmField val mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
+
+ private lateinit var context: Context
+
@Before fun assumeNotTelevision() = assumeFalse(isTelevision)
@Before
- fun wakeScreenUp() {
+ fun setUp() {
+ context = InstrumentationRegistry.getInstrumentation().context
+
wakeUpScreen()
}
@@ -52,8 +67,10 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
fun uninstallTestApp() {
uninstallTestApps()
}
+
@Test
- fun usedHealthConnectPermissionsAreListed() {
+ fun usedHealthConnectPermissionsAreListed_handHeldDevices() {
+ assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
installTestAppThatUsesHealthConnectPermission()
startManageAppPermissionsActivity()
@@ -62,7 +79,8 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
}
@Test
- fun invalidUngrantedUsedHealthConnectPermissionsAreNotListed() {
+ fun invalidUngrantedUsedHealthConnectPermissionsAreNotListed_handHeldDevices() {
+ assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
installInvalidTestAppThatUsesHealthConnectPermission()
startManageAppPermissionsActivity()
@@ -70,6 +88,54 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
waitUntilObjectGone(By.text(HEALTH_CONNECT_LABEL), TIMEOUT_SHORT)
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @RequiresFlagsEnabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+ @Test
+ fun startManageAppPermissionsActivity_wearDevices_requestLegacyBodySensorsUngranted_fitnessAndWellnessShowsUp() {
+ assumeTrue(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ installTestAppThatUsesLegacyBodySensorsPermissions()
+
+ startManageAppPermissionsActivity()
+
+ eventually { waitFindObject(By.text(FITNESS_AND_WELLNESS_LABEL)) }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @RequiresFlagsEnabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+ @Test
+ fun startManageAppPermissionsActivity_wearDevices_requestReadHeartRateUngranted_fitnessAndWellnessShowsUp() {
+ assumeTrue(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ installTestAppThatUsesReadHeartRatePermissions()
+
+ startManageAppPermissionsActivity()
+
+ eventually { waitFindObject(By.text(FITNESS_AND_WELLNESS_LABEL)) }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @RequiresFlagsEnabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+ @Test
+ fun startManageAppPermissionsActivity_handHeldDevices_requestLegacyBodySensorsUngranted_healthConnectShowsUp() {
+ assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ installTestAppThatUsesLegacyBodySensorsPermissions()
+
+ startManageAppPermissionsActivity()
+
+ eventually { waitFindObject(By.text(HEALTH_CONNECT_LABEL)) }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
+ @RequiresFlagsEnabled(FLAG_REPLACE_BODY_SENSOR_PERMISSION_ENABLED)
+ @Test
+ fun startManageAppPermissionsActivity_handHeldDevices_requestReadHeartRateUngranted_healthConnectNotShowsUp() {
+ assumeFalse(context.packageManager.hasSystemFeature(PackageManager.FEATURE_WATCH))
+ installTestAppThatUsesReadHeartRatePermissions()
+
+ startManageAppPermissionsActivity()
+
+ waitUntilObjectGone(By.text(HEALTH_CONNECT_LABEL), TIMEOUT_SHORT)
+ }
+
private fun startManageAppPermissionsActivity() {
runWithShellPermissionIdentity {
instrumentationContext.startActivity(
@@ -83,6 +149,7 @@ class HealthConnectAppPermissionFragmentTest : BasePermissionUiTest() {
}
companion object {
+ private const val FITNESS_AND_WELLNESS_LABEL = "Fitness and wellness"
// Health connect label uses a non breaking space
private const val HEALTH_CONNECT_LABEL = "Health\u00A0Connect"
private const val HEALTH_CONNECT_PERMISSION_READ_FLOORS_CLIMBED =
diff --git a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/TestAppUtils.kt b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/TestAppUtils.kt
index 7227ea3d8..8eef11e73 100644
--- a/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/TestAppUtils.kt
+++ b/PermissionController/tests/permissionui/src/com/android/permissioncontroller/permissionui/ui/TestAppUtils.kt
@@ -36,6 +36,10 @@ private const val TWO_ADDITIONAL_PERM_USER_APK =
"$APK_DIRECTORY/PermissionUiUseTwoAdditionalPermissionsApp.apk"
private const val ADDITIONAL_PERM_DEFINER_APK =
"$APK_DIRECTORY/PermissionUiDefineAdditionalPermissionApp.apk"
+private const val LEGACY_BODY_SENSORS_APK =
+ "$APK_DIRECTORY/PermissionUiUseLegacyBodySensorsPermissionApp.apk"
+private const val READ_HEART_RATE_APK =
+ "$APK_DIRECTORY/PermissionUiUseReadHeartRatePermissionApp.apk"
// All 4 of the AppThatUses_X_Permission(s) applications share the same package name.
private const val PERM_DEFINER_PACKAGE =
@@ -69,6 +73,10 @@ fun installTestAppThatUsesTwoAdditionalPermissions() = install(TWO_ADDITIONAL_PE
fun installTestAppThatDefinesAdditionalPermissions() = install(ADDITIONAL_PERM_DEFINER_APK)
+fun installTestAppThatUsesLegacyBodySensorsPermissions() = install(LEGACY_BODY_SENSORS_APK)
+
+fun installTestAppThatUsesReadHeartRatePermissions() = install(READ_HEART_RATE_APK)
+
fun uninstallTestApps() {
uninstallApp(PERM_USER_PACKAGE)
uninstallApp(PERM_DEFINER_PACKAGE)
diff --git a/PermissionController/wear-permission-components/Android.bp b/PermissionController/wear-permission-components/Android.bp
new file mode 100644
index 000000000..bdd783b60
--- /dev/null
+++ b/PermissionController/wear-permission-components/Android.bp
@@ -0,0 +1,67 @@
+// Copyright (C) 2022 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 {
+ default_team: "trendy_team_android_permissions",
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+filegroup {
+ name: "wear-permission-components-sources",
+ srcs: [
+ "src/**/*.kt",
+ ],
+ visibility: ["//visibility:private"],
+}
+
+android_library {
+ name: "wear-permission-components",
+ manifest: "AndroidManifest.xml",
+ sdk_version: "system_current",
+ min_sdk_version: "30",
+ target_sdk_version: "33",
+ srcs: [
+ ":wear-permission-components-sources",
+ ],
+ resource_dirs: ["res"],
+ libs: [
+ "androidx.annotation_annotation",
+ "framework-annotations-lib",
+ ],
+ static_libs: [
+ "androidx.fragment_fragment",
+ "androidx.appcompat_appcompat",
+ "androidx.compose.foundation_foundation",
+ "androidx.compose.runtime_runtime",
+ "androidx.compose.runtime_runtime-livedata",
+ "androidx.compose.ui_ui",
+ "androidx.wear.compose_compose-material",
+ "androidx.wear.compose_compose-material3",
+ ],
+ kotlin_lang_version: "1.9",
+ kotlincflags: [
+ "-Werror",
+ "-opt-in=kotlinx.coroutines.DelicateCoroutinesApi",
+ "-Xjvm-default=all",
+ ],
+ installable: false,
+ visibility: [
+ "//packages/modules:__subpackages__",
+ ],
+ apex_available: [
+ "//apex_available:platform",
+ "com.android.permission",
+ "com.android.healthfitness",
+ ],
+}
diff --git a/PermissionController/wear-permission-components/AndroidManifest.xml b/PermissionController/wear-permission-components/AndroidManifest.xml
new file mode 100644
index 000000000..57eca6176
--- /dev/null
+++ b/PermissionController/wear-permission-components/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2022 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.
+ -->
+<manifest package="com.android.permissioncontroller.wear.permission.components">
+</manifest>
diff --git a/PermissionController/res/drawable/ic_security_update_good.xml b/PermissionController/wear-permission-components/res/drawable/ic_security_update_good.xml
index 59e7a67fa..59e7a67fa 100644
--- a/PermissionController/res/drawable/ic_security_update_good.xml
+++ b/PermissionController/wear-permission-components/res/drawable/ic_security_update_good.xml
diff --git a/PermissionController/res/values-watch/donottranslate.xml b/PermissionController/wear-permission-components/res/values/donottranslate.xml
index 03038ddd1..03038ddd1 100644
--- a/PermissionController/res/values-watch/donottranslate.xml
+++ b/PermissionController/wear-permission-components/res/values/donottranslate.xml
diff --git a/PermissionController/wear-permission-components/res/values/overlayable.xml b/PermissionController/wear-permission-components/res/values/overlayable.xml
new file mode 100644
index 000000000..94c5972f4
--- /dev/null
+++ b/PermissionController/wear-permission-components/res/values/overlayable.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2019 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.
+-->
+<resources>
+ <overlayable name="WearPermissionControllerStyles">
+ <policy type="product|system|vendor|odm|oem">
+ <!--START WEAR SPECIFIC MATERIAL3 FONT FACE TOKENS-->
+ <item type="string" name="wear_compose_material3_arc_small_font_family" />
+ <item type="string" name="wear_compose_material3_arc_medium_font_family" />
+ <item type="string" name="wear_compose_material3_arc_large_font_family" />
+
+ <item type="string" name="wear_compose_material3_body_extra_small_font_family" />
+ <item type="string" name="wear_compose_material3_body_small_font_family" />
+ <item type="string" name="wear_compose_material3_body_medium_font_family" />
+ <item type="string" name="wear_compose_material3_body_large_font_family" />
+
+ <item type="string" name="wear_compose_material3_display_small_font_family" />
+ <item type="string" name="wear_compose_material3_display_medium_font_family" />
+ <item type="string" name="wear_compose_material3_display_large_font_family" />
+
+ <item type="string" name="wear_compose_material3_label_small_font_family" />
+ <item type="string" name="wear_compose_material3_label_medium_font_family" />
+ <item type="string" name="wear_compose_material3_label_large_font_family" />
+
+ <item type="string" name="wear_compose_material3_numeral_extra_small_font_family" />
+ <item type="string" name="wear_compose_material3_numeral_small_font_family" />
+ <item type="string" name="wear_compose_material3_numeral_medium_font_family" />
+ <item type="string" name="wear_compose_material3_numeral_large_font_family" />
+ <item type="string" name="wear_compose_material3_numeral_extra_large_font_family" />
+
+ <item type="string" name="wear_compose_material3_title_small_font_family" />
+ <item type="string" name="wear_compose_material3_title_medium_font_family" />
+ <item type="string" name="wear_compose_material3_title_large_font_family" />
+ <!--END WEAR SPECIFIC MATERIAL3 FONT FACE TOKENS-->
+
+
+ <!--START WEAR SPECIFIC MATERIAL3 FONT SIZE TOKENS-->
+ <item type="dimen" name="wear_compose_material3_arc_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_arc_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_arc_large_font_size" />
+
+ <item type="dimen" name="wear_compose_material3_body_extra_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_body_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_body_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_body_large_font_size" />
+
+ <item type="dimen" name="wear_compose_material3_display_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_display_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_display_large_font_size" />
+
+ <item type="dimen" name="wear_compose_material3_label_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_label_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_label_large_font_size" />
+
+ <item type="dimen" name="wear_compose_material3_numeral_extra_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_numeral_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_numeral_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_numeral_large_font_size" />
+ <item type="dimen" name="wear_compose_material3_numeral_extra_large_font_size" />
+
+ <item type="dimen" name="wear_compose_material3_title_small_font_size" />
+ <item type="dimen" name="wear_compose_material3_title_medium_font_size" />
+ <item type="dimen" name="wear_compose_material3_title_large_font_size" />
+ <!--END WEAR SPECIFIC MATERIAL3 FONT SIZE TOKENS-->
+
+ <!--START WEAR SPECIFIC MATERIAL3 SHAPE TOKENS-->
+ <item type="dimen" name="wear_compose_material3_shape_corner_extra_small_size" />
+ <item type="dimen" name="wear_compose_material3_shape_corner_small_size" />
+ <item type="dimen" name="wear_compose_material3_shape_corner_medium_size" />
+ <item type="dimen" name="wear_compose_material3_shape_corner_large_size" />
+ <item type="dimen" name="wear_compose_material3_shape_corner_extra_large_size" />
+ <!--END WEAR SPECIFIC MATERIAL3 SHAPE TOKENS-->
+ </policy>
+ </overlayable>
+</resources> \ No newline at end of file
diff --git a/PermissionController/wear-permission-components/res/values/strings.xml b/PermissionController/wear-permission-components/res/values/strings.xml
new file mode 100644
index 000000000..a9956ddb5
--- /dev/null
+++ b/PermissionController/wear-permission-components/res/values/strings.xml
@@ -0,0 +1,7 @@
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- Accessibility description indicating that a toggle control status is on. [CHAR LIMIT=NONE] -->
+ <string name="on">On</string>
+
+ <!-- Accessibility description indicating that a status is off. [CHAR LIMIT=NONE] -->
+ <string name="off">Off</string>
+</resources> \ No newline at end of file
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt b/PermissionController/wear-permission-components/src/wear.permission.components/AnnotatedText.kt
index 07bb88e80..4d7954c5a 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/AnnotatedText.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/AnnotatedText.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements
+package com.android.permissioncontroller.wear.permission.components
import android.text.Spanned
import android.text.style.ClickableSpan
@@ -32,10 +31,14 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextDecoration
import androidx.wear.compose.material.MaterialTheme
-import com.android.permissioncontroller.permission.ui.wear.WearUtils.capitalize
+import java.util.Locale
const val CLICKABLE_SPAN_TAG = "CLICKABLE_SPAN_TAG"
+fun String.capitalize(): String = replaceFirstChar {
+ if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString()
+}
+
@Composable
fun AnnotatedText(
text: CharSequence,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/CheckYourPhone.kt b/PermissionController/wear-permission-components/src/wear.permission.components/CheckYourPhone.kt
index 59376b8fa..467aae4e1 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/CheckYourPhone.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/CheckYourPhone.kt
@@ -13,26 +13,32 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements
+package com.android.permissioncontroller.wear.permission.components
import android.content.res.Configuration
+import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.CircularProgressIndicator
+import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Scaffold
import androidx.wear.compose.material.Text
-import com.android.permissioncontroller.R
private const val TOP_PADDING_SCREEN_PERCENTAGE = 0.1248f
private const val BOTTOM_PADDING_SCREEN_PERCENTAGE = 0.0624f
@@ -41,16 +47,12 @@ private const val TEXT_PADDING_SCREEN_PERCENTAGE = 0.0416f
enum class CheckYourPhoneState {
InProgress,
- Success
+ Success,
}
/**
* A screen to request the user to check their paired phone to proceed. It also allows a [message]
* to be displayed.
- *
- * <img
- * src="https://media.githubusercontent.com/media/google/horologist/main/docs/auth-composables/check_your_phone_screen_code.png"
- * height="120" width="120"/>
*/
@Composable
fun CheckYourPhoneScreen(
@@ -60,9 +62,7 @@ fun CheckYourPhoneScreen(
message: String? = null,
) {
val configuration = LocalConfiguration.current
-
val isLarge = configuration.isLargeScreen
-
val topPadding = (configuration.screenHeightDp * TOP_PADDING_SCREEN_PERCENTAGE).dp
val bottomPadding = (configuration.screenHeightDp * BOTTOM_PADDING_SCREEN_PERCENTAGE).dp
val sidePadding = (configuration.screenHeightDp * SIDE_PADDING_SCREEN_PERCENTAGE).dp
@@ -79,7 +79,7 @@ fun CheckYourPhoneScreen(
bottom = bottomPadding,
start = sidePadding,
end = sidePadding,
- ),
+ )
) {
Column(
modifier = Modifier.fillMaxWidth().weight(1f).padding(horizontal = textPadding),
@@ -104,21 +104,53 @@ fun CheckYourPhoneScreen(
}
}
when (state) {
- CheckYourPhoneState.InProgress ->
- RemoteConnectionProgressIndicator(
- iconRes = R.drawable.ic_security_update_good,
- Modifier.align(Alignment.CenterHorizontally)
- )
- CheckYourPhoneState.Success ->
- RemoteConnectionSuccess(
- iconRes = R.drawable.ic_security_update_good,
- Modifier.align(Alignment.CenterHorizontally)
- )
+ CheckYourPhoneState.InProgress -> RemoteConnectionProgressIndicator()
+ CheckYourPhoneState.Success -> RemoteConnectionSuccess()
}
}
}
}
+@Composable
+private fun RemoteConnectionProgressIndicator() {
+ val indicatorPadding = 8.dp
+ val iconSize = 48.dp
+ val progressBarStrokeWidth = 4.dp
+ Box(modifier = Modifier.size(iconSize).clip(CircleShape)) {
+ CircularProgressIndicator(
+ modifier = Modifier.size(iconSize - progressBarStrokeWidth + indicatorPadding),
+ strokeWidth = progressBarStrokeWidth,
+ )
+ Icon(
+ painter = painterResource(R.drawable.ic_security_update_good),
+ contentDescription = null,
+ modifier =
+ Modifier.align(Alignment.Center)
+ .size(iconSize - indicatorPadding - 8.dp)
+ .clip(CircleShape),
+ )
+ }
+}
+
+@Composable
+private fun RemoteConnectionSuccess() {
+ val indicatorPadding = 8.dp
+ val iconSize = 48.dp
+ val backgroundColor = MaterialTheme.colors.onSurface
+ val contentColor = MaterialTheme.colors.surface
+ Box(modifier = Modifier.size(iconSize).clip(CircleShape).background(backgroundColor)) {
+ Icon(
+ painter = painterResource(R.drawable.ic_security_update_good),
+ contentDescription = null,
+ tint = contentColor,
+ modifier =
+ Modifier.align(Alignment.Center)
+ .size(iconSize - indicatorPadding - 8.dp)
+ .clip(CircleShape),
+ )
+ }
+}
+
/** Whether the device is considered large screen for layout adjustment purposes. */
internal val Configuration.isLargeScreen: Boolean
get() = screenHeightDp > 224
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/DrawablePainter.kt b/PermissionController/wear-permission-components/src/wear.permission.components/DrawablePainter.kt
index d505a0ea4..a22fb2b96 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/DrawablePainter.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/DrawablePainter.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements
+package com.android.permissioncontroller.wear.permission.components
import android.graphics.drawable.Animatable
import android.graphics.drawable.ColorDrawable
@@ -166,5 +165,6 @@ private val Drawable.intrinsicSize: Size
internal object EmptyPainter : Painter() {
override val intrinsicSize: Size
get() = Size.Unspecified
+
override fun DrawScope.onDraw() {}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt b/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt
index bfa46ae55..db3711670 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/ScrollableScreen.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/ScrollableScreen.kt
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements
+package com.android.permissioncontroller.wear.permission.components
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
+import androidx.compose.foundation.layout.BoxScope
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@@ -27,12 +27,13 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.fragment.app.FragmentActivity
+import androidx.wear.compose.foundation.ExpandableState
import androidx.wear.compose.foundation.SwipeToDismissValue
import androidx.wear.compose.foundation.rememberSwipeToDismissBoxState
import androidx.wear.compose.material.SwipeToDismissBox
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionScaffold
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionScaffold
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
/**
* Screen that contains a list of items defined using the [content] parameter, adds the time text
@@ -43,6 +44,7 @@ import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionM
@Composable
fun ScrollableScreen(
materialUIVersion: WearPermissionMaterialUIVersion = ResourceHelper.materialUIVersionInSettings,
+ asScalingList: Boolean = false,
showTimeText: Boolean = true,
title: String? = null,
subtitle: CharSequence? = null,
@@ -74,6 +76,7 @@ fun ScrollableScreen(
SwipeToDismissBox(state = state) { isBackground ->
WearPermissionScaffold(
materialUIVersion,
+ asScalingList,
showTimeText,
title,
subtitle,
@@ -87,6 +90,7 @@ fun ScrollableScreen(
} else {
WearPermissionScaffold(
materialUIVersion,
+ asScalingList,
showTimeText,
title,
subtitle,
@@ -99,7 +103,7 @@ fun ScrollableScreen(
}
}
-internal fun dismiss(activity: Activity) {
+fun dismiss(activity: Activity) {
if (activity is FragmentActivity) {
if (!activity.supportFragmentManager.popBackStackImmediate()) {
activity.finish()
@@ -119,7 +123,7 @@ internal fun getBackStackEntryCount(activity: Activity): Int {
}
}
-internal fun Context.findActivity(): Activity {
+fun Context.findActivity(): Activity {
var context = this
while (context is ContextWrapper) {
if (context is Activity) return context
@@ -130,4 +134,11 @@ internal fun Context.findActivity(): Activity {
interface ListScopeWrapper {
fun item(key: Any? = null, contentType: Any? = null, content: @Composable () -> Unit)
+
+ fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((index: Int) -> Any)? = null,
+ itemContent: @Composable BoxScope.(index: Int) -> Unit,
+ )
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/AlertDialog.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/AlertDialog.kt
index a49d8822e..4abe5c8ca 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/AlertDialog.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/AlertDialog.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
@@ -22,7 +22,6 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.rememberTextMeasurer
@@ -36,11 +35,11 @@ import androidx.wear.compose.material.LocalTextStyle
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text
import androidx.wear.compose.material.dialog.Dialog
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnDefaults
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnState
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.rememberColumnState
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnDefaults
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnState
+import com.android.permissioncontroller.wear.permission.components.material2.layout.rememberColumnState
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
/**
* This component is an alternative to [AlertContent], providing the following:
@@ -60,13 +59,9 @@ fun AlertDialog(
iconRes: WearPermissionIconBuilder? = null,
scalingLazyListState: ScalingLazyListState,
) {
- val focusManager = LocalFocusManager.current
Dialog(
showDialog = showDialog,
- onDismissRequest = {
- focusManager.clearFocus()
- negativeButtonContent?.onClick?.invoke()
- },
+ onDismissRequest = { negativeButtonContent?.onClick?.invoke() },
scrollState = scalingLazyListState,
modifier = modifier,
) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Chip.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt
index 15542ec20..f0dab21ec 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Chip.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Chip.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import android.graphics.drawable.Drawable
import androidx.annotation.StringRes
@@ -46,7 +46,7 @@ import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.Text
import androidx.wear.compose.material.contentColorFor
-import com.android.permissioncontroller.permission.ui.wear.elements.rememberDrawablePainter
+import com.android.permissioncontroller.wear.permission.components.rememberDrawablePainter
/**
* This component is an alternative to [Chip], providing the following:
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Icon.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Icon.kt
index 3cfac7eef..dfed0b196 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Icon.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Icon.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import android.graphics.drawable.Drawable
import androidx.annotation.DrawableRes
@@ -29,14 +29,14 @@ import androidx.compose.ui.unit.LayoutDirection
import androidx.wear.compose.material.Icon
import androidx.wear.compose.material.LocalContentAlpha
import androidx.wear.compose.material.LocalContentColor
-import com.android.permissioncontroller.permission.ui.wear.elements.rememberDrawablePainter
+import com.android.permissioncontroller.wear.permission.components.rememberDrawablePainter
/**
* This component is an alternative to [Icon], providing the following:
* - a convenient way of setting the icon to be mirrored in RTL mode;
*/
@Composable
-public fun Icon(
+fun Icon(
imageVector: ImageVector,
contentDescription: String?,
modifier: Modifier = Modifier,
@@ -58,7 +58,7 @@ public fun Icon(
* - a convenient way of setting the icon to be mirrored in RTL mode;
*/
@Composable
-public fun Icon(
+fun Icon(
@DrawableRes id: Int,
contentDescription: String?,
modifier: Modifier = Modifier,
@@ -122,7 +122,7 @@ fun Icon(
}
}
-public enum class IconRtlMode {
+enum class IconRtlMode {
Default,
Mirrored,
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListFooter.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ListFooter.kt
index 4f6d47faf..ac603d492 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListFooter.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ListFooter.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Row
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListHeader.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ListHeader.kt
index 2d3eb0d52..7dc26179d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ListHeader.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ListHeader.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ResponsiveDialog.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ResponsiveDialog.kt
index 4cb3ab615..64597e23d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ResponsiveDialog.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ResponsiveDialog.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement.spacedBy
@@ -44,14 +44,14 @@ import androidx.wear.compose.material.LocalTextStyle
import androidx.wear.compose.material.MaterialTheme
import androidx.wear.compose.material.PositionIndicator
import androidx.wear.compose.material.Scaffold
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumn
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnDefaults.responsive
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnState
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.rememberColumnState
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.DialogButtonContent
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionIconBuilder
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.defaultAlertConfirmIcon
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.defaultAlertDismissIcon
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumn
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnDefaults.responsive
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnState
+import com.android.permissioncontroller.wear.permission.components.material2.layout.rememberColumnState
+import com.android.permissioncontroller.wear.permission.components.material3.DialogButtonContent
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionIconBuilder
+import com.android.permissioncontroller.wear.permission.components.material3.defaultAlertConfirmIcon
+import com.android.permissioncontroller.wear.permission.components.material3.defaultAlertDismissIcon
@Composable
fun ResponsiveDialogContent(
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ToggleChip.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt
index bfb5d114d..de8e0542d 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/ToggleChip.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/ToggleChip.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.BoxScope
@@ -44,8 +43,8 @@ import androidx.wear.compose.material.ToggleChip
import androidx.wear.compose.material.ToggleChipColors
import androidx.wear.compose.material.ToggleChipDefaults
import androidx.wear.compose.material.contentColorFor
-import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionToggleControlType
+import com.android.permissioncontroller.wear.permission.components.R
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionToggleControlType
/**
* This component is an alternative to [ToggleChip], providing the following:
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Wear2Scaffold.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Wear2Scaffold.kt
index 866b7f012..b5ba5b71e 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/Wear2Scaffold.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/Wear2Scaffold.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material2
+package com.android.permissioncontroller.wear.permission.components.material2
import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
@@ -54,9 +53,9 @@ 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 com.android.permissioncontroller.permission.ui.wear.elements.AnnotatedText
-import com.android.permissioncontroller.permission.ui.wear.elements.rememberDrawablePainter
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
+import com.android.permissioncontroller.wear.permission.components.AnnotatedText
+import com.android.permissioncontroller.wear.permission.components.rememberDrawablePainter
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
/**
* This component is wrapper on material 2 scaffold component. It helps with time text, scroll
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnDefaults.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnDefaults.kt
index c06fdaf14..f6fe5233c 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnDefaults.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnDefaults.kt
@@ -16,7 +16,7 @@
@file:Suppress("ObjectLiteralToLambda")
-package com.android.permissioncontroller.permission.ui.wear.elements.material2.layout
+package com.android.permissioncontroller.wear.permission.components.material2.layout
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
@@ -33,7 +33,7 @@ import androidx.wear.compose.foundation.lazy.ScalingLazyColumnDefaults
import androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType
import androidx.wear.compose.foundation.lazy.ScalingParams
import androidx.wear.compose.material.ChipDefaults
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnState.RotaryMode
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnState.RotaryMode
import kotlin.math.sqrt
// This file's content is copied from ScalingLazyColumnDefaults.kt from Horologist (go/horologist),
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnState.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnState.kt
index 0e669f6ff..c20b23aa3 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material2/layout/ScalingLazyColumnState.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material2/layout/ScalingLazyColumnState.kt
@@ -17,7 +17,7 @@
@file:Suppress("ObjectLiteralToLambda")
@file:OptIn(ExperimentalWearFoundationApi::class)
-package com.android.permissioncontroller.permission.ui.wear.elements.material2.layout
+package com.android.permissioncontroller.wear.permission.components.material2.layout
import androidx.compose.foundation.MutatePriority
import androidx.compose.foundation.gestures.FlingBehavior
@@ -42,8 +42,8 @@ import androidx.wear.compose.foundation.lazy.ScalingLazyListAnchorType
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.foundation.lazy.ScalingParams
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnDefaults.responsiveScalingParams
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.layout.ScalingLazyColumnState.RotaryMode
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnDefaults.responsiveScalingParams
+import com.android.permissioncontroller.wear.permission.components.material2.layout.ScalingLazyColumnState.RotaryMode
// This file is a copy of ScalingLazyColumnState.kt from Horologist (go/horologist),
// remove it once after wear compose supports large screen dialogs.
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButton.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt
index 9a89e0809..1a7524e7c 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButton.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButton.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.PaddingValues
@@ -33,9 +33,9 @@ import androidx.wear.compose.material3.ButtonDefaults
import androidx.wear.compose.material3.LocalTextConfiguration
import androidx.wear.compose.material3.LocalTextStyle
import androidx.wear.compose.material3.Text
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.Chip
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.material2.Chip
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
/**
* This component is wrapper on material Button component
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButtonStyle.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt
index 36d3f9f33..114bcd4bc 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionButtonStyle.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionButtonStyle.kt
@@ -13,20 +13,19 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.runtime.Composable
import androidx.wear.compose.material.ChipColors
import androidx.wear.compose.material.ChipDefaults
import androidx.wear.compose.material3.ButtonColors
import androidx.wear.compose.material3.ButtonDefaults
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.chipDefaultColors
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.chipDisabledColors
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle.DisabledLike
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle.Primary
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle.Secondary
-import com.android.permissioncontroller.permission.ui.wear.elements.material3.WearPermissionButtonStyle.Transparent
+import com.android.permissioncontroller.wear.permission.components.material2.chipDefaultColors
+import com.android.permissioncontroller.wear.permission.components.material2.chipDisabledColors
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.DisabledLike
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Primary
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Secondary
+import com.android.permissioncontroller.wear.permission.components.material3.WearPermissionButtonStyle.Transparent
/**
* This component is wrapper on material control colors, It applies the right colors based material
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionConfirmationDialog.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionConfirmationDialog.kt
index 0e1bf1fbe..4ef6e8a72 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionConfirmationDialog.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionConfirmationDialog.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.size
@@ -25,8 +25,8 @@ import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
import androidx.wear.compose.material3.AlertDialog as Material3AlertDialog
import androidx.wear.compose.material3.AlertDialogDefaults
import androidx.wear.compose.material3.Text
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.AlertDialog
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.material2.AlertDialog
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
data class DialogButtonContent(
val icon: WearPermissionIconBuilder? = null,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionIconBuilder.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionIconBuilder.kt
index 52674b50d..e5e51af66 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionIconBuilder.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionIconBuilder.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import android.graphics.drawable.Drawable
import androidx.compose.foundation.layout.size
@@ -29,7 +29,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.wear.compose.material3.Icon
import androidx.wear.compose.material3.IconButtonDefaults
-import com.android.permissioncontroller.permission.ui.wear.elements.rememberDrawablePainter
+import com.android.permissioncontroller.wear.permission.components.rememberDrawablePainter
/**
* This class simplifies the construction of icons with various attributes like resource type,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListFooter.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListFooter.kt
index 33f9cb41f..90ee09bab 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListFooter.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListFooter.kt
@@ -13,17 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.unit.dp
import androidx.wear.compose.material3.ButtonDefaults
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.ListFooter
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.material2.ListFooter
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
/** This component is creates a transparent styled button to use as a list footer. */
@Composable
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListSubHeader.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListSubHeader.kt
index ddcd93326..2ed6e532f 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionListSubHeader.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionListSubHeader.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.padding
@@ -23,9 +23,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.unit.dp
import androidx.wear.compose.material3.ListSubHeader
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.ListSubheader
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.material2.ListSubheader
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
/*
This component is simplified wrapper over ListSubHeader with quick padding adjustments
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffold.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
index 35bdf583e..4337a9bd0 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffold.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffold.kt
@@ -13,11 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import android.graphics.drawable.Drawable
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.gestures.ScrollableState
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.PaddingValues
@@ -37,11 +38,16 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.Hyphens
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
+import androidx.wear.compose.foundation.ExpandableState
import androidx.wear.compose.foundation.ScrollInfoProvider
+import androidx.wear.compose.foundation.expandableItems
+import androidx.wear.compose.foundation.lazy.ScalingLazyColumn
import androidx.wear.compose.foundation.lazy.ScalingLazyListScope
+import androidx.wear.compose.foundation.lazy.ScalingLazyListState
import androidx.wear.compose.foundation.lazy.TransformingLazyColumn
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnScope
import androidx.wear.compose.foundation.lazy.TransformingLazyColumnState
+import androidx.wear.compose.foundation.lazy.rememberScalingLazyListState
import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState
import androidx.wear.compose.material3.AppScaffold
import androidx.wear.compose.material3.CircularProgressIndicator
@@ -53,14 +59,14 @@ import androidx.wear.compose.material3.ScrollIndicator
import androidx.wear.compose.material3.Text
import androidx.wear.compose.material3.TimeText
import androidx.wear.compose.material3.lazy.scrollTransform
-import com.android.permissioncontroller.permission.ui.wear.elements.AnnotatedText
-import com.android.permissioncontroller.permission.ui.wear.elements.ListScopeWrapper
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.Wear2Scaffold
-import com.android.permissioncontroller.permission.ui.wear.elements.rememberDrawablePainter
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion.MATERIAL2_5
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionTheme
+import com.android.permissioncontroller.wear.permission.components.AnnotatedText
+import com.android.permissioncontroller.wear.permission.components.ListScopeWrapper
+import com.android.permissioncontroller.wear.permission.components.material2.Wear2Scaffold
+import com.android.permissioncontroller.wear.permission.components.rememberDrawablePainter
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion.MATERIAL2_5
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionTheme
private class TransformingScopeConverter(private val scope: TransformingLazyColumnScope) :
ListScopeWrapper {
@@ -68,12 +74,30 @@ private class TransformingScopeConverter(private val scope: TransformingLazyColu
// TODO:https://buganizer.corp.google.com/issues/389093588.
scope.item { Box(modifier = Modifier.scrollTransform(this)) { content() } }
}
+
+ override fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((Int) -> Any)?,
+ itemContent: @Composable (BoxScope.(Int) -> Unit),
+ ) {
+ throw Exception("Expandable Items are not implemented on TLC Yet. Use SLC.")
+ }
}
private class ScalingScopeConverter(private val scope: ScalingLazyListScope) : ListScopeWrapper {
override fun item(key: Any?, contentType: Any?, content: @Composable () -> Unit) {
scope.item { content() }
}
+
+ override fun expandableItems(
+ state: ExpandableState,
+ count: Int,
+ key: ((Int) -> Any)?,
+ itemContent: @Composable (BoxScope.(Int) -> Unit),
+ ) {
+ scope.expandableItems(state, count, key, itemContent)
+ }
}
/**
@@ -81,8 +105,9 @@ private class ScalingScopeConverter(private val scope: ScalingLazyListScope) : L
* indicator and standard list elements like title, icon and subtitle.
*/
@Composable
-internal fun WearPermissionScaffold(
+fun WearPermissionScaffold(
materialUIVersion: WearPermissionMaterialUIVersion = ResourceHelper.materialUIVersionInSettings,
+ asScalingList: Boolean = false,
showTimeText: Boolean,
title: String?,
subtitle: CharSequence?,
@@ -106,59 +131,62 @@ internal fun WearPermissionScaffold(
)
} else {
WearPermissionScaffoldInternal(
- showTimeText,
- title,
- subtitle,
- image,
- isLoading,
- { content.invoke(TransformingScopeConverter(this)) },
- titleTestTag,
- subtitleTestTag,
+ asScalingList = asScalingList,
+ showTimeText = showTimeText,
+ title = title,
+ subtitle = subtitle,
+ image = image,
+ isLoading = isLoading,
+ content = content,
+ titleTestTag = titleTestTag,
+ subtitleTestTag = subtitleTestTag,
)
}
}
@Composable
private fun WearPermissionScaffoldInternal(
+ asScalingList: Boolean = false,
showTimeText: Boolean,
title: String?,
subtitle: CharSequence?,
image: Any?,
isLoading: Boolean,
- content: TransformingLazyColumnScope.() -> Unit,
+ content: ListScopeWrapper.() -> Unit,
titleTestTag: String? = null,
subtitleTestTag: String? = null,
) {
- val screenWidth = LocalConfiguration.current.screenWidthDp
- val screenHeight = LocalConfiguration.current.screenHeightDp
- val paddingDefaults =
- WearPermissionScaffoldPaddingDefaults(
- screenWidth = screenWidth,
- screenHeight = screenHeight,
- )
- val columnState = rememberTransformingLazyColumnState()
+
+ val scalingListState = rememberScalingLazyListState()
+ val transformingLazyColumnState = rememberTransformingLazyColumnState()
+ val listState = if (asScalingList) scalingListState else transformingLazyColumnState
+ val scrollInfoProvider =
+ if (asScalingList) ScrollInfoProvider(scalingListState)
+ else ScrollInfoProvider(transformingLazyColumnState)
+ val positionIndicator =
+ if (asScalingList) wearPermissionScrollIndicator(!isLoading, scalingListState)
+ else wearPermissionScrollIndicator(!isLoading, transformingLazyColumnState)
+
WearPermissionTheme(version = WearPermissionMaterialUIVersion.MATERIAL3) {
AppScaffold(timeText = wearPermissionTimeText(showTimeText && !isLoading)) {
ScreenScaffold(
- scrollInfoProvider = ScrollInfoProvider(columnState),
- scrollIndicator = wearPermissionScrollIndicator(!isLoading, columnState),
+ scrollInfoProvider = scrollInfoProvider,
+ scrollIndicator = positionIndicator,
) {
Box(modifier = Modifier.fillMaxSize()) {
if (isLoading) {
CircularProgressIndicator(modifier = Modifier.align(Alignment.Center))
} else {
- ScrollingView(
- contentPadding = paddingDefaults.scrollContentPadding,
- columnState = columnState,
- icon = painterFromImage(image),
+ LazyColumnView(
+ asScalingList = asScalingList,
+ showTimeText = showTimeText,
+ listState = listState,
title = title,
- titleTestTag = titleTestTag,
- titlePaddingValues =
- paddingDefaults.titlePaddingValues(subtitle == null),
subtitle = subtitle,
- subtitleTestTag = subtitleTestTag,
- subTitlePaddingValues = paddingDefaults.subTitlePaddingValues,
+ image = image,
content = content,
+ titleTestTag = titleTestTag,
+ subtitleTestTag = subtitleTestTag,
)
}
}
@@ -168,37 +196,67 @@ private fun WearPermissionScaffoldInternal(
}
@Composable
-private fun BoxScope.ScrollingView(
- contentPadding: PaddingValues,
- columnState: TransformingLazyColumnState,
- icon: Painter?,
+private fun BoxScope.LazyColumnView(
+ asScalingList: Boolean = false,
+ showTimeText: Boolean,
+ listState: ScrollableState,
title: String?,
- titleTestTag: String?,
subtitle: CharSequence?,
- subtitleTestTag: String?,
- titlePaddingValues: PaddingValues,
- subTitlePaddingValues: PaddingValues,
- content: TransformingLazyColumnScope.() -> Unit,
+ image: Any?,
+ content: ListScopeWrapper.() -> Unit,
+ titleTestTag: String? = null,
+ subtitleTestTag: String? = null,
) {
- TransformingLazyColumn(
- contentPadding = contentPadding,
- state = columnState,
- modifier = Modifier.background(MaterialTheme.colorScheme.background),
- ) {
- with(TransformingScopeConverter(this)) {
- iconItem(icon, Modifier.size(IconButtonDefaults.LargeIconSize))
+ val screenWidth = LocalConfiguration.current.screenWidthDp
+ val screenHeight = LocalConfiguration.current.screenHeightDp
+ val paddingDefaults =
+ WearPermissionScaffoldPaddingDefaults(
+ screenWidth = screenWidth,
+ screenHeight = screenHeight,
+ )
+ val painterImage = image?.let { painterFromImage(image = image) }
+ val scrollContentPadding =
+ if (showTimeText) {
+ paddingDefaults.scrollContentPadding
+ } else {
+ paddingDefaults.scrollContentPaddingForDialogs(painterImage == null)
+ }
+
+ fun BoxScope.scrollingViewContent(scopeWrapper: ListScopeWrapper) {
+ with(scopeWrapper) {
+ iconItem(
+ painter = painterImage,
+ modifier = Modifier.size(IconButtonDefaults.LargeIconSize),
+ )
titleItem(
text = title,
testTag = titleTestTag,
- contentPaddingValues = titlePaddingValues,
+ contentPaddingValues = paddingDefaults.titlePaddingValues(subtitle == null),
)
subtitleItem(
text = subtitle,
testTag = subtitleTestTag,
- modifier = Modifier.align(Alignment.Center).padding(subTitlePaddingValues),
+ modifier =
+ Modifier.align(Alignment.Center).padding(paddingDefaults.subTitlePaddingValues),
)
+ content()
}
- content()
+ }
+
+ if (asScalingList) {
+ ScalingLazyColumn(
+ contentPadding = scrollContentPadding,
+ state = listState as ScalingLazyListState,
+ modifier = Modifier.background(MaterialTheme.colorScheme.background),
+ content = { scrollingViewContent(ScalingScopeConverter(this)) },
+ )
+ } else {
+ TransformingLazyColumn(
+ contentPadding = scrollContentPadding,
+ state = listState as TransformingLazyColumnState,
+ modifier = Modifier.background(MaterialTheme.colorScheme.background),
+ content = { scrollingViewContent(TransformingScopeConverter(this)) },
+ )
}
}
@@ -221,6 +279,17 @@ private fun wearPermissionScrollIndicator(
}
}
+private fun wearPermissionScrollIndicator(
+ showIndicator: Boolean,
+ columnState: ScalingLazyListState,
+): @Composable (BoxScope.() -> Unit)? {
+ return if (showIndicator) {
+ { ScrollIndicator(modifier = Modifier.align(Alignment.CenterEnd), state = columnState) }
+ } else {
+ null
+ }
+}
+
@Composable
private fun painterFromImage(image: Any?): Painter? {
return when (image) {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffoldPaddingDefaults.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt
index 14eaec4bf..595fb50a3 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionScaffoldPaddingDefaults.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionScaffoldPaddingDefaults.kt
@@ -13,8 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.ui.unit.dp
@@ -29,6 +28,8 @@ data class WearPermissionScaffoldPaddingDefaults(
private val titleHorizontalPadding = (screenWidth * 0.0520).dp
private val subtitleHorizontalPadding = (screenWidth * 0.0624).dp
private val scrollContentTopPadding = (screenHeight * 0.1664).dp
+ private val dialogScrollContentLargeTopPadding = (screenHeight * 0.10).dp
+ private val dialogScrollContentTopPadding = (screenHeight * 0.012).dp
private val scrollContentBottomPadding = (screenHeight * 0.3646).dp
private val noPadding = 0.dp
private val defaultItemPadding = 4.dp
@@ -51,6 +52,19 @@ data class WearPermissionScaffoldPaddingDefaults(
end = subtitleHorizontalPadding,
)
+ fun scrollContentPaddingForDialogs(needsLargePadding: Boolean) =
+ PaddingValues(
+ start = scrollContentHorizontalPadding,
+ end = scrollContentHorizontalPadding,
+ top =
+ if (needsLargePadding) {
+ dialogScrollContentLargeTopPadding
+ } else {
+ dialogScrollContentTopPadding
+ },
+ bottom = scrollContentBottomPadding,
+ )
+
val subTitlePaddingValues =
PaddingValues(
start = subtitleHorizontalPadding,
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControl.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt
index d37d17a84..1dfb90682 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControl.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControl.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.RowScope
@@ -28,10 +28,10 @@ import androidx.wear.compose.material3.LocalTextConfiguration
import androidx.wear.compose.material3.RadioButton
import androidx.wear.compose.material3.SwitchButton
import androidx.wear.compose.material3.Text
-import com.android.permissioncontroller.R
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.ToggleChip
-import com.android.permissioncontroller.permission.ui.wear.theme.ResourceHelper
-import com.android.permissioncontroller.permission.ui.wear.theme.WearPermissionMaterialUIVersion
+import com.android.permissioncontroller.wear.permission.components.R
+import com.android.permissioncontroller.wear.permission.components.material2.ToggleChip
+import com.android.permissioncontroller.wear.permission.components.theme.ResourceHelper
+import com.android.permissioncontroller.wear.permission.components.theme.WearPermissionMaterialUIVersion
/** Defines various toggle control types. */
enum class WearPermissionToggleControlType {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControlStyle.kt b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControlStyle.kt
index 048a06861..26a0ea0ef 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/elements/material3/WearPermissionToggleControlStyle.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/material3/WearPermissionToggleControlStyle.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.elements.material3
+package com.android.permissioncontroller.wear.permission.components.material3
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
@@ -25,8 +25,8 @@ import androidx.wear.compose.material3.RadioButtonColors
import androidx.wear.compose.material3.RadioButtonDefaults.radioButtonColors
import androidx.wear.compose.material3.SwitchButtonColors
import androidx.wear.compose.material3.SwitchButtonDefaults.switchButtonColors
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.toggleChipBackgroundColors
-import com.android.permissioncontroller.permission.ui.wear.elements.material2.toggleChipDisabledColors
+import com.android.permissioncontroller.wear.permission.components.material2.toggleChipBackgroundColors
+import com.android.permissioncontroller.wear.permission.components.material2.toggleChipDisabledColors
/**
* Defines toggle control styles, It helps in setting the right colors scheme to a toggle control.
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/ResourceHelper.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/ResourceHelper.kt
index 2a40a625f..010d66a30 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/ResourceHelper.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/ResourceHelper.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import android.content.Context
import android.os.SystemProperties
@@ -23,7 +23,7 @@ import androidx.annotation.DoNotInline
import androidx.annotation.StringRes
import androidx.compose.ui.graphics.Color
-internal object ResourceHelper {
+object ResourceHelper {
private const val MATERIAL3_ENABLED_SYSPROP = "persist.cw_build.bluechip.enabled"
@@ -61,7 +61,7 @@ internal object ResourceHelper {
return try {
val colorInt = context.resources.getColor(id, context.theme)
Color(colorInt)
- } catch (e: Exception) {
+ } catch (_: Exception) {
null
}
}
@@ -70,7 +70,7 @@ internal object ResourceHelper {
fun getString(context: Context, @StringRes id: Int): String? {
return try {
context.resources.getString(id)
- } catch (e: Exception) {
+ } catch (_: Exception) {
null
}
}
@@ -79,7 +79,7 @@ internal object ResourceHelper {
fun getDimen(context: Context, @DimenRes id: Int): Float? {
return try {
context.resources.getDimension(id) / context.resources.displayMetrics.density
- } catch (e: Exception) {
+ } catch (_: Exception) {
null
}
}
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3ColorScheme.kt
index 7ac6c8114..41e8fd975 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3ColorScheme.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3ColorScheme.kt
@@ -13,13 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import android.content.Context
import android.os.Build
import androidx.annotation.ColorRes
import androidx.annotation.RequiresApi
import androidx.compose.ui.graphics.Color
+import androidx.wear.compose.material.Colors
import androidx.wear.compose.material3.ColorScheme
/**
@@ -29,6 +30,24 @@ import androidx.wear.compose.material3.ColorScheme
*/
internal object WearComposeMaterial3ColorScheme {
+ fun legacyColorScheme(): ColorScheme {
+ return Colors().run {
+ ColorScheme(
+ background = background,
+ onBackground = onBackground,
+ onPrimaryContainer = primary,
+ primaryDim = primaryVariant,
+ onPrimary = onPrimary,
+ tertiary = secondary, // Best-Fit Mapping: Refer WearMaterialBridgedTheme.
+ tertiaryDim = secondaryVariant,
+ onTertiary = onSecondary,
+ surfaceContainer = surface,
+ onSurface = onSurface,
+ onSurfaceVariant = onSurfaceVariant,
+ )
+ }
+ }
+
@RequiresApi(Build.VERSION_CODES.S)
fun tonalColorScheme(context: Context): ColorScheme {
val tonalPalette = dynamicTonalPalette(context)
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Shapes.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Shapes.kt
index f81022842..89851d60e 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Shapes.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Shapes.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import android.content.Context
import androidx.annotation.DimenRes
@@ -21,7 +21,7 @@ import androidx.compose.foundation.shape.CornerBasedShape
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.ui.unit.dp
import androidx.wear.compose.material3.Shapes
-import com.android.permissioncontroller.R
+import com.android.permissioncontroller.wear.permission.components.R
// TODO(b/324928718): Use system defined symbols.
internal object WearComposeMaterial3Shapes {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3TypeScaleTokens.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3TypeScaleTokens.kt
index a4ec9ee1d..df5057472 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3TypeScaleTokens.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3TypeScaleTokens.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
/*
* These values are retrieved from https://carbon.googleplex.com/wear-m3/pages and
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Typography.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt
index ceae526a7..e44a24981 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3Typography.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3Typography.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import android.content.Context
import androidx.annotation.DimenRes
@@ -25,7 +25,7 @@ import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontVariation
import androidx.compose.ui.unit.sp
import androidx.wear.compose.material3.Typography
-import com.android.permissioncontroller.R
+import com.android.permissioncontroller.wear.permission.components.R
internal object WearComposeMaterial3Typography {
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3VariableFontTokens.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3VariableFontTokens.kt
index 1b42a3b05..644a1b754 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearComposeMaterial3VariableFontTokens.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearComposeMaterial3VariableFontTokens.kt
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import androidx.compose.ui.text.font.FontVariation
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearMaterialBridgedLegacyTheme.kt
index 160dc2e93..51ae16477 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearMaterialBridgedLegacyTheme.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearMaterialBridgedLegacyTheme.kt
@@ -13,10 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
-import android.os.Build
-import androidx.annotation.RequiresApi
import androidx.compose.ui.unit.sp
import androidx.wear.compose.material.Colors
import androidx.wear.compose.material.Shapes
@@ -29,10 +27,8 @@ import androidx.wear.compose.material.Typography
* However to avoid maintaining two sets of resources for overlays, this class construct 2.5 theme
* from 3.0
*/
-@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
internal class WearMaterialBridgedLegacyTheme
private constructor(newTheme: WearOverlayableMaterial3Theme) {
-
val colors =
newTheme.colorScheme.run {
Colors(
diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearOverlayableMaterial3Theme.kt
index 8aeb5f74d..f6bf56f47 100644
--- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/theme/WearOverlayableMaterial3Theme.kt
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearOverlayableMaterial3Theme.kt
@@ -13,11 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.permissioncontroller.permission.ui.wear.theme
+package com.android.permissioncontroller.wear.permission.components.theme
import android.content.Context
import android.os.Build
-import androidx.annotation.RequiresApi
/**
* Theme wrapper providing Material 3 styling while maintaining compatibility with Runtime Resource
@@ -26,13 +25,18 @@ import androidx.annotation.RequiresApi
* Uses the tonal palette from the previous Material Design version until dynamic color tokens are
* available in SDK 36.
*/
-@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
internal class WearOverlayableMaterial3Theme(context: Context) {
val colorScheme =
- if (Build.VERSION.SDK_INT >= 36) {
- WearComposeMaterial3ColorScheme.dynamicColorScheme(context)
- } else {
- WearComposeMaterial3ColorScheme.tonalColorScheme(context)
+ when {
+ Build.VERSION.SDK_INT >= 36 -> {
+ WearComposeMaterial3ColorScheme.dynamicColorScheme(context)
+ }
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
+ WearComposeMaterial3ColorScheme.tonalColorScheme(context)
+ }
+ else -> {
+ WearComposeMaterial3ColorScheme.legacyColorScheme()
+ }
}
val typography = WearComposeMaterial3Typography.dynamicTypography(context)
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTheme.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTheme.kt
new file mode 100644
index 000000000..b1c87108c
--- /dev/null
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTheme.kt
@@ -0,0 +1,59 @@
+/*
+ * 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.wear.permission.components.theme
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.platform.LocalContext
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material3.MaterialTheme as Material3Theme
+
+/** This enum is used to specify the material version used for a specific screen */
+enum class WearPermissionMaterialUIVersion {
+ MATERIAL2_5,
+ MATERIAL3,
+}
+
+/** An overlay-able compose theme supporting both material2.5 and 3. */
+@Composable
+fun WearPermissionTheme(
+ version: WearPermissionMaterialUIVersion = ResourceHelper.materialUIVersionInSettings,
+ content: @Composable () -> Unit,
+) {
+ WearOverlayableMaterial3Theme(LocalContext.current).run {
+ when (version) {
+ WearPermissionMaterialUIVersion.MATERIAL3 ->
+ Material3Theme(
+ colorScheme = colorScheme,
+ typography = typography,
+ shapes = shapes,
+ content = content,
+ )
+ // Material2_5 UI controls are still being used in the screen,
+ // To avoid having two set of overlay resources, we will use material3 overlay resources
+ // to
+ // support material2_5 UI controls as well.
+ WearPermissionMaterialUIVersion.MATERIAL2_5 ->
+ WearMaterialBridgedLegacyTheme.createFrom(this).run {
+ MaterialTheme(
+ colors = colors,
+ typography = typography,
+ shapes = shapes,
+ content = content,
+ )
+ }
+ }
+ }
+}
diff --git a/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTonalPalette.kt b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTonalPalette.kt
new file mode 100644
index 000000000..72aa3e487
--- /dev/null
+++ b/PermissionController/wear-permission-components/src/wear.permission.components/theme/WearPermissionTonalPalette.kt
@@ -0,0 +1,216 @@
+@file:Suppress("unused")
+
+/*
+ * 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.wear.permission.components.theme
+
+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)
+internal fun dynamicTonalPalette(context: Context) =
+ WearPermissionTonalPalette(
+ // The neutral tonal range from the generated dynamic color palette.
+ neutral100 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_0),
+ neutral99 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_10),
+ neutral95 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_50),
+ neutral90 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_100),
+ neutral80 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_200),
+ neutral70 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_300),
+ neutral60 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_400),
+ neutral50 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_500),
+ neutral40 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_600),
+ neutral30 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_700),
+ neutral20 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_800),
+ neutral10 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_900),
+ neutral0 = ColorResourceHelper.getColor(context, android.R.color.system_neutral1_1000),
+
+ // The neutral variant tonal range, sometimes called "neutral 2", from the
+ // generated dynamic color palette.
+ neutralVariant100 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_0),
+ neutralVariant99 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_10),
+ neutralVariant95 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_50),
+ neutralVariant90 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_100),
+ neutralVariant80 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_200),
+ neutralVariant70 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_300),
+ neutralVariant60 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_400),
+ neutralVariant50 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_500),
+ neutralVariant40 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_600),
+ neutralVariant30 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_700),
+ neutralVariant20 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_800),
+ neutralVariant10 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_900),
+ neutralVariant0 =
+ ColorResourceHelper.getColor(context, android.R.color.system_neutral2_1000),
+
+ // The primary tonal range from the generated dynamic color palette.
+ primary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_0),
+ primary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_10),
+ primary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_50),
+ primary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_100),
+ primary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_200),
+ primary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_300),
+ primary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_400),
+ primary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_500),
+ primary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_600),
+ primary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_700),
+ primary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_800),
+ primary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_900),
+ primary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent1_1000),
+
+ // The secondary tonal range from the generated dynamic color palette.
+ secondary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_0),
+ secondary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_10),
+ secondary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_50),
+ secondary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_100),
+ secondary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_200),
+ secondary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_300),
+ secondary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_400),
+ secondary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_500),
+ secondary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_600),
+ secondary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_700),
+ secondary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_800),
+ secondary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_900),
+ secondary0 = ColorResourceHelper.getColor(context, android.R.color.system_accent2_1000),
+
+ // The tertiary tonal range from the generated dynamic color palette.
+ tertiary100 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_0),
+ tertiary99 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_10),
+ tertiary95 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_50),
+ tertiary90 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_100),
+ tertiary80 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_200),
+ tertiary70 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_300),
+ tertiary60 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_400),
+ tertiary50 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_500),
+ tertiary40 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_600),
+ tertiary30 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_700),
+ tertiary20 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_800),
+ tertiary10 = ColorResourceHelper.getColor(context, android.R.color.system_accent3_900),
+ tertiary0 = ColorResourceHelper.getColor(context, android.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/SafetyCenter/Resources/res/values-sk/strings.xml b/SafetyCenter/Resources/res/values-sk/strings.xml
index 6357114cd..042d2dd75 100644
--- a/SafetyCenter/Resources/res/values-sk/strings.xml
+++ b/SafetyCenter/Resources/res/values-sk/strings.xml
@@ -30,7 +30,7 @@
<string name="permission_usage_title" msgid="3633779688945350407">"Panel ochrany súkromia"</string>
<string name="permission_usage_summary" msgid="5323079206029964468">"Zobraziť, ktoré aplikácie nedávno použili povolenia"</string>
<string name="permission_usage_search_terms" msgid="3852343592870257104">"Ochrana súkromia, panel ochrany súkromia"</string>
- <string name="permission_manager_title" msgid="5277347862821255015">"Správca povolení"</string>
+ <string name="permission_manager_title" msgid="5277347862821255015">"Správa povolení"</string>
<string name="permission_manager_summary" msgid="8099852107340970790">"Ovládanie prístupu aplikácií k vašim údajom"</string>
<string name="permission_manager_search_terms" msgid="2895147613099694722">"Povolenia, správca povolení"</string>
<string name="privacy_controls_title" msgid="5322875777945432395">"Nastavenia ochrany súkromia"</string>
diff --git a/flags/flags.aconfig b/flags/flags.aconfig
index 372fed403..866d27d43 100644
--- a/flags/flags.aconfig
+++ b/flags/flags.aconfig
@@ -65,15 +65,6 @@ flag {
}
flag {
- name: "livedata_refactor_permission_timeline_enabled"
- is_exported: true
- namespace: "permissions"
- description: "This flag is used to enable modern app architecture implementation for timeline page"
- bug: "354234946"
- is_fixed_read_only: true
-}
-
-flag {
name: "odad_notifications_supported"
is_exported: true
namespace: "permissions"
diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
index 44eef2144..5c7573a0b 100644
--- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
+++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt
@@ -33,6 +33,7 @@ import android.hardware.display.VirtualDisplay
import android.os.Build
import android.os.Bundle
import android.os.RemoteCallback
+import android.permission.PermissionManager
import android.permission.flags.Flags
import android.permissionmultidevice.cts.PackageManagementUtils.installPackage
import android.permissionmultidevice.cts.PackageManagementUtils.uninstallPackage
@@ -71,8 +72,12 @@ class DeviceAwarePermissionGrantTest {
private lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice
private lateinit var virtualDisplay: VirtualDisplay
private lateinit var deviceDisplayName: String
+ private val permissionManager =
+ defaultDeviceContext.getSystemService(PermissionManager::class.java)!!
- @get:Rule var virtualDeviceRule = VirtualDeviceRule.createDefault()
+ @get:Rule
+ var virtualDeviceRule: VirtualDeviceRule =
+ VirtualDeviceRule.withAdditionalPermissions(Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
@Before
fun setup() {
@@ -110,6 +115,7 @@ class DeviceAwarePermissionGrantTest {
@After
fun cleanup() {
uninstallPackage(APP_PACKAGE_NAME, requireSuccess = false)
+ Thread.sleep(2000)
}
@RequiresFlagsEnabled(
@@ -118,6 +124,9 @@ class DeviceAwarePermissionGrantTest {
)
@Test
fun onHostDevice_requestPermissionForHostDevice_shouldGrantPermission() {
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+
testGrantPermissionForDevice(
Display.DEFAULT_DISPLAY,
DEVICE_ID_DEFAULT,
@@ -134,6 +143,9 @@ class DeviceAwarePermissionGrantTest {
)
@Test
fun onHostDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+
testGrantPermissionForDevice(
Display.DEFAULT_DISPLAY,
virtualDevice.deviceId,
@@ -144,6 +156,44 @@ class DeviceAwarePermissionGrantTest {
)
}
+ @Test
+ fun onHostDevice_requestPermissionForRemoteDeviceAfterPermissionGrantedToHostDevice() {
+ instrumentation.uiAutomation.grantRuntimePermission(APP_PACKAGE_NAME, PERMISSION)
+
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, true)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+
+ testGrantPermissionForDevice(
+ Display.DEFAULT_DISPLAY,
+ virtualDevice.deviceId,
+ true,
+ deviceDisplayName,
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnRemoteDevice = true,
+ )
+ }
+
+ @Test
+ fun onHostDevice_requestPermissionForHostDeviceAfterPermissionGrantedToRemoteDevice() {
+ permissionManager.grantRuntimePermission(
+ APP_PACKAGE_NAME,
+ PERMISSION,
+ virtualDevice.persistentDeviceId!!,
+ )
+
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, true)
+
+ testGrantPermissionForDevice(
+ Display.DEFAULT_DISPLAY,
+ DEVICE_ID_DEFAULT,
+ false,
+ "",
+ expectPermissionGrantedOnDefaultDevice = true,
+ expectPermissionGrantedOnRemoteDevice = true,
+ )
+ }
+
@RequiresFlagsEnabled(
Flags.FLAG_DEVICE_AWARE_PERMISSION_APIS_ENABLED,
Flags.FLAG_DEVICE_AWARE_PERMISSIONS_ENABLED,
@@ -151,6 +201,9 @@ class DeviceAwarePermissionGrantTest {
@RequiresFlagsDisabled(Flags.FLAG_ALLOW_HOST_PERMISSION_DIALOGS_ON_VIRTUAL_DEVICES)
@Test
fun onRemoteDevice_requestPermissionForHostDevice_shouldShowWarningDialog() {
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+
requestPermissionOnDevice(virtualDisplay.display.displayId, DEVICE_ID_DEFAULT)
val displayId = virtualDisplay.display.displayId
@@ -165,6 +218,8 @@ class DeviceAwarePermissionGrantTest {
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.BAKLAVA, codeName = "Baklava")
@Test
fun onRemoteDevice_requestPermissionForHostDevice_shouldGrantPermission() {
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
// Create a virtual device with default policy, so that camera permission request will
// correspond to default device camera access.
virtualDevice =
@@ -192,6 +247,9 @@ class DeviceAwarePermissionGrantTest {
)
@Test
fun onRemoteDevice_requestPermissionForRemoteDevice_shouldGrantPermission() {
+ assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
+ assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
+
testGrantPermissionForDevice(
virtualDisplay.display.displayId,
virtualDevice.deviceId,
@@ -210,12 +268,7 @@ class DeviceAwarePermissionGrantTest {
expectPermissionGrantedOnDefaultDevice: Boolean,
expectPermissionGrantedOnRemoteDevice: Boolean,
) {
- // Assert no permission granted to either default device or virtual device at the beginning
- assertAppHasPermissionForDevice(DEVICE_ID_DEFAULT, false)
- assertAppHasPermissionForDevice(virtualDevice.deviceId, false)
-
val future = requestPermissionOnDevice(displayId, targetDeviceId)
- virtualDeviceRule.waitAndAssertActivityResumed(getPermissionDialogComponentName())
if (showDeviceName) {
assertPermissionMessageContainsDeviceName(displayId, expectedDeviceNameInDialog)
@@ -261,7 +314,9 @@ class DeviceAwarePermissionGrantTest {
.putExtra(PackageManager.EXTRA_REQUEST_PERMISSIONS_DEVICE_ID, targetDeviceId)
.putExtra(EXTRA_RESULT_RECEIVER, callback)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+
virtualDeviceRule.sendIntentToDisplay(intent, displayId)
+ virtualDeviceRule.waitAndAssertActivityResumed(getPermissionDialogComponentName())
return future
}
diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
index dd251df3a..58d110f09 100644
--- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml
+++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml
@@ -8266,6 +8266,14 @@
android:protectionLevel="signature"
android:featureFlag="com.android.hardware.input.manage_key_gestures" />
+ <!-- Allows applications to register listeners for key activeness through
+ InputManagerService.
+ <p>Protection level: signature
+ @hide -->
+ <permission android:name="android.permission.LISTEN_FOR_KEY_ACTIVITY"
+ android:protectionLevel="signature"
+ android:featureFlag="com.android.hardware.input.key_event_activity_detection"/>
+
<uses-permission android:name="android.permission.HANDLE_QUERY_PACKAGE_RESTART" />
<!-- Allows financed device kiosk apps to perform actions on the Device Lock service
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
index bd22cb5bc..ccc5a0a5e 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/BaseUsePermissionTest.kt
@@ -1129,9 +1129,16 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
}
}
}
+ protected fun navigateToIndividualPermissionSetting(
+ permission: String,
+ manuallyNavigate: Boolean = false,
+ ) {
+ navigateToIndividualPermissionSetting(permission, APP_PACKAGE_NAME, manuallyNavigate)
+ }
protected fun navigateToIndividualPermissionSetting(
permission: String,
+ packageName: String,
manuallyNavigate: Boolean = false,
) {
val useLegacyNavigation = isWatch || isAutomotive || manuallyNavigate
@@ -1150,7 +1157,7 @@ abstract class BaseUsePermissionTest : BasePermissionTest() {
runWithShellPermissionIdentity {
context.startActivity(
Intent(Intent.ACTION_MANAGE_APP_PERMISSION).apply {
- putExtra(Intent.EXTRA_PACKAGE_NAME, APP_PACKAGE_NAME)
+ putExtra(Intent.EXTRA_PACKAGE_NAME, packageName)
putExtra(Intent.EXTRA_PERMISSION_NAME, permission)
putExtra(Intent.EXTRA_USER, Process.myUserHandle())
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/MediaPermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/MediaPermissionTest.kt
index d41c7454f..5e2e40d20 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/MediaPermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/MediaPermissionTest.kt
@@ -17,12 +17,18 @@
package android.permissionui.cts
import android.Manifest
+import android.app.role.RoleManager
+import android.content.pm.PackageManager
import android.os.Build
+import android.platform.test.annotations.AsbSecurityTest
import androidx.test.filters.FlakyTest
import androidx.test.filters.SdkSuppress
+import androidx.test.uiautomator.By
import com.android.compatibility.common.util.CddTest
import com.android.compatibility.common.util.SystemUtil
+import org.junit.Assert
import org.junit.Assume
+import org.junit.Assume.assumeTrue
import org.junit.Test
/**
@@ -180,4 +186,33 @@ class MediaPermissionTest : BaseUsePermissionTest() {
assertAppHasPermission(Manifest.permission.READ_MEDIA_VIDEO, true)
assertAppHasPermission(Manifest.permission.READ_MEDIA_IMAGES, true)
}
+
+
+ @Test
+ @AsbSecurityTest(cveBugId = [315320090])
+ fun testGalleryAppListedAsFixed() {
+ val galleryPkgs = SystemUtil.callWithShellPermissionIdentity {
+ context.getSystemService(RoleManager::class.java)
+ .getRoleHolders(SYSTEM_GALLERY_ROLE_NAME)
+ }
+ assumeTrue(galleryPkgs.isNotEmpty())
+ val galleryPkg = galleryPkgs[0]
+ val checkPermissionResult = SystemUtil.callWithShellPermissionIdentity {
+ packageManager.checkPermission(Manifest.permission.READ_MEDIA_IMAGES, galleryPkg)
+ }
+ assumeTrue(checkPermissionResult == PackageManager.PERMISSION_GRANTED)
+ navigateToIndividualPermissionSetting(Manifest.permission.READ_MEDIA_IMAGES, galleryPkg)
+ // Attempt to deny the permission. It should not show the
+ // "denying default permission dialog"
+ click(By.res(DENY_RADIO_BUTTON))
+ try {
+ waitFindObject(By.res(CANCEL_BUTTON_ID), 1000L)
+ Assert.fail("expected not to find the default deny dialog")
+ } catch (_: Exception) {}
+ }
+
+ companion object {
+ private val SYSTEM_GALLERY_ROLE_NAME = "android.app.role.SYSTEM_GALLERY"
+ private val CANCEL_BUTTON_ID = "android:id/button1"
+ }
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt
index 9f76479e3..4a95a962a 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerPermissionTest.kt
@@ -39,16 +39,19 @@ import com.android.compatibility.common.util.SystemUtil.eventually
import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity
import com.android.compatibility.common.util.UiAutomatorUtils2
import org.junit.AfterClass
+import org.junit.Assert
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import org.junit.Assume.assumeTrue
import org.junit.Before
import org.junit.BeforeClass
+import org.junit.Ignore
import org.junit.Test
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE, codeName = "UpsideDownCake")
@FlakyTest
+@Ignore("b/393428835")
class PhotoPickerPermissionTest : BaseUsePermissionTest() {
companion object {
@@ -68,7 +71,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
NAMESPACE_PRIVACY,
PICKER_ENABLED_SETTING,
true.toString(),
- false
+ false,
)
}
photoUri = PhotoPickerUtils.createImage(context)
@@ -85,7 +88,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
NAMESPACE_PRIVACY,
PICKER_ENABLED_SETTING,
false.toString(),
- false
+ false,
)
}
}
@@ -110,7 +113,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
val permissions = packageInfo.requestedPermissions?.toList() ?: emptyList<String>()
assertFalse(
"Expected app to not request READ_MEDIA_VISUAL_USER_SELECTED",
- permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED)
+ permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED),
)
}
}
@@ -125,7 +128,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
val permissions = packageInfo.requestedPermissions?.toList() ?: emptyList<String>()
assertTrue(
"Expected app to request READ_MEDIA_VISUAL_USER_SELECTED",
- permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED)
+ permissions.contains(READ_MEDIA_VISUAL_USER_SELECTED),
)
}
}
@@ -145,7 +148,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED),
arrayOf(READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to false),
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
findImageOrVideo(expected = true)
@@ -161,7 +164,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
arrayOf(READ_MEDIA_IMAGES),
arrayOf(READ_MEDIA_IMAGES to true),
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
clickImageOrVideo()
@@ -174,17 +177,17 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
assertPermissionFlags(
READ_MEDIA_IMAGES,
FLAG_PERMISSION_ONE_TIME to true,
- FLAG_PERMISSION_REVOKED_COMPAT to true
+ FLAG_PERMISSION_REVOKED_COMPAT to true,
)
assertPermissionFlags(
READ_MEDIA_VIDEO,
FLAG_PERMISSION_ONE_TIME to true,
- FLAG_PERMISSION_REVOKED_COMPAT to true
+ FLAG_PERMISSION_REVOKED_COMPAT to true,
)
assertPermissionFlags(
READ_MEDIA_VISUAL_USER_SELECTED,
FLAG_PERMISSION_ONE_TIME to false,
- FLAG_PERMISSION_REVOKED_COMPAT to false
+ FLAG_PERMISSION_REVOKED_COMPAT to false,
)
}
}
@@ -209,7 +212,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED),
arrayOf(READ_MEDIA_IMAGES to false, READ_MEDIA_VISUAL_USER_SELECTED to true),
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
clickImageOrVideo()
@@ -265,7 +268,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
installPackage(APP_APK_PATH_IMPLICIT_USER_SELECT_STORAGE)
requestAppPermissionsAndAssertResult(
arrayOf(READ_MEDIA_IMAGES),
- arrayOf(READ_MEDIA_IMAGES to true)
+ arrayOf(READ_MEDIA_IMAGES to true),
) {
click(By.res(ALLOW_ALL_BUTTON))
}
@@ -278,7 +281,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
installPackage(APP_APK_PATH_LATEST)
requestAppPermissionsAndAssertResult(
arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED),
- arrayOf(READ_MEDIA_IMAGES to true, READ_MEDIA_VISUAL_USER_SELECTED to true)
+ arrayOf(READ_MEDIA_IMAGES to true, READ_MEDIA_VISUAL_USER_SELECTED to true),
) {
click(By.res(ALLOW_ALL_BUTTON))
}
@@ -338,7 +341,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
.toList()
assertTrue(
"Expected package to have USER_SELECTED",
- requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED)
+ requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED),
)
}
@@ -363,7 +366,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
.toList()
assertTrue(
"Expected package to have USER_SELECTED",
- requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED)
+ requestedPerms.contains(READ_MEDIA_VISUAL_USER_SELECTED),
)
}
@@ -381,14 +384,14 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
installPackage(APP_APK_PATH_IMPLICIT_USER_SELECT_STORAGE)
requestAppPermissionsAndAssertResult(
READ_MEDIA_VISUAL_USER_SELECTED to false,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {}
uninstallPackage(APP_PACKAGE_NAME)
installPackage(APP_APK_PATH_LATEST)
requestAppPermissionsAndAssertResult(
READ_MEDIA_VISUAL_USER_SELECTED to false,
ACCESS_MEDIA_LOCATION to false,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {}
}
@@ -399,7 +402,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
READ_MEDIA_IMAGES to true,
READ_MEDIA_VIDEO to true,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {}
}
@@ -410,7 +413,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
READ_MEDIA_IMAGES to false,
ACCESS_MEDIA_LOCATION to true,
READ_MEDIA_VISUAL_USER_SELECTED to true,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
clickImageOrVideo()
@@ -427,7 +430,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
ACCESS_MEDIA_LOCATION to false,
READ_MEDIA_VISUAL_USER_SELECTED to false,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
findView(By.res(SELECT_BUTTON), expected = false)
}
@@ -440,7 +443,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
READ_MEDIA_IMAGES to false,
ACCESS_MEDIA_LOCATION to true,
READ_MEDIA_VISUAL_USER_SELECTED to true,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
clickImageOrVideo()
@@ -459,7 +462,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
READ_MEDIA_IMAGES to false,
READ_MEDIA_VISUAL_USER_SELECTED to true,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
clickImageOrVideo()
@@ -474,7 +477,7 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
requestAppPermissionsAndAssertResult(
READ_MEDIA_IMAGES to false,
READ_MEDIA_VISUAL_USER_SELECTED to true,
- waitForWindowTransition = false
+ waitForWindowTransition = false,
) {
doAndWaitForWindowTransition { click(By.res(SELECT_BUTTON)) }
try {
@@ -506,18 +509,32 @@ class PhotoPickerPermissionTest : BaseUsePermissionTest() {
}
private fun clickImageOrVideo() {
- click(By.res(PhotoPickerUtils.getImageOrVideoResId(context)))
+ PhotoPickerUtils.clickAndWait(uiDevice, PhotoPickerUtils.getMediaItem(uiDevice))
}
private fun clickAllow() {
- click(By.res(PhotoPickerUtils.getAllowId(context)))
+ PhotoPickerUtils.clickAndWait(uiDevice, PhotoPickerUtils.findAddOrDoneButton())
}
private fun findImageOrVideo(expected: Boolean) {
- findView(By.res(PhotoPickerUtils.getImageOrVideoResId(context)), expected)
+ eventually {
+ val item = PhotoPickerUtils.getMediaItem(uiDevice)
+ if (!expected && item.exists()) {
+ Assert.fail("Found image or video, when not expecting it")
+ } else if (expected && !item.exists()) {
+ Assert.fail("Failed to find image or video")
+ }
+ }
}
private fun findVideo(expected: Boolean) {
- findView(By.res(PhotoPickerUtils.getVideoResId(context)), expected)
+ eventually {
+ val item = PhotoPickerUtils.getVideoItem(uiDevice)
+ if (!expected && item.exists()) {
+ Assert.fail("Found video, when not expecting it")
+ } else if (expected && !item.exists()) {
+ Assert.fail("Failed to find video")
+ }
+ }
}
}
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt
index db6c412db..aea5637df 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/PhotoPickerUtils.kt
@@ -21,23 +21,27 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.os.FileUtils
+import android.provider.DeviceConfig
import android.provider.MediaStore
import android.provider.cts.media.MediaProviderTestUtils
import android.provider.cts.media.MediaStoreUtils
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiObject
+import androidx.test.uiautomator.UiSelector
import com.android.compatibility.common.util.SystemUtil.callWithShellPermissionIdentity
import java.io.IOException
+import org.junit.Assert
+// TODO: b/393428835: We need to merge these utils with the Photo Picker CTS ones
object PhotoPickerUtils {
private const val DISPLAY_NAME_PREFIX = "ctsPermissionPhotoPicker"
private const val VIDEO_ICON_ID = ":id/icon_video"
- private const val IMAGE_CHECK_BOX_ID = ":id/icon_check"
private const val ALLOW_ID = ":id/button_add"
+ private const val REGEX_MEDIA_ITEM_CONTENT_DESCRIPTION = "^(Media|Photo|Video|GIF|Motion)[^s].*"
+ private const val REGEX_VIDEO_ITEM_CONTENT_DESCRIPTION = "^(Video)[^s].*"
+ private const val REGEX_CONTAINS_DONE = ".*[Dd]one.*"
private var mediaProviderPkgName: String? = null
- fun getImageOrVideoResId(context: Context): String {
- return "${getMediaProviderPkgName(context)!!}$IMAGE_CHECK_BOX_ID"
- }
-
fun getVideoResId(context: Context): String {
return "${getMediaProviderPkgName(context)!!}$VIDEO_ICON_ID"
}
@@ -70,7 +74,7 @@ object PhotoPickerUtils {
context,
R.raw.lg_g4_iso_800_jpg,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
- "image/jpeg"
+ "image/jpeg",
)
.first
}
@@ -81,7 +85,7 @@ object PhotoPickerUtils {
context,
R.raw.test_video,
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
- "video/mp4"
+ "video/mp4",
)
.first
}
@@ -108,6 +112,7 @@ object PhotoPickerUtils {
stageMedia(context, resId, collectionUri, mimeType)
}
}
+
@Throws(IOException::class)
private fun stageMedia(
context: Context,
@@ -125,4 +130,44 @@ object PhotoPickerUtils {
return session.publish() to displayName
}
}
+
+ /** Find a media item to perform click events */
+ @Throws(Exception::class)
+ fun getMediaItem(device: UiDevice): UiObject {
+ val mediaItemSelector =
+ UiSelector().descriptionMatches(REGEX_MEDIA_ITEM_CONTENT_DESCRIPTION)
+ return device.findObject(mediaItemSelector)
+ }
+
+ /** Find a media item to perform click events */
+ @Throws(Exception::class)
+ fun getVideoItem(device: UiDevice): UiObject {
+ val mediaItemSelector =
+ UiSelector().descriptionMatches(REGEX_VIDEO_ITEM_CONTENT_DESCRIPTION)
+ return device.findObject(mediaItemSelector)
+ }
+
+ fun findAddOrDoneButton(): UiObject {
+ if (isModernPickerEnabled()) {
+ return UiObject(UiSelector().textMatches(REGEX_CONTAINS_DONE))
+ }
+ return UiObject(UiSelector().resourceIdMatches("$mediaProviderPkgName:id/button_add"))
+ }
+
+ @Throws(Exception::class)
+ fun clickAndWait(uiDevice: UiDevice, uiObject: UiObject) {
+ uiObject.click()
+ uiDevice.waitForIdle()
+ }
+
+ fun isModernPickerEnabled(): Boolean {
+ return try {
+ callWithShellPermissionIdentity {
+ DeviceConfig.getBoolean("mediaprovider", "enable_modern_picker", false)
+ }
+ } catch (e: Exception) {
+ Assert.fail("Failed to check if modern media provider is enabled")
+ false
+ }
+ }
}