Эх сурвалжийг харах

feat: 关注,粉丝互关状态,生日只能选18年前

DoggyZhang 2 сар өмнө
parent
commit
1537ca6669

+ 9 - 3
app/src/main/java/com/adealink/weparty/commonui/widget/wheel/WheelDatePickerDialog.kt

@@ -6,6 +6,7 @@ import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.util.onClick
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.widget.BottomDialogFragment
+import com.adealink.weparty.commonui.widget.wheel.WheelDatePickerFragment.Companion.EXTRA_CURRENT_DATE
 import com.adealink.weparty.commonui.widget.wheel.WheelDatePickerFragment.Companion.EXTRA_INIT_DATE
 import com.adealink.weparty.databinding.DialogWheelDatePickerBinding
 
@@ -19,13 +20,16 @@ class WheelDatePickerDialog : BottomDialogFragment(R.layout.dialog_wheel_date_pi
         const val EXTRA_CONFIRM_BUTTON_TEXT = "extra_confirm_button_text"
 
         fun newInstance(
-            timestamp: Long? = null,
+            initTimestamp: Long? = null,
+            currentTimestamp: Long? = null,
+
             tips: String? = null,
             confirmButtonText: String? = null
         ): WheelDatePickerDialog {
             val fragment = WheelDatePickerDialog()
             val bundle = Bundle()
-            bundle.putLong(EXTRA_INIT_DATE, timestamp ?: System.currentTimeMillis())
+            bundle.putLong(EXTRA_INIT_DATE, initTimestamp ?: System.currentTimeMillis())
+            bundle.putLong(EXTRA_CURRENT_DATE, currentTimestamp ?: System.currentTimeMillis())
             bundle.putString(EXTRA_TIPS, tips)
             confirmButtonText?.let {
                 bundle.putString(EXTRA_CONFIRM_BUTTON_TEXT, confirmButtonText)
@@ -59,7 +63,9 @@ class WheelDatePickerDialog : BottomDialogFragment(R.layout.dialog_wheel_date_pi
         binding.tvTitle.text = title
         binding.btnConfirm.text = confirmButtonText
 
-        datePickerFragment = WheelDatePickerFragment()
+        datePickerFragment = WheelDatePickerFragment().apply {
+            arguments = this@WheelDatePickerDialog.arguments
+        }
         childFragmentManager.beginTransaction()
             .replace(binding.flDatePicker.id, datePickerFragment, "WheelDatePickerFragment")
             .commitAllowingStateLoss()

+ 15 - 2
app/src/main/java/com/adealink/weparty/commonui/widget/wheel/WheelDatePickerFragment.kt

@@ -18,12 +18,16 @@ class WheelDatePickerFragment : BaseFragment(R.layout.fragment_wheel_date_picker
 
     companion object {
         const val EXTRA_INIT_DATE = "extra_init_date"
+        const val EXTRA_CURRENT_DATE = "extra_current_date"
+
         fun newInstance(
-            timestamp: Long = System.currentTimeMillis(),
+            selectTimestamp: Long = System.currentTimeMillis(),
+            currentTimestamp: Long = System.currentTimeMillis()
         ): WheelDatePickerFragment {
             val fragment = WheelDatePickerFragment()
             val bundle = Bundle()
-            bundle.putLong(EXTRA_INIT_DATE, timestamp)
+            bundle.putLong(EXTRA_INIT_DATE, selectTimestamp)
+            bundle.putLong(EXTRA_CURRENT_DATE, currentTimestamp)
             fragment.arguments = bundle
             return fragment
         }
@@ -36,6 +40,7 @@ class WheelDatePickerFragment : BaseFragment(R.layout.fragment_wheel_date_picker
         mutableListOf<Pair<Int, String>>()  //first用于索引及获取相应时间戳,second用于日期控件滚轮文案显示
     private val dayList = mutableListOf<String>()
     private var initTimestamp = System.currentTimeMillis()
+    private var currentTimestamp = System.currentTimeMillis()
 
     private var minYear = MIN_YEAR
 
@@ -54,6 +59,12 @@ class WheelDatePickerFragment : BaseFragment(R.layout.fragment_wheel_date_picker
         if (initTimestamp <= 0) {
             initTimestamp = System.currentTimeMillis()
         }
+        arguments?.getLong(EXTRA_CURRENT_DATE)?.let {
+            currentTimestamp = it
+        }
+        if (currentTimestamp <= 0) {
+            currentTimestamp = System.currentTimeMillis()
+        }
     }
 
     /**
@@ -61,6 +72,8 @@ class WheelDatePickerFragment : BaseFragment(R.layout.fragment_wheel_date_picker
      */
     private fun initDataPicker() {
         val cal = Calendar.getInstance()
+        cal.clear()
+        cal.setTime(Date(currentTimestamp))
         currYear = cal.get(Calendar.YEAR)
         currMonth = cal.get(Calendar.MONTH) + 1
         currDay = cal.get(Calendar.DAY_OF_MONTH)

+ 2 - 2
app/src/main/java/com/adealink/weparty/module/profile/viewmodel/IFollowViewModel.kt

@@ -17,9 +17,9 @@ interface IFollowViewModel {
 
     fun isFollow(uids: List<String>): LiveData<Rlt<Map<String, FollowStatus>>>
 
-    fun follow(uid: String): LiveData<Rlt<FollowStatus>>
+    fun follow(uid: String, checkEachFollow: Boolean = false): LiveData<Rlt<FollowStatus>>
 
-    fun unFollow(uid: String): LiveData<Rlt<FollowStatus>>
+    fun unFollow(uid: String, checkEachFollow: Boolean = false): LiveData<Rlt<FollowStatus>>
 
     fun getFollowCount()
 

+ 7 - 0
app/src/main/java/com/adealink/weparty/util/TimeUtil.kt

@@ -16,6 +16,13 @@ import kotlin.math.abs
 const val TIME_FORMAT_DMY = "dd/MM/yyyy"
 const val TIME_FORMAT_DMY_HMS = "dd/MM/yyyy HH:mm:ss"
 
+fun get18YearsAgoTs(): Long {
+    val cal = Calendar.getInstance()
+    val currYear = cal.get(Calendar.YEAR)
+    cal.set(Calendar.YEAR, currYear - 18)
+    return cal.timeInMillis
+}
+
 
 @SuppressLint("SimpleDateFormat")
 fun formatTimeTo(timestamp: Long, format: String, locale: Locale = Locale.ENGLISH): String {

+ 3 - 1
module/account/src/main/java/com/adealink/weparty/account/register/fragment/CompleteUserInfoFragment.kt

@@ -25,6 +25,7 @@ import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.wheel.WheelDatePickerDialog
 import com.adealink.weparty.util.TIME_FORMAT_DMY
+import com.adealink.weparty.util.get18YearsAgoTs
 
 class CompleteUserInfoFragment : BaseFragment(R.layout.fragment_register_complete_userinfo) {
     private val binding by viewBinding(FragmentRegisterCompleteUserinfoBinding::bind)
@@ -138,7 +139,8 @@ class CompleteUserInfoFragment : BaseFragment(R.layout.fragment_register_complet
 
     private fun modifyBirthday() {
         WheelDatePickerDialog.newInstance(
-            confirmButtonText = getCompatString(R.string.account_register_next)
+            currentTimestamp = get18YearsAgoTs(),
+            confirmButtonText = getCompatString(R.string.account_register_next),
         ).apply {
             selectBirthdayCallback = object : WheelDatePickerDialog.ISelectDateCallback {
                 override fun onSelectComplete(timestamp: Long, timeStr: String) {

+ 3 - 1
module/profile/src/main/java/com/adealink/weparty/profile/edit/comp/EditPersonComp.kt

@@ -17,6 +17,7 @@ import com.adealink.weparty.profile.edit.dialog.EditNickNameDialog
 import com.adealink.weparty.profile.edit.viewmodel.EditProfileViewModel
 import com.adealink.weparty.profile.viewmodel.ProfileViewModelFactory
 import com.adealink.weparty.util.TIME_FORMAT_DMY
+import com.adealink.weparty.util.get18YearsAgoTs
 import com.adealink.weparty.R as APP_R
 
 class EditPersonComp(
@@ -91,7 +92,8 @@ class EditPersonComp(
 
     private fun editBirthday() {
         WheelDatePickerDialog.newInstance(
-            timestamp = editViewModel.editUserInfoLD.value?.birthday,
+            initTimestamp = editViewModel.editUserInfoLD.value?.birthday,
+            currentTimestamp = get18YearsAgoTs(),
             confirmButtonText = getCompatString(APP_R.string.common_save)
         ).apply {
             selectBirthdayCallback = object : WheelDatePickerDialog.ISelectDateCallback {

+ 2 - 2
module/profile/src/main/java/com/adealink/weparty/profile/relation/FansFragment.kt

@@ -87,7 +87,7 @@ class FansFragment : BaseFragment(R.layout.fragment_fans), FansItemViewBinder.On
         if (item.data.uid.isEmpty()) {
             return
         }
-        viewModel.follow(item.data.uid).observe(viewLifecycleOwner) { rlt ->
+        viewModel.follow(item.data.uid, true).observe(viewLifecycleOwner) { rlt ->
             when (rlt) {
                 is Rlt.Success -> {
                     item.data.followStatus = rlt.data.status
@@ -105,7 +105,7 @@ class FansFragment : BaseFragment(R.layout.fragment_fans), FansItemViewBinder.On
         if (item.data.uid.isEmpty()) {
             return
         }
-        viewModel.unFollow(item.data.uid).observe(viewLifecycleOwner) { rlt ->
+        viewModel.unFollow(item.data.uid, true).observe(viewLifecycleOwner) { rlt ->
             when (rlt) {
                 is Rlt.Success -> {
                     item.data.followStatus = rlt.data.status

+ 2 - 2
module/profile/src/main/java/com/adealink/weparty/profile/relation/FollowFragment.kt

@@ -90,7 +90,7 @@ class FollowFragment : BaseFragment(R.layout.fragment_follow),
         if (item.data.uid.isEmpty()) {
             return
         }
-        viewModel.follow(item.data.uid).observe(viewLifecycleOwner) { rlt ->
+        viewModel.follow(item.data.uid, true).observe(viewLifecycleOwner) { rlt ->
             when (rlt) {
                 is Rlt.Success -> {
                     item.data.followStatus = rlt.data.status
@@ -108,7 +108,7 @@ class FollowFragment : BaseFragment(R.layout.fragment_follow),
         if (item.data.uid.isEmpty()) {
             return
         }
-        viewModel.unFollow(item.data.uid).observe(viewLifecycleOwner) { rlt ->
+        viewModel.unFollow(item.data.uid, true).observe(viewLifecycleOwner) { rlt ->
             when (rlt) {
                 is Rlt.Success -> {
                     item.data.followStatus = rlt.data.status

+ 13 - 2
module/profile/src/main/java/com/adealink/weparty/profile/relation/adapter/FollowItemViewBinder.kt

@@ -36,8 +36,7 @@ class FollowItemViewBinder(val listener: OnFollowItemClick) :
             holder.binding.btnEachFollow.gone()
         } else {
             when (FollowStatus.map(item.data.followStatus)) {
-                FollowStatus.NONE,
-                FollowStatus.FANS -> {
+                FollowStatus.NONE -> {
                     holder.binding.btnFollow.show()
                     holder.binding.btnFollow.setBackgroundResource(R.drawable.profile_follow_button_bg)
                     holder.binding.btnFollow.text = getCompatString(APP_R.string.common_follow)
@@ -48,9 +47,21 @@ class FollowItemViewBinder(val listener: OnFollowItemClick) :
                     holder.binding.btnEachFollow.gone()
                 }
 
+                FollowStatus.FANS -> {
+                    //对方关注了我, 是否互关
+                    holder.binding.btnFollow.gone()
+                    holder.binding.btnEachFollow.show()
+                    holder.binding.btnEachFollow.setImageResource(R.drawable.profile_each_follow_button_ic)
+                    holder.binding.btnEachFollow.onClick {
+                        listener.follow(item, holder.layoutPosition)
+                    }
+                }
+
                 FollowStatus.EACH_FOLLOW -> {
+                    //对方关注了我, 是否取消互关
                     holder.binding.btnFollow.gone()
                     holder.binding.btnEachFollow.show()
+                    holder.binding.btnEachFollow.setImageResource(R.drawable.profile_each_unfollow_button_ic)
                     holder.binding.btnEachFollow.onClick {
                         listener.unFollow(item, holder.layoutPosition)
                     }

+ 59 - 54
module/profile/src/main/java/com/adealink/weparty/profile/relation/viewmodel/FollowViewModel.kt

@@ -43,15 +43,14 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
     override fun isFollow(uid: String): LiveData<Rlt<FollowStatus>> {
         val liveData = OnceMutableLiveData<Rlt<FollowStatus>>()
         viewModelScope.launch {
-            val rlt = followHttpService.isFollow(FollowStatusReq(listOf(uid)))
+            val rlt = suspendIsFollow(listOf(uid))
             when (rlt) {
                 is Rlt.Failed -> {
                     liveData.send(rlt)
                 }
 
                 is Rlt.Success -> {
-                    val followStatus =
-                        FollowStatus.map(rlt.data.data?.list?.find { it.uid == uid }?.followStatus)
+                    val followStatus = rlt.data[uid] ?: FollowStatus.NONE
                     followStatusMap[uid] = followStatus
                     isFollowLD.send(followStatusMap)
                     liveData.send(Rlt.Success(followStatus))
@@ -65,16 +64,14 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
     override fun isFollow(uids: List<String>): LiveData<Rlt<Map<String, FollowStatus>>> {
         val liveData = OnceMutableLiveData<Rlt<Map<String, FollowStatus>>>()
         viewModelScope.launch {
-            val rlt = followHttpService.isFollow(FollowStatusReq(uids.distinct()))
+            val rlt = suspendIsFollow(uids)
             when (rlt) {
                 is Rlt.Failed -> {
                     liveData.send(rlt)
                 }
 
                 is Rlt.Success -> {
-                    rlt.data.data?.list?.forEach {
-                        followStatusMap[it.uid] = FollowStatus.map(it.followStatus)
-                    }
+                    followStatusMap.putAll(rlt.data)
                     isFollowLD.send(followStatusMap)
                     liveData.send(Rlt.Success(followStatusMap))
                 }
@@ -83,7 +80,24 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
         return liveData
     }
 
-    override fun follow(uid: String): LiveData<Rlt<FollowStatus>> {
+    private suspend fun suspendIsFollow(uids: List<String>): Rlt<Map<String, FollowStatus>> {
+        val rlt = followHttpService.isFollow(FollowStatusReq(uids.distinct()))
+        when (rlt) {
+            is Rlt.Failed -> {
+                return rlt
+            }
+
+            is Rlt.Success -> {
+                val followMap = mutableMapOf<String, FollowStatus>()
+                rlt.data.data?.list?.forEach {
+                    followMap[it.uid] = FollowStatus.map(it.followStatus)
+                }
+                return Rlt.Success(followMap)
+            }
+        }
+    }
+
+    override fun follow(uid: String, checkEachFollow: Boolean): LiveData<Rlt<FollowStatus>> {
         val liveData = OnceMutableLiveData<Rlt<FollowStatus>>()
         viewModelScope.launch {
             val rlt = followHttpService.follow(FollowReq(uid, true))
@@ -94,15 +108,31 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
 
                 is Rlt.Success -> {
                     showToast(APP_R.string.common_follow_success)
-                    val nextStatus = onFollowStatusChanged(uid, true)
-                    liveData.send(Rlt.Success(nextStatus))
+                    val finalStatus: FollowStatus = if (checkEachFollow) {
+                        //检查互关状态
+                        val rlt = suspendIsFollow(listOf(uid))
+                        when (rlt) {
+                            is Rlt.Failed -> {
+                                FollowStatus.FOLLOW
+                            }
+
+                            is Rlt.Success -> {
+                                rlt.data[uid] ?: FollowStatus.FOLLOW
+                            }
+                        }
+                    } else {
+                        FollowStatus.FOLLOW
+                    }
+                    followStatusMap[uid] = finalStatus
+                    isFollowLD.send(followStatusMap)
+                    liveData.send(Rlt.Success(finalStatus))
                 }
             }
         }
         return liveData
     }
 
-    override fun unFollow(uid: String): LiveData<Rlt<FollowStatus>> {
+    override fun unFollow(uid: String, checkEachFollow: Boolean): LiveData<Rlt<FollowStatus>> {
         val liveData = OnceMutableLiveData<Rlt<FollowStatus>>()
         viewModelScope.launch {
             val activity = AppUtil.currentActivity as? FragmentActivity ?: return@launch
@@ -119,8 +149,24 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
                 }
 
                 is Rlt.Success -> {
-                    val nextStatus = onFollowStatusChanged(uid, false)
-                    liveData.send(Rlt.Success(nextStatus))
+                    val finalStatus: FollowStatus = if (checkEachFollow) {
+                        //检查互关状态
+                        val rlt = suspendIsFollow(listOf(uid))
+                        when (rlt) {
+                            is Rlt.Failed -> {
+                                FollowStatus.NONE
+                            }
+
+                            is Rlt.Success -> {
+                                rlt.data[uid] ?: FollowStatus.NONE
+                            }
+                        }
+                    } else {
+                        FollowStatus.NONE
+                    }
+                    followStatusMap[uid] = finalStatus
+                    isFollowLD.send(followStatusMap)
+                    liveData.send(Rlt.Success(finalStatus))
                 }
             }
 
@@ -186,47 +232,6 @@ class FollowViewModel : BaseViewModel(), IFollowViewModel {
         }
     }
 
-    private fun onFollowStatusChanged(uid: String, follow: Boolean): FollowStatus {
-        val currentStatus = followStatusMap[uid]
-        val nextStatus = when (currentStatus) {
-            FollowStatus.NONE, null -> {
-                if (follow) {
-                    FollowStatus.FOLLOW
-                } else {
-                    FollowStatus.NONE
-                }
-            }
-
-            FollowStatus.EACH_FOLLOW -> {
-                if (follow) {
-                    FollowStatus.EACH_FOLLOW
-                } else {
-                    FollowStatus.FANS
-                }
-            }
-
-            FollowStatus.FANS -> {
-                if (follow) {
-                    FollowStatus.EACH_FOLLOW
-                } else {
-                    FollowStatus.FANS
-                }
-            }
-
-            FollowStatus.FOLLOW -> {
-                if (follow) {
-                    FollowStatus.FOLLOW
-                } else {
-                    FollowStatus.NONE
-                }
-            }
-        }
-        followStatusMap[uid] = nextStatus
-        isFollowLD.send(followStatusMap)
-        return nextStatus
-    }
-
-
     private val followList = mutableListOf<FollowItemData>()
     private val followUids = mutableSetOf<String>()
     private val followPageHandler = PageHandler()