Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java

442 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.gh.gamecenter.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.core.text.HtmlCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.gh.common.util.DirectUtils;
import com.gh.common.util.LibaoUtils;
import com.gh.gamecenter.GameDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.LibaoDetailContentViewHolder;
import com.gh.gamecenter.adapter.viewholder.LibaoDetailTopViewHolder;
import com.gh.gamecenter.common.callback.OnRequestCallBackListener;
import com.gh.gamecenter.common.entity.SimpleGameEntity;
import com.gh.gamecenter.common.entity.SuggestType;
import com.gh.gamecenter.common.retrofit.Response;
import com.gh.gamecenter.common.utils.ExtensionsKt;
import com.gh.gamecenter.common.utils.PicassoImageGetter;
import com.gh.gamecenter.common.viewholder.FooterViewHolder;
import com.gh.gamecenter.core.utils.DisplayUtils;
import com.gh.gamecenter.core.utils.ExtraTagHandler;
import com.gh.gamecenter.core.utils.SpanBuilder;
import com.gh.gamecenter.core.utils.StringUtils;
import com.gh.gamecenter.databinding.LibaodetailItemContentBinding;
import com.gh.gamecenter.databinding.LibaodetailItemTopBinding;
import com.gh.gamecenter.entity.LibaoDetailEntity;
import com.gh.gamecenter.feature.entity.GameEntity;
import com.gh.gamecenter.feature.entity.LibaoEntity;
import com.gh.gamecenter.feature.entity.LibaoStatusEntity;
import com.gh.gamecenter.feature.entity.MeEntity;
import com.gh.gamecenter.feature.entity.UserDataLibaoEntity;
import com.gh.gamecenter.feature.game.GameItemViewHolder;
import com.gh.gamecenter.feature.utils.PlatformUtils;
import com.gh.gamecenter.feature.view.DownloadButton;
import com.gh.gamecenter.help.HelpAndFeedbackBridge;
import com.gh.gamecenter.retrofit.RetrofitManager;
import com.lightgame.adapter.BaseRecyclerAdapter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import retrofit2.HttpException;
/**
* Created by khy on 2016/12/13.
*/
public class LibaoDetailAdapter extends BaseRecyclerAdapter<ViewHolder> {
public static final int LIBAO_MAX_LINES = 3;
private OnRequestCallBackListener mOnRequestCallBackListener;
private OnCodeScrollListener mOnCodeScrollListener;
private DownloadButton mDownloadPb;
private LibaoEntity mLibaoEntity;
private LibaoDetailEntity mLibaoDetailEntity;
private GameEntity mGameEntity;
private String mEntrance;
private final int TYPE_FOOTER = 100;
public LibaoDetailTopViewHolder libaoDetailTopViewHolder;
public LibaoDetailAdapter(Context context, OnRequestCallBackListener onRequestCallBackListener,
OnCodeScrollListener onCodeScrollListener, LibaoEntity libaoEntity,
DownloadButton downloadPb, String entrance) {
super(context);
mOnRequestCallBackListener = onRequestCallBackListener;
mOnCodeScrollListener = onCodeScrollListener;
mLibaoEntity = libaoEntity;
mDownloadPb = downloadPb;
mEntrance = entrance;
}
public void setGameEntity(GameEntity gameEntity) {
mGameEntity = gameEntity;
}
public GameEntity getGameEntity() {
return mGameEntity;
}
public void addLibaoDetail(Context context, boolean isExistGameData) {
RetrofitManager.getInstance().getApi().getLibaoDetail(mLibaoEntity.getId())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Response<LibaoDetailEntity>() {
@Override
public void onResponse(LibaoDetailEntity response) {
mLibaoDetailEntity = response;
if (isExistGameData) {
MeEntity userData = response.getMe();
if (mLibaoEntity.isActive()) { // 以active判断礼包入口 true 为存号箱入口
// 合并userData数据
mLibaoEntity.setMe(userData);
}
mOnRequestCallBackListener.loadDone(); // 回调 检查领取状态(是否可以重复领取/重复淘号)
notifyDataSetChanged();
} else {
mOnRequestCallBackListener.loadEmpty();
}
}
@Override
public void onFailure(HttpException e) {
if (e != null && e.code() == 404) {
mOnRequestCallBackListener.loadNotFound();
} else {
mOnRequestCallBackListener.loadError();
}
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case 0:
libaoDetailTopViewHolder = new LibaoDetailTopViewHolder(LibaodetailItemTopBinding.inflate(mLayoutInflater, parent, false));
return libaoDetailTopViewHolder;
case TYPE_FOOTER:
view = mLayoutInflater.inflate(com.gh.gamecenter.common.R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view);
default:
return new LibaoDetailContentViewHolder(LibaodetailItemContentBinding.inflate(mLayoutInflater, parent, false));
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof LibaoDetailTopViewHolder) {
initLibaoDetailTop((LibaoDetailTopViewHolder) holder);
} else if (holder instanceof LibaoDetailContentViewHolder) {
initLibaoDetailContent((LibaoDetailContentViewHolder) holder, position);
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder viewHolder = (FooterViewHolder) holder;
viewHolder.initItemPadding();
viewHolder.getLoading().setVisibility(View.GONE);
SpannableStringBuilder builder = new SpanBuilder("此礼包有问题?点击反馈")
.click(mContext, 7, 11, com.gh.gamecenter.common.R.color.text_theme, false, () -> {
HelpAndFeedbackBridge.startSuggestionActivity(mContext,
SuggestType.GAME, "libao",
StringUtils.buildString(mLibaoEntity.getName(), "有问题:"), new SimpleGameEntity(mLibaoEntity.getGame().getId(), mLibaoEntity.getGame().getName(), mLibaoEntity.getGame().getIcon(), ""));
return null;
})
.build();
viewHolder.getHint().setText(builder);
viewHolder.getHint().setTextColor(ContextCompat.getColor(mContext, com.gh.gamecenter.common.R.color.text_secondary));
viewHolder.getHint().setMovementMethod(new LinkMovementMethod());
}
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return TYPE_FOOTER;
}
return position;
}
@Override
public int getItemCount() {
if (mLibaoDetailEntity != null && mLibaoEntity != null) return 3; // top + content + bottom
return 0;
}
@SuppressLint("ClickableViewAccessibility")
private void initLibaoDetailTop(LibaoDetailTopViewHolder holder) {
if (TextUtils.isEmpty(mLibaoEntity.getDes())) { // 由动态进来的数据不存咋des字段
mLibaoEntity.setDes(mLibaoDetailEntity.getDes());
}
holder.itemView.setOnClickListener(v -> {
if (mGameEntity != null) {
GameDetailActivity.startGameDetailActivity(mContext, mGameEntity, mEntrance, null);
}
});
ExtensionsKt.setRootBackgroundColor(holder.binding.getRoot(), com.gh.gamecenter.common.R.color.ui_surface);
if (mLibaoEntity.getGame() != null) {
holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getGame().getIcon(), mLibaoEntity.getGame().getIconSubscript(), mLibaoEntity.getGame().getIconFloat());
GameEntity gameEntity = mLibaoEntity.getGame().toGameEntity();
GameItemViewHolder.initGameSubtitleAndAdLabel(gameEntity, holder.binding.gameSubtitleTv, null, null, false, null, false, null);
} else {
holder.binding.libaodetailGameIcon.displayGameIcon(mLibaoEntity.getIcon(), null, null);
}
holder.binding.libaodetailName.setText(mLibaoEntity.getName());
if (TextUtils.isEmpty(mLibaoEntity.getPlatform())) {
holder.binding.libaodetailGameName.setText(mLibaoEntity.getGame().getName());
} else {
holder.binding.libaodetailGameName.setText((mLibaoEntity.getGame().getName() + " - " +
PlatformUtils.getInstance(mContext).getPlatformName(mLibaoEntity.getPlatform())));
}
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
linearLayoutManager.setStackFromEnd(true);
holder.binding.libaodetailLibaocodeRv.setLayoutManager(linearLayoutManager);
float availablePercent = ((float) mLibaoEntity.getAvailable() / (float) mLibaoEntity.getTotal()) * 100;
int count;
if (availablePercent >= 1) {
count = (int) availablePercent;
} else if (availablePercent == 0) {
count = 0;
} else {
count = 1;
}
Spanned content = null;
String status = mLibaoEntity.getBeforeStatus();
if ("coming".equals(status) || "finish".equals(status) || TextUtils.isEmpty(status)) {
content = Html.fromHtml("剩余:--");
} else if ("ling".equals(status) || "linged".equals(status)) {
content = Html.fromHtml(StringUtils.buildString("剩余:", "<font color=\"#1383EB\">", count + "%", "</font>"));
} else if ("tao".equals(status) || "taoed".equals(status)) {
content = Html.fromHtml(StringUtils.buildString("剩余:", String.valueOf(count), "%"));
} else if ("used_up".equals(status)) {
content = Html.fromHtml("剩余0% ");
}
//已领取或已淘号
if (mLibaoEntity.getMe() != null && mLibaoEntity.getMe().getUserDataLibaoList() != null
&& mLibaoEntity.getMe().getUserDataLibaoList().size() > 0) {
List<UserDataLibaoEntity> userDataLibaoList = mLibaoEntity.getMe().getUserDataLibaoList();
LibaoUtils.initLibaoBtn(mContext, holder.binding.libaodetailCopyBtn, mLibaoEntity,
mLibaoDetailEntity.getInstallRequired(), this, false,
StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), "礼包详情", null);
if (mLibaoEntity.getUniversal()) {
holder.binding.libaodetailDes.setVisibility(View.GONE);
} else {
holder.binding.libaodetailDes.setVisibility(View.VISIBLE);
holder.binding.libaodetailDes.setText(content);
}
holder.binding.libaodetailLibaocodeRv.setVisibility(View.VISIBLE);
holder.binding.line.setVisibility(View.VISIBLE);
holder.binding.libaodetailLibaocodeRv.setAdapter(new LiBaoCodeAdapter(mContext, userDataLibaoList));
ViewGroup.LayoutParams params = holder.binding.libaodetailLibaocodeRv.getLayoutParams();
if (userDataLibaoList.size() <= LIBAO_MAX_LINES) {
params.height = userDataLibaoList.size() * DisplayUtils.dip2px(mContext, 40);
} else {
params.height = LIBAO_MAX_LINES * DisplayUtils.dip2px(mContext, 40);
}
holder.binding.libaodetailLibaocodeRv.setLayoutParams(params);
holder.binding.libaodetailLibaocodeRv.setOnTouchListener((v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mOnCodeScrollListener.isScroll(false);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
mOnCodeScrollListener.isScroll(true);
}
return false;
});
return;
}
if (mLibaoEntity.getUniversal()) {
holder.binding.libaodetailDes.setVisibility(View.GONE);
} else {
holder.binding.libaodetailDes.setVisibility(View.VISIBLE);
holder.binding.libaodetailDes.setText(content);
}
if (mLibaoEntity.getStatus() != null && mLibaoDetailEntity != null) {
LibaoUtils.initLibaoBtn(mContext, holder.binding.libaodetailCopyBtn, mLibaoEntity,
mLibaoDetailEntity.getInstallRequired(), this, false,
StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), "礼包详情", null);
}
// 判断按钮状态是否为空(礼包详情进入),重新获取
if (TextUtils.isEmpty(status)) {
LibaoUtils.getLibaoStatus(mLibaoEntity.getId(), new LibaoUtils.PostLibaoListener() {
@Override
public void postSucceed(Object response) {
List<LibaoStatusEntity> statusList = (List<LibaoStatusEntity>) response;
if (statusList.size() != 0) {
mLibaoEntity.setStatus(statusList.get(0).getStatus());
mLibaoEntity.setAvailable(statusList.get(0).getAvailable());
mLibaoEntity.setTotal(statusList.get(0).getTotal());
notifyItemChanged(0);
}
}
@Override
public void postFailed(Throwable error) {
}
});
}
}
private void initLibaoDetailContent(LibaoDetailContentViewHolder holder, int position) {
if (mLibaoEntity.getContent() != null) {
holder.binding.libaodetailContentLl.setVisibility(View.VISIBLE);
holder.binding.libaodetailContent.setText(Html.fromHtml(mLibaoEntity.getContent()));
}
if (mLibaoDetailEntity != null) {
holder.binding.libaodetailTimeLl.setVisibility(View.VISIBLE);
initLibaoDetailCondition(holder);
if (mLibaoDetailEntity.getTime() != null) {
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm", Locale.CHINA);
String start = format.format((mLibaoDetailEntity.getTime().getStart() * 1000));
long libaoLingEndTime = mLibaoDetailEntity.getTime().getEnd();
String end = libaoLingEndTime == 0
? mContext.getString(R.string.libao_ling_time_infinitely) // 礼包领取结束时间为空则表示礼包长期有效
: format.format((mLibaoDetailEntity.getTime().getEnd() * 1000));
holder.binding.libaodetailTimeStart.setText(StringUtils.buildString("开始时间:", start));
holder.binding.libaodetailTimeEnd.setText(StringUtils.buildString("截止时间:", end));
}
String des = mLibaoDetailEntity.getNewDes();
if (des == null) {
des = mLibaoDetailEntity.getDes();
}
if (des != null && position == getItemCount() - 2) {
holder.binding.libaodetailDesLl.setVisibility(View.VISIBLE);
CharSequence spanned = HtmlCompat.fromHtml(des, HtmlCompat.FROM_HTML_MODE_COMPACT,
new PicassoImageGetter(holder.binding.libaodetailDes), new ExtraTagHandler());
ExtensionsKt.setTextWithInterceptingInternalUrl(holder.binding.libaodetailDes, spanned);
}
}
}
private void initLibaoDetailCondition(LibaoDetailContentViewHolder holder) {
if (mLibaoDetailEntity.getInstallRequired()) {
Spanned content;
if (TextUtils.isEmpty(mLibaoEntity.getPlatform())) {
content = Html.fromHtml(mContext.getString(R.string.libao_install_hint, mLibaoEntity.getGame().getName()));
} else {
content = Html.fromHtml(mContext.getString(R.string.libao_install_hint_platform, mLibaoEntity.getGame().getName(),
PlatformUtils.getInstance(mContext).getPlatformName(mLibaoEntity.getPlatform())));
}
holder.binding.libaodetailCondition.setVisibility(View.VISIBLE);
holder.binding.libaodetailCondition.setText(content);
} else if (ExtensionsKt.toResString(R.string.libao_activity_grant).equals(mLibaoEntity.getReceiveLimit())) {
holder.binding.libaodetailCondition.setVisibility(View.VISIBLE);
String url = mLibaoEntity.getActivityLink().getUrl();
if (TextUtils.isEmpty(url)) {
holder.binding.libaodetailCondition.setText("领取条件:通过活动获得");
} else {
SpannableStringBuilder content = new SpannableStringBuilder("领取条件:通过活动获得,查看详情");
content.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(ExtensionsKt.toColor(com.gh.gamecenter.common.R.color.text_theme, mContext));
ds.setUnderlineText(false);
}
@Override
public void onClick(@NonNull View widget) {
DirectUtils.directToWebView(mContext, url, "礼包详情-领取条件-查看活动详情");
}
}, 12, content.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.binding.libaodetailCondition.setText(content);
holder.binding.libaodetailCondition.setMovementMethod(new LinkMovementMethod());
ExtensionsKt.setDrawableEnd(holder.binding.libaodetailCondition, com.gh.gamecenter.common.R.drawable.ic_libao_activity_arrow, null, null);
holder.binding.libaodetailCondition.setCompoundDrawablePadding(DisplayUtils.dip2px(4F));
}
}
}
public LibaoEntity getLibaoEntity() {
return mLibaoEntity;
}
public void setLibaoEntity(LibaoEntity libaoEntity) {
mLibaoEntity = libaoEntity;
}
public LibaoDetailEntity getLibaoDetailEntity() {
return mLibaoDetailEntity;
}
public void initLibaoCode(UserDataLibaoEntity userDataLibaoEntity) {
boolean isLibaoDataDuplicated = false;
MeEntity userData = mLibaoEntity.getMe();
if (userData == null) {
userData = new MeEntity();
mLibaoEntity.setMe(userData);
}
List<UserDataLibaoEntity> userDataLibaoList = userData.getUserDataLibaoList();
if (userDataLibaoList == null) {
userDataLibaoList = new ArrayList<>();
userData.setUserDataLibaoList(userDataLibaoList);
} else {
for (UserDataLibaoEntity entity : userDataLibaoList) {
if (entity.getCode() != null
&& entity.getCode().equals(userDataLibaoEntity.getCode())) {
isLibaoDataDuplicated = true;
}
}
}
if (!isLibaoDataDuplicated) {
userDataLibaoList.add(userDataLibaoEntity);
notifyItemChanged(0);
}
mOnRequestCallBackListener.loadDone(userDataLibaoEntity);
}
// 点击立即安装打开下载页面,如果只有一个包 直接下载
public void openDownload(String platform) {
mDownloadPb.setTag(platform);
mDownloadPb.performClick();
}
public interface OnCodeScrollListener {
void isScroll(boolean isScroll);
}
}