From b46e3a33b49b225305636492a51e9edb91301080 Mon Sep 17 00:00:00 2001 From: Jack Date: Sat, 3 Jun 2023 09:59:47 +0800 Subject: [PATCH] feat: support web sdk social login --- .../java/com/portto/fcl/webview/FclWebView.kt | 76 ++++++++++--------- .../com/portto/fcl/webview/WebViewActivity.kt | 6 +- 2 files changed, 43 insertions(+), 39 deletions(-) diff --git a/fcl/src/main/java/com/portto/fcl/webview/FclWebView.kt b/fcl/src/main/java/com/portto/fcl/webview/FclWebView.kt index a9d9b2b..b153acf 100644 --- a/fcl/src/main/java/com/portto/fcl/webview/FclWebView.kt +++ b/fcl/src/main/java/com/portto/fcl/webview/FclWebView.kt @@ -1,14 +1,17 @@ package com.portto.fcl.webview import android.annotation.SuppressLint +import android.app.Activity import android.content.Context +import android.graphics.Rect +import android.os.Message import android.util.AttributeSet +import android.webkit.WebSettings import android.webkit.WebView import com.portto.fcl.BuildConfig @SuppressLint("SetJavaScriptEnabled") internal class FclWebView : WebView { - private var callback: WebViewCallback? = null constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) @@ -16,50 +19,55 @@ internal class FclWebView : WebView { super(context, attrs, defStyleAttr) init { - with(settings) { - loadsImagesAutomatically = true - javaScriptEnabled = true - webViewClient = WebViewClient() - webChromeClient = WebChromeClient() - domStorageEnabled = true - } + settings.setup() + webChromeClient = WebChromeClient() setWebContentsDebuggingEnabled(BuildConfig.DEBUG) } - fun setWebViewCallback(callback: WebViewCallback?) { - this.callback = callback - } - private inner class WebChromeClient : android.webkit.WebChromeClient() { - override fun onProgressChanged(view: WebView, newProgress: Int) { - super.onProgressChanged(view, newProgress) - if (view.progress == newProgress) { - callback?.onProgressChange(view.progress / 100f) - } - } - - override fun onReceivedTitle(view: WebView?, title: String?) { - super.onReceivedTitle(view, title) - callback?.onTitleChange(title.orEmpty()) - } + override fun onCreateWindow( + view: WebView?, + isDialog: Boolean, + isUserGesture: Boolean, + resultMsg: Message? + ): Boolean = onCreateWebWindow(resultMsg) } - private inner class WebViewClient : android.webkit.WebViewClient() { + private fun onCreateWebWindow(resultMsg: Message?): Boolean { + val webView = WebView(context) + webView.settings.setup() - override fun onPageFinished(view: WebView?, url: String?) { - super.onPageFinished(view, url) + webView.webViewClient = object : android.webkit.WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + // Make WebView height match parent + val displayRectangle = Rect() + (context as? Activity)?.window?.decorView?.getWindowVisibleDisplayFrame(displayRectangle) + view?.layoutParams = view?.layoutParams?.apply { + height = displayRectangle.height() + } + } } - override fun doUpdateVisitedHistory(view: WebView?, url: String?, isReload: Boolean) { - super.doUpdateVisitedHistory(view, url, isReload) - callback?.onPageUrlChange(url.orEmpty(), isReload) + webView.webChromeClient = object : android.webkit.WebChromeClient() { + override fun onCloseWindow(window: WebView?) { + super.onCloseWindow(window) + this@FclWebView.removeView(window) + } } + + this@FclWebView.addView(webView) + val transport = resultMsg?.obj as WebView.WebViewTransport + transport.webView = webView + resultMsg.sendToTarget() + return true } - interface WebViewCallback { - fun onScrollChange(scrollY: Int, offset: Int) - fun onProgressChange(progress: Float) - fun onTitleChange(title: String) - fun onPageUrlChange(url: String, isReload: Boolean) + private fun WebSettings.setup() { + javaScriptEnabled = true + domStorageEnabled = true + setSupportMultipleWindows(true) + // Remove "wv" from user agent to make Google login work + userAgentString = userAgentString.replace(oldValue = "; wv", newValue = "") } } diff --git a/fcl/src/main/java/com/portto/fcl/webview/WebViewActivity.kt b/fcl/src/main/java/com/portto/fcl/webview/WebViewActivity.kt index 8b3ca86..4c61502 100644 --- a/fcl/src/main/java/com/portto/fcl/webview/WebViewActivity.kt +++ b/fcl/src/main/java/com/portto/fcl/webview/WebViewActivity.kt @@ -4,7 +4,6 @@ import android.app.Application import android.content.Context import android.content.Intent import android.os.Bundle -import android.webkit.WebSettings import androidx.appcompat.app.AppCompatActivity internal class WebViewActivity : AppCompatActivity() { @@ -17,12 +16,9 @@ internal class WebViewActivity : AppCompatActivity() { super.onCreate(savedInstanceState) instance = this setContentView(webView) + supportActionBar?.hide() webView.loadUrl(url) FclWebViewLifecycle.onWebViewOpen(url) - webView.settings.userAgentString = WebSettings.getDefaultUserAgent(this).replace("; wv", "") - - actionBar?.hide() - supportActionBar?.hide() } override fun onDestroy() {