Skip to content

Commit

Permalink
[feature/webview-image-upload] WebView의 FileChooser로 이미지 웹으로 전달 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
l2hyunwoo committed Aug 23, 2024
1 parent 55db309 commit c54d1a3
Showing 1 changed file with 38 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,55 @@
*/
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
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<Array<Uri>>? = 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<Array<Uri>>?,
fileChooserParams: FileChooserParams?
): Boolean {
if (filePathCallback != null) {
this@WebViewActivity.filePathCallback = filePathCallback
}

imageResult.launch(
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
)
return true
}
}
handleLinkUrl()
handleOnBackPressed()
handleOnPullToRefresh()
Expand All @@ -68,4 +98,8 @@ class WebViewActivity : AppCompatActivity() {
binding.webView.reload()
}
}

companion object {
const val INTENT_URL = "_intent_url"
}
}

0 comments on commit c54d1a3

Please sign in to comment.