瀏覽代碼

fix: CR-拉新活动的代码调整 (#22)

Co-authored-by: duxuefu <duxuefu@zhenxinmail.com>
D_Slience 11 月之前
父節點
當前提交
523f2e5d33

+ 1 - 0
app/src/main/java/com/adealink/weparty/module/room/data/RoomNotifyData.kt

@@ -128,6 +128,7 @@ data class GlobalRoomBroadcastNotify(
     var lotteryActivityRewardNotify: LotteryActivityBroadcastNotify? = null
 
     // 拉新活动相关奖励
+    @Transient
     var inviteTaskRewardNotify: InviteTaskRewardBroadcastNotify? = null
 }
 

+ 0 - 1
app/src/main/java/com/adealink/weparty/module/task/invite/InviteData.kt

@@ -21,7 +21,6 @@ val INVITE_SHARE_IMAGE_URL = App.instance.ossService.getUrlByPath("/share/")
 @Parcelize
 @JsonAdapter(ExtReflectiveTypeAdapterFactory::class)
 data class InviteNewRewardNotify(
-    @GsonNullable
     @SerializedName("rewardItems") val rewardItems: List<RewardDetailData> //奖励信息
 ) : Parcelable
 

+ 3 - 2
app/src/main/java/com/adealink/weparty/module/task/invite/InviteNewRewardDialog.kt

@@ -12,6 +12,7 @@ import com.adealink.frame.router.annotation.BindExtra
 import com.adealink.frame.router.annotation.RouterUri
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
+import com.adealink.weparty.commonui.recycleview.adapter.MultiTypeListAdapter
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
 import com.adealink.weparty.commonui.recycleview.adapter.multitype.MultiTypeAdapter
 import com.adealink.weparty.commonui.recycleview.itemdecoration.HorizontalItemDecoration
@@ -54,7 +55,6 @@ class InviteRewardDialog : BaseDialogActivity() {
         }
         // 跳转邀请活动Web页
         binding.btnGo.onClick {
-            finish()
             val routerUrl =
                 Uri.parse(urlConfigService.getH5Url(H5Page.INVITE_ACTIVITY)).buildUpon().apply {
                     appendQueryParameter("showRecords", "1")
@@ -62,6 +62,7 @@ class InviteRewardDialog : BaseDialogActivity() {
             Router.build(this, Web.FullScreen.PATH)
                 .putExtra(Web.Common.EXTRA_URL, routerUrl)
                 .start()
+            finish()
         }
     }
 
@@ -71,7 +72,7 @@ class InviteRewardDialog : BaseDialogActivity() {
 
         val rewardList = notifyData?.rewardItems ?: return
 
-        val listAdapter = MultiTypeAdapter()
+        val listAdapter = MultiTypeListAdapter<RewardDetailData>()
         listAdapter.register(RewardViewBinder())
         binding.rewardList.apply {
             adapter = listAdapter

+ 1 - 0
app/src/main/res/layout/item_reward_invite_new_reward_dialog.xml

@@ -23,6 +23,7 @@
         android:textColor="@color/color_FFFF8700"
         android:textSize="20sp"
         android:textStyle="bold"
+        app:layout_constrainedWidth="true"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/iv_reward"

+ 3 - 6
gradle/libs.versions.toml

@@ -154,7 +154,7 @@ appleAppauth = "0.11.1"
 tiktok = "2.3.0"
 
 # frame
-frameBom = "5.1.17-yoki-19"
+frameBom = "5.1.18-yoki-1"
 frameRouterCompiler = "5.1.4"
 
 toolargetool = "0.3.0"
@@ -171,9 +171,6 @@ tencnetTimpushFcm = "8.5.6864"
 # rong cloud
 rongcloud = "5.16.1"
 
-frame-share-version = "5.1.8-yoki-snapshot-2"
-frame-guide-version = "5.1.8-yoki-snapshot-2"
-
 [libraries]
 # plugin
 android-build-gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" }
@@ -388,7 +385,7 @@ frame-spi = { group = "com.wenext.android", name = "frame-spi" }
 frame-aab = { group = "com.wenext.android", name = "frame-aab" }
 frame-storage = { group = "com.wenext.android", name = "frame-storage" }
 frame-log = { group = "com.wenext.android", name = "frame-log" }
-frame-guide = { group = "com.wenext.android", name = "frame-guide", version.ref = "frame-guide-version" }
+frame-guide = { group = "com.wenext.android", name = "frame-guide" }
 frame-debug = { group = "com.wenext.android", name = "frame-debug" }
 frame-apm = { group = "com.wenext.android", name = "frame-apm" }
 frame-asr = { group = "com.wenext.android", name = "frame-asr" }
@@ -400,7 +397,7 @@ frame-media = { group = "com.wenext.android", name = "frame-media" }
 frame-push = { group = "com.wenext.android", name = "frame-push" }
 #frame-room = { group = "com.wenext.android", name = "frame-room" }
 frame-tceffect = { group = "com.wenext.android", name = "frame-tceffect" }
-frame-share = { group = "com.wenext.android", name = "frame-share", version.ref = "frame-share-version" }
+frame-share = { group = "com.wenext.android", name = "frame-share" }
 frame-tcturing = { group = "com.wenext.android", name = "frame-tcturing" }
 frame-router-api = { group = "com.wenext.android", name = "frame-router-api" }
 frame-router-annotation = { group = "com.wenext.android", name = "frame-router-annotation" }

+ 6 - 0
module/account/src/main/java/com/adealink/weparty/account/login/data/LoginData.kt

@@ -51,7 +51,9 @@ data class LoginReq(
     @SerializedName("deviceToken") val deviceToken: String? = null,
     @SerializedName("codeVerifier") val codeVerifier: String? = null, //tiktok登录需要传
 
+    @GsonNullable
     @SerializedName("inviter") val inviter: String? = null, // 用于绑定邀请用户
+    @GsonNullable
     @SerializedName("shareScene") val shareScene: String? = null, // 参见: ShareLinkSource
 )
 
@@ -114,7 +116,9 @@ data class PhoneLoginReq(
     @SerializedName("virtualApk") val virtualApk: Boolean = false,
     @SerializedName("appsflyerId") val appsflyerId: String = "",
     @SerializedName("deviceToken") val deviceToken: String? = null,
+    @GsonNullable
     @SerializedName("inviter") val inviter: String? = null, // 用于绑定邀请用户
+    @GsonNullable
     @SerializedName("shareScene") val shareScene: String? = null, // 参见: ShareLinkSource
 )
 
@@ -218,7 +222,9 @@ data class EmailLoginReq(
     @SerializedName("packageName") val packageName: String = PackageUtil.getPackageName(),
     @SerializedName("appsflyerId") val appsflyerId: String = "",
     @SerializedName("friendShareCode") val friendShareCode: String? = null,
+    @GsonNullable
     @SerializedName("inviter") val inviter: String? = null, // 用于绑定邀请用户
+    @GsonNullable
     @SerializedName("shareScene") val shareScene: String? = null, // 参见: ShareLinkSource
 )
 

+ 4 - 1
module/account/src/main/java/com/adealink/weparty/account/login/manager/LoginManager.kt

@@ -6,7 +6,6 @@ import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.frame.BaseFrame
-import com.adealink.frame.locale.country.getCountryCode
 import com.adealink.frame.locale.country.getSimCountryCode
 import com.adealink.frame.locale.language.languageManager
 import com.adealink.frame.log.Log
@@ -343,6 +342,10 @@ class LoginManager : BaseFrame<ILoginListener>(), ILoginManager {
         uid = 0
         token = ""
         isNewRegister = false
+        // 置空拉新/邀请相关的参数
+        inviteUidCode = null
+        inviteRoomIdCode = null
+        shareScene = null
 
         LogoutCleaner.clean()
 

+ 1 - 0
module/profile/src/main/java/com/adealink/weparty/profile/me/data/TopEntranceViewComp.kt

@@ -31,6 +31,7 @@ import com.adealink.weparty.profile.R
 import com.adealink.weparty.profile.databinding.FragmentMeBinding
 import com.adealink.weparty.profile.databinding.LayoutMeEntranceItemBinding
 import com.adealink.weparty.profile.datasource.local.ProfileLocalService
+import com.adealink.weparty.profile.me.view.InviteEntranceViewComp
 import com.adealink.weparty.profile.viewmodel.ProfileViewModel
 import com.adealink.weparty.profile.viewmodel.ProfileViewModelFactory
 import com.adealink.weparty.url.H5Page

+ 63 - 0
module/profile/src/main/java/com/adealink/weparty/profile/me/view/InviteEntranceGuide.kt

@@ -0,0 +1,63 @@
+package com.adealink.weparty.profile.me.view
+
+import android.view.Gravity
+import android.view.View
+import com.adealink.frame.guide.BaseGuide
+import com.adealink.frame.guide.core.GuideController
+import com.adealink.frame.guide.core.GuidePage
+import com.adealink.frame.guide.core.NewbieGuide
+import com.adealink.frame.guide.core.highlight.HighLight
+import com.adealink.frame.guide.core.highlight.MarginInfo
+import com.adealink.frame.guide.core.highlight.Offset
+import com.adealink.frame.guide.core.highlight.RelativeGuide
+import com.adealink.frame.util.DisplayUtil
+import com.adealink.weparty.module.profile.ProfileModule
+import com.adealink.weparty.profile.R
+
+/**
+ * Created By: duxuefu
+ * Creation Date: 2025/4/25 13:13
+ * Description: 拉新活动入口的引导
+ */
+class InviteEntranceGuide : BaseGuide() {
+
+    override fun buildGuide(): GuideController {
+        return NewbieGuide.with(activity).addGuidePage(
+            GuidePage().apply {
+                setLabel("${LABEL_INVITE_GUIDE}_${ProfileModule.getMyUid()}")
+                addHighLight(
+                    R.string.profile_me_tag_invite,
+                    object : RelativeGuide(
+                        R.layout.layout_me_invite_guide,
+                        Gravity.TOP or Gravity.CENTER_HORIZONTAL,
+                        false
+                    ) {
+                        override fun onMarginInfo(
+                            relativeView: View,
+                            marginInfo: MarginInfo,
+                            outOffset: Offset
+                        ) {
+                            super.onMarginInfo(relativeView, marginInfo, outOffset)
+                            outOffset.top += -DisplayUtil.dp2px(12f)
+                            outOffset.start += -DisplayUtil.dp2px(30f)
+                        }
+                    },
+                    shape = HighLight.Shape.CIRCLE
+                )
+            }
+        ).build()
+    }
+
+    override fun interceptGuide(): Boolean {
+        return false
+    }
+
+    override fun guideType(): String {
+        return GUIDE_TYPE_INVITE_ENTRANCE
+    }
+
+    companion object {
+        const val LABEL_INVITE_GUIDE = "label_invite_guide"
+        const val GUIDE_TYPE_INVITE_ENTRANCE = "type_guide_invite_entrance"
+    }
+}

+ 6 - 37
module/profile/src/main/java/com/adealink/weparty/profile/me/data/InviteEntranceViewComp.kt → module/profile/src/main/java/com/adealink/weparty/profile/me/view/InviteEntranceViewComp.kt

@@ -1,32 +1,24 @@
-package com.adealink.weparty.profile.me.data
+package com.adealink.weparty.profile.me.view
 
 import android.net.Uri
 import android.os.Handler
 import android.os.Looper
-import android.view.Gravity
 import android.view.View
 import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
-import com.adealink.frame.guide.core.GuidePage
-import com.adealink.frame.guide.core.NewbieGuide
-import com.adealink.frame.guide.core.highlight.HighLight
-import com.adealink.frame.guide.core.highlight.MarginInfo
-import com.adealink.frame.guide.core.highlight.Offset
-import com.adealink.frame.guide.core.highlight.RelativeGuide
+import com.adealink.frame.guide.GuideCenter
 import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.mvvm.viewmodel.viewModels
 import com.adealink.frame.router.Router
 import com.adealink.frame.share.IShareCallback
 import com.adealink.frame.share.data.SHARE_FAIL_CODE_NO_INSTALL
 import com.adealink.frame.share.data.ShareChannel
-import com.adealink.frame.util.DisplayUtil
 import com.adealink.frame.util.runOnUiThread
 import com.adealink.weparty.AppModule
 import com.adealink.weparty.commonui.BaseActivity
 import com.adealink.weparty.commonui.toast.util.showToast
-import com.adealink.weparty.module.profile.ProfileModule
 import com.adealink.weparty.module.share.ShareModule
 import com.adealink.weparty.module.share.data.ShareLinkSource
 import com.adealink.weparty.module.share.dialog.BottomShareDialogBuilder
@@ -51,6 +43,7 @@ class InviteEntranceViewComp(
 ) : ViewComponent(lifecycleOwner) {
     private val viewModel by viewModels<InviteEntranceViewModel> { ProfileViewModelFactory() }
     private val shareViewModel by fastLazy { ShareModule.getShareViewModel(requireActivity()) }
+    private val inviteEntranceGuide by fastLazy { InviteEntranceGuide() }
 
     private val handler by lazy {
         Handler(Looper.getMainLooper())
@@ -92,9 +85,11 @@ class InviteEntranceViewComp(
     override fun onDestroy() {
         super.onDestroy()
         handler.removeCallbacks(runnable)
+        inviteEntranceGuide.unregister()
     }
 
     private fun initView() {
+        inviteEntranceGuide.register(fragment)
         binding.root.setOnClickListener {
             onInviteEntranceClick()
         }
@@ -150,32 +145,7 @@ class InviteEntranceViewComp(
         if (binding.entranceSwitcher.visibility != View.VISIBLE) {
             return
         }
-        val guidePage = GuidePage().apply {
-            setLabel("${LABEL_INVITE_GUIDE}_${ProfileModule.getMyUid()}")
-            addHighLight(
-                R.string.profile_me_tag_invite,
-                object : RelativeGuide(
-                    R.layout.layout_me_invite_guide,
-                    Gravity.TOP or Gravity.CENTER_HORIZONTAL,
-                    false
-                ) {
-                    override fun onMarginInfo(
-                        relativeView: View,
-                        marginInfo: MarginInfo,
-                        outOffset: Offset
-                    ) {
-                        super.onMarginInfo(relativeView, marginInfo, outOffset)
-                        outOffset.top += -DisplayUtil.dp2px(12f)
-                        outOffset.start += -DisplayUtil.dp2px(30f)
-                    }
-                },
-                shape = HighLight.Shape.CIRCLE
-            )
-        }
-        NewbieGuide.with(fragment)
-            .addGuidePage(guidePage)
-            .build()
-            .show()
+        GuideCenter.activeGuide(InviteEntranceGuide.GUIDE_TYPE_INVITE_ENTRANCE)
     }
 
     // 分享结果回调
@@ -258,7 +228,6 @@ class InviteEntranceViewComp(
     }
 
     companion object {
-        const val LABEL_INVITE_GUIDE = "label_invite_guide"
         const val SWITCH_INTERVAL_MILLS = 4000L // 入口轮播的时间间隔
     }