diff --git a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java index c05fa421a0..472be7bb60 100644 --- a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java +++ b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java @@ -55,6 +55,8 @@ public class DetailDownloadUtils { } viewHolder.setSpeedViewsVisible(false); + // 默认为显示状态 + viewHolder.getDownloadPb().setVisibility(View.VISIBLE); // 根据预置的配置更新 ViewHolder 的状态 (譬如青少年模式、下载内容为空等) if (updateViewHolderWithPredefinedConfig(viewHolder, gameEntity)) { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt index 1d0725bd8a..46118cf452 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.kt @@ -217,7 +217,7 @@ class DetailViewHolder( } private fun restoreDialogFragment() { - val gamePermissionDialogFragment = (context as AppCompatActivity).supportFragmentManager.findFragmentByTag( + val gamePermissionDialogFragment = (context.getActivity() as? AppCompatActivity)?.supportFragmentManager?.findFragmentByTag( GamePermissionDialogFragment::class.java.name ) as DialogFragment? gamePermissionDialogFragment?.dismissAllowingStateLoss() @@ -233,7 +233,6 @@ class DetailViewHolder( getDownloadBtnText(context, gameEntity, false, true, PluginLocation.only_game) when { localText.contains(com.gh.gamecenter.feature.R.string.update.toResString()) -> { // 本地游戏需要更新 - localDownloadButton?.goneIf(true) localDownloadContainer?.goneIf(true) downloadPb.goneIf(true) overlayTv?.goneIf(true) @@ -250,7 +249,6 @@ class DetailViewHolder( localText.contains(com.gh.gamecenter.feature.R.string.launch.toResString()) && downloadText == "更新" -> { // 畅玩游戏需要更新:显示 加速/更新 localDownloadContainer?.goneIf(true) - localDownloadButton?.goneIf(true) downloadPb.goneIf(true) overlayTv?.goneIf(true) @@ -263,7 +261,6 @@ class DetailViewHolder( } localText.contains(com.gh.gamecenter.feature.R.string.launch.toResString()) -> { // 本地游戏为启动状态:显示 加速/畅玩 - localDownloadButton?.goneIf(true) localDownloadContainer?.goneIf(true) downloadPb.goneIf(true) overlayTv?.goneIf(true) @@ -288,20 +285,20 @@ class DetailViewHolder( val downloadText = getDownloadBtnText(context, gameEntity, false, false, PluginLocation.only_game) when { downloadText.contains(com.gh.gamecenter.feature.R.string.launch.toResString()) -> { - localDownloadButton?.goneIf(true) localDownloadContainer?.goneIf(true) downloadPb.goneIf(true) true } - downloadText == com.gh.gamecenter.feature.R.string.launch.toResString() -> true + downloadText.contains(R.string.update.toResString()) -> true + else -> false } } else -> false } - it.checkIfShowSpeedUi(showSpeedUi) + it.checkIfShowSpeedUi(showSpeedUi, showDualDownloadButton) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/accelerator/GameDetailAcceleratorUiHelper.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/accelerator/GameDetailAcceleratorUiHelper.kt index aaa6ca106a..c0ee073bac 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/accelerator/GameDetailAcceleratorUiHelper.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/accelerator/GameDetailAcceleratorUiHelper.kt @@ -55,6 +55,8 @@ class GameDetailAcceleratorUiHelper(private val binding: DetailDownloadItemBindi private var hasAnyAcctRecord = false + private var showDualDownloadButton: Boolean = false + private val accelerationListener = object : OnAccelerateListener { override fun onStateChanged(state: AccelerateState) { when (state) { @@ -131,13 +133,17 @@ class GameDetailAcceleratorUiHelper(private val binding: DetailDownloadItemBindi val isCurrentGameAccelerating = AcceleratorDataHolder.instance.isCurrentGameAccelerating(game.id) - when { - isCurrentGameAccelerating -> {// 如果当前游戏正处于加速状态,则需要隐藏当前下载按钮 - binding.detailProgressbar.goneIf(true) - } + if (!showDualDownloadButton) { + when { + isCurrentGameAccelerating -> {// 如果当前游戏正处于加速状态,则需要隐藏当前下载按钮 + binding.detailProgressbar.goneIf(true) + } - binding.detailProgressbar.text == "更新" -> { // 游戏没有处于加速状态,如果 下载按钮为 “更新” 状态,则需要显示出来 - binding.detailProgressbar.goneIf(false) + binding.detailProgressbar.text == "更新" -> { // 游戏没有处于加速状态,如果 下载按钮为 “更新” 状态,则需要显示出来 + binding.detailProgressbar.setBackgroundResource(com.gh.gamecenter.common.R.drawable.bg_common_button_light_fill_blue) + binding.detailProgressbar.setTextColor(com.gh.gamecenter.common.R.color.text_theme.toColor(context)) + binding.detailProgressbar.goneIf(false) + } } } @@ -152,7 +158,8 @@ class GameDetailAcceleratorUiHelper(private val binding: DetailDownloadItemBindi } ?: R.string.network_acceleration.toResString() } - fun checkIfShowSpeedUi(show: Boolean) { + fun checkIfShowSpeedUi(show: Boolean, showDualDownloadButton: Boolean) { + this.showDualDownloadButton = showDualDownloadButton if (!isInit) { return } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt index 99b3daff7c..9c73f7d44f 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/GameDetailFragment.kt @@ -86,7 +86,8 @@ class GameDetailFragment : LazyFragment(), IScrollable { GameDetailCoverAdapter( requireContext(), this@GameDetailFragment, - viewModel + viewModel, + scrollCalculatorHelper ) { binding.coverSfv.isVisible = shouldShowCoverFilter && it } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt index 17102cb23d..313e5d68aa 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/detail/adapter/GameDetailCoverAdapter.kt @@ -23,6 +23,7 @@ import com.gh.gamecenter.databinding.ItemGameCoverVideoBinding import com.gh.gamecenter.gamedetail.GameDetailViewModel import com.gh.gamecenter.gamedetail.detail.GameDetailFragment import com.gh.gamecenter.gamedetail.entity.CoverEntity +import com.gh.gamecenter.gamedetail.video.GameDetailScrollCalculatorHelper import com.gh.gamecenter.gamedetail.video.TopVideoView import com.lightgame.adapter.BaseRecyclerAdapter import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder @@ -33,6 +34,7 @@ class GameDetailCoverAdapter( context: Context, private val fragment: GameDetailFragment, private val viewModel: GameDetailViewModel, + private val scrollCalculatorHelper: GameDetailScrollCalculatorHelper, private val showOrHideCoverFilter: ((Boolean) -> Unit) ) : BaseRecyclerAdapter(context) { @@ -108,6 +110,14 @@ class GameDetailCoverAdapter( .setAutoFullWithSize(true) .setDismissControlTime(5000) .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onClickStartIcon(url: String?, vararg objects: Any?) { + scrollCalculatorHelper.currentPlayer = holder.binding.player + } + + override fun onClickResume(url: String?, vararg objects: Any?) { + scrollCalculatorHelper.currentPlayer = holder.binding.player + } + override fun onQuitFullscreen(url: String?, vararg objects: Any) { orientationUtils.backToProtVideo() holder.binding.player.uploadVideoStreamingPlaying("退出全屏") @@ -117,6 +127,7 @@ class GameDetailCoverAdapter( holder.binding.player.viewModel = viewModel holder.binding.player.showOrHideCoverFilter = showOrHideCoverFilter + holder.binding.player.scrollCalculatorHelper = scrollCalculatorHelper holder.binding.player.video = topVideo holder.binding.player.updateThumb(topVideo.poster) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt index 2b43ba4a00..ffb45ae168 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingCommentItemViewHolder.kt @@ -30,7 +30,9 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.CustomLinkMovementMethod import com.gh.gamecenter.common.view.DrawableView -import com.gh.gamecenter.core.utils.* +import com.gh.gamecenter.core.utils.CenterImageSpan +import com.gh.gamecenter.core.utils.NumberUtils +import com.gh.gamecenter.core.utils.SpanBuilder import com.gh.gamecenter.databinding.RatingCommentItemBinding import com.gh.gamecenter.entity.RatingComment import com.gh.gamecenter.feature.entity.GameEntity @@ -249,7 +251,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding, val pat if (game.getApk().size > 0 && game.getApk()[0].version == commentData.gameVersion) { version.text = "当前版本" } else { - version.text = ("版本:" + commentData.gameVersion) + version.text = commentData.gameVersion } } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt index f48c813e93..828160ef82 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingDetailCommentItemViewHolder.kt @@ -7,6 +7,7 @@ import android.text.Spanned import android.text.TextPaint import android.text.method.LinkMovementMethod import android.text.style.ClickableSpan +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout @@ -15,6 +16,7 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat +import androidx.core.view.updateLayoutParams import com.gh.common.util.* import com.gh.common.util.NewFlatLogUtils import com.gh.common.util.NewLogUtils @@ -27,7 +29,8 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.common.utils.* import com.gh.gamecenter.common.view.DrawableView -import com.gh.gamecenter.core.utils.* +import com.gh.gamecenter.core.utils.NumberUtils +import com.gh.gamecenter.core.utils.SpanBuilder import com.gh.gamecenter.databinding.ItemArticleDetailCommentBinding import com.gh.gamecenter.entity.RatingComment import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity @@ -165,7 +168,36 @@ class RatingDetailCommentItemViewHolder(val binding: ItemArticleDetailCommentBin if (game != null && game.getApk().size > 0 && game.getApk()[0].version == commentData.gameVersion) { version.text = "当前版本" } else { - version.text = ("版本:" + commentData.gameVersion) + version.text = commentData.gameVersion + } + version.buttonDrawable = R.drawable.ic_version.toDrawable(context) + version.post { + ConstraintSet().apply { + clone(bottomContainer) + if ((version.layout?.lineCount ?: 1) > 1) { + version.gravity = Gravity.TOP + connect(version.id, ConstraintSet.START, device.id, ConstraintSet.START) + connect(version.id, ConstraintSet.TOP, device.id, ConstraintSet.BOTTOM, 6F.dip2px()) + connect(version.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 16F.dip2px()) + connect(device.id, ConstraintSet.BOTTOM, version.id, ConstraintSet.TOP) + connect(device.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 16F.dip2px()) + clear(device.id, ConstraintSet.END) + clear(likeCountTv.id, ConstraintSet.TOP) + connect(likeCountTv.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 4F.dip2px()) + bottomContainer.updateLayoutParams { height = ConstraintLayout.LayoutParams.WRAP_CONTENT } + } else { + version.gravity = Gravity.CENTER_VERTICAL + connect(version.id, ConstraintSet.START, device.id, ConstraintSet.END) + connect(version.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0) + connect(version.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0) + connect(device.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + connect(device.id, ConstraintSet.END, version.id, ConstraintSet.START) + connect(device.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0) + connect(likeCountTv.id, ConstraintSet.TOP, timeTv.id, ConstraintSet.TOP, 0) + connect(likeCountTv.id, ConstraintSet.BOTTOM, timeTv.id, ConstraintSet.BOTTOM, 0) + bottomContainer.updateLayoutParams { height = 48F.dip2px() } + } + }.applyTo(bottomContainer) } if (commentData.me.isCommented) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index 242b6ae965..9ec2815288 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -50,6 +50,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS private var mLastGetContentLengthTime = 0L var showOrHideCoverFilter: ((Boolean) -> Unit)? = null + var scrollCalculatorHelper: GameDetailScrollCalculatorHelper? = null init { post { @@ -256,6 +257,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS // 不需要弹弹窗,直接播放 override fun showWifiDialog() { + scrollCalculatorHelper?.currentPlayer = this startPlayLogic(false) //val trafficVideo = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.TRAFFIC_VIDEO_SP_KEY, false) //if (trafficVideo) { diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt index 4f5b16ce25..338baa0b1f 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultAdapter.kt @@ -527,7 +527,7 @@ class SearchGameResultAdapter( for (key in positionAndPackageMap.keys) { if (key.contains(download.packageName) && key.contains(download.gameId)) { val position = positionAndPackageMap[key] - if (position != null && getItemViewType(position) == ItemViewType.GAME_SUBJECT) { + if (position != null && position < itemCount && getItemViewType(position) == ItemViewType.GAME_SUBJECT) { val view = _recyclerView?.layoutManager?.findViewByPosition(position) val adapter = view?.findViewById(R.id.subjectRv)?.adapter if (adapter != null && adapter is SearchSubjectAdapter) { diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt index a02ed3b19a..a828e395ac 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameResultViewModel.kt @@ -97,9 +97,11 @@ class SearchGameResultViewModel( // 数据源来自于第三方的专题列表,包括 CPM 专题和 DSP 专题 val thirdPartySearchSubjectList = mutableListOf() - // 避免重复添加同一个 location 位置的专题 for (item in mutableList) { - if (!mSearchSubjects.any { it.location == item.location }) { + // 避免同一个位置重复的专题 + if (!mSearchSubjects.any { + it.location == item.location && it.columnId == item.columnId + }) { mSearchSubjects.add(item) } } diff --git a/app/src/main/res/drawable/ic_phone.xml b/app/src/main/res/drawable/ic_phone.xml new file mode 100644 index 0000000000..2489ee787c --- /dev/null +++ b/app/src/main/res/drawable/ic_phone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_version.xml b/app/src/main/res/drawable/ic_version.xml new file mode 100644 index 0000000000..96fe526557 --- /dev/null +++ b/app/src/main/res/drawable/ic_version.xml @@ -0,0 +1,19 @@ + + + + diff --git a/app/src/main/res/layout/item_article_detail_comment.xml b/app/src/main/res/layout/item_article_detail_comment.xml index ddc4efdac4..f5cb8f67c5 100644 --- a/app/src/main/res/layout/item_article_detail_comment.xml +++ b/app/src/main/res/layout/item_article_detail_comment.xml @@ -415,15 +415,16 @@ android:id="@+id/device" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:drawableLeft="@drawable/rating_phone_icon" - android:drawablePadding="4dp" + android:drawablePadding="2dp" android:ellipsize="end" android:gravity="center" + android:includeFontPadding="false" android:maxLines="1" - android:paddingRight="8dp" + android:paddingEnd="8dp" android:textColor="@color/text_tertiary" - android:textSize="10sp" + android:textSize="@dimen/tag_text_size" android:visibility="gone" + app:drawableStartCompat="@drawable/ic_phone" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/version" @@ -433,19 +434,27 @@ app:layout_constraintTop_toTopOf="parent" tools:text="小米2S" /> - + app:layout_goneMarginStart="8dp" + tools:text="版本号" /> + app:layout_goneMarginStart="16dp" + tools:text="版本号版本号版本号版本号版本号版本号版本号版本号" /> Unit)? = null) { checkLoginConfig?.checkLogin(this, entrance, action) } +fun Context.getActivity(): Activity? { + return when (this) { + is Activity -> this + is ContextWrapper -> this.baseContext.getActivity() + else -> null + } +} /** * Gson related extensions. diff --git a/module_common/src/main/res/layout/reuse_toolbar.xml b/module_common/src/main/res/layout/reuse_toolbar.xml index 187e83069c..520fd4bd4f 100644 --- a/module_common/src/main/res/layout/reuse_toolbar.xml +++ b/module_common/src/main/res/layout/reuse_toolbar.xml @@ -11,6 +11,7 @@ style="@style/Base_ToolbarStyle" android:layout_width="match_parent" android:layout_height="match_parent" + app:contentInsetStart="0dp" app:contentInsetEnd="0dp" app:contentInsetStartWithNavigation="0dp" app:navigationIcon="@null"> diff --git a/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java b/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java index cf7be197f1..0a01a0e0d6 100644 --- a/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java +++ b/module_login/src/main/java/com/gh/gamecenter/login/user/UserRepository.java @@ -662,7 +662,7 @@ public class UserRepository { String userInfo = mPreferences.getString(Constants.USER_INFO_KEY, null); if (!TextUtils.isEmpty(userInfo)) { UserInfoEntity infoEntity = GsonUtils.fromJson(userInfo, UserInfoEntity.class); - setAcceleratorToken(infoEntity.getUserId(), null); + setAcceleratorToken(infoEntity.getUserId(), () -> null); } }