From c64bb4d2496574d69bdce46ca7190c9e9631132c Mon Sep 17 00:00:00 2001 From: wushaocheng <15876365887@163.com> Date: Thu, 29 Dec 2022 17:34:37 +0800 Subject: [PATCH] =?UTF-8?q?[Modify]=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/proguard-rules.pro | 6 +- .../erban/avroom/fragment/BaseRoomFragment.kt | 4 + .../com/yizhuan/erban/home/HomeViewModel.kt | 34 +++-- .../home/fragment/HomeTabHomeFragment.java | 7 -- .../erban/home/fragment/RecommendFragment.kt | 116 +++++++++++++++--- .../main/res/layout/fragment_recommend.xml | 12 +- .../home/model/HomeModel.kt | 29 +++++ .../common/util/LimitClickUtils.java | 62 ++++++++++ 8 files changed, 228 insertions(+), 42 deletions(-) create mode 100644 library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/LimitClickUtils.java diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1e0dd0768..327469a59 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -481,4 +481,8 @@ ## 图片裁剪UCrop -dontwarn com.yalantis.ucrop.** -keep class com.yalantis.ucrop.** { *; } --keep interface com.yalantis.ucrop.** { *; } \ No newline at end of file +-keep interface com.yalantis.ucrop.** { *; } + +## BannerViewPage +-keep class androidx.recyclerview.widget.**{*;} +-keep class androidx.viewpager2.widget.**{*;} \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/BaseRoomFragment.kt b/app/src/main/java/com/yizhuan/erban/avroom/fragment/BaseRoomFragment.kt index 5fdefdd5a..612faf21d 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/BaseRoomFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/BaseRoomFragment.kt @@ -111,6 +111,7 @@ import com.yizhuan.xchat_android_core.user.bean.BaseInfo import com.yizhuan.xchat_android_core.user.bean.UserInfo import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils import com.yizhuan.xchat_android_core.utils.net.VipLevelNotEnoughException +import com.yizhuan.xchat_android_library.common.util.LimitClickUtils import com.yizhuan.xchat_android_library.common.util.SPUtils import com.yizhuan.xchat_android_library.net.rxnet.utils.RxNetWorkUtils import com.yizhuan.xchat_android_library.rxbus.RxBus @@ -149,6 +150,8 @@ open class BaseRoomFragment?> : private var roomFreeGiftDialog: RoomFreeGiftDialog? = null + private val mClickLimit by lazy { LimitClickUtils() } + @JvmField protected var isDatingMode = false @@ -636,6 +639,7 @@ open class BaseRoomFragment?> : @CallSuper override fun onClick(v: View) { + if (mClickLimit.checkForTime(500)) return when (v.id) { R.id.input_send -> { StatisticManager.Instance() diff --git a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt index de7c3be75..403c6f827 100644 --- a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt @@ -5,10 +5,7 @@ import androidx.lifecycle.MutableLiveData import com.yizhuan.erban.R import com.yizhuan.erban.base.BaseViewModel import com.yizhuan.xchat_android_core.bean.response.ListResult -import com.yizhuan.xchat_android_core.home.bean.BannerInfo -import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo -import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo -import com.yizhuan.xchat_android_core.home.bean.ResourceInfo +import com.yizhuan.xchat_android_core.home.bean.* import com.yizhuan.xchat_android_core.home.model.HomeModel import com.yizhuan.xchat_android_core.room.bean.AnchorInfo import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo @@ -22,8 +19,11 @@ import kotlinx.coroutines.async class HomeViewModel : BaseViewModel() { - private val _bannerLiveData = MutableLiveData>() - val bannerLiveData: LiveData> = _bannerLiveData + private val _tabHomeLiveData = MutableLiveData?>() + val tabHomeLiveData: MutableLiveData?> = _tabHomeLiveData + + private val _bannerLiveData = MutableLiveData?>() + val bannerLiveData: MutableLiveData?> = _bannerLiveData private val _hotRoomLiveData = MutableLiveData>() val hotRoomLiveData: LiveData> = _hotRoomLiveData @@ -65,10 +65,26 @@ class HomeViewModel : BaseViewModel() { private val _homeHotRoomLiveData = MutableLiveData?>() val homeHotRoomLiveData: LiveData?> = _homeHotRoomLiveData + fun getHomeTabName() { + safeLaunch( + onError = { + _tabHomeLiveData.value = null + }, + block = { + _tabHomeLiveData.value = HomeModel.getHomeTabHome() + } + ) + } + fun getBannerInfo() { - safeLaunch { - _bannerLiveData.value = HomeModel.getHomeBanner("1") - } + safeLaunch( + onError = { + _bannerLiveData.value = null + }, + block = { + _bannerLiveData.value = HomeModel.getHomeBanner("1") + } + ) } fun getTagInfo() { diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabHomeFragment.java b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabHomeFragment.java index bd89fbe02..fa92fa6d9 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabHomeFragment.java +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabHomeFragment.java @@ -155,13 +155,6 @@ public class HomeTabHomeFragment extends BaseFragment { if (finalList1.size() >= ROOM_COUNT) { finalList1 = finalList1.subList(0, ROOM_COUNT); } -// else { -// while (finalList1.size() < ROOM_COUNT) { -// HomeTabMapInfo info = new HomeTabMapInfo(); -// info.setItemType(HomeTabMapInfo.TYPE_EMPTY); -// finalList1.add(info); -// } -// } return finalList1; } diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/RecommendFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/RecommendFragment.kt index 8a35365ab..c66a97a31 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/RecommendFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/RecommendFragment.kt @@ -15,13 +15,18 @@ import com.yizhuan.erban.databinding.FragmentRecommendBinding import com.yizhuan.erban.home.HomeViewModel import com.yizhuan.erban.home.adapter.HomeChatAdapter import com.yizhuan.erban.home.adapter.HomeHotAdapter +import com.yizhuan.erban.home.adapter.HomeTopAdapter import com.yizhuan.erban.home.helper.BannerHelper import com.yizhuan.erban.home.helper.OpenRoomHelper +import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo +import com.yizhuan.xchat_android_core.home.bean.HomeTabMapInfo import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent import com.yizhuan.xchat_android_core.room.event.RoomShieldEvent import com.yizhuan.xchat_android_core.user.UserModel import com.yizhuan.xchat_android_core.user.event.LoginUserInfoUpdateEvent +import com.yizhuan.xchat_android_library.utils.ListUtils +import com.zhpan.bannerview.BannerViewPager import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -38,32 +43,54 @@ class RecommendFragment : BaseViewBindingFragment() { //是否需要刷新接口进行屏蔽房间操作 private var isShield = false + private var mRecommendBanner: BannerViewPager? = null + override fun init() { + mRecommendBanner = view?.findViewById(R.id.mRecommendBanner) initRefreshView() initChatTab() initHotRoomTab() - childFragmentManager - .beginTransaction() - .replace(R.id.fg_recommend_room, HomeTabHomeFragment.newInstance()) - .commitAllowingStateLoss() + homeViewModel.tabHomeLiveData.observe(this) { + it?.let { + if (ListUtils.isListEmpty(it)) { + mRecommendBanner?.visibility = View.GONE + return@observe + } else { + mRecommendBanner?.visibility = View.VISIBLE + } + + val roomsList: List = ArrayList(it) + + for (i in roomsList.indices) { + roomsList[i].itemType = HomeTabMapInfo.TYPE_NORMAL //对原始数据设置type + } + refreshRoomData(roomsList) + } + } homeViewModel.bannerLiveData.observe(this) { - BannerHelper.setBanner(binding.rollView, it) { _, _ -> - //首页_banner - ReportManager.get().reportEvent(IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( - Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.SIX), - Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) - )) + it?.let { + BannerHelper.setBanner(binding.rollView, it) { _, _ -> + //首页_banner + ReportManager.get().reportEvent( + IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( + Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.SIX), + Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) + ) + ) + } } } binding.ivGameGuide.setOnClickListener { //首页_扩列聊天-创建游戏房 - ReportManager.get().reportEvent(IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( - Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.NINE), - Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) - )) + ReportManager.get().reportEvent( + IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( + Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.NINE), + Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) + ) + ) CreateRoomDialog().apply { setGameVisible() }.show(context) } } @@ -84,10 +111,12 @@ class RecommendFragment : BaseViewBindingFragment() { val homePlayInfo: HomeRoomInfo? = charAdapter.getItem(position) if (homePlayInfo != null) { //首页_扩列聊天-用户房间 - ReportManager.get().reportEvent(IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( - Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.SEVEN), - Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) - )) + ReportManager.get().reportEvent( + IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( + Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.SEVEN), + Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) + ) + ) AVRoomActivity.startForFromType( mContext, homePlayInfo.uid, @@ -144,6 +173,52 @@ class RecommendFragment : BaseViewBindingFragment() { } } + /** + * 刷新数据 + */ + private fun refreshRoomData(roomList: List) { + mRecommendBanner?.adapter = HomeTopAdapter() + mRecommendBanner?.post { + val width = + UIUtil.getScreenWidth(mContext) - UIUtil.dip2px(mContext, 10.0) * 3 + val revealWidth = width / 3 + val bannerLayoutParams = mRecommendBanner?.layoutParams + bannerLayoutParams?.height = revealWidth + UIUtil.dip2px(mContext, 32.0) + mRecommendBanner?.layoutParams = bannerLayoutParams + setupBanner( + revealWidth, + revealWidth, + roomList + ) + } + } + + private fun setupBanner( + leftRevealWidth: Int, + rightRevealWidth: Int, + list: List + ) { + mRecommendBanner?.apply { + setLifecycleRegistry(lifecycle) + setPageMargin(UIUtil.dip2px(mContext, 10.0)) + setScrollDuration(800) + setRevealWidth(leftRevealWidth, rightRevealWidth) + setOnPageClickListener { _: View?, position: Int -> + //首页_热门房间 + val map = HashMap(3) + map[IReportConstants.HOMEPAGE_TYPE] = IReportConstants.FIVE + map[IReportConstants.MODULE] = IReportConstants.PEKO_HOMEPAGE + ReportManager.get().reportEvent(IReportConstants.MODULE_HOMEPAGE_CLICK, map) + AVRoomActivity.startForFromType( + mContext, + list[position].roomUid.toLong(), + AVRoomActivity.FROM_TYPE_RECOMMEND + ) + } + create(list) + } + } + override fun onLazyLoad() { super.onLazyLoad() loadData() @@ -151,7 +226,7 @@ class RecommendFragment : BaseViewBindingFragment() { override fun onResume() { super.onResume() - if(isShield){ + if (isShield) { loadData() isShield = false } @@ -159,6 +234,7 @@ class RecommendFragment : BaseViewBindingFragment() { private fun loadData() { homeViewModel.getBannerInfo() + homeViewModel.getHomeTabName() homeViewModel.getHomePlayV2() homeViewModel.getHotRoom() } @@ -191,7 +267,7 @@ class RecommendFragment : BaseViewBindingFragment() { } @Subscribe(threadMode = ThreadMode.MAIN) - fun onRoomShieldEvent(event: RoomShieldEvent?){ + fun onRoomShieldEvent(event: RoomShieldEvent?) { isShield = true } diff --git a/app/src/main/res/layout/fragment_recommend.xml b/app/src/main/res/layout/fragment_recommend.xml index 7ed3dbf4f..1851f50c6 100644 --- a/app/src/main/res/layout/fragment_recommend.xml +++ b/app/src/main/res/layout/fragment_recommend.xml @@ -27,14 +27,16 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + app:bvp_can_loop="true" + app:bvp_auto_play="true" + app:bvp_indicator_visibility="gone" + app:bvp_page_style="multi_page_scale" /> ? = + launchRequest { + api.apiHomeTabHome( + "", AuthModel.get().currentUid.toString(), + CommunityConstant.VERSION_VALID_TYPE, + AuthModel.get().ticket + ) + } + suspend fun getHomeBanner(type: String): List? = launchRequest { api.apiHomeBanner( @@ -254,6 +266,23 @@ object HomeModel : BaseModel() { @POST("interactive/unreadCount") fun getUnreadCount(@Query("uid") uid: Long): Single> + /** + * 首页推荐房间 + * + * @param tabId + * @param uid + * @param types + * @param ticket + * @return + */ + @GET("/home/tab/homeV2") + suspend fun apiHomeTabHome( + @Query("tabId") tabId: String, + @Query("uid") uid: String, + @Query("types") types: String, + @Query("ticket") ticket: String + ): ServiceResult> + /** * 首页Banner * diff --git a/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/LimitClickUtils.java b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/LimitClickUtils.java new file mode 100644 index 000000000..1df44e0f2 --- /dev/null +++ b/library/src/module_common/java/com/yizhuan/xchat_android_library/common/util/LimitClickUtils.java @@ -0,0 +1,62 @@ +package com.yizhuan.xchat_android_library.common.util; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * 防快速点击工具类 + */ +public class LimitClickUtils { + private Map mClickMap = new HashMap<>(); + + public boolean check() { + return this.check(null); + } + + public boolean check(Object object) { + return this.checkForTime(object, OneClick.MIN_CLICK_DELAY_TIME); + } + + public boolean checkForTime(Object object, int limitTime) { + String flag; + if (object == null) { + flag = Thread.currentThread().getStackTrace()[2].getMethodName(); + } else { + flag = object.toString(); + } + + if (this.mClickMap.get(flag) == null) { + this.mClickMap.put(flag, new OneClick(limitTime)); + } + return this.mClickMap.get(flag).check(); + } + + public boolean checkForTime(int limitTime) { + return this.checkForTime(null, limitTime); + } + + public void destroy() { + this.mClickMap.clear(); + } + + private static class OneClick { + public static final int MIN_CLICK_DELAY_TIME = 1000; + private long mLastClickTime = 0L; + private int mLimitTime; + + public OneClick(int limitTime) { + this.mLimitTime = limitTime; + } + + public boolean check() { + long currentTime = Calendar.getInstance().getTimeInMillis(); + if (currentTime - this.mLastClickTime > (long) this.mLimitTime) { + this.mLastClickTime = currentTime; + return false; + } + return true; + } + } +} +