diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 140a806c8b..98d84bfc7c 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -215,7 +215,20 @@ class DefaultJsApi(var context: Context) { DialogUtils.showLowVersionDialog(context) } + @JavascriptInterface + fun shareBase64Image(event: Any) { + val imageShareEvent = event.toString().toObject() ?: ImageShareEvent() + val context = CurrentActivityHolder.getCurrentActivity() + Base64ImageHolder.image = imageShareEvent.image.run { + if (this.startsWith("data:image/png;base64")) this.split(",")[1] else this + } + MessageShareUtils.getInstance(context).shareFromWeb(context, imageShareEvent.type) + } + @Keep internal data class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) + @Keep + internal data class ImageShareEvent(var image: String = "", var type: String = "") + } diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index 1695282e75..1cf00bb6a5 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -132,9 +132,13 @@ public class Constants { public static final String REGULATION_TEST_ADDRESS_DEV = "https://static-web.ghzs.com/etiquette-dev/index.html#/"; public static final String REGULATION_TEST_ADDRESS = "https://static-web.ghzs.com/etiquette/index.html#/"; - // 徽章 - public static final String BADGE_ADDRESS_DEV = "http://resource.ghzs.com/page/badge_dev/index.html#/"; - public static final String BADGE_ADDRESS = "http://resource.ghzs.com/page/badge_pro/index.html#/"; + // 徽章中心 + public static final String BADGE_ADDRESS_DEV = "https://static-web.ghzs.com/badge-dev/index.html#/"; + public static final String BADGE_ADDRESS = "https://static-web.ghzs.com/badge/index.html#/"; + + // 徽章详情 + public static final String BADGE_DETAIL_ADDRESS_DEV = "https://static-web.ghzs.com/badge-dev/index.html#/badgedetail"; + public static final String BADGE_DETAIL_ADDRESS = "https://static-web.ghzs.com/badge/index.html#/badgedetail"; // 腾讯企点地址 public static final String TENCENT_QIDIAN_ADDRESS = "https://url.cn/D80iyMVV?_type=wpa&qidian=true"; 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 d94ee3ed90..f8223822e5 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -25,6 +25,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; @@ -32,6 +34,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.facebook.drawee.generic.GenericDraweeHierarchy; +import com.facebook.drawee.view.SimpleDraweeView; import com.gh.common.AppExecutor; import com.gh.common.constant.Config; import com.gh.common.dialog.TrackableDialog; @@ -48,6 +51,8 @@ import com.gh.gamecenter.databinding.DialogOverseaConfirmationBinding; import com.gh.gamecenter.databinding.ImprintContentItemBinding; import com.gh.gamecenter.databinding.PrivacyItemBinding; import com.gh.gamecenter.entity.ApkEntity; +import com.gh.gamecenter.entity.Badge; +import com.gh.gamecenter.entity.BadgeEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.PrivacyPolicyEntity; import com.gh.gamecenter.entity.SettingsEntity; @@ -1715,6 +1720,89 @@ public class DialogUtils { } } + public static void showViewBadgeDialog(Context context, Badge badge, ConfirmListener listener) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_view_badge, null); + TextView titleTv = contentView.findViewById(R.id.dialog_title); + TextView contentTv = contentView.findViewById(R.id.dialog_content); + SimpleDraweeView badgeView = contentView.findViewById(R.id.dialog_badge); + ImageView badgeLightBg = contentView.findViewById(R.id.dialog_badge_light_bg); + + ImageUtils.display(badgeView, badge.getIcon()); + titleTv.setText(badge.getName()); + + // 领取条件文本超过一行就不显示 + if (badge.getActions() == null || badge.getActions().isEmpty() || badge.getActions().size() > 1) { + contentTv.setVisibility(View.INVISIBLE); + } else { + contentTv.setText(badge.getActions().get(0).getText()); + contentTv.post(() -> { + if (contentTv.getLineCount() > 1) contentTv.setVisibility(View.INVISIBLE); + }); + } + + Animation animation = AnimationUtils.loadAnimation(context, R.anim.anim_badge_light_bg); + badgeLightBg.startAnimation(animation); + + contentView.findViewById(R.id.dialog_ok).setOnClickListener(v -> { + listener.onConfirm(); + badgeLightBg.clearAnimation(); + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + + public static void showReceiveBadgeDialog(Context context, BadgeEntity badge, ConfirmListener listener) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_receive_badge, null); + TextView titleTv = contentView.findViewById(R.id.dialog_title); + TextView contentTv = contentView.findViewById(R.id.dialog_content); + SimpleDraweeView badgeView = contentView.findViewById(R.id.dialog_badge); + ImageView badgeLightBg = contentView.findViewById(R.id.dialog_badge_light_bg); + TextView receiveTv = contentView.findViewById(R.id.dialog_ok); + + ImageUtils.display(badgeView, badge.getImage()); + titleTv.setText(badge.getName()); + + // 领取条件文本超过一行就不显示 + if (badge.getActions() == null || badge.getActions().isEmpty() || badge.getActions().size() > 1) { + contentTv.setVisibility(View.INVISIBLE); + } else { + contentTv.setText(badge.getActions().get(0).getText()); + contentTv.post(() -> { + if (contentTv.getLineCount() > 1) contentTv.setVisibility(View.INVISIBLE); + }); + } + + if ("self".equals(badge.getReceive().getType())) { + receiveTv.setText(R.string.receive_badge); + } else { + receiveTv.setText(R.string.apply_badge); + } + + Animation animation = AnimationUtils.loadAnimation(context, R.anim.anim_badge_light_bg); + badgeLightBg.startAnimation(animation); + + contentView.findViewById(R.id.dialog_ok).setOnClickListener(v -> { + listener.onConfirm(); + badgeLightBg.clearAnimation(); + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 3a0b4a24d1..26a0b890b4 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -62,6 +62,9 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import org.greenrobot.eventbus.EventBus import retrofit2.HttpException +import java.net.URLEncoder +import java.util.* +import kotlin.math.roundToInt /** * 跳转用的方法 @@ -767,7 +770,29 @@ object DirectUtils { */ @JvmStatic fun directToBadgeWall(context: Context, userId: String?, name: String?, icon: String?) { - context.startActivity(WebActivity.getBadgeCenterIntent(context, userId, name, icon)) + var url: String = if ("internal" == BuildConfig.FLAVOR) { + Constants.BADGE_ADDRESS_DEV + } else { + Constants.BADGE_ADDRESS + } + + url = String.format(Locale.CHINA, "%s?user_id=%s&name=%s&icon=%s×tamp=%d", url, userId, name, URLEncoder.encode(icon), (Date().time / 1000 / 1000.toFloat()).roundToInt()) + directToFullScreenWebPage(context, url, true) + } + + /** + * 跳转至徽章详情 + */ + @JvmStatic + fun directToBadgeDetail(context: Context, userId: String?, badgeId: String?) { + var url: String = if ("internal" == BuildConfig.FLAVOR) { + Constants.BADGE_DETAIL_ADDRESS_DEV + } else { + Constants.BADGE_DETAIL_ADDRESS + } + + url = String.format(Locale.CHINA, "%s?user_id=%s&badge_id=%s×tamp=%d", url, userId, badgeId, (Date().time / 1000 / 1000.toFloat()).roundToInt()) + directToFullScreenWebPage(context, url, true) } /** diff --git a/app/src/main/java/com/gh/common/util/MessageShareUtils.java b/app/src/main/java/com/gh/common/util/MessageShareUtils.java index 02dec25aec..2ff0f8be5f 100644 --- a/app/src/main/java/com/gh/common/util/MessageShareUtils.java +++ b/app/src/main/java/com/gh/common/util/MessageShareUtils.java @@ -3,9 +3,8 @@ package com.gh.common.util; import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Matrix; import android.net.Uri; @@ -16,6 +15,7 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.util.Base64; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; @@ -26,6 +26,7 @@ import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; +import com.gh.common.Base64ImageHolder; import com.gh.common.constant.Config; import com.gh.gamecenter.R; import com.lightgame.utils.Utils; @@ -205,6 +206,46 @@ public class MessageShareUtils { }); } + public void shareFromWeb(Activity activity, String type) { + // base64转bitmap + byte[] decode = Base64.decode(Base64ImageHolder.INSTANCE.getImage(), Base64.DEFAULT); + Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length); + + this.picName = "shareImgPic.jpg"; + this.mActivity = new WeakReference<>(activity); + this.shareBm = bitmap; + + // 保存图片 + File file = new File(activity.getExternalCacheDir().getPath() + "/ShareImg"); + if (!file.isDirectory()) { + file.delete(); + file.mkdirs(); + } + if (!file.exists()) { + file.mkdirs(); + } + writeBitmap(file.getPath(), picName, bitmap, false); + + // 分享 + switch (type) { + case "qq" : + qqSahre(); + break; + case "qq_zone" : + qZoneSahre(); + break; + case "wechat" : + wechatSahre(); + break; + case "wechat_moments" : + wechatMomentsSahre(); + case "save" : + String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; + writeBitmap(savePath, "gh-" + new Date().getTime() + ".jpg", shareBm, true); + break; + } + } + //QQ分享 private void qqSahre() { Utils.toast(mContext, "分享跳转中..."); diff --git a/app/src/main/java/com/gh/common/util/SpUtils.kt b/app/src/main/java/com/gh/common/util/SpUtils.kt index dc9ce9ecc2..49c317bce8 100644 --- a/app/src/main/java/com/gh/common/util/SpUtils.kt +++ b/app/src/main/java/com/gh/common/util/SpUtils.kt @@ -46,6 +46,11 @@ object SPUtils { return sp.getInt(key, defaultValue) } + @JvmStatic + fun getLong(key: String): Long { + return sp.getLong(key, 0) + } + @JvmStatic fun getLong(key: String, defaultValue: Long): Long { return sp.getLong(key, defaultValue) diff --git a/app/src/main/java/com/gh/common/util/TimeUtils.kt b/app/src/main/java/com/gh/common/util/TimeUtils.kt index 8550ec74c4..cf8cbffe68 100644 --- a/app/src/main/java/com/gh/common/util/TimeUtils.kt +++ b/app/src/main/java/com/gh/common/util/TimeUtils.kt @@ -3,6 +3,7 @@ package com.gh.common.util import java.text.ParseException import java.text.SimpleDateFormat import java.util.* +import kotlin.math.log10 object TimeUtils { @@ -100,4 +101,27 @@ object TimeUtils { else -> "" } } + + @JvmStatic + fun getStartTimeOfToday(): Long = getStartTimeOfDay(System.currentTimeMillis()) + + @JvmStatic + fun getStartTimeOfDay(currentTime: Long): Long { + val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) + calendar.timeInMillis = getJavaTimestamp(currentTime) + calendar.set(Calendar.HOUR_OF_DAY, 0) + calendar.set(Calendar.MINUTE, 0) + calendar.set(Calendar.SECOND, 0) + calendar.set(Calendar.MILLISECOND, 0) + return calendar.timeInMillis + } + + @JvmStatic + fun getJavaTimestamp(timestamp: Long): Long { + return if ((log10(timestamp.toDouble()) + 1).toInt() == 10) { + timestamp * 1000 + } else { + timestamp + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java index 5ed2f4426a..9da8f41a96 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/CommentDetailAdapter.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.gh.common.constant.ItemViewType; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.CommentUtils; +import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.MtaHelper; @@ -199,15 +200,21 @@ public class CommentDetailAdapter extends BaseRecyclerAdapter { holder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), "", "文章-评论详情")); holder.commentUserNameTv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), "", "文章-评论详情")); holder.userBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-查看对话"); - DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, commentEntity.getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-查看对话"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + }); }); holder.badgeNameTv.setOnClickListener(v -> holder.userBadgeSdv.performClick()); holder.quoteAuthorBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-查看对话"); - DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, parent.getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-查看对话", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-查看对话"); + DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + }); }); if (commentEntity.getPriority() != 0) { holder.commentBadge.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java index c18edffe57..9d739fc7f5 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/MessageDetailAdapter.java @@ -17,6 +17,7 @@ import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.CommentUtils; import com.gh.common.util.ConcernContentUtils; import com.gh.common.util.DataCollectionUtils; +import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; @@ -449,15 +450,21 @@ public class MessageDetailAdapter extends BaseRecyclerAdapter { holder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, finalCommentEntity.getUser().getId(), mEntrance, "文章-评论详情")); holder.userBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", finalCommentEntity.getUser().getName() + "(" + finalCommentEntity.getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论列表"); - DirectUtils.directToBadgeWall(mContext, finalCommentEntity.getUser().getId(), finalCommentEntity.getUser().getName(), finalCommentEntity.getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, finalCommentEntity.getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", finalCommentEntity.getUser().getName() + "(" + finalCommentEntity.getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论列表"); + DirectUtils.directToBadgeWall(mContext, finalCommentEntity.getUser().getId(), finalCommentEntity.getUser().getName(), finalCommentEntity.getUser().getIcon()); + }); }); holder.badgeNameTv.setOnClickListener(v -> holder.userBadgeSdv.performClick()); holder.quoteAuthorBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论列表"); - DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, parent.getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论列表", parent.getUser().getName() + "(" + parent.getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论列表"); + DirectUtils.directToBadgeWall(mContext, parent.getUser().getId(), parent.getUser().getName(), parent.getUser().getIcon()); + }); }); if (commentEntity.getPriority() != 0) { diff --git a/app/src/main/java/com/gh/gamecenter/entity/BadgeEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/BadgeEntity.kt index 40752d836f..e73b336d5c 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/BadgeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/BadgeEntity.kt @@ -9,5 +9,11 @@ data class BadgeEntity( var icon: String = "", var name: String = "", //获取时间 var time: Int = 0, //有效期,0代表无限期 - val wear: Boolean = false //是否佩戴 -) \ No newline at end of file + val wear: Boolean = false, //是否佩戴 + var image: String = "", + var actions: List? = null, + var receive: BadgeReceive? = null +) + +// 领取类型 +data class BadgeReceive(var type: String = "") \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt index 12a765864a..ff4fdff321 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt @@ -36,4 +36,10 @@ data class PersonalEntity( @Parcelize data class Badge( var name: String = "", - var icon: String = "") : Parcelable + var icon: String = "", + var actions: List? = null) : Parcelable + +// 领取条件 +@Parcelize +data class BadgeAction( + var text: String = "") : Parcelable diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt index 107b09e9a4..bb603376fd 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleAskItemViewHolder.kt @@ -51,9 +51,11 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B val user = entity.user binding.userBadgeName.setOnClickListener { binding.userBadgeIcon.performClick() } binding.userBadgeIcon.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", path, user.name + "(" + user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", path) - DirectUtils.directToBadgeWall(binding.root.context, user.id, user.name, user.icon) + DialogUtils.showViewBadgeDialog(binding.root.context, user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", path, user.name + "(" + user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", path) + DirectUtils.directToBadgeWall(binding.root.context, user.id, user.name, user.icon) + } } binding.userIcon.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt index 69f46fd110..1cde45812c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescCommentsAdapter.kt @@ -113,9 +113,11 @@ class DescCommentsAdapter(context: Context, } sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-玩家评论", "${commentData.user.name}(${commentData.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏详情-玩家评论") - DirectUtils.directToBadgeWall(mContext, commentData.user.id, commentData.user.name, commentData.user.icon) + DialogUtils.showViewBadgeDialog(mContext, commentData.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "游戏详情-玩家评论", "${commentData.user.name}(${commentData.user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏详情-玩家评论") + DirectUtils.directToBadgeWall(mContext, commentData.user.id, commentData.user.name, commentData.user.icon) + } } userIcon.setOnClickListener { DirectUtils.directToHomeActivity(mContext, commentData.user.id, mEntrance, "游戏详情-玩家评论") 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 cccfed644a..d1e0685fbe 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 @@ -128,9 +128,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR "评论详情" -> "游戏评论详情" else -> "" } - MtaHelper.onEvent("进入徽章墙_用户记录", key, "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon) + DialogUtils.showViewBadgeDialog(context, commentData.replyData!!.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", key, "${commentData.replyData?.user?.name}(${commentData.replyData?.user?.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", key) + DirectUtils.directToBadgeWall(context, commentData.replyData!!.user.id, commentData.replyData!!.user.name, commentData.replyData!!.user.icon) + } } }, commentData.replyData?.user?.name!!.length + 2, commentData.replyData?.user?.name!!.length + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) @@ -180,9 +182,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR } sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", getKey(path), "${commentData.user.name}(${commentData.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", getKey(path)) - DirectUtils.directToBadgeWall(context, commentData.user.id, commentData.user.name, commentData.user.icon) + DialogUtils.showViewBadgeDialog(context, commentData.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", getKey(path), "${commentData.user.name}(${commentData.user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", getKey(path)) + DirectUtils.directToBadgeWall(context, commentData.user.id, commentData.user.name, commentData.user.icon) + } } tvBadgeName.setOnClickListener { sdvUserBadge.performClick() } diff --git a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt index 38588136f2..b2968f916f 100644 --- a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt @@ -3,11 +3,7 @@ package com.gh.gamecenter.home.amway import android.content.Context import android.view.View import android.view.ViewGroup -import com.gh.common.databind.BindingAdapters -import com.gh.common.util.DirectUtils -import com.gh.common.util.ImageUtils -import com.gh.common.util.MtaHelper -import com.gh.common.util.dip2px +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.databinding.HomeAmwayItemBinding import com.gh.gamecenter.entity.AmwayCommentEntity @@ -52,9 +48,11 @@ class HomeAmwayAdapter(context: Context, holder.binding.sdvUserBadge.visibility = View.GONE } holder.binding.sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "安利墙", "${amway.comment.user.name}(${amway.comment.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "安利墙") - DirectUtils.directToBadgeWall(mContext, amway.comment.user.id, amway.comment.user.name, amway.comment.user.icon) + DialogUtils.showViewBadgeDialog(mContext, amway.comment.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "安利墙", "${amway.comment.user.name}(${amway.comment.user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "安利墙") + DirectUtils.directToBadgeWall(mContext, amway.comment.user.id, amway.comment.user.name, amway.comment.user.icon) + } } holder.binding.all.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java index a2b601e98c..3cba1cda7b 100644 --- a/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/newsdetail/NewsDetailAdapter.java @@ -528,15 +528,21 @@ public class NewsDetailAdapter extends BaseRecyclerAdapter { viewHolder.commentUserIconDv.setOnClickListener(v -> DirectUtils.directToHomeActivity(mContext, commentEntity.getUser().getId(), mEntrance, "文章-评论列表")); viewHolder.userBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论详情"); - DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, commentEntity.getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getUser().getName() + "(" + commentEntity.getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论详情"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getUser().getId(), commentEntity.getUser().getName(), commentEntity.getUser().getIcon()); + }); }); viewHolder.badgeNameTv.setOnClickListener(v -> viewHolder.userBadgeSdv.performClick()); viewHolder.quoteAuthorBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getParent().getUser().getName() + "(" + commentEntity.getParent().getUser().getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论详情"); - DirectUtils.directToBadgeWall(mContext, commentEntity.getParent().getUser().getId(), commentEntity.getParent().getUser().getName(), commentEntity.getParent().getUser().getIcon()); + DialogUtils.showViewBadgeDialog(mContext, commentEntity.getParent().getUser().getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "资讯文章-评论详情", commentEntity.getParent().getUser().getName() + "(" + commentEntity.getParent().getUser().getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "资讯文章-评论详情"); + DirectUtils.directToBadgeWall(mContext, commentEntity.getParent().getUser().getId(), commentEntity.getParent().getUser().getName(), commentEntity.getParent().getUser().getIcon()); + }); }); } diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index 8625a25fd0..93674d2f7e 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -36,7 +36,10 @@ import com.gh.common.util.LoginHelper; import com.gh.common.util.MtaHelper; import com.gh.common.util.NetworkUtils; import com.gh.common.util.PackageUtils; +import com.gh.common.util.SPUtils; import com.gh.common.util.StringUtils; +import com.gh.common.util.TimeUtils; +import com.gh.common.util.ToastUtils; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.GameDetailActivity; import com.gh.gamecenter.MainActivity; @@ -44,6 +47,8 @@ import com.gh.gamecenter.MessageActivity; import com.gh.gamecenter.NewsDetailActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.AppEntity; +import com.gh.gamecenter.entity.Badge; +import com.gh.gamecenter.entity.BadgeEntity; import com.gh.gamecenter.entity.FunctionalGroupEntity; import com.gh.gamecenter.entity.FunctionalLinkEntity; import com.gh.gamecenter.entity.FunctionalMessageType; @@ -62,6 +67,7 @@ import com.gh.gamecenter.message.MessageUnreadRepository; import com.gh.gamecenter.message.MessageUnreadViewModel; import com.gh.gamecenter.personalhome.UserHomeViewModel; import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; +import com.gh.gamecenter.retrofit.BiResponse; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.room.AppDatabase; @@ -76,6 +82,7 @@ import com.tencent.connect.common.Constants; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.jetbrains.annotations.NotNull; import org.json.JSONObject; import java.text.SimpleDateFormat; @@ -127,6 +134,8 @@ public class PersonalFragment extends BaseLazyFragment { RelativeLayout mPersonalBadge; @BindView(R.id.personal_badge_tv) TextView mPersonalBadgeTv; + @BindView(R.id.personal_badge_icon) + SimpleDraweeView mPersonalBadgeIcon; @BindView(R.id.personal_badge_tips) View mPersonalBadgeTips; @BindView(R.id.personal_func) @@ -137,6 +146,7 @@ public class PersonalFragment extends BaseLazyFragment { public final static String LOGIN_TAG = "login_tag"; //登入标识 public final static String LOGOUT_TAG = "logout_tag"; // 登出标识 private final static String MESSAGE_READ_OVER = "MESSAGE_READ_OVER"; + private final static String SP_BADGE_RECORD_SEVEN_DAY = "badgeRecordSevenDay"; private final static int REQUEST_MESSAGE = 199; private UserInfoEntity mUserInfoEntity; @@ -291,6 +301,7 @@ public class PersonalFragment extends BaseLazyFragment { }); } + @SuppressLint("CheckResult") private void observeUIRelatedChanges() { mUserViewModel.getLoginObsUserinfo().observe(this, userInfoEntity -> { if (userInfoEntity != null && userInfoEntity.getData() != null) { @@ -306,9 +317,55 @@ public class PersonalFragment extends BaseLazyFragment { } else { mPersonalBadgeTv.setText(String.format(Locale.CHINA, "%d枚徽章", badgeEntities.size())); } + for (BadgeEntity badgeEntity : badgeEntities) { + if (badgeEntity.getWear()){ + ImageUtils.display(mPersonalBadgeIcon, badgeEntity.getIcon()); + + mPersonalBadgeIcon.setOnClickListener(v -> DialogUtils.showViewBadgeDialog(requireContext(), new Badge(badgeEntity.getName(), badgeEntity.getIcon(), badgeEntity.getActions()), + () -> DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()))); + + break; + } + } }); mUserHomeViewModel.getAvailableBadgeCount().observe(this, count -> mPersonalBadgeTips.setVisibility(count > 0 ? View.VISIBLE : View.GONE)); + mUserHomeViewModel.getAvailableBadge().observe(this, badge -> { + // 徽章领取弹窗每隔7天弹出一次,所以要判断现在是否是上一次弹出的第7天或者之后 + if (badge != null && System.currentTimeMillis() >= SPUtils.getLong(SP_BADGE_RECORD_SEVEN_DAY)) { + // 徽章领取弹窗每隔7天弹出一次,所以本次弹出后就记录7天后的时间戳 + SPUtils.setLong(SP_BADGE_RECORD_SEVEN_DAY, TimeUtils.getStartTimeOfDay(System.currentTimeMillis() + 86400000 * 6)); + + DialogUtils.showReceiveBadgeDialog(requireContext(), badge, + () -> RetrofitManager.getInstance(requireContext()).getApi() + .applyOrReceiveBadge(badge.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiResponse() { + @Override + public void onSuccess(ResponseBody data) { + if ("self".equals(badge.getReceive().getType())) { + ToastUtils.INSTANCE.showToast("领取成功"); + } else { + ToastUtils.INSTANCE.showToast("申请成功"); + } + // 跳转到徽章详情 + DirectUtils.directToBadgeDetail(requireContext(), mUserInfoEntity.getUserId(), badge.getId()); + } + + @Override + public void onFailure(@NotNull Exception exception) { + super.onFailure(exception); + if ("self".equals(badge.getReceive().getType())) { + ToastUtils.INSTANCE.showToast("领取失败"); + } else { + ToastUtils.INSTANCE.showToast("申请失败"); + } + } + })); + } + }); + mPersonalViewModel.getHaloAddData().observe(this, datas -> { if (!datas.isEmpty()) { mPersonalFuncGroupAdapter.setListData(datas); diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt index 3bb4895f84..e3620375c3 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/FollowersOrFansAdapter.kt @@ -93,8 +93,10 @@ class FollowersOrFansAdapter(context: Context, val mViewModel: FollowersOrFansVi } holder.binding.sdvUserBadge.setOnClickListener { v -> - onBadgeClickListener?.invoke(entity) - DirectUtils.directToBadgeWall(mContext, entity.id, entity.name, entity.icon) + DialogUtils.showViewBadgeDialog(mContext, entity.badge) { + onBadgeClickListener?.invoke(entity) + DirectUtils.directToBadgeWall(mContext, entity.id, entity.name, entity.icon) + } } } else if (holder is FooterViewHolder) { holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt index 03124cb234..041fadec11 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt @@ -7,9 +7,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.gamecenter.R -import com.gh.gamecenter.entity.BadgeEntity -import com.gh.gamecenter.entity.GameEntity -import com.gh.gamecenter.entity.PersonalEntity +import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response @@ -28,6 +26,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV var networkError = MutableLiveData() var playedGames = MutableLiveData>() var badges = MutableLiveData>() + var availableBadge = MutableLiveData() var availableBadgeCount = MutableLiveData() fun getUserInfo() { @@ -128,9 +127,10 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV .api.availableBadges(userId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response>() { - override fun onResponse(response: List?) { + .subscribe(object : Response>() { + override fun onResponse(response: List?) { super.onResponse(response) + availableBadge.postValue(if (response.isNullOrEmpty()) null else response[0]) availableBadgeCount.postValue(response?.count() ?: 0) } }) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt index ede82feb68..4e44751556 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt @@ -80,27 +80,29 @@ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : B val user = entity.user binding.userBadgeName.setOnClickListener { binding.userBadgeIcon.performClick() } binding.userBadgeIcon.setOnClickListener { - var key = "" - if (path == "标签专栏-热门") { - key = "问题标签详情-热门" - } else if (path == "标签专栏-精华") { - key = "问题标签详情-精华" - } else if (path == "专栏-热门") { - key = "问答-专栏详情-热门" - } else if (path == "专栏-精华") { - key = "问答-专栏详情-精华" - } else if (path == "游戏详情-动态") { - key = "游戏详情-热门回答" - } else if (path == "问答-推荐-按精选" || path == "问答-推荐-按时间") { - key = "问答-推荐" - } else if (path == "问题详情" || path == "折叠答案") { - key = path - } else { - key = path // 默认就使用path字段吧,总比为空的好 + DialogUtils.showViewBadgeDialog(binding.root.context, user.badge) { + var key = "" + if (path == "标签专栏-热门") { + key = "问题标签详情-热门" + } else if (path == "标签专栏-精华") { + key = "问题标签详情-精华" + } else if (path == "专栏-热门") { + key = "问答-专栏详情-热门" + } else if (path == "专栏-精华") { + key = "问答-专栏详情-精华" + } else if (path == "游戏详情-动态") { + key = "游戏详情-热门回答" + } else if (path == "问答-推荐-按精选" || path == "问答-推荐-按时间") { + key = "问答-推荐" + } else if (path == "问题详情" || path == "折叠答案") { + key = path + } else { + key = path // 默认就使用path字段吧,总比为空的好 + } + MtaHelper.onEvent("进入徽章墙_用户记录", key, user.name + "(" + user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", key) + DirectUtils.directToBadgeWall(binding.root.context, user.id, user.name, user.icon) } - MtaHelper.onEvent("进入徽章墙_用户记录", key, user.name + "(" + user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(binding.root.context, user.id, user.name, user.icon) } val userClick = View.OnClickListener { DirectUtils.directToHomeActivity(binding.root.context, entity.user.id, entrance, path) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt index 4cdb31eceb..960265ef7d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt @@ -1095,9 +1095,11 @@ class AnswerDetailFragment : NormalFragment() { mBinding.tvBadgeName.visibility = View.GONE } mBinding.sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "回答详情", "${user.name}(${user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "回答详情") - DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + DialogUtils.showViewBadgeDialog(requireContext(), user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "回答详情", "${user.name}(${user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "回答详情") + DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + } } mBinding.tvBadgeName.setOnClickListener { mBinding.sdvUserBadge.performClick() } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt index e09de8182c..d329f2470a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailContentViewHolder.kt @@ -185,9 +185,11 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin badgeTv.text = article.user.badge?.name ImageUtils.display(badgeIv, article.user.badge?.icon) badgeIv.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情", "${article.user.name}(${article.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情") - DirectUtils.directToBadgeWall(root.context, viewModel.detailEntity?.user?.id, article.user.name, article.user.icon) + DialogUtils.showViewBadgeDialog(root.context, article.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情", "${article.user.name}(${article.user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情") + DirectUtils.directToBadgeWall(root.context, viewModel.detailEntity?.user?.id, article.user.name, article.user.icon) + } } badgeTv.setOnClickListener { badgeIv.performClick() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/BaseArticleDetailCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/BaseArticleDetailCommentAdapter.kt index 5bac56ad87..5749d99f2a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/BaseArticleDetailCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/BaseArticleDetailCommentAdapter.kt @@ -331,9 +331,11 @@ abstract class BaseArticleDetailCommentAdapter(context: Context, } binding.badgeTv.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情-评论管理", comment.user.name + "(" + comment.user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情-评论管理") - DirectUtils.directToBadgeWall(binding.root.context, comment.user.id, comment.user.name, comment.user.icon) + DialogUtils.showViewBadgeDialog(binding.root.context, comment.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情-评论管理", comment.user.name + "(" + comment.user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情-评论管理") + DirectUtils.directToBadgeWall(binding.root.context, comment.user.id, comment.user.name, comment.user.icon) + } } binding.badgeIv.setOnClickListener { binding.badgeTv.performClick() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt index d2a40662da..18d4781a3a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentAdapter.kt @@ -117,15 +117,19 @@ class NewCommentAdapter(context: Context, } holder.userBadgeSdv.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(mContext, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + DialogUtils.showViewBadgeDialog(mContext, commentEntity.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", key) + DirectUtils.directToBadgeWall(mContext, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + } } holder.badgeNameTv.setOnClickListener { v -> holder.userBadgeSdv.performClick() } holder.quoteAuthorBadgeSdv.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.parentUser!!.name + "(" + commentEntity.parentUser!!.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(mContext, commentEntity.parentUser!!.id, commentEntity.parentUser!!.name, commentEntity.parentUser!!.icon) + DialogUtils.showViewBadgeDialog(mContext, commentEntity.parentUser!!.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.parentUser!!.name + "(" + commentEntity.parentUser!!.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", key) + DirectUtils.directToBadgeWall(mContext, commentEntity.parentUser!!.id, commentEntity.parentUser!!.name, commentEntity.parentUser!!.icon) + } } holder.commentLikeContainer.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt index 11d7fea0fc..ea7967c874 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/StairsCommentViewHolder.kt @@ -143,9 +143,11 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply } holder.binding.sdvUserBadge.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(binding.root.context, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + DialogUtils.showViewBadgeDialog(binding.root.context, commentEntity.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", key) + DirectUtils.directToBadgeWall(binding.root.context, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + } } holder.binding.commentLikeContainer.setOnClickListener { if (holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor(context, R.color.theme_font)) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/ArticleAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/ArticleAdapter.kt index b8f442b30e..12d807456b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/ArticleAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/ArticleAdapter.kt @@ -7,6 +7,7 @@ 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.DirectUtils import com.gh.common.util.ImageUtils import com.gh.common.util.MtaHelper @@ -55,9 +56,11 @@ class ArticleAdapter(context: Context, private val mEntrance: String?) : ListAda articleHolder.binding.tvBadgeName.visibility = View.GONE } articleHolder.binding.sdvUserBadge.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录", "插入文章-收藏文章列表", entity.user.name + "(" + entity.user.id + ")") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "插入文章-收藏文章列表") - DirectUtils.directToBadgeWall(mContext, entity.user.id, entity.user.name, entity.user.icon) + DialogUtils.showViewBadgeDialog(mContext, entity.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "插入文章-收藏文章列表", entity.user.name + "(" + entity.user.id + ")") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "插入文章-收藏文章列表") + DirectUtils.directToBadgeWall(mContext, entity.user.id, entity.user.name, entity.user.icon) + } } articleHolder.binding.tvBadgeName.setOnClickListener { v -> articleHolder.binding.sdvUserBadge.performClick() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt index a483c48340..4e7d322761 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt @@ -92,9 +92,11 @@ class AskFollowAdapter(val context: Context, val viewModel: AskFollowViewModel) sdvUserBadge.visibility = View.GONE } sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "问答-关注", "${historyEntity?.user?.name}(${historyEntity?.user?.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "问答-关注") - DirectUtils.directToBadgeWall(context, historyEntity?.user?.id, historyEntity?.user?.name, historyEntity?.user?.icon) + DialogUtils.showViewBadgeDialog(context, historyEntity?.user?.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "问答-关注", "${historyEntity?.user?.name}(${historyEntity?.user?.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "问答-关注") + DirectUtils.directToBadgeWall(context, historyEntity?.user?.id, historyEntity?.user?.name, historyEntity?.user?.icon) + } } questionTitle.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt index 868652740a..658a0dfaf3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowFragment.kt @@ -148,9 +148,11 @@ class AskFollowFragment : ListFragment - MtaHelper.onEvent("进入徽章墙_用户记录", "问答-关注-推荐列表", "${user.name}(${user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "问答-关注-推荐列表") - DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + DialogUtils.showViewBadgeDialog(requireContext(), user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "问答-关注-推荐列表", "${user.name}(${user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "问答-关注-推荐列表") + DirectUtils.directToBadgeWall(requireContext(), user.id, user.name, user.icon) + } } followTv.setTextColor(ContextCompat.getColor(requireContext(), R.color.theme_font)) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java index f38fc4a1eb..7aa2d3edf7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/AnswerViewHolder.java @@ -8,6 +8,7 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; +import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.MtaHelper; @@ -99,9 +100,12 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { badgeNameTv.setVisibility(View.GONE); } userBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", "问题详情", user.getName() + "(" + user.getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", "问题详情"); - DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + DialogUtils.showViewBadgeDialog(context, user.getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", "问题详情", user.getName() + "(" + user.getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", "问题详情"); + DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + }); }); badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); setAnswerImage(entity.getImages(), entity.getPassVideos()); @@ -151,9 +155,12 @@ public class AnswerViewHolder extends BaseRecyclerViewHolder { key = "插入回答-收藏回答列表"; } userBadgeSdv.setOnClickListener(v -> { - MtaHelper.onEvent("进入徽章墙_用户记录", key, user.getName() + "(" + user.getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", key); - DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + DialogUtils.showViewBadgeDialog(context, user.getBadge(), + () -> { + MtaHelper.onEvent("进入徽章墙_用户记录", key, user.getName() + "(" + user.getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", key); + DirectUtils.directToBadgeWall(context, user.getId(), user.getName(), user.getIcon()); + }); }); badgeNameTv.setOnClickListener(v -> userBadgeSdv.performClick()); diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java index 82a962f5ac..d15a2b228a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/invite/QuestionsInviteViewHolder.java @@ -8,6 +8,7 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; +import com.gh.common.util.DialogUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.MtaHelper; @@ -87,15 +88,18 @@ public class QuestionsInviteViewHolder extends BaseRecyclerViewHolder { - String key = ""; - if (path.equals("问题详情-邀请列表")) { - key = "问题详情-邀请"; - } else if (path.equals("问题详情-邀请回答")) { - key = "邀请回答列表"; - } - MtaHelper.onEvent("进入徽章墙_用户记录", key, entity.getName() + "(" + entity.getId() + ")"); - MtaHelper.onEvent("徽章中心", "进入徽章中心", key); - DirectUtils.directToBadgeWall(context, entity.getId(), entity.getName(), entity.getIcon()); + DialogUtils.showViewBadgeDialog(context, entity.getBadge(), + () -> { + String key = ""; + if (path.equals("问题详情-邀请列表")) { + key = "问题详情-邀请"; + } else if (path.equals("问题详情-邀请回答")) { + key = "邀请回答列表"; + } + MtaHelper.onEvent("进入徽章墙_用户记录", key, entity.getName() + "(" + entity.getId() + ")"); + MtaHelper.onEvent("徽章中心", "进入徽章中心", key); + DirectUtils.directToBadgeWall(context, entity.getId(), entity.getName(), entity.getIcon()); + }); }); } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/search/user/UserAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/search/user/UserAdapter.kt index 04c7cfaff9..4829d71f9e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/search/user/UserAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/search/user/UserAdapter.kt @@ -63,9 +63,11 @@ class UserAdapter(context: Context, } holder.binding.sdvUserBadge.setOnClickListener { v -> - MtaHelper.onEvent("进入徽章墙_用户记录","问答-搜索-用户列表","${entity.name}(${entity.id})") - MtaHelper.onEvent("徽章中心","进入徽章中心","问答-搜索-用户列表") - DirectUtils.directToBadgeWall(mContext, entity.id, entity.name, entity.icon) + DialogUtils.showViewBadgeDialog(mContext, entity.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录","问答-搜索-用户列表","${entity.name}(${entity.id})") + MtaHelper.onEvent("徽章中心","进入徽章中心","问答-搜索-用户列表") + DirectUtils.directToBadgeWall(mContext, entity.id, entity.name, entity.icon) + } } holder.binding.followerBtn.setOnClickListener { 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 05212eabaa..10eeb814d0 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 @@ -1301,7 +1301,13 @@ public interface ApiService { * 用户可领取徽章列表(全部数据) */ @GET("users/{user_id}/available_badges") - Observable> availableBadges(@Path("user_id") String userId); + Observable> availableBadges(@Path("user_id") String userId); + + /** + * 申请/领取徽章 + */ + @POST("badges/{badge_id}:receive") + Single applyOrReceiveBadge(@Path("badge_id") String badgeId); /** * 用户主页显示的提问过的问题,回答的答案,点赞过的答案和关注过的问题 diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index ac466087bd..77accffcfb 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -165,9 +165,11 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib tv_badge_name.visibility = View.GONE } sdv_user_badge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "视频详情", "${videoEntity.user.name}(${videoEntity.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "视频详情") - DirectUtils.directToBadgeWall(context, videoEntity.user.id, videoEntity.user.name, videoEntity.user.icon) + DialogUtils.showViewBadgeDialog(context, videoEntity.user.badge) { + MtaHelper.onEvent("进入徽章墙_用户记录", "视频详情", "${videoEntity.user.name}(${videoEntity.user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "视频详情") + DirectUtils.directToBadgeWall(context, videoEntity.user.id, videoEntity.user.name, videoEntity.user.icon) + } } tv_badge_name.setOnClickListener { sdv_user_badge.performClick() } diff --git a/app/src/main/res/anim/anim_badge_light_bg.xml b/app/src/main/res/anim/anim_badge_light_bg.xml new file mode 100644 index 0000000000..3029730a61 --- /dev/null +++ b/app/src/main/res/anim/anim_badge_light_bg.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/bg_badge_btn.png b/app/src/main/res/drawable-xxhdpi/bg_badge_btn.png new file mode 100644 index 0000000000..7779040658 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_badge_btn.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_badge_light.png b/app/src/main/res/drawable-xxhdpi/bg_badge_light.png new file mode 100644 index 0000000000..3f37e4d8dd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_badge_light.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_receive_badge.png b/app/src/main/res/drawable-xxhdpi/bg_receive_badge.png new file mode 100644 index 0000000000..9fd8fca3bf Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_receive_badge.png differ diff --git a/app/src/main/res/drawable-xxhdpi/bg_view_badge.png b/app/src/main/res/drawable-xxhdpi/bg_view_badge.png new file mode 100644 index 0000000000..6d61325625 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_view_badge.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_personal_badge.png b/app/src/main/res/drawable-xxhdpi/ic_personal_badge.png new file mode 100644 index 0000000000..2c96a872ab Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_personal_badge.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_badge_btn.png b/app/src/main/res/drawable-xxxhdpi/bg_badge_btn.png new file mode 100644 index 0000000000..8a981bc0d7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_badge_btn.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_badge_light.png b/app/src/main/res/drawable-xxxhdpi/bg_badge_light.png new file mode 100644 index 0000000000..07cef1651b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_badge_light.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_receive_badge.png b/app/src/main/res/drawable-xxxhdpi/bg_receive_badge.png new file mode 100644 index 0000000000..bc57c32fb3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_receive_badge.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/bg_view_badge.png b/app/src/main/res/drawable-xxxhdpi/bg_view_badge.png new file mode 100644 index 0000000000..cf98eb1410 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_view_badge.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_personal_badge.png b/app/src/main/res/drawable-xxxhdpi/ic_personal_badge.png new file mode 100644 index 0000000000..e426447b71 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_personal_badge.png differ diff --git a/app/src/main/res/drawable/bg_personal_badge.xml b/app/src/main/res/drawable/bg_personal_badge.xml new file mode 100644 index 0000000000..ed838b28ff --- /dev/null +++ b/app/src/main/res/drawable/bg_personal_badge.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_receive_badge.xml b/app/src/main/res/layout/dialog_receive_badge.xml new file mode 100644 index 0000000000..5298aac6d0 --- /dev/null +++ b/app/src/main/res/layout/dialog_receive_badge.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_view_badge.xml b/app/src/main/res/layout/dialog_view_badge.xml new file mode 100644 index 0000000000..bca0fc9d48 --- /dev/null +++ b/app/src/main/res/layout/dialog_view_badge.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_personal.xml b/app/src/main/res/layout/fragment_personal.xml index 22ca65cfbe..180e07cc82 100644 --- a/app/src/main/res/layout/fragment_personal.xml +++ b/app/src/main/res/layout/fragment_personal.xml @@ -84,52 +84,66 @@ app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container" app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" /> - - - + app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container" + app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container"> + android:textSize="16sp" + android:textStyle="bold" + app:layout_constraintStart_toEndOf="@+id/personal_user_icon_container" + app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" + tools:text="姓名" /> - - + + + + + + + + + #140B6D #16161A #28282E + #213964 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3b40477d6f..99352fd78e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -718,6 +718,14 @@ 新手机号与当前手机号相同,暂不支持本\n次绑定 我知道了 + 点击立即查看 + 查看更多 + 立即查看 + + 徽章中心 + 领取徽章 + 申请领取 +