|
|
|
@ -77,11 +77,11 @@ class WebExtensionPromptFeature(
|
|
|
|
|
// opens the add-ons manager.
|
|
|
|
|
val addon = Addon.newFromWebExtension(promptRequest.extension)
|
|
|
|
|
when (promptRequest) {
|
|
|
|
|
is WebExtensionPromptRequest.AfterInstallation.Permissions -> handlePermissionRequest(
|
|
|
|
|
is WebExtensionPromptRequest.AfterInstallation.Permissions.Required -> handleRequiredPermissionRequest(
|
|
|
|
|
addon,
|
|
|
|
|
promptRequest,
|
|
|
|
|
)
|
|
|
|
|
is WebExtensionPromptRequest.AfterInstallation.OptionalPermissions -> handleOptionalPermissionsRequest(
|
|
|
|
|
is WebExtensionPromptRequest.AfterInstallation.Permissions.Optional -> handleOptionalPermissionsRequest(
|
|
|
|
|
addon,
|
|
|
|
|
promptRequest,
|
|
|
|
|
)
|
|
|
|
@ -108,36 +108,31 @@ class WebExtensionPromptFeature(
|
|
|
|
|
showPostInstallationDialog(addon)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handlePermissionRequest(
|
|
|
|
|
private fun handleRequiredPermissionRequest(
|
|
|
|
|
addon: Addon,
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions,
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions.Required,
|
|
|
|
|
) {
|
|
|
|
|
showPermissionDialog(
|
|
|
|
|
addon = addon,
|
|
|
|
|
onConfirm = promptRequest.onConfirm,
|
|
|
|
|
)
|
|
|
|
|
showPermissionDialog(addon = addon, promptRequest = promptRequest)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@VisibleForTesting
|
|
|
|
|
internal fun handleOptionalPermissionsRequest(
|
|
|
|
|
addon: Addon,
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.OptionalPermissions,
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions.Optional,
|
|
|
|
|
) {
|
|
|
|
|
val shouldGrantWithoutPrompt = Addon.localizePermissions(promptRequest.permissions, context).isEmpty()
|
|
|
|
|
|
|
|
|
|
// If we don't have any promptable permissions, just proceed.
|
|
|
|
|
if (shouldGrantWithoutPrompt) {
|
|
|
|
|
promptRequest.onConfirm(true)
|
|
|
|
|
consumePromptRequest()
|
|
|
|
|
handlePermissions(promptRequest, granted = true)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
showPermissionDialog(
|
|
|
|
|
// This is a bit of a hack so that the permission prompt only lists
|
|
|
|
|
// the optional permissions that are requested.
|
|
|
|
|
addon = addon.copy(permissions = promptRequest.permissions),
|
|
|
|
|
onConfirm = promptRequest.onConfirm,
|
|
|
|
|
addon = addon,
|
|
|
|
|
promptRequest = promptRequest,
|
|
|
|
|
forOptionalPermissions = true,
|
|
|
|
|
optionalPermissions = promptRequest.permissions,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -211,8 +206,9 @@ class WebExtensionPromptFeature(
|
|
|
|
|
@VisibleForTesting
|
|
|
|
|
internal fun showPermissionDialog(
|
|
|
|
|
addon: Addon,
|
|
|
|
|
onConfirm: (Boolean) -> Unit,
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions,
|
|
|
|
|
forOptionalPermissions: Boolean = false,
|
|
|
|
|
optionalPermissions: List<String> = emptyList(),
|
|
|
|
|
) {
|
|
|
|
|
if (isInstallationInProgress || hasExistingPermissionDialogFragment()) {
|
|
|
|
|
return
|
|
|
|
@ -221,6 +217,7 @@ class WebExtensionPromptFeature(
|
|
|
|
|
val dialog = PermissionsDialogFragment.newInstance(
|
|
|
|
|
addon = addon,
|
|
|
|
|
forOptionalPermissions = forOptionalPermissions,
|
|
|
|
|
optionalPermissions = optionalPermissions,
|
|
|
|
|
promptsStyling = PermissionsDialogFragment.PromptsStyling(
|
|
|
|
|
gravity = Gravity.BOTTOM,
|
|
|
|
|
shouldWidthMatchParent = true,
|
|
|
|
@ -235,14 +232,8 @@ class WebExtensionPromptFeature(
|
|
|
|
|
positiveButtonRadius =
|
|
|
|
|
(context.resources.getDimensionPixelSize(R.dimen.tab_corner_radius)).toFloat(),
|
|
|
|
|
),
|
|
|
|
|
onPositiveButtonClicked = {
|
|
|
|
|
onConfirm(true)
|
|
|
|
|
consumePromptRequest()
|
|
|
|
|
},
|
|
|
|
|
onNegativeButtonClicked = {
|
|
|
|
|
onConfirm(false)
|
|
|
|
|
consumePromptRequest()
|
|
|
|
|
},
|
|
|
|
|
onPositiveButtonClicked = { handlePermissions(promptRequest, granted = true) },
|
|
|
|
|
onNegativeButtonClicked = { handlePermissions(promptRequest, granted = false) },
|
|
|
|
|
)
|
|
|
|
|
dialog.show(
|
|
|
|
|
fragmentManager,
|
|
|
|
@ -257,14 +248,14 @@ class WebExtensionPromptFeature(
|
|
|
|
|
if (promptRequest is WebExtensionPromptRequest.AfterInstallation.Permissions &&
|
|
|
|
|
addon.id == promptRequest.extension.id
|
|
|
|
|
) {
|
|
|
|
|
handleApprovedPermissions(promptRequest)
|
|
|
|
|
handlePermissions(promptRequest, granted = true)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
dialog.onNegativeButtonClicked = {
|
|
|
|
|
store.state.webExtensionPromptRequest?.let { promptRequest ->
|
|
|
|
|
if (promptRequest is WebExtensionPromptRequest.AfterInstallation.Permissions) {
|
|
|
|
|
handleDeniedPermissions(promptRequest)
|
|
|
|
|
handlePermissions(promptRequest, granted = false)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -292,13 +283,11 @@ class WebExtensionPromptFeature(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handleDeniedPermissions(promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions) {
|
|
|
|
|
promptRequest.onConfirm(false)
|
|
|
|
|
consumePromptRequest()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun handleApprovedPermissions(promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions) {
|
|
|
|
|
promptRequest.onConfirm(true)
|
|
|
|
|
private fun handlePermissions(
|
|
|
|
|
promptRequest: WebExtensionPromptRequest.AfterInstallation.Permissions,
|
|
|
|
|
granted: Boolean,
|
|
|
|
|
) {
|
|
|
|
|
promptRequest.onConfirm(granted)
|
|
|
|
|
consumePromptRequest()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|