From 29cd798ca8d60188c4a57356552268a9426ea42e Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 27 Aug 2021 12:00:57 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5?= =?UTF-8?q?.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=880826=E6=B5=8B=E8=AF=95=20=E7=AC=AC3?= =?UTF-8?q?=E3=80=814=E3=80=815=E3=80=816=E7=82=B9=EF=BC=89https://git.ghz?= =?UTF-8?q?s.com/pm/halo-app-issues/-/issues/1220#note=5F115199?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/databind/BindingAdapters.java | 4 +- .../main/java/com/gh/common/util/TimeUtils.kt | 12 ++ .../servers/GameServersContentFragment.kt | 138 ++++++++++++------ .../servers/GameServersContentViewModel.kt | 58 +++++--- 4 files changed, 147 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 2a429ff747..a93c5a6f91 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -769,8 +769,8 @@ public class BindingAdapters { } else { TagStyleEntity typeTag = new TagStyleEntity(); typeTag.setName(test.getType() != null ? test.getType() : ""); - typeTag.setBackground("FFF3E0"); - typeTag.setColor("FA8500"); + typeTag.setBackground("E8F3FF"); + typeTag.setColor("1383EB"); tagStyle.add(typeTag); TagStyleEntity timeTag = new TagStyleEntity(); diff --git a/app/src/main/java/com/gh/common/util/TimeUtils.kt b/app/src/main/java/com/gh/common/util/TimeUtils.kt index ae99de688f..b257128781 100644 --- a/app/src/main/java/com/gh/common/util/TimeUtils.kt +++ b/app/src/main/java/com/gh/common/util/TimeUtils.kt @@ -174,6 +174,18 @@ object TimeUtils { return calendar.timeInMillis } + @JvmStatic + fun getTimeOfDayOffsetAndHour(dayOffset: Int, hour: Int): Long { + val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) + calendar.timeInMillis = getJavaTimestamp(System.currentTimeMillis()) + calendar.set(Calendar.DAY_OF_YEAR, calendar[Calendar.DAY_OF_YEAR] + dayOffset) + calendar.set(Calendar.HOUR_OF_DAY, hour) + calendar.set(Calendar.MINUTE, 0) + calendar.set(Calendar.SECOND, 0) + calendar.set(Calendar.MILLISECOND, 0) + return calendar.timeInMillis + } + @JvmStatic fun getJavaTimestamp(timestamp: Long): Long { return if ((log10(timestamp.toDouble()) + 1).toInt() == 10) { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index 41527d616f..14b3998b92 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -24,6 +24,8 @@ import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import java.text.SimpleDateFormat +import java.util.* /** * 开服表内容 fragment @@ -81,6 +83,7 @@ class GameServersContentFragment : BaseFragment() { mViewModel?.listLiveData?.observe(this, androidx.lifecycle.Observer { if (it.first == "down") { mAdapter?.submitList(it.second, isShowPullDownTip = false, isDown = true, downSize = it.third) + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE } else { mAdapter?.submitList(it.second, mShowPullDownTipFlag || mBinding?.pullDownTip?.visibility == View.VISIBLE) } @@ -109,6 +112,8 @@ class GameServersContentFragment : BaseFragment() { mBinding?.recyclerView?.run { if (translationY != 0F) { animate().translationY(0F).setDuration(200).start() + hidePullDownTip() + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE } } @@ -134,50 +139,55 @@ class GameServersContentFragment : BaseFragment() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (dy != 0) hidePullDownTip() + if (mLayoutManager?.findFirstVisibleItemPosition() == 0) { + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE + } else if (dy != 0) { + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE + } val position = mLayoutManager?.findFirstVisibleItemPosition() ?: 0 - if (RecyclerView.NO_POSITION == position) return + if (RecyclerView.NO_POSITION == position || position < 1) return val dataList = mViewModel?.listLiveData?.value?.second - val gameEntity = dataList?.get(position + 1) + val gameEntity = dataList?.get(position - 1) val kaifuTimeHint = gameEntity?.kaifuTimeHint // 悬挂的文案 -// val timeGameEntity = dataList?.get(position) -// val fixedTopHint = timeGameEntity?.fixedTop ?: false -// if (fixedTopHint) { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) -// } else { -// val timeHint = timeGameEntity?.kaifuTimeHint -// val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) -// if (timeHint == null || timeHint == 0L) { -// val serverEntity = timeGameEntity?.serverEntity -// if (serverEntity != null) { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() -// } -// } else { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint -// } -// } -// -// // 悬挂界面移动 -// if (kaifuTimeHint != null && kaifuTimeHint != 0L) { -// val buttom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 -// if (buttom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { -// mLlParams?.topMargin = buttom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height -// ?: 0) -// } else { -// mLlParams?.topMargin = 0 -// } -// } else { -// mLlParams?.topMargin = 0 -// } -// mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams + val timeGameEntity = dataList?.get(position - 1) + val fixedTopHint = timeGameEntity?.fixedTop ?: false + if (fixedTopHint) { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) + } else { + val timeHint = timeGameEntity?.kaifuTimeHint + val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) + if (timeHint == null || timeHint == 0L) { + val serverEntity = timeGameEntity?.serverEntity + if (serverEntity != null) { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() + } + } else { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint + } + } + + // 悬挂界面移动 + if (kaifuTimeHint != null && kaifuTimeHint != 0L) { + val bottom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 + if (bottom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { + mLlParams?.topMargin = bottom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height + ?: 0) + } else { + mLlParams?.topMargin = 0 + } + } else { + mLlParams?.topMargin = 0 + } + mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams } }) mBinding?.removeFilter?.setOnClickListener { @@ -269,9 +279,51 @@ class GameServersContentFragment : BaseFragment() { mViewModel?.run { this.day = day this.hour = hour -// this.type = type - this.tags = tags - onRefreshPage() + if (day != null && hour != null && tags == this.tags) { + val time = when (day) { + "today" -> TimeUtils.getTimeOfDayOffsetAndHour(0, hour.toInt()) + "tomorrow" -> TimeUtils.getTimeOfDayOffsetAndHour(1, hour.toInt()) + else -> TimeUtils.getTimeOfDayOffsetAndHour(2, 0) + } + val isExist = isExistTime(time) + val proximateTime = mViewModel?.getProximateTime(time) + if (proximateTime != null) { + val position = mViewModel?.getPositionByTime(proximateTime) ?: 0 + mLayoutManager?.scrollToPositionWithOffset(position + 1, 0) + mBinding?.run { + recyclerView.post { + if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 + && !mAdapter!!.isNextOver() + && !mAdapter!!.isNextLoading()) { + mViewModel?.run { + loadData(action = "up") + } + } else if (!isExist) { + kaifuTimeContainer.kaifuItemTime.visibility = View.GONE + val canScrollVertically = recyclerView.canScrollVertically(-1) + noMatchView.translationY = 0F + noMatchView.visibility = View.VISIBLE + recyclerView.translationY = if (canScrollVertically) 40F.dip2px().toFloat() else -(8F.dip2px().toFloat()) + postDelayedRunnable({ + tryCatchInRelease { + noMatchView.animate().translationY(-(40F.dip2px().toFloat())).setDuration(200).start() + recyclerView.animate().translationY(recyclerView.translationY - 40F.dip2px().toFloat()).setDuration(200) + .withEndAction { + kaifuTimeContainer.kaifuItemTime.visibility = View.VISIBLE + }.start() + } + }, 2000) + } + } + } + } else { + this.tags = tags + onRefreshPage() + } + } else { + this.tags = tags + onRefreshPage() + } } } @@ -325,7 +377,7 @@ class GameServersContentFragment : BaseFragment() { override fun loadDone() { super.loadDone() mBinding?.recyclerView?.visibility = View.VISIBLE - mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE +// mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE mBinding?.reuseNoneData?.visibility = View.GONE mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index 6a26ee7df5..782ec66a73 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -6,10 +6,7 @@ import androidx.collection.ArrayMap import androidx.collection.arrayMapOf import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData -import com.gh.common.util.ApkActiveUtils -import com.gh.common.util.EntranceUtils -import com.gh.common.util.UrlFilterUtils -import com.gh.common.util.countOccurrences +import com.gh.common.util.* import com.gh.download.DownloadManager import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.entity.GameEntity @@ -36,6 +33,8 @@ class GameServersContentViewModel(application: Application) var prevId: String? = null var nextId: String? = null var isInit = true + var mKaiFuTimeList = arrayListOf() + private var mTimePositionMap = hashMapOf() init { loadData() @@ -231,17 +230,15 @@ class GameServersContentViewModel(application: Application) val gameEntity = listLiveData.value?.second?.find { it.kaifuTimeHint != null } val serverEntity = gameEntity?.serverEntity val nextServerEntity = entity.serverEntity - if (serverEntity == null || nextServerEntity == null) { - i++ - continue - } - val time = serverEntity.getTime() - val nextTime = nextServerEntity.getTime() - if (time != nextTime) { - val kaiFuTimeEntity = GameEntity() - kaiFuTimeEntity.kaifuTimeHint = time - list.add(i, kaiFuTimeEntity) - i++ + if (serverEntity != null && nextServerEntity != null) { + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = time + list.add(i, kaiFuTimeEntity) + i++ + } } } @@ -333,15 +330,36 @@ class GameServersContentViewModel(application: Application) } private fun recordIndex(list: ArrayList) { + mKaiFuTimeList.clear() + mTimePositionMap.clear() var index = 0 - list.forEach { - if (it.kaifuTimeHint != null) return@forEach - it.sequence = index++ - if (it.serverRemaining != null) { - for (remainingGame in it.serverRemaining!!) { + list.forEachIndexed { i, entity -> + if (entity.kaifuTimeHint != null) { + mKaiFuTimeList.add(entity.kaifuTimeHint!!) + mTimePositionMap[entity.kaifuTimeHint!!] = i + } + entity.sequence = index++ + if (entity.serverRemaining != null) { + for (remainingGame in entity.serverRemaining!!) { remainingGame.sequence = index++ } } } } + + fun isExistTime(time: Long): Boolean { + return mKaiFuTimeList.contains(time / 1000) + } + + fun getProximateTime(time: Long): Long? { + if (mKaiFuTimeList.isEmpty()) return null + if (time >= TimeUtils.getJavaTimestamp(mKaiFuTimeList.first()) && time <= TimeUtils.getJavaTimestamp(mKaiFuTimeList.last())) { + return mKaiFuTimeList.firstOrNull { TimeUtils.getJavaTimestamp(it) >= time } + } + return null + } + + fun getPositionByTime(time: Long): Int? { + return mTimePositionMap[time] + } } \ No newline at end of file