mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-28 00:39:01 +03:00
Create use case to check webview permissions.
This commit is contained in:
parent
b38911751e
commit
d631c709d6
5 changed files with 63 additions and 33 deletions
matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/widgets/model
vector/src/main/java/im/vector/app
core/utils
features/widgets
|
@ -29,7 +29,7 @@ private val DEFINED_TYPES by lazy {
|
||||||
WidgetType.Grafana,
|
WidgetType.Grafana,
|
||||||
WidgetType.Custom,
|
WidgetType.Custom,
|
||||||
WidgetType.IntegrationManager,
|
WidgetType.IntegrationManager,
|
||||||
WidgetType.ElementCall
|
WidgetType.ElementCall,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2022 New Vector Ltd
|
||||||
|
*
|
||||||
|
* 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 im.vector.app.core.utils
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.webkit.PermissionRequest
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class CheckWebViewPermissionsUseCase @Inject constructor() {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if required WebView permissions are already granted system level.
|
||||||
|
* @param activity the calling Activity that is requesting the permissions (or fragment parent)
|
||||||
|
* @param request WebView permission request of onPermissionRequest function
|
||||||
|
* @return true if WebView permissions are already granted, false otherwise
|
||||||
|
*/
|
||||||
|
fun execute(activity: Activity, request: PermissionRequest): Boolean {
|
||||||
|
return request.resources.all {
|
||||||
|
when (it) {
|
||||||
|
PermissionRequest.RESOURCE_AUDIO_CAPTURE -> {
|
||||||
|
PERMISSIONS_FOR_AUDIO_IP_CALL.all { permission ->
|
||||||
|
ContextCompat.checkSelfPermission(activity.applicationContext, permission) == PackageManager.PERMISSION_GRANTED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PermissionRequest.RESOURCE_VIDEO_CAPTURE -> {
|
||||||
|
PERMISSIONS_FOR_VIDEO_IP_CALL.all { permission ->
|
||||||
|
ContextCompat.checkSelfPermission(activity.applicationContext, permission) == PackageManager.PERMISSION_GRANTED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,7 +19,6 @@ package im.vector.app.core.utils
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.webkit.PermissionRequest
|
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
@ -138,32 +137,6 @@ fun checkPermissions(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks if required WebView permissions are already granted system level.
|
|
||||||
* @param activity the calling Activity that is requesting the permissions (or fragment parent)
|
|
||||||
* @param request WebView permission request of onPermissionRequest function
|
|
||||||
* @return true if WebView permissions are already granted, false otherwise
|
|
||||||
*/
|
|
||||||
fun checkWebViewPermissions(activity: Activity, request: PermissionRequest): Boolean {
|
|
||||||
return request.resources.all {
|
|
||||||
when (it) {
|
|
||||||
PermissionRequest.RESOURCE_AUDIO_CAPTURE -> {
|
|
||||||
PERMISSIONS_FOR_AUDIO_IP_CALL.all { permission ->
|
|
||||||
ContextCompat.checkSelfPermission(activity.applicationContext, permission) == PackageManager.PERMISSION_GRANTED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PermissionRequest.RESOURCE_VIDEO_CAPTURE -> {
|
|
||||||
PERMISSIONS_FOR_VIDEO_IP_CALL.all { permission ->
|
|
||||||
ContextCompat.checkSelfPermission(activity.applicationContext, permission) == PackageManager.PERMISSION_GRANTED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be call after the permission request.
|
* To be call after the permission request.
|
||||||
*
|
*
|
||||||
|
|
|
@ -43,6 +43,7 @@ import im.vector.app.core.extensions.registerStartForActivityResult
|
||||||
import im.vector.app.core.platform.OnBackPressed
|
import im.vector.app.core.platform.OnBackPressed
|
||||||
import im.vector.app.core.platform.VectorBaseFragment
|
import im.vector.app.core.platform.VectorBaseFragment
|
||||||
import im.vector.app.core.platform.VectorMenuProvider
|
import im.vector.app.core.platform.VectorMenuProvider
|
||||||
|
import im.vector.app.core.utils.CheckWebViewPermissionsUseCase
|
||||||
import im.vector.app.core.utils.openUrlInExternalBrowser
|
import im.vector.app.core.utils.openUrlInExternalBrowser
|
||||||
import im.vector.app.databinding.FragmentRoomWidgetBinding
|
import im.vector.app.databinding.FragmentRoomWidgetBinding
|
||||||
import im.vector.app.features.webview.WebEventListener
|
import im.vector.app.features.webview.WebEventListener
|
||||||
|
@ -65,7 +66,8 @@ data class WidgetArgs(
|
||||||
) : Parcelable
|
) : Parcelable
|
||||||
|
|
||||||
class WidgetFragment @Inject constructor(
|
class WidgetFragment @Inject constructor(
|
||||||
private val permissionUtils: WebviewPermissionUtils
|
private val permissionUtils: WebviewPermissionUtils,
|
||||||
|
private val checkWebViewPermissionsUseCase: CheckWebViewPermissionsUseCase,
|
||||||
) :
|
) :
|
||||||
VectorBaseFragment<FragmentRoomWidgetBinding>(),
|
VectorBaseFragment<FragmentRoomWidgetBinding>(),
|
||||||
WebEventListener,
|
WebEventListener,
|
||||||
|
@ -81,7 +83,7 @@ class WidgetFragment @Inject constructor(
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
views.widgetWebView.setupForWidget(requireActivity(), this)
|
views.widgetWebView.setupForWidget(requireActivity(), checkWebViewPermissionsUseCase, this)
|
||||||
if (fragmentArgs.kind.isAdmin()) {
|
if (fragmentArgs.kind.isAdmin()) {
|
||||||
viewModel.getPostAPIMediator().setWebView(views.widgetWebView)
|
viewModel.getPostAPIMediator().setWebView(views.widgetWebView)
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,13 +24,16 @@ import android.webkit.PermissionRequest
|
||||||
import android.webkit.WebChromeClient
|
import android.webkit.WebChromeClient
|
||||||
import android.webkit.WebView
|
import android.webkit.WebView
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.utils.checkWebViewPermissions
|
import im.vector.app.core.utils.CheckWebViewPermissionsUseCase
|
||||||
import im.vector.app.features.themes.ThemeUtils
|
import im.vector.app.features.themes.ThemeUtils
|
||||||
import im.vector.app.features.webview.VectorWebViewClient
|
import im.vector.app.features.webview.VectorWebViewClient
|
||||||
import im.vector.app.features.webview.WebEventListener
|
import im.vector.app.features.webview.WebEventListener
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
fun WebView.setupForWidget(activity: Activity, eventListener: WebEventListener) {
|
fun WebView.setupForWidget(activity: Activity,
|
||||||
|
checkWebViewPermissionsUseCase: CheckWebViewPermissionsUseCase,
|
||||||
|
eventListener: WebEventListener,
|
||||||
|
) {
|
||||||
// xml value seems ignored
|
// xml value seems ignored
|
||||||
setBackgroundColor(ThemeUtils.getColor(context, R.attr.colorSurface))
|
setBackgroundColor(ThemeUtils.getColor(context, R.attr.colorSurface))
|
||||||
|
|
||||||
|
@ -63,7 +66,7 @@ fun WebView.setupForWidget(activity: Activity, eventListener: WebEventListener)
|
||||||
// Permission requests
|
// Permission requests
|
||||||
webChromeClient = object : WebChromeClient() {
|
webChromeClient = object : WebChromeClient() {
|
||||||
override fun onPermissionRequest(request: PermissionRequest) {
|
override fun onPermissionRequest(request: PermissionRequest) {
|
||||||
if (checkWebViewPermissions(activity, request)) {
|
if (checkWebViewPermissionsUseCase.execute(activity, request)) {
|
||||||
request.grant(request.resources)
|
request.grant(request.resources)
|
||||||
} else {
|
} else {
|
||||||
eventListener.onPermissionRequest(request)
|
eventListener.onPermissionRequest(request)
|
||||||
|
|
Loading…
Add table
Reference in a new issue