diff --git a/app/src/main/java/com/gh/common/repository/ReservationRepository.kt b/app/src/main/java/com/gh/common/repository/ReservationRepository.kt index 8f13131e91..a1dacd25e4 100644 --- a/app/src/main/java/com/gh/common/repository/ReservationRepository.kt +++ b/app/src/main/java/com/gh/common/repository/ReservationRepository.kt @@ -28,6 +28,12 @@ object ReservationRepository { mReservationSet.add(gameId) } + @JvmStatic + fun removeReservationLocallyThenRefresh(gamedId: String) { + mReservationSet.remove(gamedId) + refreshReservations() + } + @SuppressLint("CheckResult") @JvmStatic fun refreshReservations() { diff --git a/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt b/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt index e848654728..63b3652220 100644 --- a/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt @@ -24,28 +24,64 @@ object DownloadDialogHelper { if (gameEntity.downloadDialog.isNullOrEmpty()) return null for (dialog in gameEntity.downloadDialog!!) { - // 不指定包名和机型 - if (dialog.rule.packageName.isEmpty() || dialog.rule.models.isEmpty()) { + + // 共有 8 种可能 + // 1. 不指定包名、机型和系统版本 + if (dialog.rule.packageName.isEmpty() + || dialog.rule.models.isEmpty() + || dialog.rule.systemVersions.isEmpty()) { return dialog } - // 指定包名不管机型 + // 2. 指定包名不管机型和系统 if (dialog.rule.packageName == apkEntity.packageName + && dialog.rule.models.isEmpty() + && dialog.rule.systemVersions.isEmpty()) { + return dialog + } + + // 3. 指定机型不管包名和系统 + if (dialog.rule.models.contains(Build.DEVICE) + && dialog.rule.packageName.isEmpty() + && dialog.rule.systemVersions.isEmpty()) { + return dialog + } + + // 4. 指定系统不管包名和机型 + if (dialog.rule.systemVersions.contains(Build.VERSION.RELEASE) + && dialog.rule.packageName.isEmpty() && dialog.rule.models.isEmpty()) { return dialog } - // 不指定机型不管包名 - if (dialog.rule.packageName.isEmpty() - && dialog.rule.models.contains(Build.DEVICE)) { + // 5. 指定包名和机型不管系统 + if (dialog.rule.packageName == apkEntity.packageName + && dialog.rule.models.contains(Build.DEVICE) + && dialog.rule.systemVersions.isEmpty()) { return dialog } - // 指定包名和机型 + // 6. 指定包名和系统不管机型 if (dialog.rule.packageName == apkEntity.packageName - && dialog.rule.models.contains(Build.DEVICE)) { + && dialog.rule.systemVersions.contains(Build.VERSION.RELEASE) + && dialog.rule.models.isEmpty()) { return dialog } + + // 7. 指定机型和系统不管包名 + if (dialog.rule.systemVersions.contains(Build.VERSION.RELEASE) + && dialog.rule.models.contains(Build.DEVICE) + && dialog.rule.packageName.isEmpty()) { + return dialog + } + + // 8.指定包名、机型和系统版本 + if (dialog.rule.packageName == apkEntity.packageName + && dialog.rule.models.contains(Build.DEVICE) + && dialog.rule.systemVersions.contains(Build.VERSION.RELEASE)) { + return dialog + } + } return null diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 860f597a96..ae447926f2 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -27,7 +27,6 @@ import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.PluginLocation; import com.gh.gamecenter.manager.PackagesManager; -import com.gh.gamecenter.mygame.MyGameActivity; import com.lightgame.download.DownloadConfig; import com.lightgame.download.DownloadEntity; import com.lightgame.download.DownloadStatus; @@ -370,9 +369,18 @@ public class DownloadItemUtils { }); } else { downloadBtn.setOnClickListener(v -> { - context.startActivity(MyGameActivity.getIntentWithConfig(context, 2)); - if (clickCallback != null) { - clickCallback.onCallback(); + if ("download".equals(gameEntity.getReserveStatus())) { + ReservationHelper.showDeleteReservationDialog(context, () -> { + ReservationHelper.deleteReservation(gameEntity, () -> { + adapter.notifyItemChanged(position); + }); + }); + } else { + ReservationHelper.showCancelReservationDialog(context, () -> { + ReservationHelper.cancelReservation(gameEntity, () -> { + adapter.notifyItemChanged(position); + }); + }); } }); } diff --git a/app/src/main/java/com/gh/common/util/ReservationHelper.kt b/app/src/main/java/com/gh/common/util/ReservationHelper.kt new file mode 100644 index 0000000000..acad11d1f2 --- /dev/null +++ b/app/src/main/java/com/gh/common/util/ReservationHelper.kt @@ -0,0 +1,93 @@ +package com.gh.common.util + +import android.annotation.SuppressLint +import android.content.Context +import com.gh.common.repository.ReservationRepository +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import com.tencent.bugly.beta.tinker.TinkerManager.getApplication +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import okhttp3.ResponseBody + +object ReservationHelper { + + @JvmStatic + fun deleteReservation(game: GameEntity, refreshCallback: EmptyCallback) { + deleteOrCancelReservation(game, true, refreshCallback) + } + + @JvmStatic + fun cancelReservation(game: GameEntity, refreshCallback: EmptyCallback) { + deleteOrCancelReservation(game, false, refreshCallback) + } + + @SuppressLint("CheckResult") + private fun deleteOrCancelReservation(game: GameEntity, deleteReservation: Boolean, refreshCallback: EmptyCallback) { + val retrofit = RetrofitManager.getInstance(HaloApp.getInstance().application) + val requestMap = hashMapOf() + requestMap["game_id"] = game.id + + val single = if (deleteReservation) { + retrofit.api + .deleteGameReservation(requestMap.createRequestBody()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } else { + retrofit.api + .cancelGameReservation(requestMap.createRequestBody()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + } + + single.subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + ReservationRepository.removeReservationLocallyThenRefresh(game.id) + + if (deleteReservation) { + MtaHelper.onEvent("预约游戏", "取消预约", game.name) + } else { + MtaHelper.onEvent("预约游戏", "删除预约", game.name) + } + + refreshCallback.onCallback() + } + + override fun onFailure(exception: Exception) { + Utils.toast(getApplication(), exception.message) + exception.printStackTrace() + } + }) + } + + @JvmStatic + fun showDeleteReservationDialog(context: Context, emptyCallback: EmptyCallback) { + DialogUtils.showAlertDialog( + context, + "删除预约", + "游戏已上线,你可以删除此预约记录,确定删除吗?", + "确定", + "取消", + { + emptyCallback.onCallback() + }, null) + } + + @JvmStatic + fun showCancelReservationDialog(context: Context, emptyCallback: EmptyCallback) { + DialogUtils.showAlertDialog( + context, + "取消预约", + "取消之后你将无法收到游戏上线的通知,确定取消预约吗?", + "确定取消", + "暂不取消", + { + emptyCallback.onCallback() + }, null) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java index 1a0859cbc9..8e82736acb 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java @@ -20,6 +20,7 @@ import com.gh.common.util.DownloadDialogHelper; import com.gh.common.util.MtaHelper; import com.gh.common.util.PackageUtils; import com.gh.common.util.PermissionHelper; +import com.gh.common.util.ReservationHelper; import com.gh.common.util.StringUtils; import com.gh.common.view.DownloadDialog; import com.gh.common.view.DownloadProgressBar; @@ -28,7 +29,6 @@ import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; -import com.gh.gamecenter.mygame.MyGameActivity; import com.lightgame.download.DownloadEntity; import com.lightgame.download.FileUtils; import com.lightgame.utils.Utils; @@ -196,7 +196,19 @@ public class DetailViewHolder { }); break; case RESERVED: - v.getContext().startActivity(MyGameActivity.getIntentWithConfig(v.getContext(), 2)); + if ("download".equals(mGameEntity.getReserveStatus())) { + ReservationHelper.showDeleteReservationDialog(mViewHolder.context, () -> { + ReservationHelper.deleteReservation(mGameEntity, () -> { + DetailDownloadUtils.detailInitDownload(mViewHolder, false); + }); + }); + } else { + ReservationHelper.showCancelReservationDialog(mViewHolder.context, () -> { + ReservationHelper.cancelReservation(mGameEntity, () -> { + DetailDownloadUtils.detailInitDownload(mViewHolder, false); + }); + }); + } break; } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index 092bb50174..d14386bc77 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -248,7 +248,9 @@ data class GameEntity( data class Rule( @SerializedName("package") var packageName: String = "", - var models: ArrayList = arrayListOf()) : Parcelable + var models: ArrayList = arrayListOf(), + @SerializedName("system_versions") + var systemVersions: ArrayList = arrayListOf()) : Parcelable } companion object { diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index 9a5c2edb2b..3540d1bd0a 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -426,8 +426,10 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: val layoutParams = holder.mPluginHead.layoutParams as LinearLayout.LayoutParams if (mIsOpenPluginList) { + holder.mHeadOpen.setImageResource(R.drawable.gamedetail_colse_icon) layoutParams.setMargins(0, DisplayUtils.dip2px(4F), 0, 0) } else { + holder.mHeadOpen.setImageResource(R.drawable.gamedetail_open_icon) layoutParams.setMargins(0, DisplayUtils.dip2px(4F), 0, DisplayUtils.dip2px(4F)) } @@ -446,11 +448,9 @@ class GameFragmentAdapter(context: Context, model: GameViewModel, var blockName: holder.mPluginHead.setOnClickListener { if (mIsOpenPluginList) { mIsOpenPluginList = false - holder.mHeadOpen.setImageResource(R.drawable.gamedetail_open_icon) MtaHelper.onEvent("首页_点击", "插件化区域", "收起") } else { mIsOpenPluginList = true - holder.mHeadOpen.setImageResource(R.drawable.gamedetail_colse_icon) MtaHelper.onEvent("首页_点击", "插件化区域", "展开") } notifyItemChanged(holder.adapterPosition) diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt index 2d103f7b89..586a5af06c 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt @@ -1,12 +1,12 @@ package com.gh.gamecenter.mygame import android.content.Context -import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType -import com.gh.common.util.DialogUtils import com.gh.common.util.DownloadItemUtils +import com.gh.common.util.EmptyCallback +import com.gh.common.util.ReservationHelper import com.gh.gamecenter.GameDetailActivity import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder @@ -78,27 +78,19 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo } private fun showDeleteReservationDialog(game: GameEntity) { - DialogUtils.showAlertDialog( - mContext, - "删除预约", - "游戏已上线,你可以删除此预约记录,确定删除吗?", - "确定", - "取消", - { - mViewModel.deleteReservation(game) - }, null) + ReservationHelper.showDeleteReservationDialog(mContext, object : EmptyCallback { + override fun onCallback() { + mViewModel.deleteReservation(game) + } + }) } private fun showCancelReservationDialog(game: GameEntity) { - DialogUtils.showAlertDialog( - mContext, - "取消预约", - "取消之后你将无法收到游戏上线的通知,确定取消预约吗?", - "确定取消", - "暂不取消", - { - mViewModel.cancelReservation(game) - }, null) + ReservationHelper.showCancelReservationDialog(mContext, object : EmptyCallback { + override fun onCallback() { + mViewModel.cancelReservation(game) + } + }) } } \ No newline at end of file diff --git a/app/src/main/res/layout/item_filter_size.xml b/app/src/main/res/layout/item_filter_size.xml index 5eb4d27ea4..a65ea1370e 100644 --- a/app/src/main/res/layout/item_filter_size.xml +++ b/app/src/main/res/layout/item_filter_size.xml @@ -1,12 +1,9 @@ + android:background="@color/all_white"> + android:textSize="12sp" /> \ No newline at end of file