From c54d1a34b4e1ecc6f098d8ba38f73e25d0f6dc28 Mon Sep 17 00:00:00 2001 From: HyunWoo Lee Date: Sat, 24 Aug 2024 01:09:18 +0900 Subject: [PATCH] =?UTF-8?q?[feature/webview-image-upload]=20WebView?= =?UTF-8?q?=EC=9D=98=20FileChooser=EB=A1=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EC=9B=B9=EC=9C=BC=EB=A1=9C=20=EC=A0=84=EB=8B=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../official/webview/view/WebViewActivity.kt | 42 +++++++++++++++++-- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/core/webview/src/main/java/org/sopt/official/webview/view/WebViewActivity.kt b/core/webview/src/main/java/org/sopt/official/webview/view/WebViewActivity.kt index 30ccfa1d..e2de6467 100644 --- a/core/webview/src/main/java/org/sopt/official/webview/view/WebViewActivity.kt +++ b/core/webview/src/main/java/org/sopt/official/webview/view/WebViewActivity.kt @@ -24,8 +24,16 @@ */ package org.sopt.official.webview.view +import android.app.Activity +import android.content.Intent +import android.net.Uri import android.os.Bundle +import android.webkit.ValueCallback +import android.webkit.WebChromeClient +import android.webkit.WebView import androidx.activity.addCallback +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import dagger.hilt.android.AndroidEntryPoint import org.sopt.official.common.util.viewBinding @@ -33,16 +41,38 @@ import org.sopt.official.webview.databinding.ActivityWebViewBinding @AndroidEntryPoint class WebViewActivity : AppCompatActivity() { - companion object { - const val INTENT_URL = "_intent_url" - } - private val binding by viewBinding(ActivityWebViewBinding::inflate) + private var filePathCallback: ValueCallback>? = null + private val imageResult = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri: Uri? -> + if (uri == null) { + filePathCallback?.onReceiveValue(null) + filePathCallback = null + } else { + val data = Intent().apply { data = uri } + filePathCallback?.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(Activity.RESULT_OK, data)) + filePathCallback = null + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(binding.root) + binding.webView.webChromeClient = object : WebChromeClient() { + override fun onShowFileChooser( + webView: WebView?, + filePathCallback: ValueCallback>?, + fileChooserParams: FileChooserParams? + ): Boolean { + if (filePathCallback != null) { + this@WebViewActivity.filePathCallback = filePathCallback + } + imageResult.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + return true + } + } handleLinkUrl() handleOnBackPressed() handleOnPullToRefresh() @@ -68,4 +98,8 @@ class WebViewActivity : AppCompatActivity() { binding.webView.reload() } } + + companion object { + const val INTENT_URL = "_intent_url" + } }