Переглянути джерело

feat: 支持web scheme page

DoggyZhang 3 місяців тому
батько
коміт
dee3978036

+ 2 - 2
app/build.gradle

@@ -95,7 +95,7 @@ android {
                 fbAppId         : "",
                 fbClientToken   : "",
                 deepLinkScheme  : "gami",
-                deepLinkHost    : "",
+                deepLinkHost    : "app",
                 httpDeepLinkHost: "gami.vip"
         ]
         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro', (isOfficial ? 'proguard-log-empty.pro' : 'proguard-log.pro')
@@ -107,7 +107,7 @@ android {
         buildConfigField("String", "QTT_APP_KEY", '"baa9f1307e2e8ee02742d960828b5c50"')
         buildConfigField("String", "HTTP_DEEP_LINK_HOST", '"gami.vip"')
         buildConfigField("String", "DEEP_LINK_SCHEME", '"gami"')
-        buildConfigField("String", "DEEP_LINK_HOST", '""')
+        buildConfigField("String", "DEEP_LINK_HOST", '"app"')
         buildConfigField("String", "UTM_FACEBOOK_KEY", '"c4ea5534613d8b3cdcd5b80097989f9eb2414138aa8e49ddfbc458cd5e50f1a6"')
 
         //trtc

+ 1 - 1
app/src/main/java/com/adealink/weparty/webview/CommonWebViewClient.kt

@@ -233,7 +233,7 @@ open class CommonWebViewClient(val webView: IWebView) : WebViewClient() {
         if (handler == null || !handler.canHandle(request)) {
             return false
         }
-        handler.handle(request)
+        handler.handle(uri)
         return true
     }
 

+ 10 - 1
app/src/main/java/com/adealink/weparty/webview/WebViewFragment.kt

@@ -32,6 +32,7 @@ import com.adealink.frame.router.annotation.BindExtra
 import com.adealink.frame.util.AppUtil
 import com.adealink.frame.util.PackageUtil
 import com.adealink.frame.util.getDeviceName
+import com.adealink.frame.util.statusBarHeight
 import com.adealink.weparty.App
 import com.adealink.weparty.BuildConfig
 import com.adealink.weparty.R
@@ -243,11 +244,19 @@ class WebViewFragment : BaseFragment(R.layout.fragment_webview),
         webFragmentCallback?.setTitle(title)
     }
 
+    /**
+     * 详见: https://mimolive.sg.larksuite.com/wiki/ZYliwjteIilW5XkmdhtlysIWgGg
+     */
     override fun onPageStarted(url: String?, favicon: Bitmap?) {
         binding.progressIndicator.visibility = View.VISIBLE
         loadJSUrl("javascript:window.localStorage.setItem('GAMI-web_auth_token', '${AppPref.token}')")
         loadJSUrl("javascript:window.localStorage.setItem('GAMI-web_app_locale', '${languageManager?.getLanguageCode() ?: ""}')")
-        loadJSUrl("javascript:window.GAMI_BRIDGE={\"requestHeader\":${requestHeader()}}")
+        loadJSUrl(
+            "javascript:window.GAMI_BRIDGE={" +
+                    "\"requestHeader\":${requestHeader()}," +
+                    "\"safeArea\":${(activity?.statusBarHeight() ?: 0)} 0" +
+                    "}"
+        )
     }
 
     fun requestHeader(): String {

+ 3 - 2
app/src/main/java/com/adealink/weparty/webview/scheme/CloseWindowScheme.kt

@@ -1,11 +1,12 @@
 package com.adealink.weparty.webview.scheme
 
-import com.adealink.frame.router.request.UriRequest
+import android.net.Uri
 import com.adealink.weparty.webview.IWebView
 
 class CloseWindowScheme(webView: IWebView) :
     WebSchemeHandler(webView, arrayOf(WebScheme.CloseWindow.PATH)) {
-    override fun handle(request: UriRequest) {
+
+    override fun handle(uri: Uri) {
         webView.webViewCallback?.closeWebView()
     }
 }

+ 43 - 0
app/src/main/java/com/adealink/weparty/webview/scheme/OpenNewPageScheme.kt

@@ -0,0 +1,43 @@
+package com.adealink.weparty.webview.scheme
+
+import android.net.Uri
+import com.adealink.frame.router.Router
+import com.adealink.frame.router.request.UriRequest
+import com.adealink.weparty.commonui.ext.getActivity
+import com.adealink.weparty.module.account.AccountModule
+import com.adealink.weparty.module.webview.Web
+import com.adealink.weparty.webview.IWebView
+
+/**
+ * gami://web/page?url=${encodeURIComponent("https://test-web.gami.vip")}&safeArea=true&header=xxx
+ *
+ * - url: H5链接 urlencode
+ * - header: 导航栏标题,设置了后客户端使用原生导航栏 & safeArea参数不生效,不传则展示全屏容器
+ * - safeArea:true-客户端设置安全区 false-全屏H5 默认false
+ *
+ * 调用示例: gami://web/page?url=https%3A%2F%2Ftest-web.gami.vip&safeArea=true
+ */
+class OpenNewPageScheme(webView: IWebView) :
+    WebSchemeHandler(webView, arrayOf(WebScheme.OpenNewPage.PATH)) {
+    override fun handle(uri: Uri) {
+
+        val url = uri.getQueryParameter("url")
+        if (url.isNullOrEmpty()) {
+            return
+        }
+        var showTopBar = true
+        val title = uri.getQueryParameter("header")
+        if (title.isNullOrEmpty()) {
+            val safeArea = uri.getQueryParameter("safeArea")?.toBoolean() ?: false
+            showTopBar = safeArea
+        } else {
+            showTopBar = true
+        }
+
+        val activity = webView.getWebView().context?.getActivity() ?: return
+        Router.build(activity, Web.FullScreen.PATH)
+            .putExtra(Web.Common.EXTRA_URL, url)
+            .putExtra(Web.Common.EXTRA_HIDE_TOPBAR, !showTopBar)
+            .start()
+    }
+}

+ 1 - 0
app/src/main/java/com/adealink/weparty/webview/scheme/SchemeHandlerExt.kt

@@ -6,4 +6,5 @@ import com.adealink.weparty.webview.IWebView
 fun CommonWebViewClient.registerCommonSchemeHandler(webView: IWebView) {
     addSchemeHandler(CloseWindowScheme(webView))
     addSchemeHandler(UserCancellationScheme(webView))
+    addSchemeHandler(OpenNewPageScheme(webView))
 }

+ 2 - 2
app/src/main/java/com/adealink/weparty/webview/scheme/UserCancellationScheme.kt

@@ -1,12 +1,12 @@
 package com.adealink.weparty.webview.scheme
 
-import com.adealink.frame.router.request.UriRequest
+import android.net.Uri
 import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.webview.IWebView
 
 class UserCancellationScheme(webView: IWebView) :
     WebSchemeHandler(webView, arrayOf(WebScheme.UserCancellation.PATH)) {
-    override fun handle(request: UriRequest) {
+    override fun handle(uri: Uri) {
         AccountModule.logout(true)
     }
 }

+ 14 - 3
app/src/main/java/com/adealink/weparty/webview/scheme/WebScheme.kt

@@ -4,13 +4,15 @@ import android.net.Uri
 import androidx.core.net.toUri
 import com.adealink.frame.router.handler.UriHandler
 import com.adealink.frame.router.request.UriRequest
+import com.adealink.weparty.BuildConfig
 import com.adealink.weparty.webview.IWebView
+import com.google.errorprone.annotations.DoNotCall
 
 interface WebScheme {
 
     interface Common {
         companion object {
-            const val SCHEME = "gami"
+            const val SCHEME = BuildConfig.DEEP_LINK_SCHEME
             const val HOST = "web"
         }
     }
@@ -27,6 +29,12 @@ interface WebScheme {
         }
     }
 
+    interface OpenNewPage {
+        companion object {
+            const val PATH = "/page"
+        }
+    }
+
 }
 
 abstract class WebSchemeHandler(val webView: IWebView, val paths: Array<String>) : UriHandler() {
@@ -43,10 +51,13 @@ abstract class WebSchemeHandler(val webView: IWebView, val paths: Array<String>)
         return paths.contains(request.path)
     }
 
-    fun canHandle(uri: Uri): Boolean {
-        return schemeUris.contains(uri)
+    @DoNotCall
+    override fun handle(request: UriRequest) {
+        //Ntd.
     }
 
+    abstract fun handle(uri: Uri)
+
     companion object {
         @JvmStatic
         fun toUriRequest(uri: Uri): UriRequest {

+ 3 - 0
module/wallet/src/main/java/com/adealink/weparty/wallet/manager/IWalletManager.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.wallet.manager
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.frame.IBaseFrame
 import com.adealink.weparty.module.wallet.data.Currency
+import com.adealink.weparty.wallet.recharge.data.RechargeItemData
 import com.adealink.weparty.wallet.recharge.data.RechargeProduct
 import com.android.billingclient.api.BillingResult
 import com.android.billingclient.api.Purchase
@@ -16,6 +17,8 @@ interface IWalletManager : IBaseFrame<IWalletListener> {
 
     fun getBalance(currency: Currency): Double
 
+    suspend fun getRechargeConfig(currency: Currency): List<RechargeProduct>
+
     suspend fun pullWalletData(): Rlt<Map<Currency, Double>>
 
     suspend fun recharge(data: RechargeProduct): Rlt<Any>

+ 27 - 0
module/wallet/src/main/java/com/adealink/weparty/wallet/manager/WalletManager.kt

@@ -5,6 +5,7 @@ import com.adealink.frame.base.Rlt
 import com.adealink.frame.data.json.toJsonErrorNull
 import com.adealink.frame.frame.BaseFrame
 import com.adealink.frame.log.Log
+import com.adealink.frame.storage.cache.TimeoutLruCache
 import com.adealink.weparty.App
 import com.adealink.weparty.commonui.ext.isSuccess
 import com.adealink.weparty.config.Config
@@ -18,6 +19,7 @@ import com.adealink.weparty.wallet.datasource.remote.WalletHttpService
 import com.adealink.weparty.wallet.recharge.data.ConvertCurrencyReq
 import com.adealink.weparty.wallet.recharge.data.PayFailReq
 import com.adealink.weparty.wallet.recharge.data.PaySuccessReq
+import com.adealink.weparty.wallet.recharge.data.RechargeConfigReq
 import com.adealink.weparty.wallet.recharge.data.RechargeProduct
 import com.android.billingclient.api.BillingResult
 import com.android.billingclient.api.Purchase
@@ -36,6 +38,12 @@ class WalletManager : BaseFrame<IWalletListener>(), IWalletManager {
     private var diamond: Double = 0.0
     private var bean: Double = 0.0
 
+    private var rechargeConfig =
+        TimeoutLruCache<Currency, List<RechargeProduct>>(
+            1000,
+            60 * 60 * 1000
+        )//最多缓存1000个,缓存时长60分钟
+
     override fun getWalletData() {
         launch {
             notifyCurrencyChanged()
@@ -61,6 +69,25 @@ class WalletManager : BaseFrame<IWalletListener>(), IWalletManager {
         }
     }
 
+    override suspend fun getRechargeConfig(currency: Currency): List<RechargeProduct> {
+        val configs = rechargeConfig[currency]
+        if (configs != null) {
+            return configs
+        }
+        val rlt = walletHttpService.rechargeConfig(RechargeConfigReq(currency = currency.type))
+        when (rlt) {
+            is Rlt.Failed -> {
+                return emptyList()
+            }
+
+            is Rlt.Success -> {
+                val items = rlt.data.data?.items ?: emptyList()
+                rechargeConfig.put(currency, items)
+                return items
+            }
+        }
+    }
+
     override suspend fun pullWalletData(): Rlt<Map<Currency, Double>> {
         val rlt = walletHttpService.pullWallet()
         when (rlt) {

+ 11 - 16
module/wallet/src/main/java/com/adealink/weparty/wallet/recharge/viewmodel/RechargeViewModel.kt

@@ -48,24 +48,19 @@ class RechargeViewModel : BaseViewModel(),
     private var selectedItem: RechargeItemData? = null
     val rechargeListLD = MutableLiveData<List<RechargeItemData>>()
 
+    init {
+        rechargeList.addAll(EMPTY_RECHARGE_LIST)
+        rechargeListLD.send(rechargeList)
+    }
+
     fun pullRechargeList(currency: Currency) {
         viewModelScope.launch {
-            val rlt = walletHttpService.rechargeConfig(RechargeConfigReq(currency = currency.type))
-            when (rlt) {
-                is Rlt.Failed -> {
-                    rechargeList.clear()
-                    rechargeList.addAll(EMPTY_RECHARGE_LIST)
-                    rechargeListLD.send(rechargeList)
-                }
-
-                is Rlt.Success -> {
-                    rechargeList.clear()
-                    rechargeList.addAll(rlt.data.data?.items?.map {
-                        RechargeItemData(it)
-                    } ?: EMPTY_RECHARGE_LIST)
-                    rechargeListLD.send(rechargeList)
-                }
-            }
+            val list = walletManager.getRechargeConfig(currency)
+            rechargeList.clear()
+            rechargeList.addAll(list.map {
+                RechargeItemData(it)
+            })
+            rechargeListLD.send(rechargeList)
         }
     }