diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index 8aa635e271..1aebc3facb 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -46,6 +46,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; + import kotlin.Unit; import kotlin.jvm.functions.Function0; @@ -66,6 +67,7 @@ import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder; import com.gh.gamecenter.databinding.DialogBindPhoneBinding; import com.gh.gamecenter.databinding.DialogOverseaConfirmationBinding; import com.gh.gamecenter.databinding.DialogPackageParseErrorBinding; +import com.gh.gamecenter.databinding.DialogReceiveLibaoSuccessBinding; import com.gh.gamecenter.databinding.DialogReportReasonBinding; import com.gh.gamecenter.databinding.ImprintContentItemBinding; import com.gh.gamecenter.databinding.PrivacyItemBinding; @@ -1083,7 +1085,7 @@ public class DialogUtils { topContent.setText(entity.getTopContent()); bottomContent.setText(ExtensionsKt.fromHtml(entity.getBottomContent())); bottomContent.setMovementMethod(CustomLinkMovementMethod.getInstance()); - + // Remove underline Spannable sa = (Spannable) bottomContent.getText(); for (URLSpan u : sa.getSpans(0, sa.length(), URLSpan.class)) { @@ -2168,6 +2170,36 @@ public class DialogUtils { dialog.show(); } + public static void showReceiveLibaoSuccessDialog(Context context, String title, String des, String libaoCode, ConfirmListener listener) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + DialogReceiveLibaoSuccessBinding binding = DialogReceiveLibaoSuccessBinding.inflate(LayoutInflater.from(context)); + binding.title.setText(title); + binding.libaoCodeTv.setText(libaoCode); + binding.desTv.setText(des); + + binding.confirm.setOnClickListener(v -> { + dialog.dismiss(); + listener.onConfirm(); + }); + + binding.cancel.setOnClickListener(v -> { + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(binding.getRoot()); + dialog.show(); + Window window = dialog.getWindow(); + if (window != null) { + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(60f); + window.setAttributes(params); + } + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index a7db28e296..b05337b0f4 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -230,6 +230,7 @@ public class EntranceUtils { public static final String KEY_IS_CATEGORY_V2 = "is_category_v2"; public static final String KEY_SUB_CATEGORY_ID = "sub_category_id"; public static final String KEY_IS_QA_FEEDBACK = "is_qa_feedback"; + public static final String KEY_IS_CLICK_RECEIVE_BTN = "is_click_receive_btn"; public static void jumpActivity(Context context, Bundle bundle) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); diff --git a/app/src/main/java/com/gh/common/util/LibaoUtils.java b/app/src/main/java/com/gh/common/util/LibaoUtils.java index fd438070a6..988f3609de 100644 --- a/app/src/main/java/com/gh/common/util/LibaoUtils.java +++ b/app/src/main/java/com/gh/common/util/LibaoUtils.java @@ -28,14 +28,17 @@ import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; +import com.halo.assistant.HaloApp; import com.lightgame.utils.Utils; import org.greenrobot.eventbus.EventBus; import org.json.JSONException; import org.json.JSONObject; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -151,9 +154,10 @@ public class LibaoUtils { }); } - public static void setLiBaoBtnStatusRound(final TextView libaoBtn, String status, Context context) { + public static void setLiBaoBtnStatusRound(final TextView libaoBtn, LibaoEntity libaoEntity, boolean shouldUpdateStatus, Context context) { + String status = shouldUpdateStatus ? updateStatus(libaoEntity) : libaoEntity.getStatus(); libaoBtn.setTextColor(Color.WHITE); - if (TextUtils.isEmpty(status)) return; + if (status == null || TextUtils.isEmpty(status)) return; switch (status) { case "ling": libaoBtn.setText(R.string.libao_ling); @@ -193,22 +197,16 @@ public class LibaoUtils { libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style); break; case "repeatLing": - libaoBtn.setText(R.string.libao_repeat_ling); - libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border); - libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font)); - break; case "repeatLinged": libaoBtn.setText(R.string.libao_repeat_ling); - libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style); - break; - case "repeatTao": - libaoBtn.setText(R.string.libao_repeat_tao); libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border); libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font)); break; + case "repeatTao": case "repeatTaoed": libaoBtn.setText(R.string.libao_repeat_tao); - libaoBtn.setBackgroundResource(R.drawable.button_normal_round_style); + libaoBtn.setBackgroundResource(R.drawable.button_normal_round_border); + libaoBtn.setTextColor(context.getResources().getColor(R.color.theme_font)); break; case "unshelve": libaoBtn.setBackgroundResource(R.drawable.button_border_round_gray); @@ -227,10 +225,73 @@ public class LibaoUtils { } } - public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, - final boolean isInstallRequired, final LibaoDetailAdapter adapter, final String entrance) { + public static String updateStatus(LibaoEntity libaoEntity) { String status = libaoEntity.getStatus(); - setLiBaoBtnStatusRound(libaoBtn, status, context); + String beforeStatus = libaoEntity.getBeforeStatus(); + if (libaoEntity.getRepeat() > 0 && libaoEntity.getMe() != null + && libaoEntity.getMe().getUserDataLibaoList() != null) { + + MeEntity userData = libaoEntity.getMe(); + List userDataLibaoList = userData.getUserDataLibaoList(); + + int repeat = libaoEntity.getRepeat(); + int curStatusCount = 0; // 当前状态的领取/淘号数量 + + for (UserDataLibaoEntity userDataLibaoEntity : userDataLibaoList) { + if (beforeStatus != null && beforeStatus.equals(userDataLibaoEntity.getType())) { + curStatusCount++; + } + } + + // 由领取到淘号的状态转换 + if (repeat <= curStatusCount || curStatusCount == 0) { // 当前领取/淘号总数是否超过总重复领取次数 / 当前状态的礼包没有领取/淘号过 + if (curStatusCount == 0 && ("ling".equals(beforeStatus) || "tao".equals(beforeStatus))) { + if (isCanLing(libaoEntity)) { // 恢复原始状态 + return beforeStatus; + } + } + return status; + } + + if ((("linged").equals(status) || ("taoed").equals(status)) && + ("ling".equals(beforeStatus) || "tao".equals(beforeStatus))) { //检查是否到了重复领取时间 + if (isCanLing(libaoEntity)) { + if ("ling".equals(beforeStatus)) { + return "repeatLinged"; // 可以重复领取 + } else { + return "repeatTaoed"; // 可以重复领取 + } + } else { + if ("ling".equals(beforeStatus)) { + return "repeatLing"; // 预备重复领取 + } else { + return "repeatTao"; // 预备重复领取 + } + } + } + } + return status; + } + + public static boolean isCanLing(LibaoEntity libaoEntity) { + List userDataLibaoList = libaoEntity.getMe().getUserDataLibaoList(); + UserDataLibaoEntity userDataLibaoEntity = userDataLibaoList.get(userDataLibaoList.size() - 1); + SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA); + long lingTime = userDataLibaoEntity.getTime() * 1000; + long curTime = Utils.getTime(HaloApp.getInstance()) * 1000; + int lingDay = Integer.parseInt(formatDay.format(lingTime)); + int curDay = Integer.parseInt(formatDay.format(curTime)); + if (curDay != lingDay || curTime - lingTime > 24 * 60 * 60 * 1000) { + return true; + } else { + return false; + } + } + + public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, + final boolean isInstallRequired, final LibaoDetailAdapter adapter, boolean shouldUpdateStatus, final String entrance) { + String status = libaoEntity.getStatus(); + setLiBaoBtnStatusRound(libaoBtn, libaoEntity, shouldUpdateStatus, context); libaoBtn.setOnClickListener(v -> { String btnStatus = libaoBtn.getText().toString(); @@ -280,7 +341,7 @@ public class LibaoUtils { Html.fromHtml(libaoEntity.getDes()), "关闭", null, null, null); } break; - case "再领一个": + case "再领": case "领取": if ("repeatLing".equals(status)) { DialogUtils.showWarningDialog(context, "礼包刷新提醒" @@ -290,7 +351,7 @@ public class LibaoUtils { libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance); } break; - case "再淘一个": + case "再淘": case "淘号": if ("repeatTao".equals(status)) { Utils.toast(context, "没到重复淘号时间, 礼包每天0点刷新"); @@ -305,7 +366,9 @@ public class LibaoUtils { JSONObject responseBody = (JSONObject) response; String libaoCode = null; + boolean hasSame = false; try { + hasSame = responseBody.getBoolean("has_same"); libaoCode = responseBody.getString("code"); } catch (JSONException e) { e.printStackTrace(); @@ -330,31 +393,35 @@ public class LibaoUtils { } return; } - Utils.toast(context, "淘号成功"); - libaoEntity.setStatus("taoed"); - EventBus.getDefault().post(new EBReuse("libaoChanged")); - adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context))); - final String finalLibaoCode = libaoCode; + String des; + if (!hasSame) { + des = "淘到的礼包码不保证可以兑换,请尽快前往游戏兑换"; + } else { + des = "您已领取过相同的礼包,可能无法成功兑换,请自行尝试"; + } + DialogUtils.showReceiveLibaoSuccessDialog(context, "淘号成功", des, finalLibaoCode, () -> { + copyLink(finalLibaoCode, context); + if (isInstallRequired) { + libaoBtn.postDelayed(() -> { + Spanned msg = Html.fromHtml( + context.getString(R.string.taoed_copy_dialog + , finalLibaoCode)); + lunningAppDialog(context + , msg, libaoEntity); + }, 300); + } + }); DialogUtils.showWarningDialog(context, "淘号成功" , Html.fromHtml(context.getString(R.string.taoed_dialog, libaoCode)) , "关闭", " 复制礼包码" , () -> { - copyLink(finalLibaoCode, context); - if (isInstallRequired) { - libaoBtn.postDelayed(() -> { - Spanned msg = Html.fromHtml( - context.getString(R.string.taoed_copy_dialog - , finalLibaoCode)); - lunningAppDialog(context - , msg, libaoEntity); - }, 300); - } + }, null); } @@ -435,9 +502,13 @@ public class LibaoUtils { if (loadingDialog != null) loadingDialog.dismiss(); JSONObject responseBody = (JSONObject) response; + boolean hasSame = false; //是否领取过相同的礼包 String libaoCode = null; + int gameApkSize = 1;//游戏apk的size,大于1为“多版本插件游戏”,否则为“非插件游戏/单版本插件游戏” try { + hasSame = responseBody.getBoolean("has_same"); libaoCode = responseBody.getString("code"); + gameApkSize = responseBody.getInt("game_apk_size"); } catch (JSONException e) { e.printStackTrace(); } @@ -455,25 +526,33 @@ public class LibaoUtils { adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "ling", Utils.getTime(context))); adapter.notifyDataSetChanged(); final String finalLibaoCode = libaoCode; + boolean finalHasSame = hasSame; + int finalGameApkSize = gameApkSize; NotificationHelper.showNotificationHintDialog(NotificationUgc.GIFT, isShow -> { if (!isShow) { - DialogUtils.showWarningDialog(context, "领取成功", Html.fromHtml(context.getString(R.string.linged_dialog, finalLibaoCode)) - , "关闭", " 复制礼包码" - , () -> { - copyLink(finalLibaoCode, context); - if (isInstallRequired) { - libaoBtn.postDelayed(() -> { - Spanned msg = Html.fromHtml(context.getString(R.string.linged_copy_dialog, finalLibaoCode)); - lunningAppDialog(context - , msg, libaoEntity); - }, 300); - } - }, null); + String des; + if (!finalHasSame) { + if (finalGameApkSize > 1) { + des = "礼包码将于60分钟后进入淘号池,部分礼包兑换有平台限制,请根据使用说明兑换"; + } else { + des = "礼包码将于60分钟后进入淘号池,请尽快前往游戏兑换"; + } + } else { + des = "您已领取过相同的礼包,可能无法成功兑换,请自行尝试"; + } + DialogUtils.showReceiveLibaoSuccessDialog(context, "领取成功", des, finalLibaoCode, () -> { + copyLink(finalLibaoCode, context); + if (isInstallRequired) { + libaoBtn.postDelayed(() -> { + Spanned msg = Html.fromHtml(context.getString(R.string.linged_copy_dialog, finalLibaoCode)); + lunningAppDialog(context + , msg, libaoEntity); + }, 300); + } + }); } return null; }); - - } @Override @@ -516,7 +595,7 @@ public class LibaoUtils { DialogUtils.showHintDialog(context, "礼包已领光" , "手速不够快,礼包已经被抢光了,十分抱歉", "知道了"); libaoEntity.setStatus("used_up"); - initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, entrance); + initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, false, entrance); break; case "maintaining": Utils.toast(context, "网络状态异常,请稍后再试"); diff --git a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java index ca675ce27f..a60664440d 100644 --- a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java @@ -21,6 +21,7 @@ import com.gh.base.OnRequestCallBackListener; import com.gh.base.ToolBarActivity; import com.gh.common.filter.RegionSettingHelper; import com.gh.common.util.ApkActiveUtils; +import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DetailDownloadUtils; import com.gh.common.util.DeviceTokenUtils; import com.gh.common.util.EntranceUtils; @@ -101,6 +102,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA private String mListStatus; // 记录列表领取状态(防止状态在详情改变导致列表状态改变) private String mName; private String mTitle; + private boolean isClickReceiveBtnIn = false;//是否点击领取按钮进入 @Override protected void handleMessage(Message msg) { @@ -129,6 +131,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mLibaoEntity.setStatus("repeatTaoed"); // 可以重复领取 } mAdapter.notifyItemChanged(0); + performClickReceiveBtn(); } } @@ -155,14 +158,19 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA false, mEntrance, mName, mTitle, null); // 下载按钮ViewHolder } - @NonNull - public static Intent getIntent(Context context, LibaoEntity libaoEntity, String entrance) { + public static Intent getIntent(Context context, LibaoEntity libaoEntity, boolean isClickReceiveBtnIn, String entrance) { Intent intent = new Intent(context, LibaoDetailActivity.class); HaloApp.put(LibaoEntity.TAG, libaoEntity); intent.putExtra(EntranceUtils.KEY_ENTRANCE, entrance); + intent.putExtra(EntranceUtils.KEY_IS_CLICK_RECEIVE_BTN, isClickReceiveBtnIn); return intent; } + @NonNull + public static Intent getIntent(Context context, LibaoEntity libaoEntity, String entrance) { + return getIntent(context, libaoEntity, false, entrance); + } + @NonNull public static Intent getIntentById(Context context, String id, String entrance) { Intent intent = new Intent(context, LibaoDetailActivity.class); @@ -183,6 +191,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mName = getString(R.string.libao_detail); setNavigationTitle(mName); mLibaoEntity = (LibaoEntity) HaloApp.get(LibaoEntity.TAG, false); + isClickReceiveBtnIn = getIntent().getBooleanExtra(EntranceUtils.KEY_IS_CLICK_RECEIVE_BTN, false); mIsScroll = true; @@ -270,6 +279,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA if (isCanLing()) { // 恢复原始状态 mLibaoEntity.setStatus(beforeStatus); mAdapter.notifyItemChanged(0); + performClickReceiveBtn(); } } return; @@ -288,11 +298,24 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mLibaoEntity.setStatus("repeatTao"); // 预备重复领取 } mAdapter.notifyItemChanged(0); + performClickReceiveBtn(); DeviceTokenUtils.syncServerTime(LibaoDetailActivity.this); mBaseHandler.sendEmptyMessageDelayed(0, 5000); } } + } else { + performClickReceiveBtn(); + } + } + + private void performClickReceiveBtn() { + if (isClickReceiveBtnIn) { + CheckLoginUtils.checkLogin(this, mEntrance, () -> + mLibaoDetailRv.postDelayed(() -> { + mAdapter.libaoDetailTopViewHolder.libaoCopyBtn.performClick(); + }, 1000) + ); } } @@ -358,13 +381,10 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA // 获取游戏摘要 private void getGameDigest() { if (mLibaoEntity.getGame() == null) return; - String gameId = mLibaoEntity.getGame().getId(); - if (RegionSettingHelper.shouldThisGameBeFiltered(gameId)) { return; } - RetrofitManager.getInstance(this).getSensitiveApi().getGameNewsDigest(gameId) .map(ApkActiveUtils.filterMapper) .subscribeOn(Schedulers.io()) @@ -378,7 +398,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) - && ExtensionsKt.countOccurrences(mEntrance,("+")) <= 1) { + && ExtensionsKt.countOccurrences(mEntrance, ("+")) <= 1) { mGameEntity.setWelcomeDialogInfoIfAvailable(); } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java index 2552bd9e14..7e0f28aaf5 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -62,6 +62,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { private String mEntrance; private final int TYPE_FOOTER = 100; + public LibaoDetailTopViewHolder libaoDetailTopViewHolder; public LibaoDetailAdapter(Context context, OnRequestCallBackListener onRequestCallBackListener, OnCodeScrollListener onCodeScrollListener, LibaoEntity libaoEntity, @@ -120,7 +121,8 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { switch (viewType) { case 0: view = mLayoutInflater.inflate(R.layout.libaodetail_item_top, parent, false); - return new LibaoDetailTopViewHolder(view); + libaoDetailTopViewHolder = new LibaoDetailTopViewHolder(view); + return libaoDetailTopViewHolder; case TYPE_FOOTER: view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); return new FooterViewHolder(view); @@ -220,11 +222,17 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { && mLibaoEntity.getMe().getUserDataLibaoList().size() > 0) { List userDataLibaoList = mLibaoEntity.getMe().getUserDataLibaoList(); LibaoUtils.initLibaoBtn(mContext, holder.libaoCopyBtn, mLibaoEntity, - mLibaoDetailEntity.getInstallRequired(), this, + mLibaoDetailEntity.getInstallRequired(), this, false, StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])")); - holder.libaoDes.setText(content); + if (mLibaoEntity.getUniversal()) { + holder.libaoDes.setVisibility(View.GONE); + } else { + holder.libaoDes.setVisibility(View.VISIBLE); + holder.libaoDes.setText(content); + } holder.libaoCodeRv.setVisibility(View.VISIBLE); + holder.line.setVisibility(View.VISIBLE); holder.libaoCodeRv.setAdapter(new LiBaoCodeAdapter(mContext, userDataLibaoList)); ViewGroup.LayoutParams params = holder.libaoCodeRv.getLayoutParams(); if (userDataLibaoList.size() <= LIBAO_MAX_LINES) { @@ -245,11 +253,16 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { return; } - holder.libaoDes.setText(content); + if (mLibaoEntity.getUniversal()) { + holder.libaoDes.setVisibility(View.GONE); + } else { + holder.libaoDes.setVisibility(View.VISIBLE); + holder.libaoDes.setText(content); + } if (mLibaoEntity.getStatus() != null && mLibaoDetailEntity != null) { LibaoUtils.initLibaoBtn(mContext, holder.libaoCopyBtn, mLibaoEntity, - mLibaoDetailEntity.getInstallRequired(), this, + mLibaoDetailEntity.getInstallRequired(), this, false, StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])")); } diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoDetailTopViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoDetailTopViewHolder.java index 2fab473bbb..7e02ccc42d 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoDetailTopViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoDetailTopViewHolder.java @@ -28,6 +28,8 @@ public class LibaoDetailTopViewHolder extends BaseRecyclerViewHolder { public GameIconView libaoGameIcon; @BindView(R.id.libaodetail_libaocode_rv) public RecyclerView libaoCodeRv; + @BindView(R.id.line) + public View line; public LibaoDetailTopViewHolder(View itemView) { super(itemView); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoNormalViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoNormalViewHolder.java index 19ab339a69..c94bd33011 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoNormalViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/LibaoNormalViewHolder.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.adapter.viewholder; import android.view.View; +import android.widget.ImageView; import android.widget.TextView; import com.gh.base.BaseRecyclerViewHolder; @@ -26,6 +27,10 @@ public class LibaoNormalViewHolder extends BaseRecyclerViewHolder { public TextView libaoBtnStatus; @BindView(R.id.libao_game_icon) public GameIconView libaoGameIcon; + @BindView(R.id.expiresTime) + public TextView expiresTime; + @BindView(R.id.moreIv) + public ImageView moreIv; public LibaoNormalViewHolder(View itemView) { super(itemView); diff --git a/app/src/main/java/com/gh/gamecenter/entity/LibaoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/LibaoEntity.kt index 8420385dbc..5edd4da9f6 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/LibaoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/LibaoEntity.kt @@ -30,7 +30,10 @@ data class LibaoEntity( var time: Long = 0, var repeat: Int = 0, // 剩余可领取数量 @SerializedName("me") - var me: MeEntity? = null) : Parcelable { + var me: MeEntity? = null, + var universal: Boolean = false,//是否是通用码,true/false + var expires: Int = 0//过期时间 +) : Parcelable { fun getIcon(): String { return if (game != null) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index 091763ba29..e0e40d60c6 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -362,6 +362,7 @@ class GameDetailViewModel(application: Application, newGameDetailEntity.detailEntity.forEach { if (it.type == "libao") { it.libao = libaoList as ArrayList + sortLibaoList(it.libao) } } unifiedGameDetailWithUserRelatedInfoForChildLiveData.postValue(newGameDetailEntity) @@ -374,6 +375,23 @@ class GameDetailViewModel(application: Application, }) } + //[已领取/已淘号/再领/再淘]的礼包置底显示 + fun sortLibaoList(libaoList: ArrayList?) { + if (UserManager.getInstance().isLoggedIn && !libaoList.isNullOrEmpty()) { + val tempList = arrayListOf() + val iterator = libaoList.iterator() + while (iterator.hasNext()) { + val entity = iterator.next() + if (entity.status == "linged" || entity.status == "taoed" || + entity.status == "repeatLinged" || entity.status == "repeatTao") { + tempList.add(entity) + iterator.remove() + } + } + libaoList.addAll(tempList) + } + } + fun concernCommand(isConcern: Boolean) { val listener = object : ConcernUtils.onConcernListener { override fun onSuccess() { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt index 1cf6c6d226..173101798b 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescAdapter.kt @@ -555,7 +555,8 @@ class DescAdapter(context: Context, viewHolder.binding.galleryRv.apply { background = ContextCompat.getDrawable(mContext, R.drawable.background_shape_white_radius_5) layoutManager = LinearLayoutManager(mContext) - val libaoAdapter = GameLibaoAdapter(mContext, libao!!, gameName ?: "", mListListener) + val libaoAdapter = if (adapter == null) GameLibaoAdapter(mContext, libao!!, gameName + ?: "", mListListener) else adapter adapter = libaoAdapter if (itemDecorationCount == 0) { val itemDecoration = HorizontalDividerItemDecoration.Builder(mContext) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescFragment.kt index 8d3234aa2c..44fbc5ac1d 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescFragment.kt @@ -24,6 +24,7 @@ import com.gh.gamecenter.gamedetail.GameDetailFragment import com.gh.gamecenter.gamedetail.GameDetailFragment.Companion.OPEN_APPBAR import com.gh.gamecenter.gamedetail.GameDetailFragment.Companion.SKIP_DESC import com.gh.gamecenter.gamedetail.GameDetailViewModel +import com.gh.gamecenter.gamedetail.entity.DetailEntity import com.gh.gamecenter.gamedetail.entity.NewGameDetailEntity import com.gh.gamecenter.video.detail.VideoDetailActivity import com.halo.assistant.HaloApp @@ -78,7 +79,8 @@ class DescFragment : BaseFragment(), IScrollable { } }) } else if (requestCode == 100) { - mAdapter.notifyDataSetChanged() + val position = mAdapter.descItemList.indexOfFirst { it.type == DetailEntity.Type.LIBAO.value } + mAdapter.notifyItemChanged(position) } } } @@ -160,7 +162,7 @@ class DescFragment : BaseFragment(), IScrollable { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) - if(newState == RecyclerView.SCROLL_STATE_DRAGGING){ + if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { EventBus.getDefault().post(EBTypeChange(GameDetailFragment.EB_SCROLLING, 0)) } } @@ -192,7 +194,7 @@ class DescFragment : BaseFragment(), IScrollable { if (liBao.status == "ling") { MtaHelper.onEvent("游戏详情_新", "游戏礼包[领取]", "${mViewModel.game?.name}+${liBao.name}") } - val intent = LibaoDetailActivity.getIntent(context, liBao, "$mEntrance[$position]") + val intent = LibaoDetailActivity.getIntent(context, liBao, true, "$mEntrance[$position]") startActivityForResult(intent, 100) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt index 63794aa5b8..bb51005d21 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameLibaoAdapter.kt @@ -7,65 +7,111 @@ import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.gh.base.OnListClickListener -import com.gh.common.util.LibaoUtils -import com.gh.common.util.MtaHelper -import com.gh.common.util.fromHtml +import com.gh.common.util.* import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.ItemGameDetailMoreBinding import com.gh.gamecenter.databinding.ItemGameLibaoBinding import com.gh.gamecenter.entity.LibaoEntity +import com.gh.gamecenter.manager.UserManager import java.util.* class GameLibaoAdapter(val context: Context, val libaos: ArrayList, val gameName: String, val listListener: OnListClickListener?) : RecyclerView.Adapter() { - var isExpand = false + var mIsExpand = false private val mShowItemCount: Int = 3//最多展示多少个礼包 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - return if (viewType == LIBAO_ITEM) { LibaoViewHolder(DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_game_libao, parent, false)) } else { - MoreViewHolder(LayoutInflater.from(context).inflate(R.layout.item_game_detail_more, parent, false)) + MoreViewHolder(ItemGameDetailMoreBinding.inflate(LayoutInflater.from(context), parent, false)) } } override fun getItemViewType(position: Int): Int { - return if (libaos.size > 3 && !isExpand) { - if (position == mShowItemCount) { - MORE + return if (libaos.size > mShowItemCount) { + if (!mIsExpand) { + if (position == mShowItemCount) MORE else LIBAO_ITEM } else { - LIBAO_ITEM + if (position == libaos.size) MORE else LIBAO_ITEM } } else { LIBAO_ITEM } } - override fun getItemCount(): Int = if (libaos.size > 3 && !isExpand) mShowItemCount + 1 else libaos.size + override fun getItemCount(): Int { + return if (libaos.size > mShowItemCount) { + if (mIsExpand) libaos.size + 1 else mShowItemCount + 1 + } else libaos.size + } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - val libaoEntity = libaos[position] when (holder) { is LibaoViewHolder -> { + val libaoEntity = libaos[position] holder.binding.libaoNameTv.text = libaoEntity.name holder.binding.contentTv.text = libaoEntity.content?.fromHtml() - val total = libaoEntity.total - val available = libaoEntity.available - if (total != 0) { - val availablePercent = (available) / total.toFloat() * 100 - val count = when { - availablePercent >= 1F -> { - availablePercent.toInt() - } - availablePercent == 0F -> { - 0 - } - else -> { - 1 + + //通用码礼包/或者还未添加礼包码时,不显示进度条,显示礼包码 + if (libaoEntity.universal || libaoEntity.status == "check") { + holder.binding.progressGroup.visibility = View.GONE + holder.binding.libaoCodeTv.visibility = View.VISIBLE + + if (!UserManager.getInstance().isLoggedIn) { + holder.binding.libaoCodeTv.text = "礼包码:-" + } else { + when (libaoEntity.status) { + "ling" -> { + holder.binding.libaoCodeTv.text = "礼包码:-" + } + "linged" -> { + val code = libaoEntity.me?.userDataLibaoList?.get(0)?.code ?: "" + val text = "礼包码:$code" + holder.binding.libaoCodeTv.text = SpanBuilder(text).color(4, text.length, R.color.theme_font).build() + holder.binding.libaoCodeTv.setOnClickListener { + code.copyTextAndToast("$code 复制成功") + } + } + else -> { + holder.binding.libaoCodeTv.text = "礼包码:-" + } } } - holder.binding.remainingTv.text = "剩余${count}%" - holder.binding.libaoSchedulePb.progress = count + } else { + if (!UserManager.getInstance().isLoggedIn) { + holder.binding.progressGroup.visibility = View.VISIBLE + holder.binding.libaoCodeTv.visibility = View.GONE + + initProgressUI(libaoEntity, holder) + } else { + when (libaoEntity.status) { + "ling" -> { + holder.binding.progressGroup.visibility = View.VISIBLE + holder.binding.libaoCodeTv.visibility = View.GONE + + initProgressUI(libaoEntity, holder) + } + "linged" -> { + holder.binding.progressGroup.visibility = View.GONE + holder.binding.libaoCodeTv.visibility = View.VISIBLE + + val code = libaoEntity.me?.userDataLibaoList?.get(0)?.code ?: "" + val text = "礼包码:$code" + holder.binding.libaoCodeTv.text = SpanBuilder(text).color(4, text.length, R.color.theme_font).build() + holder.binding.libaoCodeTv.setOnClickListener { + code.copyTextAndToast("$code 复制成功") + } + } + else -> { + holder.binding.progressGroup.visibility = View.GONE + holder.binding.libaoCodeTv.visibility = View.VISIBLE + holder.binding.libaoCodeTv.text = "礼包码:-" + } + } + } + } - LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity.status, context) + + LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity,true, context) holder.itemView.setOnClickListener { listListener?.onListClick(it, position, libaoEntity) } @@ -74,17 +120,40 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList, } } is MoreViewHolder -> { + holder.binding.arrowIv.rotation = if (mIsExpand) 180f else 0f holder.itemView.setOnClickListener { - MtaHelper.onEvent("游戏详情_新", "游戏礼包_展开", gameName) - isExpand = true - notifyItemRangeInserted(mShowItemCount + 1, libaos.size - mShowItemCount) + if (!mIsExpand) MtaHelper.onEvent("游戏详情_新", "游戏礼包_展开", gameName) + mIsExpand = !mIsExpand + notifyDataSetChanged() + } } } } + private fun initProgressUI(libaoEntity: LibaoEntity, holder: LibaoViewHolder) { + val total = libaoEntity.total + val available = libaoEntity.available + if (total != 0) { + val availablePercent = (available) / total.toFloat() * 100 + val count = when { + availablePercent >= 1F -> { + availablePercent.toInt() + } + availablePercent == 0F -> { + 0 + } + else -> { + 1 + } + } + holder.binding.remainingTv.text = "剩余${count}%" + holder.binding.libaoSchedulePb.progress = count + } + } + class LibaoViewHolder(var binding: ItemGameLibaoBinding) : RecyclerView.ViewHolder(binding.root) - class MoreViewHolder(var view: View) : RecyclerView.ViewHolder(view) + class MoreViewHolder(var binding: ItemGameDetailMoreBinding) : RecyclerView.ViewHolder(binding.root) companion object { const val MORE = 0 diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/libao/GameLibaoGalleryAdapter.java b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/libao/GameLibaoGalleryAdapter.java index 3bc3465c07..e3464fdb4d 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/libao/GameLibaoGalleryAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/libao/GameLibaoGalleryAdapter.java @@ -52,10 +52,10 @@ public class GameLibaoGalleryAdapter extends BaseRecyclerAdapter { - DataUtils.onMtaEvent(mContext, "游戏详情_新", "游戏礼包_领取", mGameName + "->" + libaoEntity.getName()); + DataUtils.onMtaEvent(mContext, "游戏详情_新", "游戏礼包_领取", mGameName + "->" + libaoEntity.getName()); return false; }); } diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java index 42aa94de9d..9164939c39 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java @@ -1,4 +1,4 @@ -package com.gh.gamecenter.libao; + package com.gh.gamecenter.libao; import android.os.Bundle; import android.text.TextUtils; diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java index 63b573f7c4..35245e40ab 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.libao; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; @@ -8,6 +9,7 @@ import android.widget.TextView; import com.gh.base.fragment.BaseFragment; import com.gh.common.util.CheckLoginUtils; +import com.gh.common.view.CustomDividerItemDecoration; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.ConcernActivity; import com.gh.gamecenter.LibaoDetailActivity; @@ -21,9 +23,11 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import butterknife.BindView; import butterknife.OnClick; @@ -82,7 +86,10 @@ public class Libao2Fragment extends BaseFragment implements SwipeRefreshLayout.O mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); adapter = new Libao2FragmentAdapter(getContext(), this, this, mEntrance); - mRecyclerView.addItemDecoration(new VerticalItemDecoration(getContext(), 8, false)); + Drawable insetDivider = ContextCompat.getDrawable(requireContext(), R.drawable.divider_item_line_space_16); + CustomDividerItemDecoration itemDecoration = new CustomDividerItemDecoration(requireContext(), false, false, true, false); + itemDecoration.setDrawable(insetDivider); + mRecyclerView.addItemDecoration(itemDecoration); mRecyclerView.setAdapter(adapter); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -213,7 +220,7 @@ public class Libao2Fragment extends BaseFragment implements SwipeRefreshLayout.O default: LibaoEntity libaoEntity = (LibaoEntity) data; adapter.setSkipPosition(position); - intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, mEntrance + "+(礼包中心:关注)"); + intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, view.getId() == R.id.libao_btn_status, mEntrance + "+(礼包中心:关注)"); startActivityForResult(intent, LIBAO_CONCERN_REQUEST); break; } diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java index 5aa53addb3..c4df927608 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java @@ -226,9 +226,9 @@ class Libao2FragmentAdapter extends BaseRecyclerAdapter { holder.libaoDes.setText(content); if (libaoEntity.getStatus() != null) { - LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, mEntrance + "+(礼包中心:关注)"); +// LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true,mEntrance + "+(礼包中心:关注)"); + LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext); } - holder.libaoBtnStatus.setClickable(false); } private void initFooterViewHolder(FooterViewHolder holder) { diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java index 662a5709c9..7751051f2f 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java @@ -1,12 +1,15 @@ package com.gh.gamecenter.libao; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; +import android.widget.RadioGroup; import android.widget.TextView; import com.gh.base.fragment.BaseFragment; import com.gh.common.util.CheckLoginUtils; +import com.gh.common.view.CustomDividerItemDecoration; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBReuse; @@ -20,6 +23,7 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import butterknife.BindView; import butterknife.OnClick; @@ -42,14 +46,17 @@ public class Libao3Fragment extends BaseFragment implements SwipeRefreshLayout.O LinearLayout mNoConn; @BindView(R.id.reuse_tv_none_data) TextView mNoDataTv; + @BindView(R.id.radiogroup) + RadioGroup mRadioGroup; private LinearLayoutManager mLayoutManager; private Libao3FragmentAdapter adapter; + private String mFilter = "expires:false"; Runnable runnable = new Runnable() { @Override public void run() { - adapter = new Libao3FragmentAdapter(getActivity(), Libao3Fragment.this, mEntrance); + adapter = new Libao3FragmentAdapter(getActivity(), Libao3Fragment.this, mFilter, mEntrance); mRecyclerView.setAdapter(adapter); adapter.loadData(); } @@ -70,8 +77,11 @@ public class Libao3Fragment extends BaseFragment implements SwipeRefreshLayout.O mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView.setLayoutManager(mLayoutManager); - adapter = new Libao3FragmentAdapter(getActivity(), this, mEntrance); - mRecyclerView.addItemDecoration(new VerticalItemDecoration(getContext(), 8, true)); + adapter = new Libao3FragmentAdapter(getActivity(), this, mFilter, mEntrance); + Drawable insetDivider = ContextCompat.getDrawable(requireContext(), R.drawable.divider_item_line_space_16); + CustomDividerItemDecoration itemDecoration = new CustomDividerItemDecoration(requireContext(), false, false, true, false); + itemDecoration.setDrawable(insetDivider); + mRecyclerView.addItemDecoration(itemDecoration); mRecyclerView.setAdapter(adapter); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -85,6 +95,14 @@ public class Libao3Fragment extends BaseFragment implements SwipeRefreshLayout.O } } }); + mRadioGroup.setOnCheckedChangeListener((group, checkedId) -> { + if (checkedId == R.id.receivedRb) { + mFilter = "expires:false"; + } else { + mFilter = "expires:true"; + } + postRunnable(runnable); + }); } @Override diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java index 291acae801..36e673e68c 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao3FragmentAdapter.java @@ -4,15 +4,23 @@ import android.content.Context; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; +import android.util.Pair; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.gh.base.OnRequestCallBackListener; import com.gh.common.util.DialogUtils; +import com.gh.common.util.ExtensionsKt; import com.gh.common.util.LibaoUtils; import com.gh.common.util.PlatformUtils; +import com.gh.common.util.TimeUtils; +import com.gh.common.view.BugFixedPopupWindow; import com.gh.gamecenter.LibaoDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; @@ -29,6 +37,7 @@ import com.lightgame.utils.Utils; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -50,13 +59,15 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter private boolean isNetworkError; private int mPage; + private String mFilter = "expires:false"; - Libao3FragmentAdapter(Context context, OnRequestCallBackListener listener, String entrance) { + Libao3FragmentAdapter(Context context, OnRequestCallBackListener listener, String filter, String entrance) { super(context); mCallBackListener = listener; mEntrance = entrance; mLibaoList = new ArrayList<>(); mPage = 1; + mFilter = filter; } void loadData() { @@ -71,7 +82,7 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter mLibaoList.clear(); } RetrofitManager.getInstance(mContext) - .getApi().getCunHaoXiang(UserManager.getInstance().getUserId(), mPage) + .getApi().getCunHaoXiang(UserManager.getInstance().getUserId(), mPage, mFilter) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response>() { @@ -191,6 +202,14 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter final LibaoEntity libaoEntity = mLibaoList.get(position); holder.libaoName.setText(libaoEntity.getName()); holder.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()); + if (mFilter.equals("expires:false") && libaoEntity.getExpires() > 0) { + holder.expiresTime.setVisibility(View.VISIBLE); + holder.expiresTime.setText(String.format(Locale.CHINA, "%s过期", TimeUtils.getFormatTime(libaoEntity.getExpires(), "MM.dd"))); + } else { + holder.expiresTime.setVisibility(View.GONE); + } + holder.moreIv.setVisibility(View.VISIBLE); + holder.moreIv.setOnClickListener(v -> showOptionPopupWindow(v, libaoEntity)); if (TextUtils.isEmpty(libaoEntity.getPlatform())) { holder.libaoGameName.setText(libaoEntity.getGame().getName()); @@ -212,77 +231,30 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter } holder.libaoDes.setText(content); - holder.libaoBtnStatus.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - LibaoUtils.copyLink(libaoEntity.getCode(), mContext); - if (!TextUtils.isEmpty(libaoEntity.getPackageName()) && LibaoUtils.isAppInstalled(mContext - , libaoEntity.getPackageName())) { - Spanned msg; - if ("ling".equals(libaoEntity.getStatus()) || "linged".equals(libaoEntity.getStatus())) { - msg = Html.fromHtml(mContext.getString(R.string.linged_copy_dialog, libaoEntity.getCode())); - } else { - msg = Html.fromHtml(mContext.getString(R.string.taoed_copy_dialog, libaoEntity.getCode())); - } - LibaoUtils.lunningAppDialog(mContext, msg, libaoEntity); + holder.libaoBtnStatus.setOnClickListener(v -> { + LibaoUtils.copyLink(libaoEntity.getCode(), mContext); + if (!TextUtils.isEmpty(libaoEntity.getPackageName()) && LibaoUtils.isAppInstalled(mContext + , libaoEntity.getPackageName())) { + Spanned msg; + if ("ling".equals(libaoEntity.getStatus()) || "linged".equals(libaoEntity.getStatus())) { + msg = Html.fromHtml(mContext.getString(R.string.linged_copy_dialog, libaoEntity.getCode())); + } else { + msg = Html.fromHtml(mContext.getString(R.string.taoed_copy_dialog, libaoEntity.getCode())); } + LibaoUtils.lunningAppDialog(mContext, msg, libaoEntity); } }); } - holder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { + holder.itemView.setOnClickListener(v -> { + if (libaoEntity.isActive() && libaoEntity.getGame().getActive()) { mContext.startActivity(LibaoDetailActivity.getIntent(mContext, libaoEntity, mEntrance + "+(礼包中心:存号箱)")); } }); - holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - DialogUtils.showWarningDialog(mContext, "删除礼包", Html.fromHtml(mContext.getString(R.string.libao_delete_dialog)) - , "取消", "确定删除" - , new DialogUtils.ConfirmListener() { - @Override - public void onConfirm() { - LibaoUtils.deleteLibaoCode(mContext, libaoEntity.getCode(), new LibaoUtils.PostLibaoListener() { - @Override - public void postSucceed(Object response) { - Utils.toast(mContext, "删除成功"); - for (LibaoEntity entity : mLibaoList) { - if (libaoEntity.getId().equals(entity.getId())) { - entity.setActive(false); - initData(); - break; - } - } - } - - @Override - public void postFailed(Throwable error) { - - if (error instanceof HttpException) { - HttpException exception = (HttpException) error; - if (exception.code() == 400) { - Utils.toast(mContext, "删除成功code-null"); - for (LibaoEntity entity : mLibaoList) { - if (libaoEntity.getId().equals(entity.getId())) { - entity.setActive(false); - initData(); - break; - } - } - } else { - Utils.toast(mContext, "删除失败,请检查网络状态"); - } - } - } - }); - - } - }, null); - return true; - } + holder.itemView.setOnLongClickListener(v -> { + showDeleteDialog(libaoEntity); + return true; }); holder.libaoBtnStatus.setText("复制"); @@ -292,6 +264,67 @@ class Libao3FragmentAdapter extends BaseRecyclerAdapter } } + private void showOptionPopupWindow(View view, LibaoEntity libaoEntity) { + View layout = LayoutInflater.from(mContext).inflate(R.layout.layout_popup_container, null); + BugFixedPopupWindow popupWindow = new BugFixedPopupWindow( + layout, + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + LinearLayout container = layout.findViewById(R.id.container); + View item = LayoutInflater.from(mContext).inflate(R.layout.layout_popup_option_icon_item, container, false); + container.addView(item, LinearLayout.LayoutParams.WRAP_CONTENT, ExtensionsKt.dip2px(50f)); + ImageView iconView = item.findViewById(R.id.icon); + TextView hitText = item.findViewById(R.id.hint_text); + hitText.setText("删除"); + iconView.setImageDrawable(ExtensionsKt.toDrawable(R.drawable.ic_libao_delete)); + item.setOnClickListener(v -> { + showDeleteDialog(libaoEntity); + popupWindow.dismiss(); + }); + popupWindow.setTouchable(true); + popupWindow.setFocusable(true); + ExtensionsKt.showAutoOrientation(popupWindow, view, 0, 0); + } + + private void showDeleteDialog(LibaoEntity libaoEntity) { + DialogUtils.showWarningDialog(mContext, "删除礼包", Html.fromHtml(mContext.getString(R.string.libao_delete_dialog)) + , "取消", "确定删除" + , () -> LibaoUtils.deleteLibaoCode(mContext, libaoEntity.getCode(), new LibaoUtils.PostLibaoListener() { + @Override + public void postSucceed(Object response) { + Utils.toast(mContext, "删除成功"); + for (LibaoEntity entity : mLibaoList) { + if (libaoEntity.getId().equals(entity.getId())) { + entity.setActive(false); + initData(); + break; + } + } + } + + @Override + public void postFailed(Throwable error) { + + if (error instanceof HttpException) { + HttpException exception = (HttpException) error; + if (exception.code() == 400) { + Utils.toast(mContext, "删除成功code-null"); + for (LibaoEntity entity : mLibaoList) { + if (libaoEntity.getId().equals(entity.getId())) { + entity.setActive(false); + initData(); + break; + } + } + } else { + Utils.toast(mContext, "删除失败,请检查网络状态"); + } + } + } + }), null); + } + private void initFooterViewHolder(FooterViewHolder holder) { holder.initItemPadding(); if (isNetworkError) { diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java b/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java index 947ae56e98..431fd550c6 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoHistoryAdapter.java @@ -160,8 +160,11 @@ public class LibaoHistoryAdapter extends BaseRecyclerAdapter { viewHolder.libaoGameIcon.displayGameIcon(libaoEntity.getIcon(), libaoEntity.getIconSubscript()); //领取状态 + if (TextUtils.isEmpty(libaoEntity.getStatus())) { + libaoEntity.setStatus("unshelve"); + } LibaoUtils.setLiBaoBtnStatusRound(viewHolder.libaoBtnStatus - , !TextUtils.isEmpty(libaoEntity.getStatus()) ? libaoEntity.getStatus() : "unshelve", mContext); + , libaoEntity, true, mContext); } else { FooterViewHolder viewHolder = (FooterViewHolder) holder; diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt index 336ca64f61..398caf1b43 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt @@ -7,7 +7,6 @@ import android.view.ViewGroup import com.gh.base.OnListClickListener import com.gh.base.OnRequestCallBackListener import com.gh.common.constant.ItemViewType -import com.gh.common.util.ImageUtils import com.gh.common.util.LibaoUtils import com.gh.common.util.PlatformUtils import com.gh.common.util.StringUtils @@ -202,10 +201,10 @@ class LibaoNewAdapter(context: Context, callBackListener: OnRequestCallBackListe holder.libaoDes.text = content if (libaoEntity.status != null) { - LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, - mEntrance + "+(礼包中心:最新)") +// LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true, +// mEntrance + "+(礼包中心:最新)") + LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext) } - holder.libaoBtnStatus.isClickable = false } fun getLibaoListSize(): Int { diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java index bd63b310f1..9001473575 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.libao; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; @@ -10,6 +11,7 @@ import android.widget.TextView; import com.ethanhua.skeleton.Skeleton; import com.ethanhua.skeleton.ViewSkeletonScreen; import com.gh.base.fragment.BaseFragment; +import com.gh.common.view.CustomDividerItemDecoration; import com.gh.common.view.SwipeLayout; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.LibaoDetailActivity; @@ -21,10 +23,12 @@ import org.greenrobot.eventbus.EventBus; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import butterknife.BindView; import butterknife.OnClick; @@ -95,7 +99,10 @@ public class LibaoNewFragment extends BaseFragment implements SwipeRefreshLayout mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new LibaoNewAdapter(getContext(), this, this, mEntrance); - mRecyclerView.addItemDecoration(new VerticalItemDecoration(getContext(), 8, true)); + Drawable insetDivider = ContextCompat.getDrawable(requireContext(), R.drawable.divider_item_line_space_16); + CustomDividerItemDecoration itemDecoration = new CustomDividerItemDecoration(requireContext(), false, false, true, false); + itemDecoration.setDrawable(insetDivider); + mRecyclerView.addItemDecoration(itemDecoration); mRecyclerView.setAdapter(mAdapter); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @@ -180,6 +187,10 @@ public class LibaoNewFragment extends BaseFragment implements SwipeRefreshLayout mHistoryLm = new LinearLayoutManager(getActivity()); mHistoryRv.setLayoutManager(mHistoryLm); mHistoryRv.setAdapter(mHistoryAdapter); + Drawable historyInsetDivider = ContextCompat.getDrawable(requireContext(), R.drawable.divider_item_line_space_16); + CustomDividerItemDecoration historyItemDecoration = new CustomDividerItemDecoration(requireContext(), false, false, true, false); + historyItemDecoration.setDrawable(historyInsetDivider); + mHistoryRv.addItemDecoration(historyItemDecoration); mHistoryRv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { @@ -272,7 +283,7 @@ public class LibaoNewFragment extends BaseFragment implements SwipeRefreshLayout super.onListClick(view, position, data); LibaoEntity libaoEntity = (LibaoEntity) data; mAdapter.setSkipPosition(position); - Intent intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, mEntrance + "+(礼包中心:最新)"); + Intent intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, view.getId() == R.id.libao_btn_status, mEntrance + "+(礼包中心:最新)"); startActivityForResult(intent, LIBAO_NEW_REQUEST); } } diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt index 4c37584133..4791a4489b 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt @@ -215,7 +215,7 @@ class LibaoSearchAdapter(fragment: LibaoSearchFragment, holder.libaoDes.text = content if (libaoEntity.status != null) { - LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, + LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null,false, mEntrance + "+(礼包中心:最新)") } holder.libaoBtnStatus.isClickable = false diff --git a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchFragment.java b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchFragment.java index 7b9ee4351c..3245840e76 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchFragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchFragment.java @@ -1,10 +1,12 @@ package com.gh.gamecenter.libao; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.view.View; import android.widget.LinearLayout; import com.gh.base.fragment.BaseFragment; +import com.gh.common.view.CustomDividerItemDecoration; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.LibaoDetailActivity; import com.gh.gamecenter.R; @@ -13,6 +15,7 @@ import com.gh.gamecenter.eventbus.EBReuse; import org.greenrobot.eventbus.EventBus; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -74,7 +77,10 @@ public class LibaoSearchFragment extends BaseFragment implements SwipeRefreshLay mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new LibaoSearchAdapter(this, this, mEntrance); - mRecyclerView.addItemDecoration(new VerticalItemDecoration(getContext(), 8, true)); + Drawable insetDivider = ContextCompat.getDrawable(requireContext(), R.drawable.divider_item_line_space_16); + CustomDividerItemDecoration itemDecoration = new CustomDividerItemDecoration(requireContext(), false, false, true, false); + itemDecoration.setDrawable(insetDivider); + mRecyclerView.addItemDecoration(itemDecoration); mRecyclerView.setAdapter(mAdapter); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 25b9621126..7c88dc26f4 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -629,7 +629,7 @@ public interface ApiService { * 获取礼包存号箱数据 */ @GET("users/{user_id}/libao/codes") - Observable> getCunHaoXiang(@Path("user_id") String user_id, @Query("page") int page); + Observable> getCunHaoXiang(@Path("user_id") String user_id, @Query("page") int page, @Query("filter") String filter); /** * 领取礼包 diff --git a/app/src/main/res/color/libao_rg_button_selector.xml b/app/src/main/res/color/libao_rg_button_selector.xml new file mode 100644 index 0000000000..1f4c108645 --- /dev/null +++ b/app/src/main/res/color/libao_rg_button_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/ic_libao_delete.webp b/app/src/main/res/drawable-xxhdpi/ic_libao_delete.webp new file mode 100644 index 0000000000..d85c87f207 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_libao_delete.webp differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_libao_more.png b/app/src/main/res/drawable-xxhdpi/ic_libao_more.png new file mode 100644 index 0000000000..af88b7ff0a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_libao_more.png differ diff --git a/app/src/main/res/drawable/bg_button_round_selector.xml b/app/src/main/res/drawable/bg_button_round_selector.xml new file mode 100644 index 0000000000..8cff9b8063 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_round_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_shape_fa_radius_6.xml b/app/src/main/res/drawable/bg_shape_fa_radius_6.xml new file mode 100644 index 0000000000..bcf9c2917a --- /dev/null +++ b/app/src/main/res/drawable/bg_shape_fa_radius_6.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/border_round_stroke_themefont_999.xml b/app/src/main/res/drawable/border_round_stroke_themefont_999.xml new file mode 100644 index 0000000000..6e8c07c3ca --- /dev/null +++ b/app/src/main/res/drawable/border_round_stroke_themefont_999.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_receive_libao_success.xml b/app/src/main/res/layout/dialog_receive_libao_success.xml new file mode 100644 index 0000000000..9d9dcfeb91 --- /dev/null +++ b/app/src/main/res/layout/dialog_receive_libao_success.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_libao3.xml b/app/src/main/res/layout/fragment_libao3.xml index e8139e026c..6eebc42a16 100644 --- a/app/src/main/res/layout/fragment_libao3.xml +++ b/app/src/main/res/layout/fragment_libao3.xml @@ -1,27 +1,71 @@ - + + android:id="@+id/libao3_srl_refresh" + android:layout_width="match_parent" + android:layout_height="match_parent"> - - + + + + + + + + + + + + + + layout="@layout/reuse_loading" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerInParent="true" /> - + - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_game_libao.xml b/app/src/main/res/layout/item_game_libao.xml index 28a01888f9..2c7b50d39d 100644 --- a/app/src/main/res/layout/item_game_libao.xml +++ b/app/src/main/res/layout/item_game_libao.xml @@ -6,10 +6,10 @@ android:id="@+id/libaoContent" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingTop="16dp" - android:paddingBottom="16dp" android:paddingLeft="16dp" - android:paddingRight="16dp"> + android:paddingTop="16dp" + android:paddingRight="16dp" + android:paddingBottom="16dp"> - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/libaoNameTv"> + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/progressContainer" /> + android:layout_height = "40dp"> + android:textColor = "@color/theme_font" /> \ No newline at end of file diff --git a/app/src/main/res/layout/libao_item.xml b/app/src/main/res/layout/libao_item.xml index ade81815ab..03229c54bf 100644 --- a/app/src/main/res/layout/libao_item.xml +++ b/app/src/main/res/layout/libao_item.xml @@ -1,5 +1,6 @@ - + android:orientation="vertical"> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/libaodetail_item_top.xml b/app/src/main/res/layout/libaodetail_item_top.xml index 2a8ed43907..2c4683158f 100644 --- a/app/src/main/res/layout/libaodetail_item_top.xml +++ b/app/src/main/res/layout/libaodetail_item_top.xml @@ -23,8 +23,8 @@ @@ -47,7 +47,6 @@ android:id = "@+id/libaodetail_game_name" android:layout_width = "match_parent" android:layout_height = "wrap_content" - android:layout_marginBottom = "6dp" android:layout_marginTop = "6dp" android:singleLine = "true" android:textColor = "@color/content" @@ -58,6 +57,8 @@ android:layout_width = "match_parent" android:layout_height = "wrap_content" android:singleLine = "true" + android:layout_marginTop="6dp" + android:visibility="gone" android:textColor = "@color/title" android:textSize = "12sp" /> @@ -76,14 +77,22 @@ + + + android:layout_below = "@+id/line" + android:visibility = "gone" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aadbd8bdbc..9f4f87258e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -418,8 +418,8 @@ 已领取 已淘号 已下架 - 再领一个 - 再淘一个 + 再领 + 再淘 查看 已安装