Ver Fonte

feat: 买量承接支持:落地指定tab (#16)

* feat:买量承接支持

* feat:买量承接支持,新客奖励弹窗后置显示逻辑

* feat:买量承接支持,新客奖励弹窗后置显示逻辑,接曝光接口逻辑

* feat:买量承接支持,新客奖励弹窗后置显示逻辑,接曝光接口逻辑

* feat:update version

* 应卓扬帆要求,先mock数据过测试用例

* feat:增加log方便排查Dialog显示问题

* feat:增加log方便排查Dialog显示问题

* Revert "应卓扬帆要求,先mock数据过测试用例"

This reverts commit b683be4a3653163e159b1bc3aeb9ddaee3225d50.

* bugfix:新版本,新客承接引导关注弹窗,有时候无法加载出来
LiuFJie há 7 meses atrás
pai
commit
fca7bea5f7

+ 6 - 0
app/src/main/java/com/adealink/weparty/commonui/dialogchain/dialogtask/NewUserLotteryDialogTask.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.commonui.dialogchain.dialogtask
 import androidx.fragment.app.FragmentActivity
 import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
+import com.adealink.frame.log.Log
 import com.adealink.frame.router.Router
 import com.adealink.weparty.commonui.dialogchain.BaseDialogData
 import com.adealink.weparty.commonui.dialogchain.BaseDialogTask
@@ -25,20 +26,25 @@ class NewUserLotteryDialogTask() :
         get() = "NewUserLotteryDialogTask"
 
     override suspend fun canShow(): Rlt<BaseDialogData.NewUserLotteryDialogData> {
+        Log.i(tag, "canShow")
         if (Gender.getGender(ProfileModule.getMyUserInfo()?.gender) != Gender.MALE) {
+            Log.i(tag, "not male")
             return Rlt.Failed(IError("not male"))
         }
         //前三天
         val userInfoRlt = ProfileModule.getUserInfoByUid(uid = ProfileModule.getMyUid())
         if (userInfoRlt is Rlt.Failed) {
+            Log.i(tag, "userInfoRlt:$userInfoRlt")
             return Rlt.Failed(userInfoRlt.error)
         }
         val myUserInfo = (userInfoRlt as Rlt.Success).data
         if (!myUserInfo.isMaleNewUser) {
+            Log.i(tag, "isMaleNewUser is false")
             return Rlt.Failed(IError("isMaleNewUser is false"))
         }
         //判断是否在前三天
         if (OperationModule.getNewUserLotteryIsEnd()) {
+            Log.i(tag, "getNewUserLotteryIsEnd")
             return Rlt.Failed(IError("end"))
         }
 

+ 28 - 1
app/src/main/java/com/adealink/weparty/commonui/dialogchain/dialogtask/NewUserRewardDialogTask.kt

@@ -3,13 +3,21 @@ package com.adealink.weparty.commonui.dialogchain.dialogtask
 import android.os.Bundle
 import androidx.fragment.app.FragmentActivity
 import com.adealink.frame.base.Rlt
+import com.adealink.frame.coroutine.dispatcher.Dispatcher
+import com.adealink.frame.log.Log
 import com.adealink.frame.router.Router
+import com.adealink.weparty.App
 import com.adealink.weparty.AppModule
 import com.adealink.weparty.commonui.dialogchain.BaseDialogData
 import com.adealink.weparty.commonui.dialogchain.BaseDialogTask
 import com.adealink.weparty.commonui.dialogchain.Priority
 import com.adealink.weparty.commonui.dialogfragment.BaseDialogFragment
+import com.adealink.weparty.commonui.ext.onFailure
+import com.adealink.weparty.commonui.ext.onSuccess
 import com.adealink.weparty.module.operation.Operation
+import com.adealink.weparty.module.task.UserTaskHttpService
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
 
 /**
  * Created by XiaoDongLin.
@@ -19,6 +27,15 @@ class NewUserRewardDialogTask(
     private val coins: Int,
     private val chatTimes: Int,
 ) : BaseDialogTask<BaseDialogData.NewUserRewardDialogData>() {
+
+    companion object {
+        const val TAG = "NewUserRewardDialogTask"
+    }
+
+    private val taskHttpService by lazy {
+        App.instance.networkService.getHttpService(UserTaskHttpService::class.java)
+    }
+
     override val priority: Int
         get() = Priority.NEW_USER_REWRARD.priority
     override val tag: String
@@ -47,7 +64,17 @@ class NewUserRewardDialogTask(
                         )
                     }
                 }
-        fragment?.show(fragmentActivity.supportFragmentManager)
+        CoroutineScope(Dispatcher.WENEXT_THREAD_POOL).launch {
+            taskHttpService.getPVReward().apply {
+                onSuccess {
+                    launch(Dispatcher.UI) {
+                        Log.e(TAG, "showNewUserRewardDialog")
+                        fragment?.show(fragmentActivity.supportFragmentManager)
+                    }
+                }
+                onFailure { Log.e(TAG, "getPVReward failed:$it") }
+            }
+        }
         return fragment.hashCode()
     }
 

+ 8 - 1
app/src/main/java/com/adealink/weparty/commonui/dialogchain/dialogtask/UserGreetingDialogTask.kt

@@ -4,6 +4,7 @@ import android.os.Bundle
 import androidx.fragment.app.FragmentActivity
 import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
+import com.adealink.frame.log.Log
 import com.adealink.frame.router.Router
 import com.adealink.weparty.commonui.dialogchain.BaseDialogData
 import com.adealink.weparty.commonui.dialogchain.BaseDialogTask
@@ -33,22 +34,28 @@ class UserGreetingDialogTask(
         get() = "UserGreetingDialogTask"
 
     override suspend fun canShow(): Rlt<BaseDialogData.NewUserGreetingDialogData> {
+        Log.i(tag, "canShow")
         val hasShow = HomeLocalService.hasShowNewUserGreeting
         if (hasShow) {
+            Log.i(tag, "hasShowNewUserGreeting is true")
             return Rlt.Failed(error = IError("hasShowNewUserGreeting is true"))
         }
-        val myUserInfoRlt = ProfileModule.getUserInfoByUid(uid = ProfileModule.getMyUid())
+        val myUserInfoRlt = ProfileModule.getUserInfoByUid(uid = ProfileModule.getMyUid(), false)
         if (myUserInfoRlt is Rlt.Failed) {
+            Log.i(tag, "myUserInfoRlt:$myUserInfoRlt")
             return Rlt.Failed(myUserInfoRlt.error)
         }
         val myUserInfo = (myUserInfoRlt as Rlt.Success).data
         if (Gender.getGender(myUserInfo.gender) != Gender.MALE) {
+            Log.i(tag, "gender is female")
             return Rlt.Failed(error = IError("gender is female"))
         }
         if (!myUserInfo.isMaleNewUser) {
+            Log.i(tag, "isMaleNewUser is false")
             return Rlt.Failed(error = IError("isMaleNewUser is false"))
         }
         if (uidList.isEmpty()) {
+            Log.i(tag, "uidList is empty")
             return Rlt.Failed(error = IError("uidList is empty"))
         }
         //随机算法,查询5个

+ 3 - 0
app/src/main/java/com/adealink/weparty/module/operation/IOperationService.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.module.operation
 
 import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.IService
 import com.adealink.frame.base.Rlt
@@ -64,4 +65,6 @@ interface IOperationService : IService<IOperationService> {
     fun tryToShowNewUserLotteryDialog()
 
     suspend fun getNewUserLotteryIsEnd(): Boolean
+
+    fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner)
 }

+ 8 - 2
app/src/main/java/com/adealink/weparty/module/operation/OperationModule.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.module.operation
 
 import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.BaseDynamicModule
 import com.adealink.frame.aab.constant.AABModuleNotInitError
@@ -11,9 +12,7 @@ import com.adealink.weparty.module.anchor.data.AnchorMessage
 import com.adealink.weparty.module.anchor.data.AnchorMessageReplyCode
 import com.adealink.weparty.module.operation.newuser.IBuyNewUserViewModel
 import com.adealink.weparty.module.operation.rechargepackage.viewmodel.IRechargeDailyViewModel
-import com.adealink.weparty.module.operation.signinreward.data.DailySignInRewardsRes
 import com.adealink.weparty.module.operation.signinreward.viewmodel.ISignInViewModel
-import com.adealink.weparty.module.task.TaskConfig
 import com.adealink.weparty.module.task.invite.InviteNewActivityShowInfo
 import java.util.EnumMap
 
@@ -244,6 +243,9 @@ object OperationModule : BaseDynamicModule<IOperationService>(IOperationService:
                 return true
             }
 
+            override fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner) {
+
+            }
         }
     }
 
@@ -262,4 +264,8 @@ object OperationModule : BaseDynamicModule<IOperationService>(IOperationService:
     override suspend fun getNewUserLotteryIsEnd(): Boolean {
         return getService().getNewUserLotteryIsEnd()
     }
+
+    override fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner) {
+        return getService().handleDelayedNewUserRewardDialogTask(viewLifecycleOwner)
+    }
 }

+ 3 - 0
app/src/main/java/com/adealink/weparty/module/operation/newuser/IBuyNewUserManager.kt

@@ -1,5 +1,6 @@
 package com.adealink.weparty.module.operation.newuser
 
+import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.base.Rlt
 import com.adealink.weparty.module.operation.signinreward.data.DailySignInRewardsRes
 
@@ -16,4 +17,6 @@ interface IBuyNewUserManager {
     suspend fun getNewUserLotteryIsEnd(): Boolean
 
     fun getTodayHasGetReward(): Boolean
+
+    fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner)
 }

+ 5 - 1
app/src/main/java/com/adealink/weparty/module/profile/data/ProfileData2.kt

@@ -177,6 +177,8 @@ data class UserInfo(
     @SerializedName("weight") var weight: Int? = null, //体重
     @GsonNullable
     @SerializedName("job") var job: String? = null, //职业
+    @GsonNullable
+    @SerializedName("homeTab") var homeTab: Int? = null, //用户注册默认打开哪一个首页标签
 
 ) : Parcelable, RoomData {
 
@@ -352,7 +354,9 @@ data class UserInfo(
                 it.packetEffect ?: this.commonConfigInfo?.packetEffect
             )
         }
-
+        userInfo.homeTab?.let {
+            this.homeTab = it
+        }
     }
 
     companion object {

+ 3 - 0
app/src/main/java/com/adealink/weparty/module/task/UserTaskHttpService.kt

@@ -36,6 +36,9 @@ interface UserTaskHttpService {
 
     @GET("activity/getRewardPackageInfoByIds")
     suspend fun getRewardPackageInfoByIds(@Query("packageIds") packageIds: List<Long>): Rlt<Res<Map<Long, List<RewardDetailData>>>>
+
+    @GET("user/getPVReward")
+    suspend fun getPVReward(): Rlt<Res<Any>>
 }
 
 

+ 5 - 0
app/src/main/java/com/adealink/weparty/module/userlist/HomeUserListFragment.kt

@@ -22,6 +22,7 @@ import com.adealink.weparty.commonui.ext.setOnTouchDelegate
 import com.adealink.weparty.commonui.recycleview.adapter.BaseTabFragmentStateAdapter
 import com.adealink.weparty.commonui.widget.EmptyFragment
 import com.adealink.weparty.databinding.FragmentHomeUserListBinding
+import com.adealink.weparty.module.operation.OperationModule
 import com.adealink.weparty.module.rank.Rank
 import com.adealink.weparty.module.userlist.fragment.HomeBaseUserListFragment
 import com.adealink.weparty.module.userlist.fragment.HomeNewUserListFragment
@@ -73,6 +74,10 @@ class HomeUserListFragment : BaseFragment(R.layout.fragment_home_user_list), ISc
         super.onCreate(savedInstanceState)
     }
 
+    override fun onResume() {
+        super.onResume()
+        OperationModule.handleDelayedNewUserRewardDialogTask(this.viewLifecycleOwner)
+    }
 
     override fun initViews() {
         super.initViews()

+ 4 - 3
app/src/main/java/com/adealink/weparty/ui/home/BaseHomeFragment.kt

@@ -356,10 +356,11 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
      * adb shell am start -a android.intent.action.VIEW -d "partyki://yoki/main?tab=room&&subTab=XXXX"
      */
     fun setDefaultTab(tabKey: String? = "") {
-        if (tabKey.isNullOrEmpty()) {
-            return
+        var tab = tabKey
+        if (tab.isNullOrEmpty()) {
+            tab = HomeTab.map(HomeLocalService.userHomeTabNumber)?.tab ?: return
         }
-        val tabIndex = HOME_TABS.indexOfFirst { it.type.tab == tabKey }
+        val tabIndex = HOME_TABS.indexOfFirst { it.type.tab == tab }
         if (tabIndex != -1) {
             vpContent.setCurrentItem(tabIndex, false)
         }

+ 12 - 1
app/src/main/java/com/adealink/weparty/ui/home/util/HomeLocalService.kt

@@ -4,6 +4,7 @@ import android.content.Context
 import com.adealink.frame.storage.sp.TypeDelegationPrefs
 import com.adealink.frame.util.AppUtil
 import com.adealink.weparty.module.profile.ProfileModule
+import com.adealink.weparty.ui.tab.HomeTab
 
 /**
  * Created by XiaoDongLin.
@@ -31,5 +32,15 @@ object HomeLocalService : TypeDelegationPrefs(
     var hasShowSayHiPopupGuide : Boolean by PrefUserKey("key_has_show_say_hi_popup_guide", false)
     //im气泡
     var hasShowImPopupGuide : Boolean by PrefUserKey("key_has_show_im_popup_guide", false)
-    
+
+    var userHomeTabNumber: Int by PrefUserKey("key_user_home_tab", HomeTab.ROOM_LIST.number)
+
+    fun setUserHomeTab(tab: Int?) {
+        val defaultHomeTabNumber = HomeTab.ROOM_LIST.number
+        userHomeTabNumber = if (tab == null) {
+            defaultHomeTabNumber
+        } else {
+            HomeTab.map(tab)?.number ?: defaultHomeTabNumber
+        }
+    }
 }

+ 13 - 6
app/src/main/java/com/adealink/weparty/ui/tab/HomeTab.kt

@@ -14,31 +14,38 @@ import com.facebook.common.util.UriUtil
 /**
  * @param tab tab的唯一标识,可以用于deeplink跳转到指定tab
  */
-enum class HomeTab(val tab: String) {
+enum class HomeTab(val tab: String, val number: Int) {
     /**
      * 用户列表
      */
-    USER_LIST("user"),
+    USER_LIST("user", 0),
 
     /**
      * 房间列表
      */
-    ROOM_LIST("room"),
+    ROOM_LIST("room", 1),
 
     /**
      * 消息
      */
-    MESSAGE("message"),
+    MESSAGE("message", 2),
 
     /**
      * 我的
      */
-    ME("me"),
+    ME("me", 3),
 
     /**
      * Moment
      */
-    MOMENT("moment")
+    MOMENT("moment", 4);
+
+    companion object {
+        @JvmStatic
+        fun map(number: Int): HomeTab? {
+            return entries.find { it.number == number }
+        }
+    }
 }
 
 val ROOM_LIST_TAB = Tab(

+ 1 - 1
gradle.properties

@@ -28,5 +28,5 @@ OFFICIAL=false
 
 IS_RELEASE=true
 
-VERSION_CODE=28
+VERSION_CODE=29
 VERSION_NAME=1.7.5

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

@@ -63,6 +63,7 @@ import com.adealink.weparty.storage.AppPref
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import java.util.concurrent.atomic.AtomicBoolean
+import com.adealink.weparty.ui.home.util.HomeLocalService
 
 val loginManager: ILoginManager by lazy { LoginManager() }
 
@@ -270,13 +271,15 @@ class LoginManager : BaseFrame<ILoginListener>(), ILoginManager {
     }
 
     private fun loginSuccess(result: LoginResult, loginType: ThirdType) {
+        val userInfo = result.userInfo
         AppPref.deviceLogined = true
         isLogin = true
-        uid = result.userInfo.uid
+        uid = userInfo.uid
         token = result.token
         AppPref.refreshToken = result.refreshToken
-        ProfileModule.setMyUserInfo(result.userInfo)
+        ProfileModule.setMyUserInfo(userInfo)
         AccountLocalService.loginType = loginType.value
+        HomeLocalService.setUserHomeTab(userInfo.homeTab)
     }
 
     override suspend fun phoneVerifyCodeRegister(

+ 5 - 0
module/operation/src/main/java/com/adealink/weparty/operation/OperationServiceImpl.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.operation
 
 import android.os.Bundle
 import androidx.fragment.app.FragmentManager
+import androidx.lifecycle.LifecycleOwner
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.base.CommonDataNullError
@@ -599,4 +600,8 @@ class OperationServiceImpl : IOperationService {
     override suspend fun getNewUserLotteryIsEnd(): Boolean {
         return buyNewUserManager.getNewUserLotteryIsEnd()
     }
+
+    override fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner) {
+        return buyNewUserManager.handleDelayedNewUserRewardDialogTask(viewLifecycleOwner)
+    }
 }

+ 23 - 9
module/operation/src/main/java/com/adealink/weparty/operation/newuser/NewUserManager.kt

@@ -1,8 +1,10 @@
 package com.adealink.weparty.operation.newuser
 
-import androidx.fragment.app.FragmentActivity
+import android.os.Looper
+import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.log.Log
+import com.adealink.frame.mvvm.livedata.OnceMutableLiveData
 import com.adealink.frame.network.ISocketNotify
 import com.adealink.frame.util.AppUtil
 import com.adealink.weparty.App
@@ -26,6 +28,7 @@ class NewUserManager : IBuyNewUserManager {
     private val signInRewardHttpService by lazy {
         App.instance.networkService.getHttpService(SignInRewardHttpService::class.java)
     }
+    private var newUserRewardDialogTaskLd = OnceMutableLiveData<NewUserRewardDialogTask?>()
 
     private val buyNewUserRewardNotify = object : ISocketNotify<BuyNewUserRewardNotify> {
 
@@ -53,17 +56,28 @@ class NewUserManager : IBuyNewUserManager {
 
     private fun notifyBuyNewUserReward(notify: BuyNewUserRewardNotify) {
         Log.i(TAG_OPERATION, "notifyBuyNewUserReward: $notify, ${AppUtil.currentActivity}")
-        val topActivity = AppUtil.currentActivity ?: return
-        if (topActivity is FragmentActivity) {
-            DialogTaskManager.submit(
-                task = NewUserRewardDialogTask(
-                    notify.coins,
-                    notify.chatTimes
-                )
-            )
+        postDelayedNewUserRewardDialogTask(notify)
+    }
+
+    private fun postDelayedNewUserRewardDialogTask(notify: BuyNewUserRewardNotify) {
+        val task = NewUserRewardDialogTask(
+            notify.coins, notify.chatTimes
+        )
+        if (Looper.getMainLooper().thread == Thread.currentThread()) {
+            newUserRewardDialogTaskLd.setValue(task)
+        } else {
+            newUserRewardDialogTaskLd.postValue(task)
         }
     }
 
+    override fun handleDelayedNewUserRewardDialogTask(viewLifecycleOwner: LifecycleOwner) {
+        newUserRewardDialogTaskLd.observe(viewLifecycleOwner) { task ->
+            if (task != null) {
+                DialogTaskManager.submit(task)
+                newUserRewardDialogTaskLd.value = null
+            }
+        }
+    }
 
     private val NEW_USER_LOTTERY_CODE = 96
     private var isLotteryEnd: Boolean? = null //是否结束