Suppress webview / checkbox permission dialog

Signed-off-by: Johannes Marbach <johannesm@element.io>
This commit is contained in:
Johannes Marbach 2022-07-07 08:46:47 +02:00 committed by Onuray Sahin
parent fd3b082a2c
commit 5c55263cf6
2 changed files with 37 additions and 15 deletions

View File

@ -298,7 +298,8 @@ class WidgetFragment @Inject constructor(
request = request,
context = requireContext(),
activity = requireActivity(),
activityResultLauncher = permissionResultLauncher
activityResultLauncher = permissionResultLauncher,
autoApprove = fragmentArgs.kind == WidgetKind.ELEMENT_CALL
)
}

View File

@ -41,11 +41,22 @@ class WebviewPermissionUtils @Inject constructor(
request: PermissionRequest,
context: Context,
activity: FragmentActivity,
activityResultLauncher: ActivityResultLauncher<Array<String>>
activityResultLauncher: ActivityResultLauncher<Array<String>>,
autoApprove: Boolean = false
) {
if (autoApprove) {
onPermissionsSelected(
permissions = request.resources.toList(),
request = request,
activity = activity,
activityResultLauncher = activityResultLauncher)
return
}
val allowedPermissions = request.resources.map {
it to false
}.toMutableList()
MaterialAlertDialogBuilder(context)
.setTitle(title)
.setMultiChoiceItems(
@ -54,21 +65,10 @@ class WebviewPermissionUtils @Inject constructor(
allowedPermissions[which] = allowedPermissions[which].first to isChecked
}
.setPositiveButton(R.string.room_widget_resource_grant_permission) { _, _ ->
permissionRequest = request
selectedPermissions = allowedPermissions.mapNotNull { perm ->
val permissions = allowedPermissions.mapNotNull { perm ->
perm.first.takeIf { perm.second }
}
val requiredAndroidPermissions = selectedPermissions.mapNotNull { permission ->
webPermissionToAndroidPermission(permission)
}
// When checkPermissions returns false, some of the required Android permissions will
// have to be requested and the flow completes asynchronously via onPermissionResult
if (checkPermissions(requiredAndroidPermissions, activity, activityResultLauncher)) {
request.grant(selectedPermissions.toTypedArray())
reset()
}
onPermissionsSelected(permissions, request, activity, activityResultLauncher)
}
.setNegativeButton(R.string.room_widget_resource_decline_permission) { _, _ ->
request.deny()
@ -76,6 +76,27 @@ class WebviewPermissionUtils @Inject constructor(
.show()
}
private fun onPermissionsSelected(
permissions: List<String>,
request: PermissionRequest,
activity: FragmentActivity,
activityResultLauncher: ActivityResultLauncher<Array<String>>,
) {
permissionRequest = request
selectedPermissions = permissions
val requiredAndroidPermissions = selectedPermissions.mapNotNull { permission ->
webPermissionToAndroidPermission(permission)
}
// When checkPermissions returns false, some of the required Android permissions will
// have to be requested and the flow completes asynchronously via onPermissionResult
if (checkPermissions(requiredAndroidPermissions, activity, activityResultLauncher)) {
request.grant(selectedPermissions.toTypedArray())
reset()
}
}
fun onPermissionResult(result: Map<String, Boolean>) {
if (permissionRequest == null) {
fatalError(