@@ -17,7 +17,9 @@ import com.example.fragment.library.base.http.HttpRequest
1717import com.example.fragment.library.base.http.download
1818import com.example.fragment.library.base.utils.InjectUtils.injectVConsoleJs
1919import com.example.fragment.library.base.utils.UIModeUtils.isNightMode
20- import com.tencent.smtt.export.external.interfaces.*
20+ import com.tencent.smtt.export.external.interfaces.IX5WebSettings
21+ import com.tencent.smtt.export.external.interfaces.WebResourceRequest
22+ import com.tencent.smtt.export.external.interfaces.WebResourceResponse
2123import com.tencent.smtt.sdk.*
2224import com.tencent.smtt.sdk.WebView.HitTestResult.IMAGE_TYPE
2325import com.tencent.smtt.sdk.WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE
@@ -36,9 +38,7 @@ class WebViewHelper private constructor(parent: ViewGroup) {
3638
3739 private val webView = WebViewManager .obtain(parent.context)
3840
39-
40- var onReceivedTitleListener: OnReceivedTitleListener ? = null
41- var onPageChangedListener: OnPageChangedListener ? = null
41+ private var onPageChangedListener: OnPageChangedListener ? = null
4242
4343 private var injectState = false
4444 private var injectVConsole = false
@@ -68,16 +68,13 @@ class WebViewHelper private constructor(parent: ViewGroup) {
6868 view : WebView ? ,
6969 request : WebResourceRequest ?
7070 ): WebResourceResponse ? {
71- val uri = request?.url
72- if (view != null && uri != null ) {
73- val url = uri.toString()
74- val extension = getExtensionFromUrl(url)
71+ if (view != null && request != null ) {
7572 when {
76- isAssetsResource(url ) -> {
77- return assetsResourceRequest(view.context, url )
73+ isAssetsResource(request ) -> {
74+ return assetsResourceRequest(view.context, request )
7875 }
79- isWebResource(extension ) -> {
80- return webResourceRequest(view.context, url, extension )
76+ isWebResource(request ) -> {
77+ return webResourceRequest(view.context, request )
8178 }
8279 }
8380 }
@@ -86,39 +83,25 @@ class WebViewHelper private constructor(parent: ViewGroup) {
8683
8784 override fun onPageStarted (view : WebView ? , url : String? , favicon : Bitmap ? ) {
8885 super .onPageStarted(view, url, favicon)
89- injectState = false
9086 onPageChangedListener?.onPageStarted(view, url, favicon)
87+ injectState = false
9188 }
9289
9390 override fun onPageFinished (view : WebView ? , url : String? ) {
9491 super .onPageFinished(view, url)
95- injectState = false
9692 onPageChangedListener?.onPageFinished(view, url)
97- }
98-
99- override fun onReceivedSslError (
100- view : WebView ? ,
101- handler : SslErrorHandler ? ,
102- error : SslError ?
103- ) {
104- super .onReceivedSslError(view, handler, error)
105- handler?.proceed() // 接受证书
93+ injectState = false
10694 }
10795 }
10896 webView.webChromeClient = object : WebChromeClient () {
10997
110- override fun onReceivedTitle (view : WebView ? , title : String? ) {
111- super .onReceivedTitle(view, title)
112- onReceivedTitleListener?.onReceivedTitle(view, title)
113- }
114-
11598 override fun onProgressChanged (view : WebView ? , newProgress : Int ) {
11699 super .onProgressChanged(view, newProgress)
117- if (injectVConsole && ! injectState && newProgress > 80 ) {
100+ onPageChangedListener?.onProgressChanged(view, newProgress)
101+ if (newProgress > 80 && injectVConsole && ! injectState) {
118102 view?.apply { evaluateJavascript(context.injectVConsoleJs()) {} }
119103 injectState = true
120104 }
121- onPageChangedListener?.onProgressChanged(view, newProgress)
122105 }
123106 }
124107 webView.setDownloadListener { url, _, _, _, _ ->
@@ -159,6 +142,11 @@ class WebViewHelper private constructor(parent: ViewGroup) {
159142 return this
160143 }
161144
145+ fun setOnPageChangedListener (onPageChangedListener : OnPageChangedListener ? ): WebViewHelper {
146+ this .onPageChangedListener = onPageChangedListener
147+ return this
148+ }
149+
162150 fun canGoBack (): Boolean {
163151 val canBack = webView.canGoBack()
164152 if (canBack) webView.goBack()
@@ -202,28 +190,36 @@ class WebViewHelper private constructor(parent: ViewGroup) {
202190 WebViewManager .recycle(webView)
203191 }
204192
205- private fun isAssetsResource (url : String ): Boolean {
193+ private fun isAssetsResource (webRequest : WebResourceRequest ): Boolean {
194+ val url = webRequest.url.toString()
206195 return url.startsWith(" file:///android_asset/" )
207196 }
208197
209- private fun isWebResource (extension : String ): Boolean {
198+ private fun isWebResource (webRequest : WebResourceRequest ): Boolean {
199+ val url = webRequest.url.toString()
200+ val extension = getExtensionFromUrl(url)
210201 return extension == " ico" || extension == " gif"
211202 || extension == " jpeg" || extension == " jpg"
212203 || extension == " png" || extension == " svg"
213204 || extension == " webp" || extension == " css"
214205 || extension == " js" || extension == " json"
215206 }
216207
217- private fun assetsResourceRequest (context : Context , url : String ): WebResourceResponse ? {
208+ private fun assetsResourceRequest (
209+ context : Context ,
210+ webRequest : WebResourceRequest
211+ ): WebResourceResponse ? {
218212 try {
219- val webResourceResponse = WebResourceResponse ()
213+ val url = webRequest.url.toString ()
220214 val filenameIndex = url.lastIndexOf(" /" ) + 1
221215 val filename = url.substring(filenameIndex)
222216 val suffixIndex = url.lastIndexOf(" ." )
223217 val suffix = url.substring(suffixIndex + 1 )
224- webResourceResponse.mimeType = getMimeTypeFromExtension(url)
218+ val webResourceResponse = WebResourceResponse ()
219+ webResourceResponse.mimeType = getMimeTypeFromUrl(url)
225220 webResourceResponse.encoding = " UTF-8"
226- webResourceResponse.data = context.resources.assets.open(" $suffix /$filename " )
221+ webResourceResponse.data = context.assets.open(" $suffix /$filename " )
222+ webResourceResponse.responseHeaders = mapOf (" access-control-allow-origin" to " *" )
227223 return webResourceResponse
228224 } catch (e: Exception ) {
229225 e.printStackTrace()
@@ -233,24 +229,26 @@ class WebViewHelper private constructor(parent: ViewGroup) {
233229
234230 private fun webResourceRequest (
235231 context : Context ,
236- url : String ,
237- extension : String
232+ webRequest : WebResourceRequest
238233 ): WebResourceResponse ? {
239234 try {
235+ val url = webRequest.url.toString()
240236 val cachePath = CacheUtils .getCacheDirPath(context, " web_cache" )
241237 val filePathName = cachePath + File .separator + url.encodeUtf8().md5().hex()
242238 val file = File (filePathName)
243239 if (! file.exists() || ! file.isFile) {
244240 runBlocking {
245- download(HttpRequest (url), filePathName)
241+ download(HttpRequest (url).apply {
242+ webRequest.requestHeaders.forEach { putHeader(it.key, it.value) }
243+ }, filePathName)
246244 }
247245 }
248246 if (file.exists() && file.isFile) {
249247 val webResourceResponse = WebResourceResponse ()
250- webResourceResponse.mimeType = getMimeTypeFromExtension(extension )
248+ webResourceResponse.mimeType = getMimeTypeFromUrl(url )
251249 webResourceResponse.encoding = " UTF-8"
252- webResourceResponse.responseHeaders = mapOf (" access-control-allow-origin" to " *" )
253250 webResourceResponse.data = file.inputStream()
251+ webResourceResponse.responseHeaders = mapOf (" access-control-allow-origin" to " *" )
254252 return webResourceResponse
255253 }
256254 } catch (e: Exception ) {
@@ -270,8 +268,9 @@ class WebViewHelper private constructor(parent: ViewGroup) {
270268 return " "
271269 }
272270
273- private fun getMimeTypeFromExtension ( extension : String ): String {
271+ private fun getMimeTypeFromUrl ( url : String ): String {
274272 try {
273+ val extension = getExtensionFromUrl(url)
275274 if (extension.isNotBlank() && extension != " null" ) {
276275 if (extension == " json" ) {
277276 return " application/json"
@@ -284,17 +283,11 @@ class WebViewHelper private constructor(parent: ViewGroup) {
284283 return " */*"
285284 }
286285
287-
288- interface OnReceivedTitleListener {
289- fun onReceivedTitle (view : WebView ? , title : String? )
290- }
291-
292286 interface OnPageChangedListener {
293287 fun onPageStarted (view : WebView ? , url : String? , favicon : Bitmap ? )
294288 fun onPageFinished (view : WebView ? , url : String? )
295289 fun onProgressChanged (view : WebView ? , newProgress : Int )
296290 }
297-
298291}
299292
300293@SuppressLint(" SetJavaScriptEnabled" )
0 commit comments